From 27e04c121fbb07ec4225170c2fc466f15bfa07d4 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 3 Feb 2023 21:57:57 +0530 Subject: [PATCH 001/233] Code freeze of release-16.0 (#12232) Signed-off-by: Manan Gupta --- .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 efe1d6e8856..1bb74feee50 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 e8c258db4cb8e429d41be289919a5b089c9bc677 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 8 Feb 2023 16:03:45 +0100 Subject: [PATCH 002/233] Revert default MySQL 80 version to `8.0.30` (#12252) (#12273) * Revert default MySQL 80 version * upgrade mysql80 default to 8.0.30 * Add release notes regarding MySQL upgrade path in the vitess-operator * Remove unwanted upgrade path step --------- Signed-off-by: Florent Poinsard --- doc/releasenotes/16_0_0_summary.md | 18 ++++++++++++++++-- docker/lite/install_dependencies.sh | 2 +- go/flags/endtoend/mysqlctl.txt | 2 +- go/flags/endtoend/mysqlctld.txt | 2 +- go/flags/endtoend/vtbackup.txt | 2 +- go/flags/endtoend/vtctldclient.txt | 2 +- go/flags/endtoend/vtexplain.txt | 2 +- go/flags/endtoend/vtgate.txt | 2 +- go/flags/endtoend/vttablet.txt | 2 +- go/flags/endtoend/vttestserver.txt | 2 +- go/vt/servenv/buildinfo_test.go | 2 +- go/vt/servenv/mysql.go | 2 +- 12 files changed, 27 insertions(+), 13 deletions(-) diff --git a/doc/releasenotes/16_0_0_summary.md b/doc/releasenotes/16_0_0_summary.md index f723c8d7fd2..72f5c8c8fc0 100644 --- a/doc/releasenotes/16_0_0_summary.md +++ b/doc/releasenotes/16_0_0_summary.md @@ -12,6 +12,7 @@ - **[Breaking Changes](#breaking-changes)** - [VTGate Advertised MySQL Version](#advertised-mysql-version) - [Default MySQL version on Docker](#default-mysql-version) + - [Running Vitess on the Operator](#running-vitess-on-the-operator) - [vtctld UI Removal](#vtcltd-ui-removal) - [vtctld Flag Deprecation & Deletions](#vtctld-flag-deprecations) - [Orchestrator Integration Deletion](#orc-integration-removal) @@ -88,12 +89,25 @@ The flag `disable-replication-manager` is deprecated and will be removed in a la #### VTGate Advertised MySQL Version -VTGate now advertises MySQL version 8.0.31. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. +VTGate now advertises MySQL version 8.0.30. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. The users can set the `mysql_server_version` flag to advertise the correct version. #### Default MySQL version on Docker -The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the default patch version of the `vitess/lite:mysql80` image goes from `8.0.23` to `8.0.31`. +The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the patch version of MySQL80 has been upgraded from `8.0.23` to `8.0.30`. + +#### Running Vitess on the Operator + +If you are using the vitess-operator and want to remain on MySQL 5.7, we invite you to use the `vitess/lite:v16.0.0-mysql57` Docker Image. + +However, if you are running MySQL 8.0 on the vitess-operator, with for instance `vitess/lite:v15.0.2-mysql80`, considering that we are bumping the patch version of MySQL 80 from `8.0.23` to `8.0.30`, you will have to manually upgrade: + +1. Add `innodb_fast_shutdown=0` to your extra cnf in your YAML file. +2. Apply this file. +3. Wait for all the pods to be healthy. +4. Then change your YAML file to use the new Docker Images (`vitess/lite:v16.0.0`, defaults to mysql80). +5. Remove `innodb_fast_shutdown=0` from your extra cnf in your YAML file. +6. Apply this file. #### vtctld UI Removal In v13, the vtctld UI was deprecated. As of this release, the `web/vtctld2` directory is deleted and the UI will no longer be included in any Vitess images going forward. All build scripts and the Makefile have been updated to reflect this change. diff --git a/docker/lite/install_dependencies.sh b/docker/lite/install_dependencies.sh index cff035c2319..92f7ab67397 100755 --- a/docker/lite/install_dependencies.sh +++ b/docker/lite/install_dependencies.sh @@ -83,7 +83,7 @@ mysql57) ) ;; mysql80) - mysql8_version=8.0.31 + mysql8_version=8.0.30 do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/libmysqlclient21_${mysql8_version}-1debian10_amd64.deb /tmp/libmysqlclient21_${mysql8_version}-1debian10_amd64.deb do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client-core_${mysql8_version}-1debian10_amd64.deb /tmp/mysql-community-client-core_${mysql8_version}-1debian10_amd64.deb do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client-plugins_${mysql8_version}-1debian10_amd64.deb /tmp/mysql-community-client-plugins_${mysql8_version}-1debian10_amd64.deb diff --git a/go/flags/endtoend/mysqlctl.txt b/go/flags/endtoend/mysqlctl.txt index da2db03f0db..c380ebfb557 100644 --- a/go/flags/endtoend/mysqlctl.txt +++ b/go/flags/endtoend/mysqlctl.txt @@ -57,7 +57,7 @@ Global flags: --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --mysql_port int MySQL port (default 3306) - --mysql_server_version string MySQL server version to advertise. (default "8.0.31-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --mysql_socket string Path to the mysqld socket file --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 diff --git a/go/flags/endtoend/mysqlctld.txt b/go/flags/endtoend/mysqlctld.txt index 92152e508e0..d5da79e347f 100644 --- a/go/flags/endtoend/mysqlctld.txt +++ b/go/flags/endtoend/mysqlctld.txt @@ -68,7 +68,7 @@ Usage of mysqlctld: --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --mysql_port int MySQL port (default 3306) - --mysql_server_version string MySQL server version to advertise. (default "8.0.31-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --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) diff --git a/go/flags/endtoend/vtbackup.txt b/go/flags/endtoend/vtbackup.txt index 451e2489ab7..98dc99c0e17 100644 --- a/go/flags/endtoend/vtbackup.txt +++ b/go/flags/endtoend/vtbackup.txt @@ -119,7 +119,7 @@ Usage of vtbackup: --mycnf_socket_file string mysql socket file --mycnf_tmp_dir string mysql tmp directory --mysql_port int mysql port (default 3306) - --mysql_server_version string MySQL server version to advertise. (default "8.0.31-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --mysql_socket string path to the mysql socket --mysql_timeout duration how long to wait for mysqld startup (default 5m0s) --port int port for the server diff --git a/go/flags/endtoend/vtctldclient.txt b/go/flags/endtoend/vtctldclient.txt index b77cef271db..c6e48e610d6 100644 --- a/go/flags/endtoend/vtctldclient.txt +++ b/go/flags/endtoend/vtctldclient.txt @@ -108,7 +108,7 @@ Flags: --log_dir string If non-empty, write log files in this directory --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 - --mysql_server_version string MySQL server version to advertise. (default "8.0.31-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --server string server to use for connection (required) diff --git a/go/flags/endtoend/vtexplain.txt b/go/flags/endtoend/vtexplain.txt index 02fddc86988..a70067a9bc8 100644 --- a/go/flags/endtoend/vtexplain.txt +++ b/go/flags/endtoend/vtexplain.txt @@ -14,7 +14,7 @@ Usage of vtexplain: --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 - --mysql_server_version string MySQL server version to advertise. (default "8.0.31-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --normalize Whether to enable vtgate normalization --output-mode string Output in human-friendly text or json (default "text") --planner-version string Sets the query planner version to use when generating the explain output. Valid values are V3 and Gen4. An empty value will use VTGate's default planner diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index 50ede91bde9..0761740d33c 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -115,7 +115,7 @@ Usage of vtgate: --mysql_server_ssl_key string Path to ssl key for mysql server plugin SSL --mysql_server_ssl_server_ca string path to server CA in PEM format, which will be combine with server cert, return full certificate chain to clients --mysql_server_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. - --mysql_server_version string MySQL server version to advertise. (default "8.0.31-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --mysql_server_write_timeout duration connection write timeout --mysql_slow_connect_warn_threshold duration Warn if it takes more than the given threshold for a mysql connection to establish --mysql_tcp_version string Select tcp, tcp4, or tcp6 to control the socket type. (default "tcp") diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index 9411ca117f6..cc3d4a275d0 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -188,7 +188,7 @@ Usage of vttablet: --mycnf_slow_log_path string mysql slow query log path --mycnf_socket_file string mysql socket file --mycnf_tmp_dir string mysql tmp directory - --mysql_server_version string MySQL server version to advertise. (default "8.0.31-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --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 10s) diff --git a/go/flags/endtoend/vttestserver.txt b/go/flags/endtoend/vttestserver.txt index 81a154e3dbb..193070c5161 100644 --- a/go/flags/endtoend/vttestserver.txt +++ b/go/flags/endtoend/vttestserver.txt @@ -71,7 +71,7 @@ Usage of vttestserver: --min_table_shard_size int The minimum number of initial rows in a table shard. Ignored if--initialize_with_random_data is false. The actual number is chosen randomly. (default 1000) --mysql_bind_host string which host to bind vtgate mysql listener to (default "localhost") --mysql_only If this flag is set only mysql is initialized. The rest of the vitess components are not started. Also, the output specifies the mysql unix socket instead of the vtgate port. - --mysql_server_version string MySQL server version to advertise. (default "8.0.31-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --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) --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) diff --git a/go/vt/servenv/buildinfo_test.go b/go/vt/servenv/buildinfo_test.go index 5ad208f0fb0..e6793c915d0 100644 --- a/go/vt/servenv/buildinfo_test.go +++ b/go/vt/servenv/buildinfo_test.go @@ -45,5 +45,5 @@ func TestVersionString(t *testing.T) { assert.Equal(t, "Version: v1.2.3-SNAPSHOT (Jenkins build 422) (Git revision d54b87ca0be09b678bb4490060e8f23f890ddb92 branch 'gitBranch') built on time is now by user@host using 1.19.3 amiga/amd64", v.String()) - assert.Equal(t, "8.0.31-Vitess", v.MySQLVersion()) + assert.Equal(t, "8.0.30-Vitess", v.MySQLVersion()) } diff --git a/go/vt/servenv/mysql.go b/go/vt/servenv/mysql.go index c3f62718124..94019a1c42c 100644 --- a/go/vt/servenv/mysql.go +++ b/go/vt/servenv/mysql.go @@ -23,7 +23,7 @@ import ( // mySQLServerVersion is what Vitess will present as it's version during the connection handshake, // and as the value to the @@version system variable. If nothing is provided, Vitess will report itself as // a specific MySQL version with the vitess version appended to it -var mySQLServerVersion = "8.0.31-Vitess" +var mySQLServerVersion = "8.0.30-Vitess" // RegisterMySQLServerFlags installs the flags needed to specify or expose a // particular MySQL server version from Vitess. From 5334b225e9aaa3599345e8159bcfbd942ccbcc3a Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 8 Feb 2023 20:34:49 +0530 Subject: [PATCH 003/233] Release of v16.0.0-rc1 (#12235) * Release notes for 16.0.0-rc1 Signed-off-by: Manan Gupta * Release commit for 16.0.0-rc1 Signed-off-by: Manan Gupta --------- Signed-off-by: Manan Gupta --- .github/workflows/code_freeze.yml | 2 +- doc/releasenotes/16_0_0_changelog.md | 403 +++++++++++++++ doc/releasenotes/16_0_0_release_notes.md | 464 +++++++++++++++++- 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 | 12 +- examples/operator/201_customer_tablets.yaml | 12 +- examples/operator/302_new_shards.yaml | 12 +- examples/operator/306_down_shard_0.yaml | 12 +- examples/operator/operator.yaml | 2 +- go/vt/servenv/version.go | 10 +- 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, 932 insertions(+), 99 deletions(-) create mode 100644 doc/releasenotes/16_0_0_changelog.md diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 1bb74feee50..efe1d6e8856 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/doc/releasenotes/16_0_0_changelog.md b/doc/releasenotes/16_0_0_changelog.md new file mode 100644 index 00000000000..97190048243 --- /dev/null +++ b/doc/releasenotes/16_0_0_changelog.md @@ -0,0 +1,403 @@ +# Changelog of Vitess v16.0.0-rc1 + +### Announcement +#### Governance + * Move inactive maintainers to "Past" section, change Areas to include more active maintainers [#11744](https://github.com/vitessio/vitess/pull/11744) + * add frances to maintainers [#11865](https://github.com/vitessio/vitess/pull/11865) + * add Arthur to the maintainers file [#11937](https://github.com/vitessio/vitess/pull/11937) +#### Query Serving + * deprecate V3 planner [#11635](https://github.com/vitessio/vitess/pull/11635) +#### VTAdmin + * [vtadmin] deprecated vtexplain [#12163](https://github.com/vitessio/vitess/pull/12163) +### Bug fixes +#### Backup and Restore + * Detect redo log location dynamically based on presence [#11555](https://github.com/vitessio/vitess/pull/11555) + * [main] mysqlctl: flags should be added to vtbackup (#12048) [#12060](https://github.com/vitessio/vitess/pull/12060) +#### Build/CI + * Fix the script `check_make_sizegen` [#11465](https://github.com/vitessio/vitess/pull/11465) + * Skip `TestComparisonSemantics` test [#11474](https://github.com/vitessio/vitess/pull/11474) + * Docker Image Context Fix [#11628](https://github.com/vitessio/vitess/pull/11628) + * Addition of a CI tool to detect dead links in test/config.json [#11668](https://github.com/vitessio/vitess/pull/11668) + * Fix files changes filtering in CI [#11714](https://github.com/vitessio/vitess/pull/11714) + * Fix `codeql` workflow timeout issue [#11760](https://github.com/vitessio/vitess/pull/11760) + * Trigger OnlineDDL workflow when test data changes [#11827](https://github.com/vitessio/vitess/pull/11827) +#### Cluster management + * BugFix: Errant GTID detection for a single replica [#12024](https://github.com/vitessio/vitess/pull/12024) + * BugFix: Fix race in `IsFlagProvided` [#12042](https://github.com/vitessio/vitess/pull/12042) +#### General + * [main] Stats Flags: include stats flags in the correct binaries (#11450) [#11453](https://github.com/vitessio/vitess/pull/11453) + * Test flags: Update logic for parsing test flags to run unit tests within GoLand and to parse test flags in vtgate to allow running unit tests [#11551](https://github.com/vitessio/vitess/pull/11551) + * Fix missing flag usage for vault credentials flags [#11582](https://github.com/vitessio/vitess/pull/11582) + * fix vdiff release notes [#11595](https://github.com/vitessio/vitess/pull/11595) +#### Observability + * stats/prometheus: normalize labels for single-label implementations [#12057](https://github.com/vitessio/vitess/pull/12057) +#### Online DDL + * Parse binlog variable length encoded columns [#11871](https://github.com/vitessio/vitess/pull/11871) +#### Operator + * [main] Increase the memory limit of the vitess-operator (#11548) [#11550](https://github.com/vitessio/vitess/pull/11550) + * Fix rbac config in the vtop example [#12034](https://github.com/vitessio/vitess/pull/12034) +#### Query Serving + * Fix query list override issue on mysql restart [#11309](https://github.com/vitessio/vitess/pull/11309) + * make MySQL56-flavor schema queries forward-compatible [#11323](https://github.com/vitessio/vitess/pull/11323) + * Plan order by `COUNT(X)` [#11420](https://github.com/vitessio/vitess/pull/11420) + * Fix #11455 - skip vindex operations for `DELETE` statements against unsharded tables [#11461](https://github.com/vitessio/vitess/pull/11461) + * Fix aggregation end-to-end test PRIMARY KEY [#11473](https://github.com/vitessio/vitess/pull/11473) + * collations: fix coercion semantics according to 8.0.31 changes [#11487](https://github.com/vitessio/vitess/pull/11487) + * fix: reserve connection to follow query timeout when outside of transaction [#11490](https://github.com/vitessio/vitess/pull/11490) + * [main] bug fix: using self-referencing columns in HAVING should not overflow (#11499) [#11504](https://github.com/vitessio/vitess/pull/11504) + * Fix `HAVING` rewriting made in #11306 [#11515](https://github.com/vitessio/vitess/pull/11515) + * fix: fail over reconnect in stream execution for connection with transaction [#11517](https://github.com/vitessio/vitess/pull/11517) + * [15.0] Fix: concatenate engine in transaction [#11534](https://github.com/vitessio/vitess/pull/11534) + * [main] Redact bind variables in mysql errors (#11540) [#11545](https://github.com/vitessio/vitess/pull/11545) + * Fix ordering when error happens during stream setup [#11592](https://github.com/vitessio/vitess/pull/11592) + * Do not multiply `AggregateRandom` in `JOIN`s [#11633](https://github.com/vitessio/vitess/pull/11633) + * [bugfix] Allow VTExplain to handle shards that are not active during resharding [#11640](https://github.com/vitessio/vitess/pull/11640) + * Fix generating invalid alter table for comments [#11645](https://github.com/vitessio/vitess/pull/11645) + * sqltypes: handle leading zeroes [#11650](https://github.com/vitessio/vitess/pull/11650) + * Send errors in stream instead of a grpc error from streaming rpcs when transaction or reserved connection is acquired [#11656](https://github.com/vitessio/vitess/pull/11656) + * schemadiff: normalize index option value (string) [#11675](https://github.com/vitessio/vitess/pull/11675) + * improve handling of ORDER BY/HAVING rewriting [#11691](https://github.com/vitessio/vitess/pull/11691) + * query timeout hints in unsharded cases [#11709](https://github.com/vitessio/vitess/pull/11709) + * Online DDL: adding error check; more verbose error messages [#11789](https://github.com/vitessio/vitess/pull/11789) + * Accept no more data in session state change as ok [#11796](https://github.com/vitessio/vitess/pull/11796) + * Fix: return allowed transaction isolation level value on select query [#11804](https://github.com/vitessio/vitess/pull/11804) + * semantics: Use a BitSet [#11819](https://github.com/vitessio/vitess/pull/11819) + * BugFix: Escaping Percentage and Underscore require special handling [#11823](https://github.com/vitessio/vitess/pull/11823) + * Simplify recursive data structure in CFC Vindex [#11843](https://github.com/vitessio/vitess/pull/11843) + * Fix MySQL56 GTID parsing when SID/UUID repeats [#11888](https://github.com/vitessio/vitess/pull/11888) + * Online DDL: fix 'vtctlclient OnlineDDL' template queries [#11889](https://github.com/vitessio/vitess/pull/11889) + * Fix CheckMySQL by setting the correct wanted state [#11895](https://github.com/vitessio/vitess/pull/11895) + * Onlineddl: formalize "immediate operations", respect `--postpone-completion` strategy flag [#11910](https://github.com/vitessio/vitess/pull/11910) + * bugfix: allow predicates without dependencies with derived tables to be handled correctly [#11911](https://github.com/vitessio/vitess/pull/11911) + * Online DDL: ensure message is valid `utf8` in `updateMigrationMessage()` [#11914](https://github.com/vitessio/vitess/pull/11914) + * Fix sending a ServerLost error when reading a packet fails [#11920](https://github.com/vitessio/vitess/pull/11920) + * only expand when we have full information [#11998](https://github.com/vitessio/vitess/pull/11998) + * Remove unnecessary logging [#12000](https://github.com/vitessio/vitess/pull/12000) + * Fix parsing and normalization of floating point types [#12009](https://github.com/vitessio/vitess/pull/12009) + * OnlineDDL: scheduleNextMigration() to only read reviewed migrations [#12014](https://github.com/vitessio/vitess/pull/12014) + * Keywords must be unique and can't be reused [#12044](https://github.com/vitessio/vitess/pull/12044) + * Fix: Date math with Interval keyword [#12082](https://github.com/vitessio/vitess/pull/12082) + * OnlineDDL: support integer-to-enum conversion in `vitess` migrations [#12098](https://github.com/vitessio/vitess/pull/12098) + * Keep the correct case for the charset for canonical string [#12105](https://github.com/vitessio/vitess/pull/12105) + * 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) + * handle system databases other that information_schema correctly [#12175](https://github.com/vitessio/vitess/pull/12175) + * VTGate: Ensure HealthCheck Cache Secondary Maps Stay in Sync With Authoritative Map on Tablet Delete [#12178](https://github.com/vitessio/vitess/pull/12178) + * schemadiff: fix scenario where no tables exist in schema and with just views reading from DUAL [#12189](https://github.com/vitessio/vitess/pull/12189) + * Fix parsing of bitnum values larger than 64 bit [#12191](https://github.com/vitessio/vitess/pull/12191) + * Online DDL: fix deadlock by releasing mutex before calling callback [#12211](https://github.com/vitessio/vitess/pull/12211) +#### VReplication + * VReplication: escape identifiers when renaming source tables [#11670](https://github.com/vitessio/vitess/pull/11670) + * VReplication: Prevent Orphaned VDiff2 Jobs [#11768](https://github.com/vitessio/vitess/pull/11768) + * VDiff2: Properly Apply --only_pks Report Flag [#12025](https://github.com/vitessio/vitess/pull/12025) + * VReplication: Improve Error/Status Reporting [#12052](https://github.com/vitessio/vitess/pull/12052) + * VReplication: Propagate Binlog Stream Errors [#12095](https://github.com/vitessio/vitess/pull/12095) +#### VTorc + * Fix VTOrc holding locks after shutdown [#11442](https://github.com/vitessio/vitess/pull/11442) + * [15.0] Fix VTOrc to handle multiple failures [#11489](https://github.com/vitessio/vitess/pull/11489) + * VTOrc running PRS when database_instance empty bug fix. [#12019](https://github.com/vitessio/vitess/pull/12019) + * Fix: VTOrc forgetting old instances [#12089](https://github.com/vitessio/vitess/pull/12089) + * Fix insert query of blocked_recovery table in VTOrc [#12091](https://github.com/vitessio/vitess/pull/12091) +#### vtctl + * Switch ApplySchema `--sql` argument to be `StringArray` instead of `StringSlice` [#11790](https://github.com/vitessio/vitess/pull/11790) +#### vtexplain + * Use Gen4 as the default planner version for VTExplain [#12021](https://github.com/vitessio/vitess/pull/12021) +#### vttestserver + * Fix vttestserver run script defaults [#12004](https://github.com/vitessio/vitess/pull/12004) + * Add missing backslash to run.sh script [#12033](https://github.com/vitessio/vitess/pull/12033) +### CI/Build +#### Backup and Restore + * docker/lite: +zstd dep [#11997](https://github.com/vitessio/vitess/pull/11997) +#### Build/CI + * unit test: use require and assert [#11252](https://github.com/vitessio/vitess/pull/11252) + * Skip CI with the `Skip CI` label [#11514](https://github.com/vitessio/vitess/pull/11514) + * Update GitHub Actions workflows to latest versions [#11525](https://github.com/vitessio/vitess/pull/11525) + * Removing SharedPitr_tls and Backup_transfrom test from CI [#11611](https://github.com/vitessio/vitess/pull/11611) + * Add automation to change vitess version in the docker-release script [#11682](https://github.com/vitessio/vitess/pull/11682) + * Fix two additional flaky test sources in endtoend tests [#11743](https://github.com/vitessio/vitess/pull/11743) + * Update latest protobuf [#11782](https://github.com/vitessio/vitess/pull/11782) + * Update test runners to run all tests including outside package [#11787](https://github.com/vitessio/vitess/pull/11787) + * Update to latest etcd release [#11791](https://github.com/vitessio/vitess/pull/11791) + * Migrate to GitHub OIDC based auth for Launchable [#11808](https://github.com/vitessio/vitess/pull/11808) + * Fix the golangci-lint config [#11812](https://github.com/vitessio/vitess/pull/11812) + * Add instructions on how to fix a self-hosted runner running out of disk space [#11839](https://github.com/vitessio/vitess/pull/11839) + * Fix deprecated usage of set-output [#11844](https://github.com/vitessio/vitess/pull/11844) + * update golangci-lint to 1.50.1 [#11873](https://github.com/vitessio/vitess/pull/11873) + * CODEOWNERS: Add vrepl team members for vtgate vstream and tablet picker [#11950](https://github.com/vitessio/vitess/pull/11950) + * Upgrade all the CI runners to Ubuntu 22.04 [#11985](https://github.com/vitessio/vitess/pull/11985) + * Add lauchable to unit tests as well and remove OIDC [#12031](https://github.com/vitessio/vitess/pull/12031) + * consolidating OnlineDDL 'declarative' tests into 'scheduler' tests: part 1 [#12061](https://github.com/vitessio/vitess/pull/12061) + * OnlineDDL CI: remove 'revertible' tests (part 2) [#12192](https://github.com/vitessio/vitess/pull/12192) + * Update vtadmin dependencies [#12201](https://github.com/vitessio/vitess/pull/12201) + * Update Go dependencies [#12215](https://github.com/vitessio/vitess/pull/12215) +#### Cluster management + * Endtoend cluster improvements [#11859](https://github.com/vitessio/vitess/pull/11859) + * CI, tabletmanager throttler topo tests: polling until status received [#12107](https://github.com/vitessio/vitess/pull/12107) +#### General + * [deps] go get golang.org/x/text && go mod tidy [#11466](https://github.com/vitessio/vitess/pull/11466) + * Upgrade to `go1.19.3` [#11655](https://github.com/vitessio/vitess/pull/11655) + * Code freeze of release-16.0 [#12232](https://github.com/vitessio/vitess/pull/12232) +#### Governance + * codeowners: have at least two for almost every package [#11639](https://github.com/vitessio/vitess/pull/11639) + * added code owners for go.mod and go.sum files [#11711](https://github.com/vitessio/vitess/pull/11711) + * Add more codeowners to the `/test` directory [#11762](https://github.com/vitessio/vitess/pull/11762) +#### Query Serving + * Consistent sorting in Online DDL Vrepl suite test [#11821](https://github.com/vitessio/vitess/pull/11821) + * Flakes: Properly Test HealthCheck Cache Response Handling [#12226](https://github.com/vitessio/vitess/pull/12226) +#### TabletManager + * Update throttler-topo workflow file [#11784](https://github.com/vitessio/vitess/pull/11784) + * Fix closing the body for HTTP requests [#11842](https://github.com/vitessio/vitess/pull/11842) +#### VReplication + * update jsonparser dependency [#11694](https://github.com/vitessio/vitess/pull/11694) +#### VTorc + * Move vtorc runners back to normal github runners [#11482](https://github.com/vitessio/vitess/pull/11482) +### Dependabot +#### Java + * build(deps): Bump protobuf-java from 3.19.4 to 3.19.6 in /java [#11439](https://github.com/vitessio/vitess/pull/11439) +#### VTAdmin + * build(deps): Bump @xmldom/xmldom from 0.7.5 to 0.7.8 in /web/vtadmin [#11615](https://github.com/vitessio/vitess/pull/11615) + * build(deps): Bump loader-utils from 1.4.0 to 1.4.1 in /web/vtadmin [#11659](https://github.com/vitessio/vitess/pull/11659) + * build(deps): Bump loader-utils from 1.4.1 to 1.4.2 in /web/vtadmin [#11725](https://github.com/vitessio/vitess/pull/11725) +### Documentation +#### Build/CI + * Update release notes summary for the new default MySQL version [#12222](https://github.com/vitessio/vitess/pull/12222) +#### CLI + * [vtadmin] Do not backtick binary name [#11464](https://github.com/vitessio/vitess/pull/11464) + * [vtctldclient|docs] apply doc feedback based on website PR feedback [#12030](https://github.com/vitessio/vitess/pull/12030) +#### Documentation + * Upgrades the release notes for v15.0.0 [#11567](https://github.com/vitessio/vitess/pull/11567) + * Copy design docs over from website [#12071](https://github.com/vitessio/vitess/pull/12071) +#### VReplication + * Mark VDiff V2 as GA in v16 [#12084](https://github.com/vitessio/vitess/pull/12084) +### Enhancement +#### Authn/z + * VTGate: Set immediate caller id from gRPC static auth username [#12050](https://github.com/vitessio/vitess/pull/12050) +#### Backup and Restore + * Incremental logical backup and point in time recovery [#11097](https://github.com/vitessio/vitess/pull/11097) + * vtbackup: disable redo log before starting replication [#11330](https://github.com/vitessio/vitess/pull/11330) + * remove excessive backup decompression logging [#11479](https://github.com/vitessio/vitess/pull/11479) + * vtbackup: add --disable-redo-log flag (default false) [#11594](https://github.com/vitessio/vitess/pull/11594) + * remove backup_hook from flag help [#12029](https://github.com/vitessio/vitess/pull/12029) +#### Build/CI + * Move CI workflow to use latest community version of mysql 8.0 [#11493](https://github.com/vitessio/vitess/pull/11493) + * Upgrade the `release_notes_label` workflow for `v16.0.0` [#11544](https://github.com/vitessio/vitess/pull/11544) + * CODEOWNERS: Add maintainers to `.github/workflows` and `.github` [#11781](https://github.com/vitessio/vitess/pull/11781) + * Allow override of build git env in docker/base builds [#11968](https://github.com/vitessio/vitess/pull/11968) + * Add vtorc port to vitess local docker run [#12001](https://github.com/vitessio/vitess/pull/12001) + * Update the MySQL version used by our Docker images [#12054](https://github.com/vitessio/vitess/pull/12054) + * Fail CI when a PR is labeled with `NeedsWebsiteDocsUpdate` or `NeedsDescriptionUpdate` [#12062](https://github.com/vitessio/vitess/pull/12062) +#### CLI + * Add GenerateShardRanges to vtctldclient [#11492](https://github.com/vitessio/vitess/pull/11492) + * Properly deprecate flags and fix default for `--cell` [#11501](https://github.com/vitessio/vitess/pull/11501) + * Allow version to be accessible via the -v shorthand [#11512](https://github.com/vitessio/vitess/pull/11512) +#### Cluster management + * Create new api for topo lock shard exists [#11269](https://github.com/vitessio/vitess/pull/11269) + * Deprecating VExec part1: removing client-side references [#11955](https://github.com/vitessio/vitess/pull/11955) +#### Driver + * Implement the RowsColumnTypeScanType interface in the go sql driver [#12007](https://github.com/vitessio/vitess/pull/12007) +#### Examples + * Give all permissions in rbac in examples [#11463](https://github.com/vitessio/vitess/pull/11463) + * Fix Vitess Operator example [#11546](https://github.com/vitessio/vitess/pull/11546) +#### General + * removing unncessary flags across binaries [#11495](https://github.com/vitessio/vitess/pull/11495) + * [release-15.0] Upgrade to `go1.18.7` [#11507](https://github.com/vitessio/vitess/pull/11507) + * vttablet sidecar schema:use schemadiff to reach desired schema on tablet init replacing the withDDL-based approach [#11520](https://github.com/vitessio/vitess/pull/11520) + * Removing redundant flags across binaries [#11522](https://github.com/vitessio/vitess/pull/11522) + * Remove `EnableTracingOpt` and `--grpc_enable_tracing` [#11543](https://github.com/vitessio/vitess/pull/11543) + * Add default lower stack limit [#11569](https://github.com/vitessio/vitess/pull/11569) + * Upgrade to `go1.19.4` [#11905](https://github.com/vitessio/vitess/pull/11905) + * Add structure logging to Vitess [#11960](https://github.com/vitessio/vitess/pull/11960) + * Revert changes made in #11960 [#12219](https://github.com/vitessio/vitess/pull/12219) +#### Governance + * Add manan and florent to Docker files CODEOWNERS [#11981](https://github.com/vitessio/vitess/pull/11981) +#### Query Serving + * ComBinlogDumpGTID and downstream replication protocol [#10066](https://github.com/vitessio/vitess/pull/10066) + * Document error code in `vtgate/planbuilder` [#10738](https://github.com/vitessio/vitess/pull/10738) + * opt in/out of query consolidation [#11080](https://github.com/vitessio/vitess/pull/11080) + * Online DDL: more (async) log visibility into cut-over phase [#11253](https://github.com/vitessio/vitess/pull/11253) + * optionally disable verify-after-insert behavior of lookup vindexes [#11313](https://github.com/vitessio/vitess/pull/11313) + * resource pool: resource max lifetime timeout [#11337](https://github.com/vitessio/vitess/pull/11337) + * feat: added query timeout to vtgate default and per session [#11429](https://github.com/vitessio/vitess/pull/11429) + * [evalengine] add rewrites for nullif and ifnull [#11431](https://github.com/vitessio/vitess/pull/11431) + * Handle aliasing of collation names [#11433](https://github.com/vitessio/vitess/pull/11433) + * vitess Online DDL atomic cut-over [#11460](https://github.com/vitessio/vitess/pull/11460) + * Keep track of expanded columns in the semantic analysis [#11462](https://github.com/vitessio/vitess/pull/11462) + * feat: deconstruct tuple comparisons so we can use them for routing decisions [#11500](https://github.com/vitessio/vitess/pull/11500) + * Add Gauge For CheckMySQL Running [#11524](https://github.com/vitessio/vitess/pull/11524) + * Optimize List Support In Vindex Functions [#11531](https://github.com/vitessio/vitess/pull/11531) + * add option to disable lookup read lock [#11538](https://github.com/vitessio/vitess/pull/11538) + * [refactor] Predicate push down [#11552](https://github.com/vitessio/vitess/pull/11552) + * planner: better bindvar names for auto-parameterized queries [#11571](https://github.com/vitessio/vitess/pull/11571) + * planner enhancement: nice bindvar names for update [#11581](https://github.com/vitessio/vitess/pull/11581) + * Online DDL: more support for INSTANT DDL [#11591](https://github.com/vitessio/vitess/pull/11591) + * vtgate: route create table statements to vschema keyspace [#11602](https://github.com/vitessio/vitess/pull/11602) + * Dynamic tablet throttler config: enable/disable, set metrics query/threshold [#11604](https://github.com/vitessio/vitess/pull/11604) + * Cleanup copying of proto results to sqltypes.Result [#11607](https://github.com/vitessio/vitess/pull/11607) + * Move horizon planning to operators [#11622](https://github.com/vitessio/vitess/pull/11622) + * normalize more expressions [#11631](https://github.com/vitessio/vitess/pull/11631) + * Fix `OR 1=0` causing queries to scatter [#11653](https://github.com/vitessio/vitess/pull/11653) + * Online DDL: normalize/idempotentize CHECK CONSTRAINTs in ALTER TABLE statement [#11663](https://github.com/vitessio/vitess/pull/11663) + * add support for transaction isolation level and make it vitess aware setting [#11673](https://github.com/vitessio/vitess/pull/11673) + * don't reuse bindvars for LIMIT and OFFSET [#11689](https://github.com/vitessio/vitess/pull/11689) + * Online DDL: more scheduler triggering following successful operations [#11701](https://github.com/vitessio/vitess/pull/11701) + * Add support for transaction access mode [#11704](https://github.com/vitessio/vitess/pull/11704) + * rewrite predicates to expose routing opportunities [#11765](https://github.com/vitessio/vitess/pull/11765) + * find IN route possibility in ORs [#11775](https://github.com/vitessio/vitess/pull/11775) + * [planner] Better AST equality [#11867](https://github.com/vitessio/vitess/pull/11867) + * optimize joins, redirect dml for reference tables [#11875](https://github.com/vitessio/vitess/pull/11875) + * VExplain statement [#11892](https://github.com/vitessio/vitess/pull/11892) + * Simplify `getPlan` and `gen4CompareV3` [#11903](https://github.com/vitessio/vitess/pull/11903) + * Better clone of the VCursor [#11926](https://github.com/vitessio/vitess/pull/11926) + * Better clone of the VCursor [#11926](https://github.com/vitessio/vitess/pull/11926) + * [planner] Schema information on the information_schema views [#11941](https://github.com/vitessio/vitess/pull/11941) + * schemadiff: foreign key validation (tables and columns) [#11944](https://github.com/vitessio/vitess/pull/11944) + * OnlineDDL: support --unsafe-allow-foreign-keys strategy flag [#11976](https://github.com/vitessio/vitess/pull/11976) + * support transaction isolation modification through reserved connection system settings [#11987](https://github.com/vitessio/vitess/pull/11987) + * **unsafe**: Online DDL support for `--unsafe-allow-foreign-keys` strategy flag [#11988](https://github.com/vitessio/vitess/pull/11988) + * vtgate advertised mysql server version to 8.0.31 [#11989](https://github.com/vitessio/vitess/pull/11989) + * schemadiff: normalize `PRIMARY KEY` definition [#12016](https://github.com/vitessio/vitess/pull/12016) + * schemadiff: validate and apply foreign key indexes [#12026](https://github.com/vitessio/vitess/pull/12026) + * OnlineDDL: 'mysql' strategy, managed by the scheduler, but executed via normal MySQL statements [#12027](https://github.com/vitessio/vitess/pull/12027) + * Refactor sqlparser.Rewrite uses [#12059](https://github.com/vitessio/vitess/pull/12059) + * Online DDL: --in-order-completion ddl strategy and logic [#12113](https://github.com/vitessio/vitess/pull/12113) + * schemadiff: TableCharsetCollateStrategy hint [#12137](https://github.com/vitessio/vitess/pull/12137) + * Support BETWEEN in the evalengine [#12150](https://github.com/vitessio/vitess/pull/12150) + * Use schema for the information_schema views [#12171](https://github.com/vitessio/vitess/pull/12171) + * vtgateconn: add DeregisterDialer hook [#12213](https://github.com/vitessio/vitess/pull/12213) +#### VReplication + * VReplication Copy Phase: Parallelize Bulk Inserts [#10828](https://github.com/vitessio/vitess/pull/10828) + * VSCopy: Resume the copy phase consistently from given GTID and lastpk [#11103](https://github.com/vitessio/vitess/pull/11103) + * For partial MoveTables, setup reverse shard routing rules on workflow creation [#11415](https://github.com/vitessio/vitess/pull/11415) + * Use unique rows in copy_state to support parallel replication [#11451](https://github.com/vitessio/vitess/pull/11451) + * Log which tablet copy_state optimization failed on [#11521](https://github.com/vitessio/vitess/pull/11521) + * Allow users to control VReplication DDL handling [#11532](https://github.com/vitessio/vitess/pull/11532) + * VReplication: Defer Secondary Index Creation [#11700](https://github.com/vitessio/vitess/pull/11700) + * VSCopy: Send COPY_COMPLETED events when the copy operation is done [#11740](https://github.com/vitessio/vitess/pull/11740) + * Add `VStreamerCount` stat to `vttablet` [#11978](https://github.com/vitessio/vitess/pull/11978) +#### VTAdmin + * [VTAdmin] `Validate`, `ValidateShard`, `ValidateVersionShard`, `GetFullStatus` [#11438](https://github.com/vitessio/vitess/pull/11438) + * Full Status tab improvements for VTAdmin [#11470](https://github.com/vitessio/vitess/pull/11470) + * [15.0] Add VTGate debug/status page link to VTAdmin [#11541](https://github.com/vitessio/vitess/pull/11541) + * VTAdmin: display workflow type in workflows list [#11685](https://github.com/vitessio/vitess/pull/11685) +#### VTorc + * Timeout Fixes and VTOrc Improvement [#11881](https://github.com/vitessio/vitess/pull/11881) + * Also log error on a failure in DiscoverInstance [#11936](https://github.com/vitessio/vitess/pull/11936) + * VTOrc Code Cleanup - generate_base, replace cluster_name with keyspace and shard. [#12012](https://github.com/vitessio/vitess/pull/12012) + * Move vtorc from go-sqlite3 to modernc.org/sqlite [#12214](https://github.com/vitessio/vitess/pull/12214) +### Feature Request +#### Evalengine + * evalengine: Support built-in MySQL function for string functions and operations [#11185](https://github.com/vitessio/vitess/pull/11185) +#### Query Serving + * Add support for views in vtgate [#11195](https://github.com/vitessio/vitess/pull/11195) + * Add support for Views DDL [#11896](https://github.com/vitessio/vitess/pull/11896) + * notify view change to vtgate [#12115](https://github.com/vitessio/vitess/pull/12115) + * Views Support: Updating Views in VSchema for query serving [#12124](https://github.com/vitessio/vitess/pull/12124) +#### web UI + * [VTAdmin] Topology Browser [#11496](https://github.com/vitessio/vitess/pull/11496) +### Internal Cleanup +#### Backup and Restore + * backup: remove deprecated hook support [#12066](https://github.com/vitessio/vitess/pull/12066) +#### Build/CI + * Update all the Go dependencies [#11741](https://github.com/vitessio/vitess/pull/11741) + * Remove building Docker containers with MariaDB [#12040](https://github.com/vitessio/vitess/pull/12040) + * Add TOC to the summary docs [#12225](https://github.com/vitessio/vitess/pull/12225) +#### CLI + * moved missed flags to pflags in vtgate [#11966](https://github.com/vitessio/vitess/pull/11966) + * Migrate missed vtctld flags to pflag and immediately deprecate them [#11974](https://github.com/vitessio/vitess/pull/11974) + * Remove Dead Legacy Workflow Manager Code [#12085](https://github.com/vitessio/vitess/pull/12085) +#### Cluster management + * Adding deprecate message to backup hooks [#11491](https://github.com/vitessio/vitess/pull/11491) + * Orchestrator Integration Removal and `orc_client_user` removal [#11503](https://github.com/vitessio/vitess/pull/11503) + * [15.0] Deprecate InitShardPrimary command [#11557](https://github.com/vitessio/vitess/pull/11557) + * mysqlctl is a command-line client so remove server flags [#12022](https://github.com/vitessio/vitess/pull/12022) + * Remove replication manager and run VTOrc in all e2e tests [#12149](https://github.com/vitessio/vitess/pull/12149) +#### General + * Improve Codeowners File [#11428](https://github.com/vitessio/vitess/pull/11428) + * Remove example script that caused some confusion [#11529](https://github.com/vitessio/vitess/pull/11529) + * Remove unused ioutil2 code [#11661](https://github.com/vitessio/vitess/pull/11661) + * Fix some linter errors [#11773](https://github.com/vitessio/vitess/pull/11773) + * Remove Deprecated flags, code and stats. [#12083](https://github.com/vitessio/vitess/pull/12083) +#### Governance + * Correct minor inaccuracies in governing docs [#11933](https://github.com/vitessio/vitess/pull/11933) +#### Online DDL + * [cleanup] Explicitly include DDLStrategySetting in the sizegen target [#11857](https://github.com/vitessio/vitess/pull/11857) + * OnlineDDL: avoid schema_migrations AUTO_INCREMENT gaps by pre-checking for existing migration [#12169](https://github.com/vitessio/vitess/pull/12169) +#### Query Serving + * [gen4 planner] Operator refactoring [#11498](https://github.com/vitessio/vitess/pull/11498) + * [gen4]: small refactoring around Compact [#11537](https://github.com/vitessio/vitess/pull/11537) + * change CreatePhysicalOperator to use the rewriteBottomUp() functionality [#11542](https://github.com/vitessio/vitess/pull/11542) + * [refactor planner] Columns and predicates on operators [#11606](https://github.com/vitessio/vitess/pull/11606) + * Move initialization of metrics to be static [#11608](https://github.com/vitessio/vitess/pull/11608) + * planner operators refactoring [#11680](https://github.com/vitessio/vitess/pull/11680) + * sqlparser: new Equality API [#11906](https://github.com/vitessio/vitess/pull/11906) + * sqlparser: `QueryMatchesTemplates` uses canonical string [#11990](https://github.com/vitessio/vitess/pull/11990) + * Move more rewriting to SafeRewrite [#12063](https://github.com/vitessio/vitess/pull/12063) + * store transaction isolation level in upper case [#12099](https://github.com/vitessio/vitess/pull/12099) + * Generating copy-on-rewrite logic [#12135](https://github.com/vitessio/vitess/pull/12135) + * Clean up ColumnType uses [#12139](https://github.com/vitessio/vitess/pull/12139) +#### TabletManager + * Table GC: rely on tm state to determine operation mode [#11972](https://github.com/vitessio/vitess/pull/11972) + * Mark VReplicationExec Client Command as Deprecated [#12070](https://github.com/vitessio/vitess/pull/12070) +#### VReplication + * Leverage pFlag's Changed function to detect user specified flag [#11677](https://github.com/vitessio/vitess/pull/11677) + * VReplication: Remove Deprecated V1 Client Commands [#11705](https://github.com/vitessio/vitess/pull/11705) +#### VTAdmin + * move react-scripts to dev dependencies [#11767](https://github.com/vitessio/vitess/pull/11767) +#### web UI + * [vtctld2] Remove vtctld2 UI and vtctld server components that serve the app UI [#11851](https://github.com/vitessio/vitess/pull/11851) +### 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) +#### Online DDL + * Speedup DDLs by not reloading table size stats [#11601](https://github.com/vitessio/vitess/pull/11601) +#### Query Serving + * DDL: do not Reload() for 'CREATE TEMPORARY' and 'DROP TEMPORARY' statements [#12144](https://github.com/vitessio/vitess/pull/12144) +#### VReplication + * mysql: Improve MySQL 5.6 GTID parsing performance [#11570](https://github.com/vitessio/vitess/pull/11570) +#### vttestserver + * vttestserver: make tablet_refresh_interval configurable and reduce default value [#11918](https://github.com/vitessio/vitess/pull/11918) +### Release +#### Build/CI + * Improve the release process [#12056](https://github.com/vitessio/vitess/pull/12056) + * Use Ubuntu 20.04 for Release Builds [#12202](https://github.com/vitessio/vitess/pull/12202) + * Use Ubuntu 20.04 for Release Builds [#12202](https://github.com/vitessio/vitess/pull/12202) +#### Documentation + * Fix release notes summary links [#11508](https://github.com/vitessio/vitess/pull/11508) + * Release notes summary of `14.0.4` [#11849](https://github.com/vitessio/vitess/pull/11849) + * Release notes for `v15.0.2` [#11963](https://github.com/vitessio/vitess/pull/11963) +#### General + * Release notes for 15.0.0-rc1 and update SNAPSHOT version to 16.0.0 [#11445](https://github.com/vitessio/vitess/pull/11445) + * fix anchors for release notes and summary [#11578](https://github.com/vitessio/vitess/pull/11578) + * update release notes after 15.0 [#11584](https://github.com/vitessio/vitess/pull/11584) + * Mention the `--db-config-*-*` flag in the release notes [#11610](https://github.com/vitessio/vitess/pull/11610) + * Release notes for 15.0.1 [#11850](https://github.com/vitessio/vitess/pull/11850) + * updating summary and release notes for v15.0.1 [#11852](https://github.com/vitessio/vitess/pull/11852) + * [main] Update the release `15.0.2` summary doc (#11954) [#11956](https://github.com/vitessio/vitess/pull/11956) +### Testing +#### Backup and Restore + * go/vt/mysqlctl: add compression benchmarks [#11994](https://github.com/vitessio/vitess/pull/11994) +#### Build/CI + * endtoend: fix race when closing vtgate [#11707](https://github.com/vitessio/vitess/pull/11707) + * [ci issue] Tests are running on older versions that do not support the query [#11923](https://github.com/vitessio/vitess/pull/11923) + * consolidating OnlineDDL 'singleton' tests into 'scheduler' tests: part 1 [#12055](https://github.com/vitessio/vitess/pull/12055) + * Internal: Fix Bad Merge [#12087](https://github.com/vitessio/vitess/pull/12087) + * add debug tooling [#12126](https://github.com/vitessio/vitess/pull/12126) + * Remove the semgrep action [#12148](https://github.com/vitessio/vitess/pull/12148) + * CI cleanup: remove onlineddl_declarative, onlineddl_singleton (cleanup part 2) [#12182](https://github.com/vitessio/vitess/pull/12182) + * Online DDL CI: consolidated revertible and revert CI tests (part 1) [#12183](https://github.com/vitessio/vitess/pull/12183) + * Allow manually kicking off CodeQL [#12200](https://github.com/vitessio/vitess/pull/12200) +#### General + * endtoend: fix dbconfig initialization for endtoend tests [#11609](https://github.com/vitessio/vitess/pull/11609) +#### Query Serving + * Add additional unit test with state changes swapped [#11192](https://github.com/vitessio/vitess/pull/11192) + * Use JSON for plan tests [#11430](https://github.com/vitessio/vitess/pull/11430) + * Add a PRIMARY KEY to the aggregation E2E tests [#11459](https://github.com/vitessio/vitess/pull/11459) + * Change the indexes in `TestEmptyTableAggr` to be unique [#11485](https://github.com/vitessio/vitess/pull/11485) + * Readable plan tests [#11708](https://github.com/vitessio/vitess/pull/11708) + * test: deflake TestQueryTimeoutWithTables [#11772](https://github.com/vitessio/vitess/pull/11772) + * more unit tests for QueryMatchesTemplates() [#11894](https://github.com/vitessio/vitess/pull/11894) + * remove e2e test from partial_keyspace config [#12005](https://github.com/vitessio/vitess/pull/12005) +#### VReplication + * VDiff2: Migrate VDiff1 Unit Tests [#11916](https://github.com/vitessio/vitess/pull/11916) + * VReplication: Test Migrations From MariaDB to MySQL [#12036](https://github.com/vitessio/vitess/pull/12036) + diff --git a/doc/releasenotes/16_0_0_release_notes.md b/doc/releasenotes/16_0_0_release_notes.md index 55b30b03cfc..49f48360813 100644 --- a/doc/releasenotes/16_0_0_release_notes.md +++ b/doc/releasenotes/16_0_0_release_notes.md @@ -1,32 +1,462 @@ -# Release of Vitess v16.0.0 +# Release of Vitess v16.0.0-rc1 +## Summary -## Major Changes +### Table of Contents -### Online DDL +- **[Major Changes](#major-changes)** + - **[VReplication](#vreplication)** + - [VStream Copy Resume](#vstream-copy-resume) + - [VDiff2 GA](#vdiff2-ga) + - **[Tablet throttler](#tablet-throttler)** + - **[Incremental backup and point in time recovery](#inc-backup)** + - **[Replication manager removal and VTOrc becomes mandatory](#repl-manager-removal)** + - **[Breaking Changes](#breaking-changes)** + - [VTGate Advertised MySQL Version](#advertised-mysql-version) + - [Default MySQL version on Docker](#default-mysql-version) + - [vtctld UI Removal](#vtcltd-ui-removal) + - [vtctld Flag Deprecation & Deletions](#vtctld-flag-deprecations) + - [Orchestrator Integration Deletion](#orc-integration-removal) + - [mysqlctl Flags](#mysqlctl-flags) + - [Query Serving Errors](#qs-errors) + - [Logstats Table and Keyspace removed](#logstats-table-keyspace) + - [Removed Stats](#removed-stats) + - [Deprecated Stats](#deprecated-stats) + - [Removed flag](#removed-flag) + - [`lock-timeout` and `remote_operation_timeout` Changes](#lock-timeout-introduction) + - [Normalized labels in the Prometheus Exporter](#normalized-lables) + - **[New command line flags and behavior](#new-flag)** + - [VTGate: Support query timeout --query-timeout](#vtgate-query-timeout) + - [VTTablet: VReplication parallel insert workers --vreplication-parallel-insert-workers](#vrepl-parallel-workers) + - [VTTablet: --queryserver-config-pool-conn-max-lifetime](#queryserver-lifetime) + - [vttablet --throttler-config-via-topo](#vttablet-throttler-config) + - [vtctldclient UpdateThrottlerConfig](#vtctldclient-update-throttler) + - [vtctldclient Backup --incremental_from_pos](#vtctldclient-backup) + - [vtctldclient RestoreFromBackup --restore_to_pos](#vtctldclient-restore-from-backup) + - [New `vexplain` command](#new-vexplain-command) + - **[Important bug fixes](#important-bug-fixes)** + - [Corrupted results for non-full-group-by queries with JOINs](#corrupted-results) + - **[Deprecations and Removals](#deprecations-removals)** + - **[MySQL Compatibility](#mysql-compatibility)** + - [Transaction Isolation Level](#transaction-isolation-level) + - [Transaction Access Mode](#transaction-access-mode) + - [Support for views](#support-views) + - **[VTOrc](#vtorc)** + - [Flag Deprecations](#flag-deprecations) + - **[VTTestServer](#vttestserver)** + - [Performance Improvement](#perf-improvement) +- **[Minor Changes](#minor-changes)** + - **[Backup compression benchmarks](#backup-comp-benchmarks)** +- **[Refactor](#refactor)** + - **[VTTablet sidecar schema maintenance refactor](#vttablet-sidecar-schema)** -#### 'mysql' strategy +## Major Changes -Introducing a new DDL strategy: `mysql`. This strategy is a hybrid between `direct` (which is completely non-Online) and the various online strategies. +### VReplication -A migration submitted with `mysql` strategy is _managed_. That is, it gets a migration UUID. The scheduler queues it, reviews it, runs it. The user may cancel or retry it, much like all Online DDL migrations. The difference is that when the scheduler runs the migration via normal MySQL `CREATE/ALTER/DROP TABLE` statements. +#### VStream Copy Resume -The user may add `ALGORITHM=INPLACE` or `ALGORITHM=INSTANT` as they please, and the scheduler will attempt to run those as is. Some migrations will be completely blocking. See the [MySQL documentation](https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html). In particular, consider that for non-`INSTANT` DDLs, replicas will accumulate substantial lag. +In [PR #11103](https://github.com/vitessio/vitess/pull/11103) we introduced the ability to resume a `VTGate` [`VStream` copy operation](https://vitess.io/docs/design-docs/vreplication/vstream/vscopy/). This is useful when a [`VStream` copy operation](https://vitess.io/docs/design-docs/vreplication/vstream/vscopy/) is interrupted due to e.g. a network failure or a server restart. The `VStream` copy operation can be resumed by specifying each table's last seen primary key value in the `VStream` request. Please see the [`VStream` docs](https://vitess.io/docs/16.0/reference/vreplication/vstream/) for more details. -#### '--in-order-completion' strategy flag +#### VDiff2 GA -A migration that runs with this DDL strategy flag may only complete if no prior migrations are still pending (pending means either `queued`, `ready` or `running` states). +We are marking [VDiff v2](https://vitess.io/docs/16.0/reference/vreplication/vdiff2/) as Generally Available or production-ready in v16. We now recommend that you use v2 rather than v1 going forward. V1 will be deprecated and eventually removed in future releases. +If you wish to use v1 for any reason, you will now need to specify the `--v1` flag. -`--in-order-completion` considers the order by which migrations were submitted. For example: +### Tablet throttler -- In two sequential `ApplySchema` commands, the first is considered to be "earlier" and the second is "later". -- In a single `ApplySchema` command, and with multiple queries in `--sql` command line argument, the order of migrations is the same as the order of SQL statements. +The tablet throttler can now be configured dynamically. Configuration is now found in the topo service, and applies to all tablets in all shards and cells of a given keyspace. For backwards compatibility `v16` still supports `vttablet`-based command line flags for throttler ocnfiguration. -Internally, that order is implied by the `id` column of `_vt.schema_migrations` table. +It is possible to enable/disable, to change throttling threshold as well as the throttler query. -Note that `--in-order-completion` still allows concurrency. In fact, it is designed to work with concurrent migrations. The idea is that many migrations may run concurrently, but the way they finally `complete` is in-order. +See https://github.com/vitessio/vitess/pull/11604 -This lets the user submit multiple migrations which may have some dependencies (for example, introduce two views, one of which reads from the other). As long as the migrations are submitted in a valid order, the user can then expect Vitess to complete the migrations successfully (and in that order). +### Incremental backup and point in time recovery -This strategy flag applies to any `CREATE|DROP TABLE|VIEW` statements, and to `ALTER TABLE` with `vitess|online` strategy. +In [PR #11097](https://github.com/vitessio/vitess/pull/11097) we introduced native incremental backup and point in time recovery: + +- It is possible to take an incremental backup, starting with last known (full or incremental) backup, and up to either a specified (GTID) position, or current ("auto") position. +- The backup is done by copying binary logs. The binary logs are rotated as needed. +- It is then possible to restore a backup up to a given point in time (GTID position). This involves finding a restore path consisting of a full backup and zero or more incremental backups, applied up to the given point in time. +- A server restored to a point in time remains in `DRAINED` tablet type, and does not join the replication stream (thus, "frozen" in time). +- It is possible to take incremental backups from different tablets. It is OK to have overlaps in incremental backup contents. The restore process chooses a valid path, and is valid as long as there are no gaps in the backed up binary log content. + +### Replication manager removal and VTOrc becomes mandatory +VTOrc is now a **required** component of Vitess starting from v16. If the users want VTOrc to manage replication, then they must run VTOrc. +Replication manager is removed from vttablets since the responsibility of fixing replication lies entirely with VTOrc now. +The flag `disable-replication-manager` is deprecated and will be removed in a later release. + +### Breaking Changes + +#### VTGate Advertised MySQL Version + +VTGate now advertises MySQL version 8.0.31. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. +The users can set the `mysql_server_version` flag to advertise the correct version. + +#### Default MySQL version on Docker + +The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the default patch version of the `vitess/lite:mysql80` image goes from `8.0.23` to `8.0.31`. + +#### vtctld UI Removal +In v13, the vtctld UI was deprecated. As of this release, the `web/vtctld2` directory is deleted and the UI will no longer be included in any Vitess images going forward. All build scripts and the Makefile have been updated to reflect this change. + +However, the vtctld HTTP API will remain at `{$vtctld_web_port}/api`. + +#### vtctld Flag Deprecation & Deletions +With the removal of the vtctld UI, the following vtctld flags have been deprecated: +- `--vtctld_show_topology_crud`: This was a flag that controlled the display of CRUD topology actions in the vtctld UI. The UI is removed, so this flag is no longer necessary. + +The following deprecated flags have also been removed: +- `--enable_realtime_stats` +- `--enable_vtctld_ui` +- `--web_dir` +- `--web_dir2` +- `--workflow_manager_init` +- `--workflow_manager_use_election` +- `--workflow_manager_disable` + +#### Orchestrator Integration Deletion + +Orchestrator integration in `vttablet` was deprecated in the previous release and is deleted in this release. +Consider using `VTOrc` instead of `Orchestrator`. + +#### mysqlctl Flags + +The [`mysqlctl` command-line client](https://vitess.io/docs/16.0/reference/programs/mysqlctl/) had some leftover (ignored) server flags after the [v15 pflag work](https://github.com/vitessio/enhancements/blob/main/veps/vep-4.md). Those unused flags have now been removed. If you are using any of the following flags with `mysqlctl` in your scripts or other tooling, they will need to be removed prior to upgrading to v16: + `--port --grpc_auth_static_client_creds --grpc_compression --grpc_initial_conn_window_size --grpc_initial_window_size --grpc_keepalive_time --grpc_keepalive_timeout` + +#### Query Serving Errors + +In this release, we are introducing a new way to report errors from Vitess through the query interface. +Errors will now have an error code for each error, which will make it easy to search for more information on the issue. +For instance, the following error: + +``` +aggregate functions take a single argument 'count(user_id, name)' +``` + +Will be transformed into: + +``` +VT03001: aggregate functions take a single argument 'count(user_id, name)' +``` + +The error code `VT03001` can then be used to search or ask for help and report problems. + +If you have code searching for error strings from Vitess, this is a breaking change. +Many error strings have been tweaked. +If your application is searching for specific errors, you might need to update your code. + +#### Logstats Table and Keyspace removed + +Information about which tables are used is now reported by the field TablesUsed added in v15, that is a string array, listing all tables and which keyspace they are in. +The Table/Keyspace fields were deprecated in v15 and are now removed in the v16 release of Vitess. + +#### Removed Stats + +The stat `QueryRowCounts` is removed in v16. `QueryRowsAffected` and `QueryRowsReturned` can be used instead to gather the same information. + +#### Deprecated Stats + +The stats `QueriesProcessed` and `QueriesRouted` are deprecated in v16. The same information can be inferred from the stats `QueriesProcessedByTable` and `QueriesRoutedByTable` respectively. These stats will be removed in the next release. + +#### Removed flag + +The following flag is removed in v16: +- `enable_semi_sync` + +#### `lock-timeout` and `remote_operation_timeout` Changes + +Earlier, the shard and keyspace locks used to be capped by the `remote_operation_timeout`. This is no longer the case and instead a new flag called `lock-timeout` is introduced. +For backward compatibility, if `lock-timeout` is unspecified and `remote_operation_timeout` flag is provided, then its value will also be used for `lock-timeout` as well. +The default value for `remote_operation_timeout` has also changed from 30 seconds to 15 seconds. The default for the new flag `lock-timeout` is 45 seconds. + +During upgrades, if the users want to preserve the same behaviour as previous releases, then they should provide the `remote_operation_timeout` flag explicitly before upgrading. +After the upgrade, they should then alter their configuration to also specify `lock-timeout` explicitly. + +#### Normalized labels in the Prometheus Exporter + +The Prometheus metrics exporter now properly normalizes _all_ label names into their `snake_case` form, as it is idiomatic for Prometheus metrics. Previously, Vitess instances were emitting inconsistent labels for their metrics, with some of them being `CamelCase` and others being `snake_case`. + +### New command line flags and behavior + +#### VTGate: Support query timeout --query-timeout + +`--query-timeout` allows you to specify a timeout for queries. This timeout is applied to all queries. +It can be overridden by setting the `query_timeout` session variable. +Setting it as command line directive with `QUERY_TIMEOUT_MS` will override other values. + +#### VTTablet: VReplication parallel insert workers --vreplication-parallel-insert-workers + +`--vreplication-parallel-insert-workers=[integer]` enables parallel bulk inserts during the copy phase +of VReplication (disabled by default). When set to a value greater than 1 the bulk inserts — each +executed as a single transaction from the vstream packet contents — may happen in-parallel and +out-of-order, but the commit of those transactions are still serialized in order. + +Other aspects of the VReplication copy-phase logic are preserved: + + 1. All statements executed when processing a vstream packet occur within a single MySQL transaction. + 2. Writes to `_vt.copy_state` always follow their corresponding inserts from within the vstream packet. + 3. The final `commit` for the vstream packet always follows the corresponding write to `_vt.copy_state`. + 4. The vstream packets are committed in the order seen in the stream. So for any PK1 and PK2, the write to `_vt.copy_state` and `commit` steps (steps 2 and 3 above) for PK1 will both precede the `_vt.copy_state` write and commit steps of PK2. + + Other phases, catchup, fast-forward, and replicating/"running", are unchanged. + +#### VTTablet: --queryserver-config-pool-conn-max-lifetime + +`--queryserver-config-pool-conn-max-lifetime=[integer]` allows you to set a timeout on each connection in the query server connection pool. It chooses a random value between its value and twice its value, and when a connection has lived longer than the chosen value, it'll be removed from the pool the next time it's returned to the pool. + +#### vttablet --throttler-config-via-topo + +The flag `--throttler-config-via-topo` switches throttler configuration from `vttablet`-flags to the topo service. This flag is `false` by default, for backwards compatibility. It will default to `true` in future versions. + +#### vtctldclient UpdateThrottlerConfig + +Tablet throttler configuration is now supported in `topo`. Updating the throttler configuration is done via `vtctldclient UpdateThrottlerConfig` and applies to all tablet in all cells for a given keyspace. + +Examples: + +```shell +# disable throttler; all throttler checks will return with "200 OK" +$ vtctldclient UpdateThrottlerConfig --disable commerce + +# enable throttler; checks are responded with appropriate status per current metrics +$ vtctldclient UpdateThrottlerConfig --enable commerce + +# Both enable and set threshold in same command. Since no query is indicated, we assume the default check for replication lag +$ vtctldclient UpdateThrottlerConfig --enable --threshold 5.0 commerce + +# Change threshold. Does not affect enabled/disabled state of the throttler +$ vtctldclient UpdateThrottlerConfig --threshold 1.5 commerce + +# Use a custom query +$ vtctldclient UpdateThrottlerConfig --custom_query "show global status like 'threads_running'" --check_as_check_self --threshold 50 commerce + +# Restore default query and threshold +$ vtctldclient UpdateThrottlerConfig --custom_query "" --check_as_check_shard --threshold 1.5 commerce +``` + +See https://github.com/vitessio/vitess/pull/11604 + +#### vtctldclient Backup --incremental_from_pos + +The `Backup` command now supports `--incremental_from_pos` flag, which can receive a valid position or the value `auto`. For example: + +```shell +$ vtctlclient -- Backup --incremental_from_pos "MySQL56/16b1039f-22b6-11ed-b765-0a43f95f28a3:1-615" zone1-0000000102 +$ vtctlclient -- Backup --incremental_from_pos "auto" zone1-0000000102 +``` + +When the value is `auto`, the position is evaluated as the last successful backup's `Position`. The idea with incremental backups is to create a contiguous (overlaps allowed) sequence of backups that store all changes from last full backup. + +The incremental backup copies binary log files. It does not take MySQL down nor places any locks. It does not interrupt traffic on the MySQL server. The incremental backup copies comlete binlog files. It initially rotates binary logs, then copies anything from the requested position and up to the last completed binary log. + +The backup thus does not necessarily start _exactly_ at the requested position. It starts with the first binary log that has newer entries than requested position. It is OK if the binary logs include transactions prior to the equested position. The restore process will discard any duplicates. + +Normally, you can expect the backups to be precisely contiguous. Consider an `auto` value: due to the nature of log rotation and the fact we copy complete binlog files, the next incremental backup will start with the first binay log not covered by the previous backup, which in itself copied the one previous binlog file in full. Again, it is completely valid to enter any good position. + +The incremental backup fails if it is unable to attain binary logs from given position (ie binary logs have been purged). + +The manifest of an incremental backup has a non-empty `FromPosition` value, and a `Incremental = true` value. + +#### vtctldclient RestoreFromBackup --restore_to_pos + +- `--restore_to_pos`: request to restore the server up to the given position (inclusive) and not one step further. +- `--dry_run`: when `true`, calculate the restore process, if possible, evaluate a path, but exit without actually making any changes to the server. + +Examples: + +```shell +$ vtctlclient -- RestoreFromBackup --restore_to_pos "MySQL56/16b1039f-22b6-11ed-b765-0a43f95f28a3:1-220" zone1-0000000102 +``` + +The restore process seeks a restore _path_: a sequence of backups (handles/manifests) consisting of one full backup followed by zero or more incremental backups, that can bring the server up to the requested position, inclusive. + +The command fails if it cannot evaluate a restore path. Possible reasons: + +- there's gaps in the incremental backups +- existing backups don't reach as far as requested position +- all full backups exceed requested position (so there's no way to get into an ealier position) + +The command outputs the restore path. + +There may be multiple restore paths, the command prefers a path with the least number of backups. This has nothing to say about the amount and size of binary logs involved. + +The `RestoreFromBackup --restore_to_pos` ends with: + +- the restored server in intentionally broken replication setup +- tablet type is `DRAINED` + +#### New `vexplain` command +A new `vexplain` command has been introduced with the following syntax - +``` +VEXPLAIN [ALL|QUERIES|PLAN] explainable_stmt +``` + +This command will help the users look at the plan that vtgate comes up with for the given query (`PLAN` type), see all the queries that are executed on all the MySQL instances (`QUERIES` type), +and see the vtgate plan along with the MySQL explain output for the executed queries (`ALL` type). + +The formats `VTEXPLAIN` and `VITESS` for `EXPLAIN` queries are deprecated, and these newly introduced commands should be used instead. + +### Important bug fixes + +#### Corrupted results for non-full-group-by queries with JOINs + +An issue in versions `<= v14.0.3` and `<= v15.0.0` that generated corrupted results for non-full-group-by queries with a JOIN +is now fixed. The full issue can be found [here](https://github.com/vitessio/vitess/issues/11625), and its fix [here](https://github.com/vitessio/vitess/pull/11633). + +### Deprecations and Removals + +- The V3 planner is deprecated as of the v16 release, and will be removed in the v17 release of Vitess. + +- The [VReplication v1 commands](https://vitess.io/docs/15.0/reference/vreplication/v1/) — which were deprecated in Vitess 11.0 — have been removed. You will need to use the [VReplication v2 commands](https://vitess.io/docs/16.0/reference/vreplication/v2/) instead. + +- The `vtctlclient VExec` command was removed, having been deprecated since v12. + +- The `vtctlclient VReplicationExec` command has now been deprecated and will be removed in a future release. Please see [#12070](https://github.com/vitessio/vitess/pull/12070) for additional details. + +- `vtctlclient OnlineDDL ... [complete|retry|cancel|cancel-all]` returns empty result on success instead of number of shard affected. + +- VTTablet flag `--backup_storage_hook` has been removed, use one of the builtin compression algorithms or `--external-compressor` and `--external-decompressor` instead. + +- vtbackup flag `--backup_storage_hook` has been removed, use one of the builtin compression algorithms or `--external-compressor` and `--external-decompressor` instead. + +- The VTTablet flag `--init_populate_metadata` has been deprecated, since we have deleted the `local_metadata` and `shard_metadata` sidecar database tables. + +- The dead legacy Workflow Manager related code was removed in [#12085](https://github.com/vitessio/vitess/pull/12085). This included the following `vtctl` client commands: `WorkflowAction`, `WorkflowCreate`, `WorkflowWait`, `WorkflowStart`, `WorkflowStop`, `WorkflowTree`, `WorkflowDelete`. + +- VTAdmin's `VTExplain` endpoint has been deprecated. Users can use the new `vexplain` query format instead. The endpoint will be deleted in a future release. + + +### MySQL Compatibility + +#### Transaction Isolation Level + +Support added for `set [session] transaction isolation level ` + +```sql +transaction_characteristic: { + ISOLATION LEVEL level + | access_mode +} + +level: { + REPEATABLE READ + | READ COMMITTED + | READ UNCOMMITTED + | SERIALIZABLE +} +``` + +This will set the transaction isolation level for the current session. +This will be applied to any shard where the session will open a transaction. + +#### Transaction Access Mode + +Support added for `start transaction` with transaction characteristic. + +```sql +START TRANSACTION + [transaction_characteristic [, transaction_characteristic] ...] + +transaction_characteristic: { + WITH CONSISTENT SNAPSHOT + | READ WRITE + | READ ONLY +} +``` + +This will allow users to start a transaction with these characteristics. + +#### Support for views + +Vitess now supports views in sharded keyspace. Views are not created on the underlying database but are logically stored +in vschema. +Any query using a view will get re-written as a derived table during query planning. +VSchema Example + +```json +{ + "sharded": true, + "vindexes": {}, + "tables": {}, + "views": { + "view1": "select * from t1", + "view2": "select * from t2", + } +} +``` + +### VTOrc + +#### Flag Deprecations + +The flag `lock-shard-timeout` has been deprecated. Please use the newly introduced `lock-timeout` instead. More detail [here](#lock-timeout-introduction). + +### VTTestServer + +#### Performance Improvement + +Creating a database with vttestserver was taking ~45 seconds. This can be problematic in test environments where testcases do a lot of `create` and `drop` database. +In an effort to minimize the database creation time, we have changed the value of `tablet_refresh_interval` to 10s while instantiating vtcombo during vttestserver initialization. We have also made this configurable so that it can be reduced further if desired. +For any production cluster the default value of this flag is still [1 minute](https://vitess.io/docs/15.0/reference/programs/vtgate/). Reducing this value might put more stress on Topo Server (since we now read from Topo server more often) but for testing purposes +this shouldn't be a concern. + +## Minor changes + +### Backup compression benchmarks + +Compression benchmarks have been added to the `mysqlctl` package. + +The benchmarks fetch and compress a ~6 GiB tar file containing 3 InnoDB files using different built-in and external compressors. + +Here are sample results from a 2020-era Mac M1 with 16 GiB of memory: + +```sh +$ go test -bench=BenchmarkCompress ./go/vt/mysqlctl -run=NONE -timeout=12h -benchtime=1x -v +goos: darwin +goarch: arm64 +pkg: vitess.io/vitess/go/vt/mysqlctl +BenchmarkCompressLz4Builtin + compression_benchmark_test.go:310: downloading data from https://www.dropbox.com/s/raw/smmgifsooy5qytd/enwiki-20080103-pages-articles.ibd.tar.zst + BenchmarkCompressLz4Builtin-8 1 11737493087 ns/op 577.98 MB/s 2.554 compression-ratio + BenchmarkCompressPargzipBuiltin + BenchmarkCompressPargzipBuiltin-8 1 31083784040 ns/op 218.25 MB/s 2.943 compression-ratio + BenchmarkCompressPgzipBuiltin + BenchmarkCompressPgzipBuiltin-8 1 13325299680 ns/op 509.11 MB/s 2.910 compression-ratio + BenchmarkCompressZstdBuiltin + BenchmarkCompressZstdBuiltin-8 1 18683863911 ns/op 363.09 MB/s 3.150 compression-ratio + BenchmarkCompressZstdExternal + BenchmarkCompressZstdExternal-8 1 10795487675 ns/op 628.41 MB/s 3.093 compression-ratio + BenchmarkCompressZstdExternalFast4 + BenchmarkCompressZstdExternalFast4-8 1 7139319009 ns/op 950.23 MB/s 2.323 compression-ratio + BenchmarkCompressZstdExternalT0 + BenchmarkCompressZstdExternalT0-8 1 4393860434 ns/op 1543.97 MB/s 3.093 compression-ratio + BenchmarkCompressZstdExternalT4 + BenchmarkCompressZstdExternalT4-8 1 4389559744 ns/op 1545.49 MB/s 3.093 compression-ratio + PASS + cleaning up "/var/folders/96/k7gzd7q10zdb749vr02q7sjh0000gn/T/ee7d47b45ef09786c54fa2d7354d2a68.dat" +``` + +## Refactor + +### VTTablet sidecar schema maintenance refactor + +This is an internal refactor and should not change the behavior of Vitess as seen by users. + +Developers will see a difference though: v16 changes the way we maintain vttablet's sidecar database schema (also referred to as the `_vt` +database). Instead of using the `WithDDL` package, introduced in #6348, we use a declarative approach. Users will now have to update +the desired schema in the `go/vt/sidecardb/schema` directory. + +The desired schema is specified, one per table. A new module `sidecardb`, compares this to the existing schema and +performs the required `create` or `alter` to reach it. This is done whenever a primary vttablet starts up. + +The sidecar tables `local_metadata` and `shard_metadata` are no longer in use and all references to them are removed as +part of this refactor. There were used previously for Orchestrator support, which has been superseded by `vtorc`. + +------------ +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/16_0_0_changelog.md). + +The release includes 331 commits (excluding merges) + +Thanks to all our contributors: @EmadMokhtar, @GuptaManan100, @Weijun-H, @WilliamLu99, @ajm188, @arthurschreiber, @arvind-murty, @brendar, @brirams, @dbussink, @deepthi, @dependabot[bot], @draftcode, @ejortegau, @frouioui, @harshit-gangal, @jjh-kim, @johanoskarsson, @kbslvsk, @mattlord, @maxenglander, @mdlayher, @notfelineit, @pbibra, @pudiva, @rohit-nayak-ps, @rsajwani, @shlomi-noach, @systay, @timvaillancourt, @vitess-bot[bot], @vmg, @yoheimuta -It _does not_ apply to `ALTER TABLE` in `gh-ost`, `pt-osc`, `mysql` and `direct` strategies. diff --git a/docker/release.sh b/docker/release.sh index d73b4ec2054..c1e5e71e784 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.0' +vt_base_version='16.0.0-rc1' 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 bf916df0e42..00b0ca0ef5e 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - "15000:$WEB_PORT" - "$GRPC_PORT" @@ -81,7 +81,7 @@ services: condition: service_healthy vtgate: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - "15099:$WEB_PORT" - "$GRPC_PORT" @@ -111,7 +111,7 @@ services: condition: service_healthy schemaload: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 command: - sh - -c @@ -144,12 +144,12 @@ services: environment: - KEYSPACES=$KEYSPACE - GRPC_PORT=15999 - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - .:/script vttablet100: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - "15100:$WEB_PORT" - "$GRPC_PORT" @@ -181,7 +181,7 @@ services: retries: 15 vttablet101: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - "15101:$WEB_PORT" - "$GRPC_PORT" @@ -213,7 +213,7 @@ services: retries: 15 vttablet102: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - "15102:$WEB_PORT" - "$GRPC_PORT" @@ -245,7 +245,7 @@ services: retries: 15 vttablet103: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - "15103:$WEB_PORT" - "$GRPC_PORT" @@ -277,7 +277,7 @@ services: retries: 15 vtorc: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 command: ["sh", "-c", "/script/vtorc-up.sh"] depends_on: - vtctld @@ -307,7 +307,7 @@ services: retries: 15 vreplication: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - ".:/script" environment: diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index 17f9e5fe65e..5d5750caf42 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - .:/script set_keyspace_durability_policy: @@ -115,7 +115,7 @@ services: environment: - KEYSPACES=test_keyspace lookup_keyspace - GRPC_PORT=15999 - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - .:/script vtctld: @@ -143,7 +143,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - 15000:8080 - "15999" @@ -160,7 +160,7 @@ services: --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - 15099:8080 - "15999" @@ -182,7 +182,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - 15302:8080 - "15999" diff --git a/examples/compose/vtcompose/docker-compose.test.yml b/examples/compose/vtcompose/docker-compose.test.yml index a04fa5aa310..1f53ce21c37 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - .:/script set_keyspace_durability_policy_test_keyspace: @@ -117,7 +117,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=test_keyspace - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - .:/script set_keyspace_durability_policy_unsharded_keyspace: @@ -130,7 +130,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=unsharded_keyspace - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - .:/script vtctld: @@ -159,7 +159,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - 15000:8080 - "15999" @@ -176,7 +176,7 @@ services: ''grpc-vtgateservice'' --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - 15099:8080 - "15999" @@ -199,7 +199,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - 15301:8080 - "15999" diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index 709ea5ee352..2543d7ac7e0 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 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:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - "15000:%[1]d" - "%[2]d" @@ -696,7 +696,7 @@ func generateVtgate(opts vtOptions) string { - op: add path: /services/vtgate value: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 ports: - "15099:%[1]d" - "%[2]d" @@ -738,7 +738,7 @@ func generateVTOrc(dbInfo externalDbInfo, keyspaceInfoMap map[string]keyspaceInf - op: add path: /services/vtorc value: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - ".:/script" environment: @@ -763,7 +763,7 @@ func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - op: add path: /services/vreplication value: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - ".:/script" environment: @@ -791,7 +791,7 @@ func generateSetKeyspaceDurabilityPolicy( - op: add path: /services/set_keyspace_durability_policy_%[3]s value: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - ".:/script" environment: @@ -828,7 +828,7 @@ func generateSchemaload( - op: add path: /services/schemaload_%[7]s value: - image: vitess/lite:${VITESS_TAG:-latest} + image: vitess/lite:v16.0.0-rc1 volumes: - ".:/script" environment: diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index b0ff6d467bb..a70a8decee5 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:latest + vtctld: vitess/lite:v16.0.0-rc1 vtadmin: vitess/vtadmin:latest - vtgate: vitess/lite:latest - vttablet: vitess/lite:latest - vtbackup: vitess/lite:latest - vtorc: vitess/lite:latest + vtgate: vitess/lite:v16.0.0-rc1 + vttablet: vitess/lite:v16.0.0-rc1 + vtbackup: vitess/lite:v16.0.0-rc1 + vtorc: vitess/lite:v16.0.0-rc1 mysqld: - mysql56Compatible: vitess/lite:latest + mysql56Compatible: vitess/lite:v16.0.0-rc1 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 fbf5a95946e..dd69c6998d9 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:latest + vtctld: vitess/lite:v16.0.0-rc1 vtadmin: vitess/vtadmin:latest - vtgate: vitess/lite:latest - vttablet: vitess/lite:latest - vtbackup: vitess/lite:latest - vtorc: vitess/lite:latest + vtgate: vitess/lite:v16.0.0-rc1 + vttablet: vitess/lite:v16.0.0-rc1 + vtbackup: vitess/lite:v16.0.0-rc1 + vtorc: vitess/lite:v16.0.0-rc1 mysqld: - mysql56Compatible: vitess/lite:latest + mysql56Compatible: vitess/lite:v16.0.0-rc1 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 0859e8adcd5..e20aea5814b 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:latest + vtctld: vitess/lite:v16.0.0-rc1 vtadmin: vitess/vtadmin:latest - vtgate: vitess/lite:latest - vttablet: vitess/lite:latest - vtbackup: vitess/lite:latest - vtorc: vitess/lite:latest + vtgate: vitess/lite:v16.0.0-rc1 + vttablet: vitess/lite:v16.0.0-rc1 + vtbackup: vitess/lite:v16.0.0-rc1 + vtorc: vitess/lite:v16.0.0-rc1 mysqld: - mysql56Compatible: vitess/lite:latest + mysql56Compatible: vitess/lite:v16.0.0-rc1 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 189c951ca42..e1e9578c944 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:latest + vtctld: vitess/lite:v16.0.0-rc1 vtadmin: vitess/vtadmin:latest - vtgate: vitess/lite:latest - vttablet: vitess/lite:latest - vtbackup: vitess/lite:latest - vtorc: vitess/lite:latest + vtgate: vitess/lite:v16.0.0-rc1 + vttablet: vitess/lite:v16.0.0-rc1 + vtbackup: vitess/lite:v16.0.0-rc1 + vtorc: vitess/lite:v16.0.0-rc1 mysqld: - mysql56Compatible: vitess/lite:latest + mysql56Compatible: vitess/lite:v16.0.0-rc1 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/operator.yaml b/examples/operator/operator.yaml index 9af230a3880..bf393b07426 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:latest + image: planetscale/vitess-operator:v2.9.0-rc1 name: vitess-operator resources: limits: diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index 31f4e26e6a7..f9893bfecc4 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. @@ -14,9 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -// THIS FILE IS AUTO-GENERATED DURING NEW RELEASES -// DO NOT EDIT - package servenv -const versionName = "16.0.0-SNAPSHOT" +// THIS FILE IS AUTO-GENERATED DURING NEW RELEASES BY ./tools/do_releases.sh +// DO NOT EDIT + +const versionName = "16.0.0-rc1" diff --git a/java/client/pom.xml b/java/client/pom.xml index efa409db760..5604620eb0c 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-SNAPSHOT + 16.0.0-rc1 vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 3436995a228..d345700713d 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-SNAPSHOT + 16.0.0-rc1 vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 9a5fd6ca49a..8d1b17c7316 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-SNAPSHOT + 16.0.0-rc1 vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 54321a065e5..d95bc867e55 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-SNAPSHOT + 16.0.0-rc1 vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 4db3730f541..639472506ba 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.0-SNAPSHOT + 16.0.0-rc1 pom Vitess Java Client libraries [Parent] From 4e32ce1a8858f785d80b6596112de5c0a3ae60a0 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 8 Feb 2023 21:06:33 +0530 Subject: [PATCH 004/233] feat: fix release notes (#12276) Signed-off-by: Manan Gupta --- doc/releasenotes/16_0_0_changelog.md | 4 +- doc/releasenotes/16_0_0_release_notes.md | 84 ++++++++++++------------ 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/doc/releasenotes/16_0_0_changelog.md b/doc/releasenotes/16_0_0_changelog.md index 97190048243..53b503bc6e1 100644 --- a/doc/releasenotes/16_0_0_changelog.md +++ b/doc/releasenotes/16_0_0_changelog.md @@ -292,7 +292,7 @@ * Add support for Views DDL [#11896](https://github.com/vitessio/vitess/pull/11896) * notify view change to vtgate [#12115](https://github.com/vitessio/vitess/pull/12115) * Views Support: Updating Views in VSchema for query serving [#12124](https://github.com/vitessio/vitess/pull/12124) -#### web UI +#### Admin Web UI * [VTAdmin] Topology Browser [#11496](https://github.com/vitessio/vitess/pull/11496) ### Internal Cleanup #### Backup and Restore @@ -343,7 +343,7 @@ * VReplication: Remove Deprecated V1 Client Commands [#11705](https://github.com/vitessio/vitess/pull/11705) #### VTAdmin * move react-scripts to dev dependencies [#11767](https://github.com/vitessio/vitess/pull/11767) -#### web UI +#### Admin Web UI * [vtctld2] Remove vtctld2 UI and vtctld server components that serve the app UI [#11851](https://github.com/vitessio/vitess/pull/11851) ### Performance #### Cluster management diff --git a/doc/releasenotes/16_0_0_release_notes.md b/doc/releasenotes/16_0_0_release_notes.md index 49f48360813..514420d53dc 100644 --- a/doc/releasenotes/16_0_0_release_notes.md +++ b/doc/releasenotes/16_0_0_release_notes.md @@ -49,7 +49,7 @@ - **[Refactor](#refactor)** - **[VTTablet sidecar schema maintenance refactor](#vttablet-sidecar-schema)** -## Major Changes +## Major Changes ### VReplication @@ -62,7 +62,7 @@ In [PR #11103](https://github.com/vitessio/vitess/pull/11103) we introduced the We are marking [VDiff v2](https://vitess.io/docs/16.0/reference/vreplication/vdiff2/) as Generally Available or production-ready in v16. We now recommend that you use v2 rather than v1 going forward. V1 will be deprecated and eventually removed in future releases. If you wish to use v1 for any reason, you will now need to specify the `--v1` flag. -### Tablet throttler +### Tablet throttler The tablet throttler can now be configured dynamically. Configuration is now found in the topo service, and applies to all tablets in all shards and cells of a given keyspace. For backwards compatibility `v16` still supports `vttablet`-based command line flags for throttler ocnfiguration. @@ -70,7 +70,7 @@ It is possible to enable/disable, to change throttling threshold as well as the See https://github.com/vitessio/vitess/pull/11604 -### Incremental backup and point in time recovery +### Incremental backup and point in time recovery In [PR #11097](https://github.com/vitessio/vitess/pull/11097) we introduced native incremental backup and point in time recovery: @@ -80,28 +80,28 @@ In [PR #11097](https://github.com/vitessio/vitess/pull/11097) we introduced nati - A server restored to a point in time remains in `DRAINED` tablet type, and does not join the replication stream (thus, "frozen" in time). - It is possible to take incremental backups from different tablets. It is OK to have overlaps in incremental backup contents. The restore process chooses a valid path, and is valid as long as there are no gaps in the backed up binary log content. -### Replication manager removal and VTOrc becomes mandatory +### Replication manager removal and VTOrc becomes mandatory VTOrc is now a **required** component of Vitess starting from v16. If the users want VTOrc to manage replication, then they must run VTOrc. Replication manager is removed from vttablets since the responsibility of fixing replication lies entirely with VTOrc now. The flag `disable-replication-manager` is deprecated and will be removed in a later release. -### Breaking Changes +### Breaking Changes -#### VTGate Advertised MySQL Version +#### VTGate Advertised MySQL Version VTGate now advertises MySQL version 8.0.31. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. The users can set the `mysql_server_version` flag to advertise the correct version. -#### Default MySQL version on Docker +#### Default MySQL version on Docker The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the default patch version of the `vitess/lite:mysql80` image goes from `8.0.23` to `8.0.31`. -#### vtctld UI Removal +#### vtctld web UI Removal In v13, the vtctld UI was deprecated. As of this release, the `web/vtctld2` directory is deleted and the UI will no longer be included in any Vitess images going forward. All build scripts and the Makefile have been updated to reflect this change. However, the vtctld HTTP API will remain at `{$vtctld_web_port}/api`. -#### vtctld Flag Deprecation & Deletions +#### vtctld Flag Deprecation & Deletions With the removal of the vtctld UI, the following vtctld flags have been deprecated: - `--vtctld_show_topology_crud`: This was a flag that controlled the display of CRUD topology actions in the vtctld UI. The UI is removed, so this flag is no longer necessary. @@ -114,17 +114,17 @@ The following deprecated flags have also been removed: - `--workflow_manager_use_election` - `--workflow_manager_disable` -#### Orchestrator Integration Deletion +#### Orchestrator Integration Deletion Orchestrator integration in `vttablet` was deprecated in the previous release and is deleted in this release. Consider using `VTOrc` instead of `Orchestrator`. -#### mysqlctl Flags +#### mysqlctl Flags The [`mysqlctl` command-line client](https://vitess.io/docs/16.0/reference/programs/mysqlctl/) had some leftover (ignored) server flags after the [v15 pflag work](https://github.com/vitessio/enhancements/blob/main/veps/vep-4.md). Those unused flags have now been removed. If you are using any of the following flags with `mysqlctl` in your scripts or other tooling, they will need to be removed prior to upgrading to v16: `--port --grpc_auth_static_client_creds --grpc_compression --grpc_initial_conn_window_size --grpc_initial_window_size --grpc_keepalive_time --grpc_keepalive_timeout` -#### Query Serving Errors +#### Query Serving Errors In this release, we are introducing a new way to report errors from Vitess through the query interface. Errors will now have an error code for each error, which will make it easy to search for more information on the issue. @@ -146,25 +146,25 @@ If you have code searching for error strings from Vitess, this is a breaking cha Many error strings have been tweaked. If your application is searching for specific errors, you might need to update your code. -#### Logstats Table and Keyspace removed +#### Logstats Table and Keyspace removed Information about which tables are used is now reported by the field TablesUsed added in v15, that is a string array, listing all tables and which keyspace they are in. The Table/Keyspace fields were deprecated in v15 and are now removed in the v16 release of Vitess. -#### Removed Stats +#### Removed Stats The stat `QueryRowCounts` is removed in v16. `QueryRowsAffected` and `QueryRowsReturned` can be used instead to gather the same information. -#### Deprecated Stats +#### Deprecated Stats The stats `QueriesProcessed` and `QueriesRouted` are deprecated in v16. The same information can be inferred from the stats `QueriesProcessedByTable` and `QueriesRoutedByTable` respectively. These stats will be removed in the next release. -#### Removed flag +#### Removed flag The following flag is removed in v16: - `enable_semi_sync` -#### `lock-timeout` and `remote_operation_timeout` Changes +#### `lock-timeout` and `remote_operation_timeout` Changes Earlier, the shard and keyspace locks used to be capped by the `remote_operation_timeout`. This is no longer the case and instead a new flag called `lock-timeout` is introduced. For backward compatibility, if `lock-timeout` is unspecified and `remote_operation_timeout` flag is provided, then its value will also be used for `lock-timeout` as well. @@ -173,19 +173,19 @@ The default value for `remote_operation_timeout` has also changed from 30 second During upgrades, if the users want to preserve the same behaviour as previous releases, then they should provide the `remote_operation_timeout` flag explicitly before upgrading. After the upgrade, they should then alter their configuration to also specify `lock-timeout` explicitly. -#### Normalized labels in the Prometheus Exporter +#### Normalized labels in the Prometheus Exporter The Prometheus metrics exporter now properly normalizes _all_ label names into their `snake_case` form, as it is idiomatic for Prometheus metrics. Previously, Vitess instances were emitting inconsistent labels for their metrics, with some of them being `CamelCase` and others being `snake_case`. -### New command line flags and behavior +### New command line flags and behavior -#### VTGate: Support query timeout --query-timeout +#### VTGate: Support query timeout --query-timeout `--query-timeout` allows you to specify a timeout for queries. This timeout is applied to all queries. It can be overridden by setting the `query_timeout` session variable. Setting it as command line directive with `QUERY_TIMEOUT_MS` will override other values. -#### VTTablet: VReplication parallel insert workers --vreplication-parallel-insert-workers +#### VTTablet: VReplication parallel insert workers --vreplication-parallel-insert-workers `--vreplication-parallel-insert-workers=[integer]` enables parallel bulk inserts during the copy phase of VReplication (disabled by default). When set to a value greater than 1 the bulk inserts — each @@ -201,15 +201,15 @@ Other aspects of the VReplication copy-phase logic are preserved: Other phases, catchup, fast-forward, and replicating/"running", are unchanged. -#### VTTablet: --queryserver-config-pool-conn-max-lifetime +#### VTTablet: --queryserver-config-pool-conn-max-lifetime `--queryserver-config-pool-conn-max-lifetime=[integer]` allows you to set a timeout on each connection in the query server connection pool. It chooses a random value between its value and twice its value, and when a connection has lived longer than the chosen value, it'll be removed from the pool the next time it's returned to the pool. -#### vttablet --throttler-config-via-topo +#### vttablet --throttler-config-via-topo The flag `--throttler-config-via-topo` switches throttler configuration from `vttablet`-flags to the topo service. This flag is `false` by default, for backwards compatibility. It will default to `true` in future versions. -#### vtctldclient UpdateThrottlerConfig +#### vtctldclient UpdateThrottlerConfig Tablet throttler configuration is now supported in `topo`. Updating the throttler configuration is done via `vtctldclient UpdateThrottlerConfig` and applies to all tablet in all cells for a given keyspace. @@ -237,7 +237,7 @@ $ vtctldclient UpdateThrottlerConfig --custom_query "" --check_as_check_shard -- See https://github.com/vitessio/vitess/pull/11604 -#### vtctldclient Backup --incremental_from_pos +#### vtctldclient Backup --incremental_from_pos The `Backup` command now supports `--incremental_from_pos` flag, which can receive a valid position or the value `auto`. For example: @@ -258,7 +258,7 @@ The incremental backup fails if it is unable to attain binary logs from given po The manifest of an incremental backup has a non-empty `FromPosition` value, and a `Incremental = true` value. -#### vtctldclient RestoreFromBackup --restore_to_pos +#### vtctldclient RestoreFromBackup --restore_to_pos - `--restore_to_pos`: request to restore the server up to the given position (inclusive) and not one step further. - `--dry_run`: when `true`, calculate the restore process, if possible, evaluate a path, but exit without actually making any changes to the server. @@ -286,7 +286,7 @@ The `RestoreFromBackup --restore_to_pos` ends with: - the restored server in intentionally broken replication setup - tablet type is `DRAINED` -#### New `vexplain` command +#### New `vexplain` command A new `vexplain` command has been introduced with the following syntax - ``` VEXPLAIN [ALL|QUERIES|PLAN] explainable_stmt @@ -297,14 +297,14 @@ and see the vtgate plan along with the MySQL explain output for the executed que The formats `VTEXPLAIN` and `VITESS` for `EXPLAIN` queries are deprecated, and these newly introduced commands should be used instead. -### Important bug fixes +### Important bug fixes -#### Corrupted results for non-full-group-by queries with JOINs +#### Corrupted results for non-full-group-by queries with JOINs An issue in versions `<= v14.0.3` and `<= v15.0.0` that generated corrupted results for non-full-group-by queries with a JOIN is now fixed. The full issue can be found [here](https://github.com/vitessio/vitess/issues/11625), and its fix [here](https://github.com/vitessio/vitess/pull/11633). -### Deprecations and Removals +### Deprecations and Removals - The V3 planner is deprecated as of the v16 release, and will be removed in the v17 release of Vitess. @@ -327,9 +327,9 @@ is now fixed. The full issue can be found [here](https://github.com/vitessio/vit - VTAdmin's `VTExplain` endpoint has been deprecated. Users can use the new `vexplain` query format instead. The endpoint will be deleted in a future release. -### MySQL Compatibility +### MySQL Compatibility -#### Transaction Isolation Level +#### Transaction Isolation Level Support added for `set [session] transaction isolation level ` @@ -350,7 +350,7 @@ level: { This will set the transaction isolation level for the current session. This will be applied to any shard where the session will open a transaction. -#### Transaction Access Mode +#### Transaction Access Mode Support added for `start transaction` with transaction characteristic. @@ -367,7 +367,7 @@ transaction_characteristic: { This will allow users to start a transaction with these characteristics. -#### Support for views +#### Support For Views Vitess now supports views in sharded keyspace. Views are not created on the underlying database but are logically stored in vschema. @@ -386,24 +386,24 @@ VSchema Example } ``` -### VTOrc +### VTOrc -#### Flag Deprecations +#### Flag Deprecations The flag `lock-shard-timeout` has been deprecated. Please use the newly introduced `lock-timeout` instead. More detail [here](#lock-timeout-introduction). -### VTTestServer +### VTTestServer -#### Performance Improvement +#### Performance Improvement Creating a database with vttestserver was taking ~45 seconds. This can be problematic in test environments where testcases do a lot of `create` and `drop` database. In an effort to minimize the database creation time, we have changed the value of `tablet_refresh_interval` to 10s while instantiating vtcombo during vttestserver initialization. We have also made this configurable so that it can be reduced further if desired. For any production cluster the default value of this flag is still [1 minute](https://vitess.io/docs/15.0/reference/programs/vtgate/). Reducing this value might put more stress on Topo Server (since we now read from Topo server more often) but for testing purposes this shouldn't be a concern. -## Minor changes +## Minor changes -### Backup compression benchmarks +### Backup Compression Benchmarks Compression benchmarks have been added to the `mysqlctl` package. @@ -437,9 +437,9 @@ BenchmarkCompressLz4Builtin cleaning up "/var/folders/96/k7gzd7q10zdb749vr02q7sjh0000gn/T/ee7d47b45ef09786c54fa2d7354d2a68.dat" ``` -## Refactor +## Refactor -### VTTablet sidecar schema maintenance refactor +### VTTablet Sidecar Schema Maintenance Refactor This is an internal refactor and should not change the behavior of Vitess as seen by users. From 51a7abf45d0be74d9e21558cab9f2404ece7306f Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 9 Feb 2023 10:44:40 +0530 Subject: [PATCH 005/233] Back to dev mode (#12277) Signed-off-by: Manan Gupta --- 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 c1e5e71e784..9d97a58b7b7 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='16.0.0-rc1' +vt_base_version='16.0.0-SNAPSHOT' debian_versions='buster bullseye' default_debian_version='bullseye' diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index f9893bfecc4..9018096ab32 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 = "16.0.0-rc1" +const versionName = "16.0.0-SNAPSHOT" diff --git a/java/client/pom.xml b/java/client/pom.xml index 5604620eb0c..efa409db760 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-rc1 + 16.0.0-SNAPSHOT vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index d345700713d..3436995a228 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-rc1 + 16.0.0-SNAPSHOT vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 8d1b17c7316..9a5fd6ca49a 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-rc1 + 16.0.0-SNAPSHOT vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index d95bc867e55..54321a065e5 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-rc1 + 16.0.0-SNAPSHOT vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 639472506ba..4db3730f541 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.0-rc1 + 16.0.0-SNAPSHOT pom Vitess Java Client libraries [Parent] From 8c57874f6e8258f1385d63e8c34a83ab5fc0824a Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Thu, 9 Feb 2023 07:26:54 +0100 Subject: [PATCH 006/233] Download mariadb from vitess-resources (#12271) (#12279) * Download mariadb from vitess-resources * Use proper mariadb version increment in tests * Use 10.10.3 instead of LTS --------- Signed-off-by: Florent Poinsard --- go/test/endtoend/vreplication/cluster_test.go | 10 +++++----- .../vreplication/vreplication_test.go | 20 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go/test/endtoend/vreplication/cluster_test.go b/go/test/endtoend/vreplication/cluster_test.go index bbccd674674..43991454b6e 100644 --- a/go/test/endtoend/vreplication/cluster_test.go +++ b/go/test/endtoend/vreplication/cluster_test.go @@ -252,8 +252,8 @@ func downloadDBTypeVersion(dbType string, majorVersion string, path string) erro versionFile = "mysql-8.0.28-linux-glibc2.17-x86_64-minimal.tar.xz" url = "https://dev.mysql.com/get/Downloads/MySQL-8.0/" + versionFile } else if dbType == "mariadb" && majorVersion == "10.10" { - versionFile = "mariadb-10.10.2-linux-systemd-x86_64.tar.gz" - url = "https://ftp.osuosl.org/pub/mariadb/mariadb-10.10.2/bintar-linux-systemd-x86_64/" + versionFile + versionFile = "mariadb-10.10.3-linux-systemd-x86_64.tar.gz" + url = "https://github.com/vitessio/vitess-resources/releases/download/v4.0/" + versionFile } else { return fmt.Errorf("invalid/unsupported major version: %s for database: %s", majorVersion, dbType) } @@ -425,7 +425,7 @@ func (vc *VitessCluster) AddTablet(t testing.TB, cell *Cell, keyspace *Keyspace, "--enable-lag-throttler", "--heartbeat_enable", "--heartbeat_interval", "250ms", - } //FIXME: for multi-cell initial schema doesn't seem to load without "--queryserver-config-schema-reload-time" + } // FIXME: for multi-cell initial schema doesn't seem to load without "--queryserver-config-schema-reload-time" options = append(options, extraVTTabletArgs...) if mainClusterConfig.vreplicationCompressGTID { @@ -570,7 +570,7 @@ func (vc *VitessCluster) DeleteShard(t testing.TB, cellName string, ksName strin tab.Vttablet.TearDown() } log.Infof("Deleting Shard %s", shardName) - //TODO how can we avoid the use of even_if_serving? + // TODO how can we avoid the use of even_if_serving? if output, err := vc.VtctlClient.ExecuteCommandWithOutput("DeleteShard", "--", "--recursive", "--even_if_serving", ksName+"/"+shardName); err != nil { t.Fatalf("DeleteShard command failed with error %+v and output %s\n", err, output) } @@ -615,7 +615,7 @@ func (vc *VitessCluster) teardown(t testing.TB) { } } } - //collect unique keyspaces across cells + // collect unique keyspaces across cells keyspaces := make(map[string]*Keyspace) for _, cell := range vc.Cells { for _, keyspace := range cell.Keyspaces { diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go index d9145cc8185..1875ef6d8f5 100644 --- a/go/test/endtoend/vreplication/vreplication_test.go +++ b/go/test/endtoend/vreplication/vreplication_test.go @@ -781,15 +781,15 @@ func shardCustomer(t *testing.T, testReverse bool, cells []*Cell, sourceCellOrAl matchInsertQuery2 := "insert into customer(`name`, cid) values (:vtg1, :_cid0)" require.False(t, validateThatQueryExecutesOnTablet(t, vtgateConn, productTab, "customer", insertQuery2, matchInsertQuery2)) - insertQuery2 = "insert into customer(name, cid) values('tempCustomer3', 101)" //ID 101, hence due to reverse_bits in shard 80- + insertQuery2 = "insert into customer(name, cid) values('tempCustomer3', 101)" // ID 101, hence due to reverse_bits in shard 80- require.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab2, "customer", insertQuery2, matchInsertQuery2)) - insertQuery2 = "insert into customer(name, cid) values('tempCustomer4', 102)" //ID 102, hence due to reverse_bits in shard -80 + insertQuery2 = "insert into customer(name, cid) values('tempCustomer4', 102)" // ID 102, hence due to reverse_bits in shard -80 require.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab1, "customer", insertQuery2, matchInsertQuery2)) execVtgateQuery(t, vtgateConn, "customer", "update customer set meta = convert(x'7b7d' using utf8mb4) where cid = 1") if testReverse { - //Reverse Replicate + // Reverse Replicate switchReads(t, workflowType, allCellNames, ksWorkflow, true) printShardPositions(vc, ksShards) switchWrites(t, workflowType, ksWorkflow, true) @@ -809,7 +809,7 @@ func shardCustomer(t *testing.T, testReverse bool, cells []*Cell, sourceCellOrAl waitForNoWorkflowLag(t, vc, targetKs, workflow) - //Go forward again + // Go forward again switchReads(t, workflowType, allCellNames, ksWorkflow, false) switchWrites(t, workflowType, ksWorkflow, false) @@ -839,11 +839,11 @@ func shardCustomer(t *testing.T, testReverse bool, cells []*Cell, sourceCellOrAl assert.NoError(t, err, "Customer table not deleted from zone1-200") require.True(t, found) - insertQuery2 = "insert into customer(name, cid) values('tempCustomer8', 103)" //ID 103, hence due to reverse_bits in shard 80- + insertQuery2 = "insert into customer(name, cid) values('tempCustomer8', 103)" // ID 103, hence due to reverse_bits in shard 80- require.False(t, validateThatQueryExecutesOnTablet(t, vtgateConn, productTab, "customer", insertQuery2, matchInsertQuery2)) - insertQuery2 = "insert into customer(name, cid) values('tempCustomer10', 104)" //ID 105, hence due to reverse_bits in shard -80 + insertQuery2 = "insert into customer(name, cid) values('tempCustomer10', 104)" // ID 105, hence due to reverse_bits in shard -80 require.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab1, "customer", insertQuery2, matchInsertQuery2)) - insertQuery2 = "insert into customer(name, cid) values('tempCustomer9', 105)" //ID 104, hence due to reverse_bits in shard 80- + insertQuery2 = "insert into customer(name, cid) values('tempCustomer9', 105)" // ID 104, hence due to reverse_bits in shard 80- require.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab2, "customer", insertQuery2, matchInsertQuery2)) execVtgateQuery(t, vtgateConn, "customer", "delete from customer where name like 'tempCustomer%'") @@ -939,7 +939,7 @@ func reshardMerchant3to1Merge(t *testing.T) { }) } -func reshardCustomer3to2SplitMerge(t *testing.T) { //-40,40-80,80-c0 => merge/split, c0- stays the same ending up with 3 +func reshardCustomer3to2SplitMerge(t *testing.T) { // -40,40-80,80-c0 => merge/split, c0- stays the same ending up with 3 t.Run("reshardCustomer3to2SplitMerge", func(t *testing.T) { ksName := "customer" counts := map[string]int{"zone1-1000": 8, "zone1-1100": 8, "zone1-1200": 5} @@ -947,7 +947,7 @@ func reshardCustomer3to2SplitMerge(t *testing.T) { //-40,40-80,80-c0 => merge/sp }) } -func reshardCustomer3to1Merge(t *testing.T) { //to unsharded +func reshardCustomer3to1Merge(t *testing.T) { // to unsharded t.Run("reshardCustomer3to1Merge", func(t *testing.T) { ksName := "customer" counts := map[string]int{"zone1-1500": 21} @@ -1430,7 +1430,7 @@ func switchWrites(t *testing.T, workflowType, ksWorkflow string, reverse bool) { if output != "" { fmt.Printf("Output of switching writes for %s:\n++++++\n%s\n--------\n", ksWorkflow, output) } - //printSwitchWritesExtraDebug is useful when debugging failures in Switch writes due to corner cases/races + // printSwitchWritesExtraDebug is useful when debugging failures in Switch writes due to corner cases/races _ = printSwitchWritesExtraDebug require.NoError(t, err, fmt.Sprintf("Switch writes Error: %s: %s", err, output)) } From ae796b294c81294326c3ed06faa0ed7599338bf5 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 9 Feb 2023 12:39:08 +0530 Subject: [PATCH 007/233] feat: fix summary and release notes (#12283) Signed-off-by: Manan Gupta --- doc/releasenotes/16_0_0_release_notes.md | 18 ++++- doc/releasenotes/16_0_0_summary.md | 92 ++++++++++++------------ 2 files changed, 62 insertions(+), 48 deletions(-) diff --git a/doc/releasenotes/16_0_0_release_notes.md b/doc/releasenotes/16_0_0_release_notes.md index 514420d53dc..36996f95f82 100644 --- a/doc/releasenotes/16_0_0_release_notes.md +++ b/doc/releasenotes/16_0_0_release_notes.md @@ -13,6 +13,7 @@ - **[Breaking Changes](#breaking-changes)** - [VTGate Advertised MySQL Version](#advertised-mysql-version) - [Default MySQL version on Docker](#default-mysql-version) + - [Running Vitess on the Operator](#running-vitess-on-the-operator) - [vtctld UI Removal](#vtcltd-ui-removal) - [vtctld Flag Deprecation & Deletions](#vtctld-flag-deprecations) - [Orchestrator Integration Deletion](#orc-integration-removal) @@ -89,12 +90,25 @@ The flag `disable-replication-manager` is deprecated and will be removed in a la #### VTGate Advertised MySQL Version -VTGate now advertises MySQL version 8.0.31. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. +VTGate now advertises MySQL version 8.0.30. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. The users can set the `mysql_server_version` flag to advertise the correct version. #### Default MySQL version on Docker -The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the default patch version of the `vitess/lite:mysql80` image goes from `8.0.23` to `8.0.31`. +The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the patch version of MySQL80 has been upgraded from `8.0.23` to `8.0.30`. + +#### Running Vitess on the Operator + +If you are using the vitess-operator and want to remain on MySQL 5.7, we invite you to use the `vitess/lite:v16.0.0-mysql57` Docker Image. + +However, if you are running MySQL 8.0 on the vitess-operator, with for instance `vitess/lite:v15.0.2-mysql80`, considering that we are bumping the patch version of MySQL 80 from `8.0.23` to `8.0.30`, you will have to manually upgrade: + +1. Add `innodb_fast_shutdown=0` to your extra cnf in your YAML file. +2. Apply this file. +3. Wait for all the pods to be healthy. +4. Then change your YAML file to use the new Docker Images (`vitess/lite:v16.0.0`, defaults to mysql80). +5. Remove `innodb_fast_shutdown=0` from your extra cnf in your YAML file. +6. Apply this file. #### vtctld web UI Removal In v13, the vtctld UI was deprecated. As of this release, the `web/vtctld2` directory is deleted and the UI will no longer be included in any Vitess images going forward. All build scripts and the Makefile have been updated to reflect this change. diff --git a/doc/releasenotes/16_0_0_summary.md b/doc/releasenotes/16_0_0_summary.md index 72f5c8c8fc0..bc8ba3f9ed4 100644 --- a/doc/releasenotes/16_0_0_summary.md +++ b/doc/releasenotes/16_0_0_summary.md @@ -49,7 +49,7 @@ - **[Refactor](#refactor)** - **[VTTablet sidecar schema maintenance refactor](#vttablet-sidecar-schema)** -## Major Changes +## Major Changes ### VReplication @@ -62,7 +62,7 @@ In [PR #11103](https://github.com/vitessio/vitess/pull/11103) we introduced the We are marking [VDiff v2](https://vitess.io/docs/16.0/reference/vreplication/vdiff2/) as Generally Available or production-ready in v16. We now recommend that you use v2 rather than v1 going forward. V1 will be deprecated and eventually removed in future releases. If you wish to use v1 for any reason, you will now need to specify the `--v1` flag. -### Tablet throttler +### Tablet throttler The tablet throttler can now be configured dynamically. Configuration is now found in the topo service, and applies to all tablets in all shards and cells of a given keyspace. For backwards compatibility `v16` still supports `vttablet`-based command line flags for throttler ocnfiguration. @@ -70,7 +70,7 @@ It is possible to enable/disable, to change throttling threshold as well as the See https://github.com/vitessio/vitess/pull/11604 -### Incremental backup and point in time recovery +### Incremental backup and point in time recovery In [PR #11097](https://github.com/vitessio/vitess/pull/11097) we introduced native incremental backup and point in time recovery: @@ -80,19 +80,19 @@ In [PR #11097](https://github.com/vitessio/vitess/pull/11097) we introduced nati - A server restored to a point in time remains in `DRAINED` tablet type, and does not join the replication stream (thus, "frozen" in time). - It is possible to take incremental backups from different tablets. It is OK to have overlaps in incremental backup contents. The restore process chooses a valid path, and is valid as long as there are no gaps in the backed up binary log content. -### Replication manager removal and VTOrc becomes mandatory +### Replication manager removal and VTOrc becomes mandatory VTOrc is now a **required** component of Vitess starting from v16. If the users want VTOrc to manage replication, then they must run VTOrc. Replication manager is removed from vttablets since the responsibility of fixing replication lies entirely with VTOrc now. The flag `disable-replication-manager` is deprecated and will be removed in a later release. -### Breaking Changes +### Breaking Changes -#### VTGate Advertised MySQL Version +#### VTGate Advertised MySQL Version VTGate now advertises MySQL version 8.0.30. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. The users can set the `mysql_server_version` flag to advertise the correct version. -#### Default MySQL version on Docker +#### Default MySQL version on Docker The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the patch version of MySQL80 has been upgraded from `8.0.23` to `8.0.30`. @@ -109,12 +109,12 @@ However, if you are running MySQL 8.0 on the vitess-operator, with for instance 5. Remove `innodb_fast_shutdown=0` from your extra cnf in your YAML file. 6. Apply this file. -#### vtctld UI Removal +#### vtctld web UI Removal In v13, the vtctld UI was deprecated. As of this release, the `web/vtctld2` directory is deleted and the UI will no longer be included in any Vitess images going forward. All build scripts and the Makefile have been updated to reflect this change. However, the vtctld HTTP API will remain at `{$vtctld_web_port}/api`. -#### vtctld Flag Deprecation & Deletions +#### vtctld Flag Deprecation & Deletions With the removal of the vtctld UI, the following vtctld flags have been deprecated: - `--vtctld_show_topology_crud`: This was a flag that controlled the display of CRUD topology actions in the vtctld UI. The UI is removed, so this flag is no longer necessary. @@ -127,17 +127,17 @@ The following deprecated flags have also been removed: - `--workflow_manager_use_election` - `--workflow_manager_disable` -#### Orchestrator Integration Deletion +#### Orchestrator Integration Deletion Orchestrator integration in `vttablet` was deprecated in the previous release and is deleted in this release. Consider using `VTOrc` instead of `Orchestrator`. -#### mysqlctl Flags +#### mysqlctl Flags The [`mysqlctl` command-line client](https://vitess.io/docs/16.0/reference/programs/mysqlctl/) had some leftover (ignored) server flags after the [v15 pflag work](https://github.com/vitessio/enhancements/blob/main/veps/vep-4.md). Those unused flags have now been removed. If you are using any of the following flags with `mysqlctl` in your scripts or other tooling, they will need to be removed prior to upgrading to v16: - `--port --grpc_auth_static_client_creds --grpc_compression --grpc_initial_conn_window_size --grpc_initial_window_size --grpc_keepalive_time --grpc_keepalive_timeout` +`--port --grpc_auth_static_client_creds --grpc_compression --grpc_initial_conn_window_size --grpc_initial_window_size --grpc_keepalive_time --grpc_keepalive_timeout` -#### Query Serving Errors +#### Query Serving Errors In this release, we are introducing a new way to report errors from Vitess through the query interface. Errors will now have an error code for each error, which will make it easy to search for more information on the issue. @@ -159,46 +159,46 @@ If you have code searching for error strings from Vitess, this is a breaking cha Many error strings have been tweaked. If your application is searching for specific errors, you might need to update your code. -#### Logstats Table and Keyspace removed +#### Logstats Table and Keyspace removed Information about which tables are used is now reported by the field TablesUsed added in v15, that is a string array, listing all tables and which keyspace they are in. The Table/Keyspace fields were deprecated in v15 and are now removed in the v16 release of Vitess. -#### Removed Stats +#### Removed Stats The stat `QueryRowCounts` is removed in v16. `QueryRowsAffected` and `QueryRowsReturned` can be used instead to gather the same information. -#### Deprecated Stats +#### Deprecated Stats The stats `QueriesProcessed` and `QueriesRouted` are deprecated in v16. The same information can be inferred from the stats `QueriesProcessedByTable` and `QueriesRoutedByTable` respectively. These stats will be removed in the next release. -#### Removed flag +#### Removed flag The following flag is removed in v16: - `enable_semi_sync` -#### `lock-timeout` and `remote_operation_timeout` Changes +#### `lock-timeout` and `remote_operation_timeout` Changes -Earlier, the shard and keyspace locks used to be capped by the `remote_operation_timeout`. This is no longer the case and instead a new flag called `lock-timeout` is introduced. +Earlier, the shard and keyspace locks used to be capped by the `remote_operation_timeout`. This is no longer the case and instead a new flag called `lock-timeout` is introduced. For backward compatibility, if `lock-timeout` is unspecified and `remote_operation_timeout` flag is provided, then its value will also be used for `lock-timeout` as well. The default value for `remote_operation_timeout` has also changed from 30 seconds to 15 seconds. The default for the new flag `lock-timeout` is 45 seconds. During upgrades, if the users want to preserve the same behaviour as previous releases, then they should provide the `remote_operation_timeout` flag explicitly before upgrading. After the upgrade, they should then alter their configuration to also specify `lock-timeout` explicitly. -#### Normalized labels in the Prometheus Exporter +#### Normalized labels in the Prometheus Exporter The Prometheus metrics exporter now properly normalizes _all_ label names into their `snake_case` form, as it is idiomatic for Prometheus metrics. Previously, Vitess instances were emitting inconsistent labels for their metrics, with some of them being `CamelCase` and others being `snake_case`. -### New command line flags and behavior +### New command line flags and behavior -#### VTGate: Support query timeout --query-timeout +#### VTGate: Support query timeout --query-timeout `--query-timeout` allows you to specify a timeout for queries. This timeout is applied to all queries. It can be overridden by setting the `query_timeout` session variable. Setting it as command line directive with `QUERY_TIMEOUT_MS` will override other values. -#### VTTablet: VReplication parallel insert workers --vreplication-parallel-insert-workers +#### VTTablet: VReplication parallel insert workers --vreplication-parallel-insert-workers `--vreplication-parallel-insert-workers=[integer]` enables parallel bulk inserts during the copy phase of VReplication (disabled by default). When set to a value greater than 1 the bulk inserts — each @@ -214,15 +214,15 @@ Other aspects of the VReplication copy-phase logic are preserved: Other phases, catchup, fast-forward, and replicating/"running", are unchanged. -#### VTTablet: --queryserver-config-pool-conn-max-lifetime +#### VTTablet: --queryserver-config-pool-conn-max-lifetime `--queryserver-config-pool-conn-max-lifetime=[integer]` allows you to set a timeout on each connection in the query server connection pool. It chooses a random value between its value and twice its value, and when a connection has lived longer than the chosen value, it'll be removed from the pool the next time it's returned to the pool. -#### vttablet --throttler-config-via-topo +#### vttablet --throttler-config-via-topo The flag `--throttler-config-via-topo` switches throttler configuration from `vttablet`-flags to the topo service. This flag is `false` by default, for backwards compatibility. It will default to `true` in future versions. -#### vtctldclient UpdateThrottlerConfig +#### vtctldclient UpdateThrottlerConfig Tablet throttler configuration is now supported in `topo`. Updating the throttler configuration is done via `vtctldclient UpdateThrottlerConfig` and applies to all tablet in all cells for a given keyspace. @@ -250,7 +250,7 @@ $ vtctldclient UpdateThrottlerConfig --custom_query "" --check_as_check_shard -- See https://github.com/vitessio/vitess/pull/11604 -#### vtctldclient Backup --incremental_from_pos +#### vtctldclient Backup --incremental_from_pos The `Backup` command now supports `--incremental_from_pos` flag, which can receive a valid position or the value `auto`. For example: @@ -271,7 +271,7 @@ The incremental backup fails if it is unable to attain binary logs from given po The manifest of an incremental backup has a non-empty `FromPosition` value, and a `Incremental = true` value. -#### vtctldclient RestoreFromBackup --restore_to_pos +#### vtctldclient RestoreFromBackup --restore_to_pos - `--restore_to_pos`: request to restore the server up to the given position (inclusive) and not one step further. - `--dry_run`: when `true`, calculate the restore process, if possible, evaluate a path, but exit without actually making any changes to the server. @@ -299,7 +299,7 @@ The `RestoreFromBackup --restore_to_pos` ends with: - the restored server in intentionally broken replication setup - tablet type is `DRAINED` -#### New `vexplain` command +#### New `vexplain` command A new `vexplain` command has been introduced with the following syntax - ``` VEXPLAIN [ALL|QUERIES|PLAN] explainable_stmt @@ -310,14 +310,14 @@ and see the vtgate plan along with the MySQL explain output for the executed que The formats `VTEXPLAIN` and `VITESS` for `EXPLAIN` queries are deprecated, and these newly introduced commands should be used instead. -### Important bug fixes +### Important bug fixes -#### Corrupted results for non-full-group-by queries with JOINs +#### Corrupted results for non-full-group-by queries with JOINs An issue in versions `<= v14.0.3` and `<= v15.0.0` that generated corrupted results for non-full-group-by queries with a JOIN is now fixed. The full issue can be found [here](https://github.com/vitessio/vitess/issues/11625), and its fix [here](https://github.com/vitessio/vitess/pull/11633). -### Deprecations and Removals +### Deprecations and Removals - The V3 planner is deprecated as of the v16 release, and will be removed in the v17 release of Vitess. @@ -340,9 +340,9 @@ is now fixed. The full issue can be found [here](https://github.com/vitessio/vit - VTAdmin's `VTExplain` endpoint has been deprecated. Users can use the new `vexplain` query format instead. The endpoint will be deleted in a future release. -### MySQL Compatibility +### MySQL Compatibility -#### Transaction Isolation Level +#### Transaction Isolation Level Support added for `set [session] transaction isolation level ` @@ -360,10 +360,10 @@ level: { } ``` -This will set the transaction isolation level for the current session. +This will set the transaction isolation level for the current session. This will be applied to any shard where the session will open a transaction. -#### Transaction Access Mode +#### Transaction Access Mode Support added for `start transaction` with transaction characteristic. @@ -380,7 +380,7 @@ transaction_characteristic: { This will allow users to start a transaction with these characteristics. -#### Support for views +#### Support For Views Vitess now supports views in sharded keyspace. Views are not created on the underlying database but are logically stored in vschema. @@ -399,24 +399,24 @@ VSchema Example } ``` -### VTOrc +### VTOrc -#### Flag Deprecations +#### Flag Deprecations The flag `lock-shard-timeout` has been deprecated. Please use the newly introduced `lock-timeout` instead. More detail [here](#lock-timeout-introduction). -### VTTestServer +### VTTestServer -#### Performance Improvement +#### Performance Improvement Creating a database with vttestserver was taking ~45 seconds. This can be problematic in test environments where testcases do a lot of `create` and `drop` database. In an effort to minimize the database creation time, we have changed the value of `tablet_refresh_interval` to 10s while instantiating vtcombo during vttestserver initialization. We have also made this configurable so that it can be reduced further if desired. -For any production cluster the default value of this flag is still [1 minute](https://vitess.io/docs/15.0/reference/programs/vtgate/). Reducing this value might put more stress on Topo Server (since we now read from Topo server more often) but for testing purposes +For any production cluster the default value of this flag is still [1 minute](https://vitess.io/docs/15.0/reference/programs/vtgate/). Reducing this value might put more stress on Topo Server (since we now read from Topo server more often) but for testing purposes this shouldn't be a concern. -## Minor changes +## Minor changes -### Backup compression benchmarks +### Backup Compression Benchmarks Compression benchmarks have been added to the `mysqlctl` package. @@ -450,9 +450,9 @@ BenchmarkCompressLz4Builtin cleaning up "/var/folders/96/k7gzd7q10zdb749vr02q7sjh0000gn/T/ee7d47b45ef09786c54fa2d7354d2a68.dat" ``` -## Refactor +## Refactor -### VTTablet sidecar schema maintenance refactor +### VTTablet Sidecar Schema Maintenance Refactor This is an internal refactor and should not change the behavior of Vitess as seen by users. From 236c1476d0a63903b25fcf4c2f30addf602de065 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 21:57:49 +0530 Subject: [PATCH 008/233] feat: fix release script (#12289) Signed-off-by: Manan Gupta Co-authored-by: Manan Gupta --- tools/release_utils.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/release_utils.sh b/tools/release_utils.sh index 7890af0f3fa..41c90a3fe1c 100755 --- a/tools/release_utils.sh +++ b/tools/release_utils.sh @@ -25,7 +25,7 @@ function checkGitState() { } 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 8d77ddfae90f6cbc4d9000b0df60ae914db02f90 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 09:01:21 +0200 Subject: [PATCH 009/233] [release-16.0] Fix aggregation on outer joins (#12298) (#12311) * fix: aggregation coming from right hand side of left join check for null Signed-off-by: Harshit Gangal * test: added a sum test Signed-off-by: Harshit Gangal * addressed review comments Signed-off-by: Harshit Gangal --------- Signed-off-by: Harshit Gangal Co-authored-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/filter_cases.json | 2 +- .../planbuilder/testdata/tpch_cases.json | 18 ++--- 5 files changed, 100 insertions(+), 20 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go index ba9bbd8b19c..6ddc7f981b4 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go @@ -384,3 +384,17 @@ func TestAggregateRandom(t *testing.T) { 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 29e832faf6d..eea1400b916 100644 --- a/go/vt/vtgate/planbuilder/horizon_planning.go +++ b/go/vt/vtgate/planbuilder/horizon_planning.go @@ -381,7 +381,13 @@ func generateAggregateParams(aggrs []operators.Aggr, aggrParamOffsets [][]offset 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 1c46ed4ea7b..f80fa0ec338 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -2926,7 +2926,7 @@ { "OperatorType": "Projection", "Expressions": [ - "[COLUMN 0] * [COLUMN 1] as count(*)" + "[COLUMN 0] * COALESCE([COLUMN 1], INT64(1)) as count(*)" ], "Inputs": [ { @@ -3045,7 +3045,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": [ @@ -3108,7 +3108,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": [ @@ -3170,8 +3170,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]" ], @@ -3804,7 +3804,7 @@ { "OperatorType": "Projection", "Expressions": [ - "[COLUMN 2] * [COLUMN 3] as sum(col)" + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as sum(col)" ], "Inputs": [ { @@ -4063,7 +4063,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": [ @@ -4190,7 +4190,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": [ @@ -4847,7 +4847,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": [ @@ -4904,5 +4904,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" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/filter_cases.json b/go/vt/vtgate/planbuilder/testdata/filter_cases.json index 60b64974c2a..17ffcb7734f 100644 --- a/go/vt/vtgate/planbuilder/testdata/filter_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/filter_cases.json @@ -6610,7 +6610,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as textcol1", - "[COLUMN 1] * [COLUMN 2] as sum(a.id)" + "[COLUMN 1] * COALESCE([COLUMN 2], INT64(1)) as sum(a.id)" ], "Inputs": [ { diff --git a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json index 0f50e9588cd..b403d8469de 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 85e505deb1f0f52a890de8716107cee87bfcdf8a Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 13 Feb 2023 12:39:14 +0530 Subject: [PATCH 010/233] fix: transaction_isolation to be applied at session level (#12281) (#12308) Signed-off-by: Harshit Gangal --- .../endtoend/vtgate/transaction/tx_test.go | 25 +++++++++++++++++++ go/vt/vtgate/engine/fake_vcursor_test.go | 4 ++- go/vt/vtgate/engine/set.go | 2 +- go/vt/vtgate/engine/set_test.go | 3 +++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/go/test/endtoend/vtgate/transaction/tx_test.go b/go/test/endtoend/vtgate/transaction/tx_test.go index 2b63def43ba..8a004277b89 100644 --- a/go/test/endtoend/vtgate/transaction/tx_test.go +++ b/go/test/endtoend/vtgate/transaction/tx_test.go @@ -209,6 +209,31 @@ func TestTransactionAccessModes(t *testing.T) { utils.Exec(t, conn, "rollback") } +// TestTransactionIsolationInTx tests transaction isolation level inside transaction +// and setting isolation level to different values. +func TestTransactionIsolationInTx(t *testing.T) { + ctx := context.Background() + + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + defer conn.Close() + + utils.Exec(t, conn, "set transaction isolation level read committed") + utils.Exec(t, conn, "begin") + utils.AssertMatches(t, conn, "select @@transaction_isolation", `[[VARCHAR("READ-COMMITTED")]]`) + utils.Exec(t, conn, "commit") + + utils.Exec(t, conn, "set transaction isolation level serializable") + utils.Exec(t, conn, "begin") + utils.AssertMatches(t, conn, "select @@transaction_isolation", `[[VARCHAR("SERIALIZABLE")]]`) + utils.Exec(t, conn, "commit") + + utils.Exec(t, conn, "set transaction isolation level read committed") + utils.Exec(t, conn, "begin") + utils.AssertMatches(t, conn, "select @@transaction_isolation", `[[VARCHAR("READ-COMMITTED")]]`) + utils.Exec(t, conn, "commit") +} + func start(t *testing.T) func() { deleteAll := func() { conn, err := mysql.Connect(context.Background(), &vtParams) diff --git a/go/vt/vtgate/engine/fake_vcursor_test.go b/go/vt/vtgate/engine/fake_vcursor_test.go index 702a3a47361..464502f5099 100644 --- a/go/vt/vtgate/engine/fake_vcursor_test.go +++ b/go/vt/vtgate/engine/fake_vcursor_test.go @@ -355,6 +355,8 @@ type loggingVCursor struct { // map different shards to keyspaces in the test. ksShardMap map[string][]string + + shardSession []*srvtopo.ResolvedShard } type tableRoutes struct { @@ -420,7 +422,7 @@ func (f *loggingVCursor) InReservedConn() bool { } func (f *loggingVCursor) ShardSession() []*srvtopo.ResolvedShard { - return nil + return f.shardSession } func (f *loggingVCursor) ExecuteVSchema(context.Context, string, *sqlparser.AlterVschema) error { diff --git a/go/vt/vtgate/engine/set.go b/go/vt/vtgate/engine/set.go index 11fb079ddd4..7b253d5f034 100644 --- a/go/vt/vtgate/engine/set.go +++ b/go/vt/vtgate/engine/set.go @@ -313,7 +313,7 @@ func (svs *SysVarReservedConn) Execute(ctx context.Context, vcursor VCursor, env queries := make([]*querypb.BoundQuery, len(rss)) for i := 0; i < len(rss); i++ { queries[i] = &querypb.BoundQuery{ - Sql: fmt.Sprintf("set @@%s = %s", svs.Name, svs.Expr), + Sql: fmt.Sprintf("set %s = %s", svs.Name, svs.Expr), BindVariables: env.BindVars, } } diff --git a/go/vt/vtgate/engine/set_test.go b/go/vt/vtgate/engine/set_test.go index 0f7e0fd1641..d66b7406187 100644 --- a/go/vt/vtgate/engine/set_test.go +++ b/go/vt/vtgate/engine/set_test.go @@ -23,6 +23,7 @@ import ( "testing" "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/srvtopo" "github.com/stretchr/testify/require" @@ -59,6 +60,7 @@ func TestSetSystemVariableAsString(t *testing.T) { ), "foobar", )}, + shardSession: []*srvtopo.ResolvedShard{{Target: &querypb.Target{Keyspace: "ks", Shard: "-20"}}}, } _, err := set.TryExecute(context.Background(), vc, map[string]*querypb.BindVariable{}, false) require.NoError(t, err) @@ -68,6 +70,7 @@ func TestSetSystemVariableAsString(t *testing.T) { "ExecuteMultiShard ks.-20: select dummy_expr from dual where @@x != dummy_expr {} false false", "SysVar set with (x,'foobar')", "Needs Reserved Conn", + "ExecuteMultiShard ks.-20: set x = dummy_expr {} false false", }) } From cdae7f0992bc2bbdc501b09d9f78e3d57417bbaa 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:20 +0530 Subject: [PATCH 011/233] fix: added null safe operator precendence rule (#12307) 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 dc92d019b61897b99b370ea1f9fd505a5ab0c238 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 15 Feb 2023 17:45:42 +0530 Subject: [PATCH 012/233] add database name to _vt.views table (#12368) Signed-off-by: Harshit Gangal --- go/mysql/schema.go | 18 ++++++++++-------- go/vt/sidecardb/schema/misc/views.sql | 3 ++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/go/mysql/schema.go b/go/mysql/schema.go index 5029dd86ef7..a85d140fef9 100644 --- a/go/mysql/schema.go +++ b/go/mysql/schema.go @@ -88,30 +88,32 @@ order by table_name, ordinal_position` // Views InsertIntoViewsTable = `insert into _vt.views ( + table_schema, table_name, view_definition, - create_statement) values (:table_name, :view_definition, :create_statement)` + create_statement) values (database(), :table_name, :view_definition, :create_statement)` ReplaceIntoViewsTable = `replace into _vt.views ( + table_schema, table_name, view_definition, - create_statement) values (:table_name, :view_definition, :create_statement)` + create_statement) values (database(), :table_name, :view_definition, :create_statement)` UpdateViewsTable = `update _vt.views set view_definition = :view_definition, create_statement = :create_statement - where table_name = :table_name` + where table_schema = database() and table_name = :table_name` - DeleteFromViewsTable = `delete from _vt.views where table_name in ::table_name` + DeleteFromViewsTable = `delete from _vt.views where table_schema = database() and table_name in ::table_name` - SelectFromViewsTable = `select table_name from _vt.views where table_name in ::table_name` + SelectFromViewsTable = `select table_name from _vt.views where table_schema = database() and table_name in ::table_name` - SelectAllViews = `select table_name, updated_at from _vt.views` + SelectAllViews = `select table_name, updated_at from _vt.views where table_schema = database()` // FetchUpdatedViews queries fetches information about updated views - FetchUpdatedViews = `select table_name, view_definition, create_statement from _vt.views where table_name in ::viewnames` + FetchUpdatedViews = `select table_name, view_definition, create_statement from _vt.views where table_schema = database() and table_name in ::viewnames` // FetchViews queries fetches all views - FetchViews = `select table_name, view_definition, create_statement from _vt.views` + FetchViews = `select table_name, view_definition, create_statement from _vt.views where table_schema = database()` ) // BaseShowTablesFields contains the fields returned by a BaseShowTables or a BaseShowTablesForTable command. diff --git a/go/vt/sidecardb/schema/misc/views.sql b/go/vt/sidecardb/schema/misc/views.sql index 1d31a648a1b..bc14b13e74f 100644 --- a/go/vt/sidecardb/schema/misc/views.sql +++ b/go/vt/sidecardb/schema/misc/views.sql @@ -16,9 +16,10 @@ limitations under the License. CREATE TABLE IF NOT EXISTS _vt.views ( + TABLE_SCHEMA varchar(64) NOT NULL, TABLE_NAME varchar(64) NOT NULL, VIEW_DEFINITION longtext NOT NULL, CREATE_STATEMENT longtext NOT NULL, UPDATED_AT TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (TABLE_NAME) + PRIMARY KEY (TABLE_SCHEMA, TABLE_NAME) ) engine = InnoDB From 9b6a4c5034e14d1d737eee82063b8355948e3cf3 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 16 Feb 2023 03:41:41 -0500 Subject: [PATCH 013/233] Examples: Add lib functions to wait for shard states (#12239) (#12278) * Add lib functions to wait for shard states * Fixup region example too * Address minor review comments * Remove extraneous line change * Refactor to remove duplicated files/code Also address shellcheck warnings. * Fix tests that run in CI * Use more robust location detection * Fix backup tests * Exit on shard healthy failure * Remove unused dups and adjust client_test and Dockerfiles --------- Signed-off-by: Matt Lord --- .github/workflows/region_example.yml | 1 - .../upgrade_downgrade_test_backups_manual.yml | 54 +++++------ ...grade_test_backups_manual_next_release.yml | 52 +++++------ docker/local/Dockerfile | 2 +- docker/mini/Dockerfile | 5 +- .../backups/create_commerce_schema.sql | 0 .../backups/create_customer_schema.sql | 0 .../{local => }/backups/restart_tablets.sh | 16 ++-- examples/{local => }/backups/start_cluster.sh | 36 ++++---- examples/{local => }/backups/stop_tablets.sh | 6 +- examples/{local => }/backups/take_backups.sh | 8 +- examples/{local => common}/env.sh | 7 +- examples/common/lib/utils.sh | 90 +++++++++++++++++++ .../{local => common}/scripts/consul-down.sh | 2 +- .../{local => common}/scripts/consul-up.sh | 2 +- .../scripts/etcd-down.sh | 2 +- examples/{local => common}/scripts/etcd-up.sh | 2 +- .../{local => common}/scripts/k3s-down.sh | 4 +- examples/{local => common}/scripts/k3s-up.sh | 9 +- .../scripts/mysqlctl-down.sh | 2 +- .../scripts/mysqlctl-up.sh | 2 +- .../{local => common}/scripts/vtadmin-down.sh | 2 +- .../{local => common}/scripts/vtadmin-up.sh | 7 +- .../scripts/vtctld-down.sh | 2 +- .../scripts/vtctld-up.sh | 2 +- .../scripts/vtgate-down.sh | 2 +- .../{local => common}/scripts/vtgate-up.sh | 2 +- .../{local => common}/scripts/vtorc-down.sh | 2 +- .../{local => common}/scripts/vtorc-up.sh | 5 +- .../scripts/vttablet-down.sh | 2 +- .../{local => common}/scripts/vttablet-up.sh | 2 +- .../scripts/zk-down.sh | 2 +- examples/{local => common}/scripts/zk-up.sh | 2 +- examples/{local => common}/topo-etcd2.sh | 0 examples/{local => common}/topo-k8s.sh | 0 examples/{local => common}/topo-zk2.sh | 0 .../{local => common}/vtadmin/discovery.json | 0 examples/{local => common}/vtadmin/rbac.yaml | 0 examples/{local => common}/vtorc/config.json | 0 examples/local/101_initial_cluster.sh | 42 ++++----- examples/local/201_customer_tablets.sh | 22 ++--- examples/local/202_move_tables.sh | 2 +- examples/local/203_switch_reads.sh | 2 +- examples/local/204_switch_writes.sh | 2 +- examples/local/205_clean_commerce.sh | 2 +- examples/local/301_customer_sharded.sh | 10 +-- examples/local/302_new_shards.sh | 26 ++---- examples/local/303_reshard.sh | 2 +- examples/local/304_switch_reads.sh | 2 +- examples/local/305_switch_writes.sh | 2 +- examples/local/306_down_shard_0.sh | 6 +- examples/local/307_delete_shard_0.sh | 4 +- examples/local/401_teardown.sh | 28 +++--- examples/local/README.md | 4 +- examples/local/scripts/etcd-down.sh | 22 ----- examples/local/scripts/mysqlctl-up.sh | 42 --------- examples/local/scripts/vtctld-down.sh | 22 ----- examples/local/scripts/vtctld-up.sh | 36 -------- examples/local/scripts/vtgate-down.sh | 23 ----- examples/local/scripts/zk-down.sh | 26 ------ examples/local/vtexplain/atomicity_method1.sh | 3 - examples/local/vtexplain/atomicity_method2.sh | 3 - .../vtexplain/atomicity_method2_reads.sh | 3 - .../vtexplain/atomicity_method2_working.sh | 3 - examples/local/vtexplain/atomicity_method3.sh | 4 - .../region_sharding/101_initial_cluster.sh | 35 ++++---- examples/region_sharding/201_main_sharded.sh | 10 +-- examples/region_sharding/202_new_tablets.sh | 27 +++--- examples/region_sharding/203_reshard.sh | 2 +- examples/region_sharding/204_switch_reads.sh | 2 +- examples/region_sharding/205_switch_writes.sh | 2 +- examples/region_sharding/206_down_shard_0.sh | 6 +- .../region_sharding/207_delete_shard_0.sh | 4 +- examples/region_sharding/301_teardown.sh | 26 +++--- examples/region_sharding/README.md | 6 +- examples/region_sharding/env.sh | 83 ----------------- .../region_sharding/main_vschema_sharded.json | 2 +- examples/region_sharding/scripts/etcd-up.sh | 51 ----------- examples/region_sharding/scripts/k3s-down.sh | 30 ------- examples/region_sharding/scripts/k3s-up.sh | 60 ------------- .../region_sharding/scripts/mysqlctl-down.sh | 28 ------ .../region_sharding/scripts/vtadmin-down.sh | 9 -- .../region_sharding/scripts/vtadmin-up.sh | 55 ------------ examples/region_sharding/scripts/vtgate-up.sh | 57 ------------ .../region_sharding/scripts/vtorc-down.sh | 7 -- examples/region_sharding/scripts/vtorc-up.sh | 24 ----- .../region_sharding/scripts/vttablet-down.sh | 30 ------- .../region_sharding/scripts/vttablet-up.sh | 69 -------------- examples/region_sharding/scripts/zk-up.sh | 62 ------------- examples/region_sharding/topo-etcd2.sh | 21 ----- examples/region_sharding/topo-k8s.sh | 21 ----- examples/region_sharding/topo-zk2.sh | 21 ----- .../region_sharding/vtadmin/discovery.json | 18 ---- examples/region_sharding/vtadmin/rbac.yaml | 5 -- examples/region_sharding/vtorc/config.json | 8 -- examples/vtexplain/atomicity_method1.sh | 3 + examples/vtexplain/atomicity_method2.sh | 3 + examples/vtexplain/atomicity_method2_reads.sh | 3 + .../vtexplain/atomicity_method2_working.sh | 3 + examples/vtexplain/atomicity_method3.sh | 4 + .../vtexplain/atomicity_schema.sql | 0 .../vtexplain/atomicity_vschema.json | 0 test/client_test.sh | 24 ++--- test/local_example.sh | 39 ++++---- test/region_example.sh | 4 +- 105 files changed, 381 insertions(+), 1160 deletions(-) rename examples/{local => }/backups/create_commerce_schema.sql (100%) rename examples/{local => }/backups/create_customer_schema.sql (100%) rename examples/{local => }/backups/restart_tablets.sh (80%) rename examples/{local => }/backups/start_cluster.sh (51%) rename examples/{local => }/backups/stop_tablets.sh (88%) rename examples/{local => }/backups/take_backups.sh (81%) rename examples/{local => common}/env.sh (98%) create mode 100644 examples/common/lib/utils.sh rename examples/{local => common}/scripts/consul-down.sh (93%) rename examples/{local => common}/scripts/consul-up.sh (96%) rename examples/{region_sharding => common}/scripts/etcd-down.sh (93%) rename examples/{local => common}/scripts/etcd-up.sh (96%) rename examples/{local => common}/scripts/k3s-down.sh (91%) rename examples/{local => common}/scripts/k3s-up.sh (89%) rename examples/{local => common}/scripts/mysqlctl-down.sh (94%) rename examples/{region_sharding => common}/scripts/mysqlctl-up.sh (95%) rename examples/{local => common}/scripts/vtadmin-down.sh (76%) rename examples/{local => common}/scripts/vtadmin-up.sh (89%) rename examples/{region_sharding => common}/scripts/vtctld-down.sh (92%) rename examples/{region_sharding => common}/scripts/vtctld-up.sh (95%) rename examples/{region_sharding => common}/scripts/vtgate-down.sh (93%) rename examples/{local => common}/scripts/vtgate-up.sh (96%) rename examples/{local => common}/scripts/vtorc-down.sh (60%) rename examples/{local => common}/scripts/vtorc-up.sh (72%) rename examples/{local => common}/scripts/vttablet-down.sh (94%) rename examples/{local => common}/scripts/vttablet-up.sh (97%) rename examples/{region_sharding => common}/scripts/zk-down.sh (93%) rename examples/{local => common}/scripts/zk-up.sh (97%) rename examples/{local => common}/topo-etcd2.sh (100%) rename examples/{local => common}/topo-k8s.sh (100%) rename examples/{local => common}/topo-zk2.sh (100%) rename examples/{local => common}/vtadmin/discovery.json (100%) rename examples/{local => common}/vtadmin/rbac.yaml (100%) rename examples/{local => common}/vtorc/config.json (100%) delete mode 100755 examples/local/scripts/etcd-down.sh delete mode 100755 examples/local/scripts/mysqlctl-up.sh delete mode 100755 examples/local/scripts/vtctld-down.sh delete mode 100755 examples/local/scripts/vtctld-up.sh delete mode 100755 examples/local/scripts/vtgate-down.sh delete mode 100755 examples/local/scripts/zk-down.sh delete mode 100644 examples/local/vtexplain/atomicity_method1.sh delete mode 100644 examples/local/vtexplain/atomicity_method2.sh delete mode 100644 examples/local/vtexplain/atomicity_method2_reads.sh delete mode 100644 examples/local/vtexplain/atomicity_method2_working.sh delete mode 100644 examples/local/vtexplain/atomicity_method3.sh delete mode 100644 examples/region_sharding/env.sh delete mode 100755 examples/region_sharding/scripts/etcd-up.sh delete mode 100755 examples/region_sharding/scripts/k3s-down.sh delete mode 100755 examples/region_sharding/scripts/k3s-up.sh delete mode 100755 examples/region_sharding/scripts/mysqlctl-down.sh delete mode 100755 examples/region_sharding/scripts/vtadmin-down.sh delete mode 100755 examples/region_sharding/scripts/vtadmin-up.sh delete mode 100755 examples/region_sharding/scripts/vtgate-up.sh delete mode 100755 examples/region_sharding/scripts/vtorc-down.sh delete mode 100755 examples/region_sharding/scripts/vtorc-up.sh delete mode 100755 examples/region_sharding/scripts/vttablet-down.sh delete mode 100755 examples/region_sharding/scripts/vttablet-up.sh delete mode 100755 examples/region_sharding/scripts/zk-up.sh delete mode 100644 examples/region_sharding/topo-etcd2.sh delete mode 100644 examples/region_sharding/topo-k8s.sh delete mode 100644 examples/region_sharding/topo-zk2.sh delete mode 100644 examples/region_sharding/vtadmin/discovery.json delete mode 100644 examples/region_sharding/vtadmin/rbac.yaml delete mode 100644 examples/region_sharding/vtorc/config.json create mode 100755 examples/vtexplain/atomicity_method1.sh create mode 100755 examples/vtexplain/atomicity_method2.sh create mode 100755 examples/vtexplain/atomicity_method2_reads.sh create mode 100755 examples/vtexplain/atomicity_method2_working.sh create mode 100755 examples/vtexplain/atomicity_method3.sh rename examples/{local => }/vtexplain/atomicity_schema.sql (100%) rename examples/{local => }/vtexplain/atomicity_vschema.json (100%) diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index 71a303ef38e..ce974c4aebd 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -105,5 +105,4 @@ jobs: if [ ${{matrix.os}} = "macos-latest" ]; then export PATH="/usr/local/opt/mysql@5.7/bin:$PATH" fi - sed -i 's/user\/my-vitess/runner\/work\/vitess\/vitess/g' examples/region_sharding/main_vschema_sharded.json #set correct path to countries.json eatmydata -- go run test.go -print-log -follow -retry=1 region_example diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 2e2490b53b8..6a06378eb74 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -191,18 +191,18 @@ jobs: # We also insert a few rows in our three tables. - name: Create the example Vitess cluster with all components using version N if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 5 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/start_cluster.sh + source build.env ; cd examples/backups + ./start_cluster.sh # Taking a backup - name: Take a backup of all the shards if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 2 + timeout-minutes: 5 run: | - source build.env ; cd examples/local - ./backups/take_backups.sh + source build.env ; cd examples/backups + ./take_backups.sh # We insert more data in every table after the backup. # When we restore the backup made in the previous step, we do not want to see the rows we are about to insert now. @@ -214,7 +214,7 @@ jobs: - name: Insert more data after the backup if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - source build.env ; cd examples/local ; source ./env.sh + source build.env ; cd examples; source ./common/env.sh echo "insert into customer(email) values('new_user_1@domain.com');" | mysql echo "insert into product(sku, description, price) values('SKU-1009', 'description', 89);" | mysql @@ -223,10 +223,10 @@ jobs: # Stop all the tablets and remove their data - name: Stop tablets if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 5 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/stop_tablets.sh + source build.env ; cd examples/backups + ./stop_tablets.sh # We downgrade: we use the version N-1 of vttablet - name: Downgrade - Swap binaries, use VTTablet N-1 @@ -241,18 +241,18 @@ jobs: # Starting the tablets again, they will automatically start restoring the last backup. - name: Start new tablets and restore if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 5 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/restart_tablets.sh + source build.env ; cd examples/backups + ./restart_tablets.sh # give enough time to the tablets to restore the backup - sleep 60 + sleep 90 # Count the number of rows in each table to make sure the restoration is successful. - name: Assert the number of rows in every table if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - source build.env ; cd examples/local ; source ./env.sh + source build.env ; cd examples ; source ./common/env.sh echo "select count(sku) from product;" | mysql 2>&1| grep 2 echo "select count(email) from customer;" | mysql 2>&1| grep 5 @@ -262,7 +262,7 @@ jobs: - name: Insert more rows in the tables if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - source build.env ; cd examples/local ; source ./env.sh + source build.env ; cd examples ; source ./common/env.sh echo "insert into customer(email) values('new_user_2@domain.com');" | mysql echo "insert into product(sku, description, price) values('SKU-1011', 'description', 111);" | mysql @@ -271,18 +271,18 @@ jobs: # Taking a second backup of the cluster. - name: Take a second backup of all the shards if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 2 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/take_backups.sh + source build.env ; cd examples/backups + ./take_backups.sh # Stopping the tablets so we can perform the upgrade. - name: Stop tablets if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 5 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/stop_tablets.sh + source build.env ; cd examples/backups + ./stop_tablets.sh # We upgrade: we swap binaries and use the version N of the tablet. - name: Upgrade - Swap binaries, use VTTablet N @@ -297,18 +297,18 @@ jobs: # Starting the tablets again and restoring the previous backup. - name: Start new tablets and restore if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 5 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/restart_tablets.sh + source build.env ; cd examples/backups + ./restart_tablets.sh # give enough time to the tablets to restore the backup - sleep 60 + sleep 90 # We count the number of rows in every table to check that the restore step was successful. - name: Assert the number of rows in every table if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - source build.env ; cd examples/local ; source ./env.sh + source build.env ; cd examples ; source ./common/env.sh echo "select count(sku) from product;" | mysql 2>&1| grep 3 echo "select count(email) from customer;" | mysql 2>&1| grep 6 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 f58dff29f84..dc9be0d2781 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -194,18 +194,18 @@ jobs: # We also insert a few rows in our three tables. - name: Create the example Vitess cluster with all components using version N if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 5 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/start_cluster.sh + source build.env ; cd examples/backups + ./start_cluster.sh # Taking a backup - name: Take a backup of all the shards if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 2 + timeout-minutes: 5 run: | - source build.env ; cd examples/local - ./backups/take_backups.sh + source build.env ; cd examples/backups + ./take_backups.sh # We insert more data in every table after the backup. # When we restore the backup made in the next step, we do not want to see the rows we are about to insert now. @@ -217,7 +217,7 @@ jobs: - name: Insert more data after the backup if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - source build.env ; cd examples/local ; source ./env.sh + source build.env ; cd examples ; source ./common/env.sh echo "insert into customer(email) values('new_user_1@domain.com');" | mysql echo "insert into product(sku, description, price) values('SKU-1009', 'description', 89);" | mysql @@ -226,10 +226,10 @@ jobs: # Stop all the tablets and remove their data - name: Stop tablets if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 5 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/stop_tablets.sh + source build.env ; cd examples/backups + ./stop_tablets.sh # We downgrade: we use the version N+1 of vttablet - name: Downgrade - Swap binaries, use VTTablet N+1 @@ -244,10 +244,10 @@ jobs: # Starting the tablets again, they will automatically start restoring the last backup. - name: Start new tablets and restore if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 5 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/restart_tablets.sh + source build.env ; cd examples/backups + ./restart_tablets.sh # give enough time to the tablets to restore the backup sleep 60 @@ -255,7 +255,7 @@ jobs: - name: Assert the number of rows in every table if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - source build.env ; cd examples/local ; source ./env.sh + source build.env ; cd examples ; source ./common/env.sh echo "select count(sku) from product;" | mysql 2>&1| grep 2 echo "select count(email) from customer;" | mysql 2>&1| grep 5 @@ -265,7 +265,7 @@ jobs: - name: Insert more rows in the tables if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - source build.env ; cd examples/local ; source ./env.sh + source build.env ; cd examples ; source ./common/env.sh echo "insert into customer(email) values('new_user_2@domain.com');" | mysql echo "insert into product(sku, description, price) values('SKU-1011', 'description', 111);" | mysql @@ -274,18 +274,18 @@ jobs: # Taking a second backup of the cluster. - name: Take a second backup of all the shards if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 2 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/take_backups.sh + source build.env ; cd examples/backups + ./take_backups.sh # Stopping the tablets so we can perform the upgrade. - name: Stop tablets if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 5 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/stop_tablets.sh + source build.env ; cd examples/backups + ./stop_tablets.sh # We upgrade: we swap binaries and use the version N of the tablet. - name: Upgrade - Swap binaries, use VTTablet N @@ -300,18 +300,18 @@ jobs: # Starting the tablets again and restoring the next backup. - name: Start new tablets and restore if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 5 + timeout-minutes: 10 run: | - source build.env ; cd examples/local - ./backups/restart_tablets.sh + source build.env ; cd examples/backups + ./restart_tablets.sh # give enough time to the tablets to restore the backup - sleep 60 + sleep 90 # We count the number of rows in every table to check that the restore step was successful. - name: Assert the number of rows in every table if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - source build.env ; cd examples/local ; source ./env.sh + source build.env ; cd examples ; source ./common/env.sh echo "select count(sku) from product;" | mysql 2>&1| grep 3 echo "select count(email) from customer;" | mysql 2>&1| grep 6 diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index 62e2c68ae10..ec7a1db0f9d 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -12,7 +12,7 @@ RUN /vt/dist/install_dependencies.sh mysql57 COPY docker/local/install_local_dependencies.sh /vt/dist/install_local_dependencies.sh RUN /vt/dist/install_local_dependencies.sh -RUN echo "source /vt/local/env.sh" >> /etc/bash.bashrc +RUN echo "source /vt/common/env.sh" >> /etc/bash.bashrc # Allows some docker builds to disable CGO ARG CGO_ENABLED=0 diff --git a/docker/mini/Dockerfile b/docker/mini/Dockerfile index df299ce8634..f9c14932eb0 100644 --- a/docker/mini/Dockerfile +++ b/docker/mini/Dockerfile @@ -35,8 +35,9 @@ COPY docker/mini/orchestrator-vitess-mini.conf.json /etc/orchestrator.conf.json RUN chown vitess:vitess /etc/orchestrator.conf.json COPY docker/mini/docker-entry /vt/dist/docker/mini/docker-entry -COPY examples/local/scripts /vt/dist/scripts -COPY examples/local/env.sh /vt/dist/scripts/env.sh +COPY examples/common/scripts /vt/dist/scripts +COPY examples/common/env.sh /vt/dist/scripts/env.sh +COPY examples/common/lib/utils.sh /vt/dist/scripts/lib/utils.sh COPY docker/mini/vtctld-mini-up.sh /vt/dist/scripts/vtctld-mini-up.sh COPY docker/mini/vttablet-mini-up.sh /vt/dist/scripts/vttablet-mini-up.sh COPY docker/mini/orchestrator-up.sh /vt/dist/scripts/orchestrator-up.sh diff --git a/examples/local/backups/create_commerce_schema.sql b/examples/backups/create_commerce_schema.sql similarity index 100% rename from examples/local/backups/create_commerce_schema.sql rename to examples/backups/create_commerce_schema.sql diff --git a/examples/local/backups/create_customer_schema.sql b/examples/backups/create_customer_schema.sql similarity index 100% rename from examples/local/backups/create_customer_schema.sql rename to examples/backups/create_customer_schema.sql diff --git a/examples/local/backups/restart_tablets.sh b/examples/backups/restart_tablets.sh similarity index 80% rename from examples/local/backups/restart_tablets.sh rename to examples/backups/restart_tablets.sh index 038fafc5dbf..13c4ed0cfb6 100755 --- a/examples/local/backups/restart_tablets.sh +++ b/examples/backups/restart_tablets.sh @@ -17,21 +17,21 @@ # this script brings up new tablets for the two new shards that we will # be creating in the customer keyspace and copies the schema -source ./env.sh +source ../common/env.sh for i in 100 101 102; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - CELL=zone1 KEYSPACE=commerce TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + CELL=zone1 KEYSPACE=commerce TABLET_UID=$i ../common/scripts/vttablet-up.sh done for i in 200 201 202; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - SHARD=-80 CELL=zone1 KEYSPACE=customer TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + SHARD=-80 CELL=zone1 KEYSPACE=customer TABLET_UID=$i ../common/scripts/vttablet-up.sh done for i in 300 301 302; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - SHARD=80- CELL=zone1 KEYSPACE=customer TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + SHARD=80- CELL=zone1 KEYSPACE=customer TABLET_UID=$i ../common/scripts/vttablet-up.sh done sleep 5 @@ -40,7 +40,7 @@ sleep 5 # complete before we start InitShardPrimary, otherwise we end up reading the # tablet type to RESTORE and do not set semi-sync, which leads to the primary # hanging on writes. -totalTime=300 +totalTime=600 for i in 101 201 301; do while [ $totalTime -gt 0 ]; do status=$(curl "http://$hostname:15$i/debug/status_details") diff --git a/examples/local/backups/start_cluster.sh b/examples/backups/start_cluster.sh similarity index 51% rename from examples/local/backups/start_cluster.sh rename to examples/backups/start_cluster.sh index ff4fdd23342..a9e2de606cb 100755 --- a/examples/local/backups/start_cluster.sh +++ b/examples/backups/start_cluster.sh @@ -17,56 +17,60 @@ # this script brings up new tablets for the two new shards that we will # be creating in the customer keyspace and copies the schema -source ./env.sh +source ../common/env.sh # start topo server if [ "${TOPO}" = "zk2" ]; then - CELL=zone1 ./scripts/zk-up.sh + CELL=zone1 ../common/scripts/zk-up.sh elif [ "${TOPO}" = "k8s" ]; then - CELL=zone1 ./scripts/k3s-up.sh + CELL=zone1 ../common/scripts/k3s-up.sh else - CELL=zone1 ./scripts/etcd-up.sh + CELL=zone1 ../common/scripts/etcd-up.sh fi # start vtctld -CELL=zone1 ./scripts/vtctld-up.sh +CELL=zone1 ../common/scripts/vtctld-up.sh # start vttablets for keyspace commerce for i in 100 101 102; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - CELL=zone1 KEYSPACE=commerce TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + CELL=zone1 KEYSPACE=commerce TABLET_UID=$i ../common/scripts/vttablet-up.sh done # set one of the replicas to primary vtctldclient InitShardPrimary --force commerce/0 zone1-100 # create the schema for commerce -vtctlclient ApplySchema -- --sql-file backups/create_commerce_schema.sql commerce -vtctlclient ApplyVSchema -- --vschema_file ./vschema_commerce_seq.json commerce +vtctlclient ApplySchema -- --sql-file ./create_commerce_schema.sql commerce || fail "Could not apply schema for the commerce keyspace" +vtctlclient ApplyVSchema -- --vschema_file ../local/vschema_commerce_seq.json commerce || fail "Could not apply vschema for the commerce keyspace" # start vttablets for keyspace customer for i in 200 201 202; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - SHARD=-80 CELL=zone1 KEYSPACE=customer TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + SHARD=-80 CELL=zone1 KEYSPACE=customer TABLET_UID=$i ../common/scripts/vttablet-up.sh done for i in 300 301 302; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - SHARD=80- CELL=zone1 KEYSPACE=customer TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + SHARD=80- CELL=zone1 KEYSPACE=customer TABLET_UID=$i ../common/scripts/vttablet-up.sh done # set one of the replicas to primary vtctldclient InitShardPrimary --force customer/-80 zone1-200 vtctldclient InitShardPrimary --force customer/80- zone1-300 +for shard in "-80" "80-"; do + wait_for_healthy_shard customer "${shard}" || exit 1 +done + # create the schema for customer -vtctlclient ApplySchema -- --sql-file backups/create_customer_schema.sql customer -vtctlclient ApplyVSchema -- --vschema_file ./vschema_customer_sharded.json customer +vtctlclient ApplySchema -- --sql-file ./create_customer_schema.sql customer || fail "Could not apply schema for the customer keyspace" +vtctlclient ApplyVSchema -- --vschema_file ../local/vschema_customer_sharded.json customer || fail "Could not apply vschema for the customer keyspace" # start vtgate -CELL=zone1 ./scripts/vtgate-up.sh +CELL=zone1 ../common/scripts/vtgate-up.sh sleep 5 diff --git a/examples/local/backups/stop_tablets.sh b/examples/backups/stop_tablets.sh similarity index 88% rename from examples/local/backups/stop_tablets.sh rename to examples/backups/stop_tablets.sh index 25470ac5491..2a45e9e68d2 100755 --- a/examples/local/backups/stop_tablets.sh +++ b/examples/backups/stop_tablets.sh @@ -17,7 +17,7 @@ # this script brings up new tablets for the two new shards that we will # be creating in the customer keyspace and copies the schema -source ./env.sh +source ../common/env.sh for tablet in 100 200 300; do if vtctlclient --action_timeout 1s --server localhost:15999 GetTablet zone1-$tablet >/dev/null 2>&1; then @@ -25,9 +25,9 @@ for tablet in 100 200 300; do for i in 0 1 2; do uid=$(($tablet + $i)) echo "Shutting down tablet zone1-$uid" - CELL=zone1 TABLET_UID=$uid ./scripts/vttablet-down.sh + CELL=zone1 TABLET_UID=$uid ../common/scripts/vttablet-down.sh echo "Shutting down mysql zone1-$uid" - CELL=zone1 TABLET_UID=$uid ./scripts/mysqlctl-down.sh + CELL=zone1 TABLET_UID=$uid ../common/scripts/mysqlctl-down.sh echo "Removing tablet directory zone1-$uid" vtctlclient DeleteTablet -- --allow_primary=true zone1-$uid rm -Rf $VTDATAROOT/vt_0000000$uid diff --git a/examples/local/backups/take_backups.sh b/examples/backups/take_backups.sh similarity index 81% rename from examples/local/backups/take_backups.sh rename to examples/backups/take_backups.sh index f8544a95b69..dc1b049c9c3 100755 --- a/examples/local/backups/take_backups.sh +++ b/examples/backups/take_backups.sh @@ -17,8 +17,8 @@ # this script brings up new tablets for the two new shards that we will # be creating in the customer keyspace and copies the schema -source ./env.sh +source ../common/env.sh -vtctlclient BackupShard customer/-80 -vtctlclient BackupShard customer/80- -vtctlclient BackupShard commerce/0 +for shard in "customer/-80" "customer/80-" "commerce/0"; do + vtctlclient BackupShard "${shard}" || fail "Failed to backup shard: ${shard}" +done diff --git a/examples/local/env.sh b/examples/common/env.sh similarity index 98% rename from examples/local/env.sh rename to examples/common/env.sh index b6db50a27b9..3b6a23a26cb 100644 --- a/examples/local/env.sh +++ b/examples/common/env.sh @@ -14,15 +14,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +source "$(dirname "${BASH_SOURCE[0]:-$0}")/lib/utils.sh" + hostname=$(hostname -f) vtctld_web_port=15000 export VTDATAROOT="${VTDATAROOT:-${PWD}/vtdataroot}" -function fail() { - echo "ERROR: $1" - exit 1 -} - if [[ $EUID -eq 0 ]]; then fail "This script refuses to be run as root. Please switch to a regular user." fi diff --git a/examples/common/lib/utils.sh b/examples/common/lib/utils.sh new file mode 100644 index 00000000000..ab13e9bc6c4 --- /dev/null +++ b/examples/common/lib/utils.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +# 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. + +# This file contains utility functions that can be used throughout the +# various examples. + +# Wait for the given number of tablets to show up in the topology server +# for the keyspace/shard. Example (wait for 2 tablets in commerce/0): +# wait_for_shard_tablets commerce 0 2 +function wait_for_shard_tablets() { + if [[ -z ${1} || -z ${2} || -z ${3} ]]; then + fail "A keyspace, shard, and number of tablets must be specified when waiting for tablets to come up" + fi + keyspace=${1} + shard=${2} + num_tablets=${3} + wait_secs=180 + + for _ in $(seq 1 ${wait_secs}); do + cur_tablets=$(vtctldclient GetTablets --keyspace "${keyspace}" --shard "${shard}" | wc -l) + if [[ ${cur_tablets} -eq ${num_tablets} ]]; then + break + fi + sleep 1 + done; + + cur_tablets=$(vtctldclient GetTablets --keyspace "${keyspace}" --shard "${shard}" | wc -l) + if [[ ${cur_tablets} -lt ${num_tablets} ]]; then + fail "Timed out after ${wait_secs} seconds waiting for tablets to come up in ${keyspace}/${shard}" + fi +} + +# Wait for a primary tablet to be elected and become healthy and serving +# in the given keyspace/shard. Example: +# wait_for_healthy_shard commerce 0 +function wait_for_healthy_shard_primary() { + if [[ -z ${1} || -z ${2} ]]; then + fail "A keyspace and shard must be specified when waiting for the shard's primary to be healthy" + fi + keyspace=${1} + shard=${2} + healthy_indicator="PRIMARY: Serving" + wait_secs=180 + + for _ in $(seq 1 ${wait_secs}); do + if curl -s "http://$(vtctldclient GetTablets --keyspace "${keyspace}" --shard "${shard}" | grep -i 'primary' | awk '{print $5}')/debug/status_details" | grep -qi "${healthy_indicator}"; then + break + fi + sleep 1 + done; + + curl -s "http://$(vtctldclient GetTablets --keyspace "${keyspace}" --shard "${shard}" | grep -i 'primary' | awk '{print $5}')/debug/status_details" | grep -qi "${healthy_indicator}" \ + || fail "Timed out after ${wait_secs} seconds waiting for a primary tablet to be elected and become healthy in ${keyspace}/${shard}" +} + +# Wait for a specified number of the keyspace/shard's tablets to show up +# in the topology server (3 is the default if no value is specified) and +# then wait for one of the tablets to be promoted to primary and become +# healthy and serving. Example: +# wait_for_healthy_shard commerce 0 +function wait_for_healthy_shard() { + if [[ -z ${1} || -z ${2} ]]; then + fail "A keyspace and shard must be specified when waiting for tablets to come up" + fi + keyspace=${1} + shard=${2} + num_tablets=${3:-3} + + wait_for_shard_tablets "${keyspace}" "${shard}" "${num_tablets}" + wait_for_healthy_shard_primary "${keyspace}" "${shard}" +} + +# Print error message and exit with error code. +function fail() { + echo "ERROR: ${1}" + exit 1 +} diff --git a/examples/local/scripts/consul-down.sh b/examples/common/scripts/consul-down.sh similarity index 93% rename from examples/local/scripts/consul-down.sh rename to examples/common/scripts/consul-down.sh index 6bebb8c72ec..4da5694525a 100755 --- a/examples/local/scripts/consul-down.sh +++ b/examples/common/scripts/consul-down.sh @@ -16,7 +16,7 @@ # This is an example script that stops the consul server started by consul-up.sh. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" echo "Stopping consul..." kill -9 `cat $VTDATAROOT/tmp/consul.pid` diff --git a/examples/local/scripts/consul-up.sh b/examples/common/scripts/consul-up.sh similarity index 96% rename from examples/local/scripts/consul-up.sh rename to examples/common/scripts/consul-up.sh index 4a69d1e1902..584a25f437a 100755 --- a/examples/local/scripts/consul-up.sh +++ b/examples/common/scripts/consul-up.sh @@ -16,7 +16,7 @@ # This is an example script that creates a single-node consul datacenter. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" cell=${CELL:-'test'} consul_http_port=${CONSUL_HTTP_PORT:-'8500'} diff --git a/examples/region_sharding/scripts/etcd-down.sh b/examples/common/scripts/etcd-down.sh similarity index 93% rename from examples/region_sharding/scripts/etcd-down.sh rename to examples/common/scripts/etcd-down.sh index 018af7432a3..f9894f8659c 100755 --- a/examples/region_sharding/scripts/etcd-down.sh +++ b/examples/common/scripts/etcd-down.sh @@ -16,7 +16,7 @@ # This is an example script that stops the etcd servers started by etcd-up.sh. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" echo "Stopping etcd..." kill -9 `cat $VTDATAROOT/tmp/etcd.pid` diff --git a/examples/local/scripts/etcd-up.sh b/examples/common/scripts/etcd-up.sh similarity index 96% rename from examples/local/scripts/etcd-up.sh rename to examples/common/scripts/etcd-up.sh index 5d262217c88..20a16a42260 100755 --- a/examples/local/scripts/etcd-up.sh +++ b/examples/common/scripts/etcd-up.sh @@ -16,7 +16,7 @@ # This is an example script that creates a quorum of Etcd servers. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" cell=${CELL:-'test'} export ETCDCTL_API=2 diff --git a/examples/local/scripts/k3s-down.sh b/examples/common/scripts/k3s-down.sh similarity index 91% rename from examples/local/scripts/k3s-down.sh rename to examples/common/scripts/k3s-down.sh index 590dc604e3e..195b024bf91 100755 --- a/examples/local/scripts/k3s-down.sh +++ b/examples/common/scripts/k3s-down.sh @@ -18,9 +18,7 @@ set -e -# shellcheck source=./env.sh -# shellcheck disable=SC1091 -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" # Stop K3s server. echo "Stopping k3s server..." diff --git a/examples/local/scripts/k3s-up.sh b/examples/common/scripts/k3s-up.sh similarity index 89% rename from examples/local/scripts/k3s-up.sh rename to examples/common/scripts/k3s-up.sh index b2ead1a86d6..7c85cb0ac07 100755 --- a/examples/local/scripts/k3s-up.sh +++ b/examples/common/scripts/k3s-up.sh @@ -19,11 +19,8 @@ set -e cell=${CELL:-'test'} -script_root=$(dirname "${BASH_SOURCE[0]}") - -# shellcheck source=./env.sh -# shellcheck disable=SC1091 -source ./env.sh +script_dir="$(dirname "${BASH_SOURCE[0]:-$0}")" +source "${script_dir}/../env.sh" case $(uname) in Linux) ;; @@ -47,7 +44,7 @@ sleep 15 KUBECTL="k3s kubectl --kubeconfig=${K8S_KUBECONFIG}" # Create the CRD for vitesstopologynodes -$KUBECTL create -f ../../go/vt/topo/k8stopo/VitessTopoNodes-crd.yaml +$KUBECTL create -f "${script_dir}/../../../go/vt/topo/k8stopo/VitessTopoNodes-crd.yaml" # Add the CellInfo description for the cell set +e diff --git a/examples/local/scripts/mysqlctl-down.sh b/examples/common/scripts/mysqlctl-down.sh similarity index 94% rename from examples/local/scripts/mysqlctl-down.sh rename to examples/common/scripts/mysqlctl-down.sh index 812558d6ca8..b2dee4e2119 100755 --- a/examples/local/scripts/mysqlctl-down.sh +++ b/examples/common/scripts/mysqlctl-down.sh @@ -17,7 +17,7 @@ # This is an example script that stops the mysqld and vttablet instances # created by vttablet-up.sh -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" cell=${CELL:-'test'} uid=$TABLET_UID diff --git a/examples/region_sharding/scripts/mysqlctl-up.sh b/examples/common/scripts/mysqlctl-up.sh similarity index 95% rename from examples/region_sharding/scripts/mysqlctl-up.sh rename to examples/common/scripts/mysqlctl-up.sh index ae041cf951d..d9df27ccdc0 100755 --- a/examples/region_sharding/scripts/mysqlctl-up.sh +++ b/examples/common/scripts/mysqlctl-up.sh @@ -16,7 +16,7 @@ # This is an example script that creates a single shard vttablet deployment. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" cell=${CELL:-'test'} uid=$TABLET_UID diff --git a/examples/local/scripts/vtadmin-down.sh b/examples/common/scripts/vtadmin-down.sh similarity index 76% rename from examples/local/scripts/vtadmin-down.sh rename to examples/common/scripts/vtadmin-down.sh index 2a7944d9d5a..011e6da7f49 100755 --- a/examples/local/scripts/vtadmin-down.sh +++ b/examples/common/scripts/vtadmin-down.sh @@ -1,6 +1,6 @@ #!/bin/bash -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" echo "Stopping vtadmin-web..." kill -9 "$(cat "$VTDATAROOT/tmp/vtadmin-web.pid")" diff --git a/examples/local/scripts/vtadmin-up.sh b/examples/common/scripts/vtadmin-up.sh similarity index 89% rename from examples/local/scripts/vtadmin-up.sh rename to examples/common/scripts/vtadmin-up.sh index 5ee04c9a959..8f3caf39c15 100755 --- a/examples/local/scripts/vtadmin-up.sh +++ b/examples/common/scripts/vtadmin-up.sh @@ -1,9 +1,10 @@ #!/bin/bash -source ./env.sh +script_dir="$(dirname "${BASH_SOURCE[0]:-$0}")" +source "${script_dir}/../env.sh" log_dir="${VTDATAROOT}/tmp" -web_dir="../../web/vtadmin" +web_dir="${script_dir}/../../../web/vtadmin" vtadmin_api_port=14200 vtadmin_web_port=14201 @@ -18,7 +19,7 @@ vtadmin \ --logtostderr \ --alsologtostderr \ --rbac \ - --rbac-config="./vtadmin/rbac.yaml" \ + --rbac-config="${script_dir}/../vtadmin/rbac.yaml" \ --cluster "id=local,name=local,discovery=staticfile,discovery-staticfile-path=./vtadmin/discovery.json,tablet-fqdn-tmpl={{ .Tablet.Hostname }}:15{{ .Tablet.Alias.Uid }}" \ > "${log_dir}/vtadmin-api.out" 2>&1 & diff --git a/examples/region_sharding/scripts/vtctld-down.sh b/examples/common/scripts/vtctld-down.sh similarity index 92% rename from examples/region_sharding/scripts/vtctld-down.sh rename to examples/common/scripts/vtctld-down.sh index d96fa3b927f..a56d59b97e5 100755 --- a/examples/region_sharding/scripts/vtctld-down.sh +++ b/examples/common/scripts/vtctld-down.sh @@ -16,7 +16,7 @@ # This is an example script that stops vtctld. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" echo "Stopping vtctld..." kill -9 `cat $VTDATAROOT/tmp/vtctld.pid` diff --git a/examples/region_sharding/scripts/vtctld-up.sh b/examples/common/scripts/vtctld-up.sh similarity index 95% rename from examples/region_sharding/scripts/vtctld-up.sh rename to examples/common/scripts/vtctld-up.sh index 5ab8017424c..e49b346ca1e 100755 --- a/examples/region_sharding/scripts/vtctld-up.sh +++ b/examples/common/scripts/vtctld-up.sh @@ -16,7 +16,7 @@ # This is an example script that starts vtctld. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" cell=${CELL:-'test'} grpc_port=15999 diff --git a/examples/region_sharding/scripts/vtgate-down.sh b/examples/common/scripts/vtgate-down.sh similarity index 93% rename from examples/region_sharding/scripts/vtgate-down.sh rename to examples/common/scripts/vtgate-down.sh index 9da0a7179df..3eea5fdf94d 100755 --- a/examples/region_sharding/scripts/vtgate-down.sh +++ b/examples/common/scripts/vtgate-down.sh @@ -16,7 +16,7 @@ # This is an example script that stops the instance started by vtgate-up.sh. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" # Stop vtgate. echo "Stopping vtgate..." diff --git a/examples/local/scripts/vtgate-up.sh b/examples/common/scripts/vtgate-up.sh similarity index 96% rename from examples/local/scripts/vtgate-up.sh rename to examples/common/scripts/vtgate-up.sh index cb33e27839b..03b85869e5d 100755 --- a/examples/local/scripts/vtgate-up.sh +++ b/examples/common/scripts/vtgate-up.sh @@ -16,7 +16,7 @@ # This is an example script that starts a single vtgate. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" cell=${CELL:-'test'} web_port=15001 diff --git a/examples/local/scripts/vtorc-down.sh b/examples/common/scripts/vtorc-down.sh similarity index 60% rename from examples/local/scripts/vtorc-down.sh rename to examples/common/scripts/vtorc-down.sh index 2fdfc1491ce..f4d2e4cb8a0 100755 --- a/examples/local/scripts/vtorc-down.sh +++ b/examples/common/scripts/vtorc-down.sh @@ -1,6 +1,6 @@ #!/bin/bash -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" echo "Stopping vtorc." kill -9 "$(cat "$VTDATAROOT/tmp/vtorc.pid")" diff --git a/examples/local/scripts/vtorc-up.sh b/examples/common/scripts/vtorc-up.sh similarity index 72% rename from examples/local/scripts/vtorc-up.sh rename to examples/common/scripts/vtorc-up.sh index f5a0d75dbba..66a826da288 100755 --- a/examples/local/scripts/vtorc-up.sh +++ b/examples/common/scripts/vtorc-up.sh @@ -1,6 +1,7 @@ #!/bin/bash -source ./env.sh +script_dir="$(dirname "${BASH_SOURCE[0]:-$0}")" +source "${script_dir}/../env.sh" log_dir="${VTDATAROOT}/tmp" port=16000 @@ -9,7 +10,7 @@ vtorc \ $TOPOLOGY_FLAGS \ --logtostderr \ --alsologtostderr \ - --config="./vtorc/config.json" \ + --config="${script_dir}/../vtorc/config.json" \ --port $port \ > "${log_dir}/vtorc.out" 2>&1 & diff --git a/examples/local/scripts/vttablet-down.sh b/examples/common/scripts/vttablet-down.sh similarity index 94% rename from examples/local/scripts/vttablet-down.sh rename to examples/common/scripts/vttablet-down.sh index 47b881b9793..3de266def76 100755 --- a/examples/local/scripts/vttablet-down.sh +++ b/examples/common/scripts/vttablet-down.sh @@ -17,7 +17,7 @@ # This is an example script that stops the mysqld and vttablet instances # created by vttablet-up.sh -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" printf -v tablet_dir 'vt_%010d' $TABLET_UID pid=`cat $VTDATAROOT/$tablet_dir/vttablet.pid` diff --git a/examples/local/scripts/vttablet-up.sh b/examples/common/scripts/vttablet-up.sh similarity index 97% rename from examples/local/scripts/vttablet-up.sh rename to examples/common/scripts/vttablet-up.sh index 43d0849ce76..0e70837d235 100755 --- a/examples/local/scripts/vttablet-up.sh +++ b/examples/common/scripts/vttablet-up.sh @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" cell=${CELL:-'test'} keyspace=${KEYSPACE:-'test_keyspace'} diff --git a/examples/region_sharding/scripts/zk-down.sh b/examples/common/scripts/zk-down.sh similarity index 93% rename from examples/region_sharding/scripts/zk-down.sh rename to examples/common/scripts/zk-down.sh index 18dd7933bc9..a9fa1e80a30 100755 --- a/examples/region_sharding/scripts/zk-down.sh +++ b/examples/common/scripts/zk-down.sh @@ -16,7 +16,7 @@ # This is an example script that stops the ZooKeeper servers started by zk-up.sh. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" # Stop ZooKeeper servers. echo "Stopping zk servers..." diff --git a/examples/local/scripts/zk-up.sh b/examples/common/scripts/zk-up.sh similarity index 97% rename from examples/local/scripts/zk-up.sh rename to examples/common/scripts/zk-up.sh index d689e167988..519d5305b25 100755 --- a/examples/local/scripts/zk-up.sh +++ b/examples/common/scripts/zk-up.sh @@ -16,7 +16,7 @@ # This is an example script that creates a quorum of ZooKeeper servers. -source ./env.sh +source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" cell=${CELL:-'test'} diff --git a/examples/local/topo-etcd2.sh b/examples/common/topo-etcd2.sh similarity index 100% rename from examples/local/topo-etcd2.sh rename to examples/common/topo-etcd2.sh diff --git a/examples/local/topo-k8s.sh b/examples/common/topo-k8s.sh similarity index 100% rename from examples/local/topo-k8s.sh rename to examples/common/topo-k8s.sh diff --git a/examples/local/topo-zk2.sh b/examples/common/topo-zk2.sh similarity index 100% rename from examples/local/topo-zk2.sh rename to examples/common/topo-zk2.sh diff --git a/examples/local/vtadmin/discovery.json b/examples/common/vtadmin/discovery.json similarity index 100% rename from examples/local/vtadmin/discovery.json rename to examples/common/vtadmin/discovery.json diff --git a/examples/local/vtadmin/rbac.yaml b/examples/common/vtadmin/rbac.yaml similarity index 100% rename from examples/local/vtadmin/rbac.yaml rename to examples/common/vtadmin/rbac.yaml diff --git a/examples/local/vtorc/config.json b/examples/common/vtorc/config.json similarity index 100% rename from examples/local/vtorc/config.json rename to examples/common/vtorc/config.json diff --git a/examples/local/101_initial_cluster.sh b/examples/local/101_initial_cluster.sh index a14fa142e4b..ffa24d7f98e 100755 --- a/examples/local/101_initial_cluster.sh +++ b/examples/local/101_initial_cluster.sh @@ -17,57 +17,47 @@ # this script brings up zookeeper and all the vitess components # required for a single shard deployment. -source ./env.sh +source ../common/env.sh # start topo server if [ "${TOPO}" = "zk2" ]; then - CELL=zone1 ./scripts/zk-up.sh + CELL=zone1 ../common/scripts/zk-up.sh elif [ "${TOPO}" = "k8s" ]; then - CELL=zone1 ./scripts/k3s-up.sh + CELL=zone1 ../common/scripts/k3s-up.sh elif [ "${TOPO}" = "consul" ]; then - CELL=zone1 ./scripts/consul-up.sh + CELL=zone1 ../common/scripts/consul-up.sh else - CELL=zone1 ./scripts/etcd-up.sh + CELL=zone1 ../common/scripts/etcd-up.sh fi # start vtctld -CELL=zone1 ./scripts/vtctld-up.sh +CELL=zone1 ../common/scripts/vtctld-up.sh # start vttablets for keyspace commerce for i in 100 101 102; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - CELL=zone1 KEYSPACE=commerce TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + CELL=zone1 KEYSPACE=commerce TABLET_UID=$i ../common/scripts/vttablet-up.sh done # set the correct durability policy for the keyspace -vtctldclient --server localhost:15999 SetKeyspaceDurabilityPolicy --durability-policy=semi_sync commerce +vtctldclient --server localhost:15999 SetKeyspaceDurabilityPolicy --durability-policy=semi_sync commerce || fail "Failed to set keyspace durability policy on the commerce keyspace" # start vtorc -./scripts/vtorc-up.sh +../common/scripts/vtorc-up.sh # Wait for all the tablets to be up and registered in the topology server -for _ in $(seq 0 200); do - vtctldclient GetTablets --keyspace commerce --shard 0 | wc -l | grep -q "3" && break - sleep 1 -done; -vtctldclient GetTablets --keyspace commerce --shard 0 | wc -l | grep -q "3" || (echo "Timed out waiting for tablets to be up in commerce/0" && exit 1) - -# Wait for a primary tablet to be elected in the shard -for _ in $(seq 0 200); do - vtctldclient GetTablets --keyspace commerce --shard 0 | grep -q "primary" && break - sleep 1 -done; -vtctldclient GetTablets --keyspace commerce --shard 0 | grep "primary" || (echo "Timed out waiting for primary to be elected in commerce/0" && exit 1) +# and for a primary tablet to be elected in the shard and become healthy/serving. +wait_for_healthy_shard commerce 0 || exit 1 # create the schema -vtctldclient ApplySchema --sql-file create_commerce_schema.sql commerce +vtctldclient ApplySchema --sql-file create_commerce_schema.sql commerce || fail "Failed to apply schema for the commerce keyspace" # create the vschema -vtctldclient ApplyVSchema --vschema-file vschema_commerce_initial.json commerce +vtctldclient ApplyVSchema --vschema-file vschema_commerce_initial.json commerce || fail "Failed to apply vschema for the commerce keyspace" # start vtgate -CELL=zone1 ./scripts/vtgate-up.sh +CELL=zone1 ../common/scripts/vtgate-up.sh # start vtadmin -./scripts/vtadmin-up.sh +../common/scripts/vtadmin-up.sh diff --git a/examples/local/201_customer_tablets.sh b/examples/local/201_customer_tablets.sh index 6a27bef6cfc..1d5bf3585ce 100755 --- a/examples/local/201_customer_tablets.sh +++ b/examples/local/201_customer_tablets.sh @@ -18,26 +18,16 @@ # resharding it also splits the vschema between the two keyspaces # old (commerce) and new (customer) -source ./env.sh +source ../common/env.sh for i in 200 201 202; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - CELL=zone1 KEYSPACE=customer TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + CELL=zone1 KEYSPACE=customer TABLET_UID=$i ../common/scripts/vttablet-up.sh done # set the correct durability policy for the keyspace -vtctldclient --server localhost:15999 SetKeyspaceDurabilityPolicy --durability-policy=semi_sync customer +vtctldclient --server localhost:15999 SetKeyspaceDurabilityPolicy --durability-policy=semi_sync customer || fail "Failed to set keyspace durability policy on the customer keyspace" # Wait for all the tablets to be up and registered in the topology server -for _ in $(seq 0 200); do - vtctldclient GetTablets --keyspace customer --shard 0 | wc -l | grep -q "3" && break - sleep 1 -done; -vtctldclient GetTablets --keyspace customer --shard 0 | wc -l | grep -q "3" || (echo "Timed out waiting for tablets to be up in customer/0" && exit 1) - -# Wait for a primary tablet to be elected in the shard -for _ in $(seq 0 200); do - vtctldclient GetTablets --keyspace customer --shard 0 | grep -q "primary" && break - sleep 1 -done; -vtctldclient GetTablets --keyspace customer --shard 0 | grep "primary" || (echo "Timed out waiting for primary to be elected in customer/0" && exit 1) +# and for a primary tablet to be elected in the shard and become healthy/serving. +wait_for_healthy_shard customer 0 || exit 1 diff --git a/examples/local/202_move_tables.sh b/examples/local/202_move_tables.sh index 2b69817445e..f385acb12a3 100755 --- a/examples/local/202_move_tables.sh +++ b/examples/local/202_move_tables.sh @@ -17,6 +17,6 @@ # this script copies over all the data from commerce keyspace to # customer keyspace for the customer and corder tables -source ./env.sh +source ../common/env.sh vtctlclient MoveTables -- --source commerce --tables 'customer,corder' Create customer.commerce2customer diff --git a/examples/local/203_switch_reads.sh b/examples/local/203_switch_reads.sh index 1c1abbe7ff0..4bca7e4e257 100755 --- a/examples/local/203_switch_reads.sh +++ b/examples/local/203_switch_reads.sh @@ -17,6 +17,6 @@ # this script migrates traffic for the new customer keyspace to the new # tablets of types rdonly and replica -source ./env.sh +source ../common/env.sh vtctlclient MoveTables -- --tablet_types=rdonly,replica SwitchTraffic customer.commerce2customer diff --git a/examples/local/204_switch_writes.sh b/examples/local/204_switch_writes.sh index a04f6ffc947..743ca1e2512 100755 --- a/examples/local/204_switch_writes.sh +++ b/examples/local/204_switch_writes.sh @@ -17,6 +17,6 @@ # this script migrates primary traffic for the customer keyspace to the # new primary tablet -source ./env.sh +source ../common/env.sh vtctlclient MoveTables -- --tablet_types=primary SwitchTraffic customer.commerce2customer diff --git a/examples/local/205_clean_commerce.sh b/examples/local/205_clean_commerce.sh index 37824052d27..5d307a231d3 100755 --- a/examples/local/205_clean_commerce.sh +++ b/examples/local/205_clean_commerce.sh @@ -17,7 +17,7 @@ # this script removes the customer and corder tables from the commerce # keyspace -source ./env.sh +source ../common/env.sh vtctlclient MoveTables Complete customer.commerce2customer diff --git a/examples/local/301_customer_sharded.sh b/examples/local/301_customer_sharded.sh index 8f008d0638b..ad80cdd98dd 100755 --- a/examples/local/301_customer_sharded.sh +++ b/examples/local/301_customer_sharded.sh @@ -20,9 +20,9 @@ # it also changes the customer vschema from unsharded to sharded and # sets up the necessary vindexes -source ./env.sh +source ../common/env.sh -vtctldclient ApplySchema --sql-file create_commerce_seq.sql commerce -vtctldclient ApplyVSchema --vschema-file vschema_commerce_seq.json commerce -vtctldclient ApplyVSchema --vschema-file vschema_customer_sharded.json customer -vtctldclient ApplySchema --sql-file create_customer_sharded.sql customer +vtctldclient ApplySchema --sql-file create_commerce_seq.sql commerce || fail "Failed to create sequence tables in the commerce keyspace" +vtctldclient ApplyVSchema --vschema-file vschema_commerce_seq.json commerce || fail "Failed to create vschema sequences in the commerce keyspace" +vtctldclient ApplyVSchema --vschema-file vschema_customer_sharded.json customer || fail "Failed to create vschema in sharded customer keyspace" +vtctldclient ApplySchema --sql-file create_customer_sharded.sql customer || fail "Failed to create schema in sharded customer keyspace" diff --git a/examples/local/302_new_shards.sh b/examples/local/302_new_shards.sh index 40569e2c20d..b2ac94f5c7f 100755 --- a/examples/local/302_new_shards.sh +++ b/examples/local/302_new_shards.sh @@ -17,30 +17,20 @@ # this script brings up new tablets for the two new shards that we will # be creating in the customer keyspace and copies the schema -source ./env.sh +source ../common/env.sh for i in 300 301 302; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - SHARD=-80 CELL=zone1 KEYSPACE=customer TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + SHARD=-80 CELL=zone1 KEYSPACE=customer TABLET_UID=$i ../common/scripts/vttablet-up.sh done for i in 400 401 402; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - SHARD=80- CELL=zone1 KEYSPACE=customer TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + SHARD=80- CELL=zone1 KEYSPACE=customer TABLET_UID=$i ../common/scripts/vttablet-up.sh done for shard in "-80" "80-"; do - # Wait for all the tablets to be up and registered in the topology server - for _ in $(seq 0 200); do - vtctldclient GetTablets --keyspace customer --shard $shard | wc -l | grep -q "3" && break - sleep 1 - done; - vtctldclient GetTablets --keyspace customer --shard $shard | wc -l | grep -q "3" || (echo "Timed out waiting for tablets to be up in customer/$shard" && exit 1) - - # Wait for a primary tablet to be elected in the shard - for _ in $(seq 0 200); do - vtctldclient GetTablets --keyspace customer --shard $shard | grep -q "primary" && break - sleep 1 - done; - vtctldclient GetTablets --keyspace customer --shard $shard | grep "primary" || (echo "Timed out waiting for primary to be elected in customer/$shard" && exit 1) + # Wait for all the tablets to be up and registered in the topology server + # and for a primary tablet to be elected in the shard and become healthy/serving. + wait_for_healthy_shard customer "${shard}" || exit 1 done; diff --git a/examples/local/303_reshard.sh b/examples/local/303_reshard.sh index 510ba68b815..ea12987e9ed 100755 --- a/examples/local/303_reshard.sh +++ b/examples/local/303_reshard.sh @@ -17,6 +17,6 @@ # this script copies the data from customer/0 to customer/-80 and customer/80- # each row will be copied to exactly one shard based on the vindex value -source ./env.sh +source ../common/env.sh vtctlclient Reshard -- --source_shards '0' --target_shards '-80,80-' Create customer.cust2cust diff --git a/examples/local/304_switch_reads.sh b/examples/local/304_switch_reads.sh index 67d0fb45e85..52d6093f4ff 100755 --- a/examples/local/304_switch_reads.sh +++ b/examples/local/304_switch_reads.sh @@ -16,6 +16,6 @@ # this script migrates traffic for the rdonly and replica tablets -source ./env.sh +source ../common/env.sh vtctlclient Reshard -- --tablet_types=rdonly,replica SwitchTraffic customer.cust2cust diff --git a/examples/local/305_switch_writes.sh b/examples/local/305_switch_writes.sh index 289019b1363..9bbc7ed9ea5 100755 --- a/examples/local/305_switch_writes.sh +++ b/examples/local/305_switch_writes.sh @@ -16,6 +16,6 @@ # this script migrates traffic for the primary tablet -source ./env.sh +source ../common/env.sh vtctlclient Reshard -- --tablet_types=primary SwitchTraffic customer.cust2cust diff --git a/examples/local/306_down_shard_0.sh b/examples/local/306_down_shard_0.sh index 0d956553cd5..db860b3e23c 100755 --- a/examples/local/306_down_shard_0.sh +++ b/examples/local/306_down_shard_0.sh @@ -15,11 +15,11 @@ # limitations under the License. # this script brings down the tablets for customer/0 keyspace -source ./env.sh +source ../common/env.sh vtctlclient Reshard Complete customer.cust2cust for i in 200 201 202; do - CELL=zone1 TABLET_UID=$i ./scripts/vttablet-down.sh - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-down.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/vttablet-down.sh + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-down.sh done diff --git a/examples/local/307_delete_shard_0.sh b/examples/local/307_delete_shard_0.sh index a09e8f15c00..e0781990f56 100755 --- a/examples/local/307_delete_shard_0.sh +++ b/examples/local/307_delete_shard_0.sh @@ -16,6 +16,6 @@ # this script deletes the old shard 0 which has been replaced by 2 shards -source ./env.sh +source ../common/env.sh -vtctldclient DeleteShards --recursive customer/0 +vtctldclient DeleteShards --force --recursive customer/0 diff --git a/examples/local/401_teardown.sh b/examples/local/401_teardown.sh index ae78d262486..08dcbf3cd29 100755 --- a/examples/local/401_teardown.sh +++ b/examples/local/401_teardown.sh @@ -17,43 +17,42 @@ # We should not assume that any of the steps have been executed. # This makes it possible for a user to cleanup at any point. -source ./env.sh +source ../common/env.sh -./scripts/vtadmin-down.sh +../common/scripts/vtadmin-down.sh -./scripts/vtorc-down.sh +../common/scripts/vtorc-down.sh -./scripts/vtgate-down.sh +../common/scripts/vtgate-down.sh for tablet in 100 200 300 400; do if vtctlclient --action_timeout 1s --server localhost:15999 GetTablet zone1-$tablet >/dev/null 2>&1; then # The zero tablet is up. Try to shutdown 0-2 tablet + mysqlctl for i in 0 1 2; do - uid=$(($tablet + $i)) + uid=$((tablet + i)) printf -v alias '%s-%010d' 'zone1' $uid echo "Shutting down tablet $alias" - CELL=zone1 TABLET_UID=$uid ./scripts/vttablet-down.sh - CELL=zone1 TABLET_UID=$uid ./scripts/mysqlctl-down.sh + CELL=zone1 TABLET_UID=$uid ../common/scripts/vttablet-down.sh + CELL=zone1 TABLET_UID=$uid ../common/scripts/mysqlctl-down.sh done fi done -./scripts/vtctld-down.sh +../common/scripts/vtctld-down.sh if [ "${TOPO}" = "zk2" ]; then - CELL=zone1 ./scripts/zk-down.sh + CELL=zone1 ../common/scripts/zk-down.sh elif [ "${TOPO}" = "k8s" ]; then - CELL=zone1 ./scripts/k3s-down.sh + CELL=zone1 ../common/scripts/k3s-down.sh elif [ "${TOPO}" = "consul" ]; then - CELL=zone1 ./scripts/consul-down.sh + CELL=zone1 ../common/scripts/consul-down.sh else - CELL=zone1 ./scripts/etcd-down.sh + CELL=zone1 ../common/scripts/etcd-down.sh fi # pedantic check: grep for any remaining processes -if [ ! -z "$VTDATAROOT" ]; then - +if [ -n "$VTDATAROOT" ]; then if pgrep -f -l "$VTDATAROOT" >/dev/null; then echo "ERROR: Stale processes detected! It is recommended to manuallly kill them:" pgrep -f -l "$VTDATAROOT" @@ -63,7 +62,6 @@ if [ ! -z "$VTDATAROOT" ]; then # shellcheck disable=SC2086 rm -r ${VTDATAROOT:?}/* - fi disown -a diff --git a/examples/local/README.md b/examples/local/README.md index 220ffccc1fc..cb846b7c8b1 100644 --- a/examples/local/README.md +++ b/examples/local/README.md @@ -6,7 +6,7 @@ This document contains the summary of the commands to be run. ``` # Setup environment and aliases -source env.sh +source ../common/env.sh # Bring up initial cluster and commerce keyspace ./101_initial_cluster.sh @@ -47,7 +47,7 @@ vtctlclient Reshard -- --tablet_types=primary SwitchTraffic customer.cust2cust # Down shard 0 ./306_down_shard_0.sh -vtctlclient DeleteShard -- --recursive customer/0 +vtctlclient DeleteShard -- --force --recursive customer/0 # Down cluster ./401_teardown.sh diff --git a/examples/local/scripts/etcd-down.sh b/examples/local/scripts/etcd-down.sh deleted file mode 100755 index 018af7432a3..00000000000 --- a/examples/local/scripts/etcd-down.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that stops the etcd servers started by etcd-up.sh. - -source ./env.sh - -echo "Stopping etcd..." -kill -9 `cat $VTDATAROOT/tmp/etcd.pid` diff --git a/examples/local/scripts/mysqlctl-up.sh b/examples/local/scripts/mysqlctl-up.sh deleted file mode 100755 index ae041cf951d..00000000000 --- a/examples/local/scripts/mysqlctl-up.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that creates a single shard vttablet deployment. - -source ./env.sh - -cell=${CELL:-'test'} -uid=$TABLET_UID -mysql_port=$[17000 + $uid] -printf -v alias '%s-%010d' $cell $uid -printf -v tablet_dir 'vt_%010d' $uid - -mkdir -p $VTDATAROOT/backups - -echo "Starting MySQL for tablet $alias..." -action="init" - -if [ -d $VTDATAROOT/$tablet_dir ]; then - echo "Resuming from existing vttablet dir:" - echo " $VTDATAROOT/$tablet_dir" - action='start' -fi - -mysqlctl \ - --log_dir $VTDATAROOT/tmp \ - --tablet_uid $uid \ - --mysql_port $mysql_port \ - $action diff --git a/examples/local/scripts/vtctld-down.sh b/examples/local/scripts/vtctld-down.sh deleted file mode 100755 index d96fa3b927f..00000000000 --- a/examples/local/scripts/vtctld-down.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that stops vtctld. - -source ./env.sh - -echo "Stopping vtctld..." -kill -9 `cat $VTDATAROOT/tmp/vtctld.pid` diff --git a/examples/local/scripts/vtctld-up.sh b/examples/local/scripts/vtctld-up.sh deleted file mode 100755 index 5ab8017424c..00000000000 --- a/examples/local/scripts/vtctld-up.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that starts vtctld. - -source ./env.sh - -cell=${CELL:-'test'} -grpc_port=15999 - -echo "Starting vtctld..." -# shellcheck disable=SC2086 -vtctld \ - $TOPOLOGY_FLAGS \ - --cell $cell \ - --service_map 'grpc-vtctl,grpc-vtctld' \ - --backup_storage_implementation file \ - --file_backup_storage_root $VTDATAROOT/backups \ - --log_dir $VTDATAROOT/tmp \ - --port $vtctld_web_port \ - --grpc_port $grpc_port \ - --pid_file $VTDATAROOT/tmp/vtctld.pid \ - > $VTDATAROOT/tmp/vtctld.out 2>&1 & diff --git a/examples/local/scripts/vtgate-down.sh b/examples/local/scripts/vtgate-down.sh deleted file mode 100755 index 9da0a7179df..00000000000 --- a/examples/local/scripts/vtgate-down.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that stops the instance started by vtgate-up.sh. - -source ./env.sh - -# Stop vtgate. -echo "Stopping vtgate..." -kill `cat $VTDATAROOT/tmp/vtgate.pid` diff --git a/examples/local/scripts/zk-down.sh b/examples/local/scripts/zk-down.sh deleted file mode 100755 index 18dd7933bc9..00000000000 --- a/examples/local/scripts/zk-down.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that stops the ZooKeeper servers started by zk-up.sh. - -source ./env.sh - -# Stop ZooKeeper servers. -echo "Stopping zk servers..." -for zkid in $zkids; do - zkctl -zk.myid $zkid -zk.cfg $zkcfg -log_dir $VTDATAROOT/tmp shutdown -done - diff --git a/examples/local/vtexplain/atomicity_method1.sh b/examples/local/vtexplain/atomicity_method1.sh deleted file mode 100644 index b946ec7434f..00000000000 --- a/examples/local/vtexplain/atomicity_method1.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -set -x -vtexplain -vschema-file vschema.json -schema-file schema.sql -shards 4 -sql 'INSERT /*vt+ MULTI_SHARD_AUTOCOMMIT=1 */ INTO t1 (c1) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20);' diff --git a/examples/local/vtexplain/atomicity_method2.sh b/examples/local/vtexplain/atomicity_method2.sh deleted file mode 100644 index 33a09cbfbee..00000000000 --- a/examples/local/vtexplain/atomicity_method2.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -set -x -vtexplain -vschema-file vschema.json -schema-file schema.sql -shards 4 -sql 'SET transaction_mode="single"; INSERT INTO t1 (c1) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20);' diff --git a/examples/local/vtexplain/atomicity_method2_reads.sh b/examples/local/vtexplain/atomicity_method2_reads.sh deleted file mode 100644 index f32732ccfc5..00000000000 --- a/examples/local/vtexplain/atomicity_method2_reads.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -set -x -vtexplain -vschema-file vschema.json -schema-file schema.sql -shards 4 -sql 'SET transaction_mode="single"; BEGIN; SELECT * from t1; COMMIT;' diff --git a/examples/local/vtexplain/atomicity_method2_working.sh b/examples/local/vtexplain/atomicity_method2_working.sh deleted file mode 100644 index f9c84e87a72..00000000000 --- a/examples/local/vtexplain/atomicity_method2_working.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -set -x -vtexplain -vschema-file vschema.json -schema-file schema.sql -shards 4 -sql 'SET transaction_mode="single"; INSERT INTO t1 (c1) values (10),(14),(15),(16);' diff --git a/examples/local/vtexplain/atomicity_method3.sh b/examples/local/vtexplain/atomicity_method3.sh deleted file mode 100644 index 772bae21460..00000000000 --- a/examples/local/vtexplain/atomicity_method3.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -set -x -# SET transaction_mode="multi" is implied by default -vtexplain -vschema-file vschema.json -schema-file schema.sql -shards 4 -sql 'INSERT INTO t1 (c1) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20);' diff --git a/examples/region_sharding/101_initial_cluster.sh b/examples/region_sharding/101_initial_cluster.sh index 210334cf18f..c2692440189 100755 --- a/examples/region_sharding/101_initial_cluster.sh +++ b/examples/region_sharding/101_initial_cluster.sh @@ -17,46 +17,43 @@ # this script brings up topo server and all the vitess components # required for a single shard deployment. -source ./env.sh +source ../common/env.sh # start topo server if [ "${TOPO}" = "zk2" ]; then - CELL=zone1 ./scripts/zk-up.sh + CELL=zone1 ../common/scripts/zk-up.sh elif [ "${TOPO}" = "k8s" ]; then - CELL=zone1 ./scripts/k3s-up.sh + CELL=zone1 ../common/scripts/k3s-up.sh else - CELL=zone1 ./scripts/etcd-up.sh + CELL=zone1 ../common/scripts/etcd-up.sh fi # start vtctld -CELL=zone1 ./scripts/vtctld-up.sh +CELL=zone1 ../common/scripts/vtctld-up.sh # start unsharded keyspace and tablet -CELL=zone1 TABLET_UID=100 ./scripts/mysqlctl-up.sh -SHARD=0 CELL=zone1 KEYSPACE=main TABLET_UID=100 ./scripts/vttablet-up.sh +CELL=zone1 TABLET_UID=100 ../common/scripts/mysqlctl-up.sh +SHARD=0 CELL=zone1 KEYSPACE=main TABLET_UID=100 ../common/scripts/vttablet-up.sh # set the correct durability policy for the keyspace -vtctldclient --server localhost:15999 SetKeyspaceDurabilityPolicy --durability-policy=none main +vtctldclient --server localhost:15999 SetKeyspaceDurabilityPolicy --durability-policy=none main || fail "Failed to set keyspace durability policy on the main keyspace" # start vtorc -./scripts/vtorc-up.sh +../common/scripts/vtorc-up.sh -# Wait for a primary tablet to be elected in the shard -for _ in $(seq 0 200); do - vtctldclient GetTablets --keyspace main --shard 0 | grep -q "primary" && break - sleep 1 -done; -vtctldclient GetTablets --keyspace main --shard 0 | grep "primary" || (echo "Timed out waiting for primary to be elected in main/0" && exit 1) +# Wait for a primary tablet to be elected in the shard and for it +# to become healthy/sherving. +wait_for_healthy_shard main 0 1 || exit 1 # create the schema -vtctldclient ApplySchema --sql-file create_main_schema.sql main +vtctldclient ApplySchema --sql-file create_main_schema.sql main || fail "Failed to apply schema for the main keyspace" # create the vschema -vtctldclient ApplyVSchema --vschema-file main_vschema_initial.json main +vtctldclient ApplyVSchema --vschema-file main_vschema_initial.json main || fail "Failed to apply vschema for the main keyspace" # start vtgate -CELL=zone1 ./scripts/vtgate-up.sh +CELL=zone1 ../common/scripts/vtgate-up.sh # start vtadmin -./scripts/vtadmin-up.sh +../common/scripts/vtadmin-up.sh diff --git a/examples/region_sharding/201_main_sharded.sh b/examples/region_sharding/201_main_sharded.sh index b8a589c0d49..387f89506db 100755 --- a/examples/region_sharding/201_main_sharded.sh +++ b/examples/region_sharding/201_main_sharded.sh @@ -14,20 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -source ./env.sh +source ../common/env.sh # apply sharding vschema -vtctldclient ApplyVSchema --vschema-file main_vschema_sharded.json main +vtctldclient ApplyVSchema --vschema-file main_vschema_sharded.json main || fail "Failed to apply vschema for the sharded main keyspace" # optional: create the schema needed for lookup vindex #vtctlclient ApplySchema --sql-file create_lookup_schema.sql main # create the lookup vindex -vtctlclient CreateLookupVindex -- --tablet_types=PRIMARY main "$(cat lookup_vindex.json)" +vtctlclient CreateLookupVindex -- --tablet_types=PRIMARY main "$(cat lookup_vindex.json)" || fail "Failed to create lookup vindex in main keyspace" # we have to wait for replication to catch up # Can see on vttablet status page Vreplication that copy is complete sleep 5 -#externalize vindex -vtctlclient ExternalizeVindex main.customer_region_lookup +# externalize vindex +vtctlclient ExternalizeVindex main.customer_region_lookup || fail "Failed to externalize customer_region_lookup vindex in the main keyspace" diff --git a/examples/region_sharding/202_new_tablets.sh b/examples/region_sharding/202_new_tablets.sh index e570ae3b3c2..d9134a6a7a3 100755 --- a/examples/region_sharding/202_new_tablets.sh +++ b/examples/region_sharding/202_new_tablets.sh @@ -14,23 +14,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -source ./env.sh +source ../common/env.sh # start vttablets for new shards. we start only one tablet each (primary) -CELL=zone1 TABLET_UID=200 ./scripts/mysqlctl-up.sh -SHARD=-40 CELL=zone1 KEYSPACE=main TABLET_UID=200 ./scripts/vttablet-up.sh -CELL=zone1 TABLET_UID=300 ./scripts/mysqlctl-up.sh -SHARD=40-80 CELL=zone1 KEYSPACE=main TABLET_UID=300 ./scripts/vttablet-up.sh -CELL=zone1 TABLET_UID=400 ./scripts/mysqlctl-up.sh -SHARD=80-c0 CELL=zone1 KEYSPACE=main TABLET_UID=400 ./scripts/vttablet-up.sh -CELL=zone1 TABLET_UID=500 ./scripts/mysqlctl-up.sh -SHARD=c0- CELL=zone1 KEYSPACE=main TABLET_UID=500 ./scripts/vttablet-up.sh +CELL=zone1 TABLET_UID=200 ../common/scripts/mysqlctl-up.sh +SHARD=-40 CELL=zone1 KEYSPACE=main TABLET_UID=200 ../common/scripts/vttablet-up.sh +CELL=zone1 TABLET_UID=300 ../common/scripts/mysqlctl-up.sh +SHARD=40-80 CELL=zone1 KEYSPACE=main TABLET_UID=300 ../common/scripts/vttablet-up.sh +CELL=zone1 TABLET_UID=400 ../common/scripts/mysqlctl-up.sh +SHARD=80-c0 CELL=zone1 KEYSPACE=main TABLET_UID=400 ../common/scripts/vttablet-up.sh +CELL=zone1 TABLET_UID=500 ../common/scripts/mysqlctl-up.sh +SHARD=c0- CELL=zone1 KEYSPACE=main TABLET_UID=500 ../common/scripts/vttablet-up.sh for shard in "-40" "40-80" "80-c0" "c0-"; do - # Wait for a primary tablet to be elected in the shard - for _ in $(seq 0 200); do - vtctldclient GetTablets --keyspace main --shard $shard | grep -q "primary" && break - sleep 1 - done; - vtctldclient GetTablets --keyspace main --shard $shard | grep "primary" || (echo "Timed out waiting for primary to be elected in main/$shard" && exit 1) + # Wait for all the tablets to be up and registered in the topology server + # and for a primary tablet to be elected in the shard and become healthy/serving. + wait_for_healthy_shard main "${shard}" 1 || exit 1 done; diff --git a/examples/region_sharding/203_reshard.sh b/examples/region_sharding/203_reshard.sh index 0cef1dbc4f9..aaa448a135d 100755 --- a/examples/region_sharding/203_reshard.sh +++ b/examples/region_sharding/203_reshard.sh @@ -14,6 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -source ./env.sh +source ../common/env.sh vtctlclient Reshard -- --source_shards '0' --target_shards '-40,40-80,80-c0,c0-' --tablet_types=PRIMARY Create main.main2regions diff --git a/examples/region_sharding/204_switch_reads.sh b/examples/region_sharding/204_switch_reads.sh index f0e6b7fd6cb..20703938199 100755 --- a/examples/region_sharding/204_switch_reads.sh +++ b/examples/region_sharding/204_switch_reads.sh @@ -16,6 +16,6 @@ # this script migrates traffic for the rdonly and replica tablets -source ./env.sh +source ../common/env.sh vtctlclient Reshard -- --tablet_types=rdonly,replica SwitchTraffic main.main2regions diff --git a/examples/region_sharding/205_switch_writes.sh b/examples/region_sharding/205_switch_writes.sh index d337929852e..ad0d8ee51d2 100755 --- a/examples/region_sharding/205_switch_writes.sh +++ b/examples/region_sharding/205_switch_writes.sh @@ -16,7 +16,7 @@ # this script migrates traffic for the primary tablet -source ./env.sh +source ../common/env.sh vtctlclient Reshard -- --tablet_types=primary SwitchTraffic main.main2regions diff --git a/examples/region_sharding/206_down_shard_0.sh b/examples/region_sharding/206_down_shard_0.sh index d302a071a46..6b46ea34ea0 100755 --- a/examples/region_sharding/206_down_shard_0.sh +++ b/examples/region_sharding/206_down_shard_0.sh @@ -15,7 +15,7 @@ # limitations under the License. # this script brings down the tablets for main/0 keyspace/shard -source ./env.sh +source ../common/env.sh -CELL=zone1 TABLET_UID=100 ./scripts/vttablet-down.sh -CELL=zone1 TABLET_UID=100 ./scripts/mysqlctl-down.sh +CELL=zone1 TABLET_UID=100 ../common/scripts/vttablet-down.sh +CELL=zone1 TABLET_UID=100 ../common/scripts/mysqlctl-down.sh diff --git a/examples/region_sharding/207_delete_shard_0.sh b/examples/region_sharding/207_delete_shard_0.sh index 05f24679226..298afd7b273 100755 --- a/examples/region_sharding/207_delete_shard_0.sh +++ b/examples/region_sharding/207_delete_shard_0.sh @@ -16,6 +16,6 @@ # this script deletes the old shard 0 which has been replaced by 4 shards -source ./env.sh +source ../common/env.sh -vtctldclient DeleteShards --recursive main/0 +vtctldclient DeleteShards --force --recursive main/0 diff --git a/examples/region_sharding/301_teardown.sh b/examples/region_sharding/301_teardown.sh index 310c7f1277b..25f3bb259f2 100755 --- a/examples/region_sharding/301_teardown.sh +++ b/examples/region_sharding/301_teardown.sh @@ -17,37 +17,36 @@ # We should not assume that any of the steps have been executed. # This makes it possible for a user to cleanup at any point. -source ./env.sh +source ../common/env.sh -./scripts/vtadmin-down.sh +../common/scripts/vtadmin-down.sh -./scripts/vtorc-down.sh +../common/scripts/vtorc-down.sh -./scripts/vtgate-down.sh +../common/scripts/vtgate-down.sh for tablet in 100 200 300 400 500; do if vtctlclient --server localhost:15999 GetTablet zone1-$tablet >/dev/null 2>&1; then - printf -v alias '%s-%010d' 'zone1' $uid + printf -v alias '%s-%010d' 'zone1' $tablet echo "Shutting down tablet $alias" - CELL=zone1 TABLET_UID=$tablet ./scripts/vttablet-down.sh - CELL=zone1 TABLET_UID=$tablet ./scripts/mysqlctl-down.sh + CELL=zone1 TABLET_UID=$tablet ../common/scripts/vttablet-down.sh + CELL=zone1 TABLET_UID=$tablet ../common/scripts/mysqlctl-down.sh fi done -./scripts/vtctld-down.sh +../common/scripts/vtctld-down.sh if [ "${TOPO}" = "zk2" ]; then - CELL=zone1 ./scripts/zk-down.sh + CELL=zone1 ../common/scripts/zk-down.sh elif [ "${TOPO}" = "k8s" ]; then - CELL=zone1 ./scripts/k3s-down.sh + CELL=zone1 ../common/scripts/k3s-down.sh else - CELL=zone1 ./scripts/etcd-down.sh + CELL=zone1 ../common/scripts/etcd-down.sh fi # pedantic check: grep for any remaining processes -if [ ! -z "$VTDATAROOT" ]; then - +if [ -n "$VTDATAROOT" ]; then if pgrep -f -l "$VTDATAROOT" >/dev/null; then echo "ERROR: Stale processes detected! It is recommended to manually kill them:" pgrep -f -l "$VTDATAROOT" @@ -57,7 +56,6 @@ if [ ! -z "$VTDATAROOT" ]; then # shellcheck disable=SC2086 rm -r ${VTDATAROOT:?}/* - fi disown -a diff --git a/examples/region_sharding/README.md b/examples/region_sharding/README.md index 8b9ced13999..fcc2e617143 100644 --- a/examples/region_sharding/README.md +++ b/examples/region_sharding/README.md @@ -5,12 +5,8 @@ This document contains the summary of the commands to be run. ``` -# Edit main_vschema_sharded.json and set region_map to full path of countries.json file -# Example: - "region_map": "/home/user/vitess/examples/region_sharding/countries.json", - # setup environment and aliases -source env.sh +source ../common/env.sh # Bring up initial cluster and main keyspace (unsharded) ./101_initial_cluster.sh diff --git a/examples/region_sharding/env.sh b/examples/region_sharding/env.sh deleted file mode 100644 index 54b9c97fff9..00000000000 --- a/examples/region_sharding/env.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/bash - -# 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. - -hostname=$(hostname -f) -vtctld_web_port=15000 -export VTDATAROOT="${VTDATAROOT:-${PWD}/vtdataroot}" - -function fail() { - echo "ERROR: $1" - exit 1 -} - -if [[ $EUID -eq 0 ]]; then - fail "This script refuses to be run as root. Please switch to a regular user." -fi - -# mysqld might be in /usr/sbin which will not be in the default PATH -PATH="/usr/sbin:$PATH" -for binary in mysqld etcd etcdctl curl vtctlclient vttablet vtgate vtctld mysqlctl; do - command -v "$binary" > /dev/null || fail "${binary} is not installed in PATH. See https://vitess.io/docs/get-started/local/ for install instructions." -done; - -if [ "${TOPO}" = "zk2" ]; then - # Each ZooKeeper server needs a list of all servers in the quorum. - # Since we're running them all locally, we need to give them unique ports. - # In a real deployment, these should be on different machines, and their - # respective hostnames should be given. - zkcfg=(\ - "1@$hostname:28881:38881:21811" \ - "2@$hostname:28882:38882:21812" \ - "3@$hostname:28883:38883:21813" \ - ) - printf -v zkcfg ",%s" "${zkcfg[@]}" - zkcfg=${zkcfg:1} - - zkids='1 2 3' - - # Set topology environment parameters. - ZK_SERVER="localhost:21811,localhost:21812,localhost:21813" - # shellcheck disable=SC2034 - TOPOLOGY_FLAGS="--topo_implementation zk2 --topo_global_server_address ${ZK_SERVER} --topo_global_root /vitess/global" - - mkdir -p "${VTDATAROOT}/tmp" -elif [ "${TOPO}" = "k8s" ]; then - # Set topology environment parameters. - K8S_ADDR="localhost" - K8S_PORT="8443" - K8S_KUBECONFIG=$VTDATAROOT/tmp/k8s.kubeconfig - # shellcheck disable=SC2034 - TOPOLOGY_FLAGS="--topo_implementation k8s --topo_k8s_kubeconfig ${K8S_KUBECONFIG} --topo_global_server_address ${K8S_ADDR}:${K8S_PORT} --topo_global_root /vitess/global" -else - ETCD_SERVER="localhost:2379" - TOPOLOGY_FLAGS="--topo_implementation etcd2 --topo_global_server_address $ETCD_SERVER --topo_global_root /vitess/global" - - mkdir -p "${VTDATAROOT}/etcd" -fi - -mkdir -p "${VTDATAROOT}/tmp" - -# Set aliases to simplify instructions. -# In your own environment you may prefer to use config files, -# such as ~/.my.cnf - -alias mysql="command mysql -h 127.0.0.1 -P 15306" -alias vtctlclient="command vtctlclient --server localhost:15999 --log_dir ${VTDATAROOT}/tmp --alsologtostderr" -alias vtctldclient="command vtctldclient --server localhost:15999" - -# Make sure aliases are expanded in non-interactive shell -shopt -s expand_aliases - diff --git a/examples/region_sharding/main_vschema_sharded.json b/examples/region_sharding/main_vschema_sharded.json index 06d72e58981..ec51afa9ee8 100644 --- a/examples/region_sharding/main_vschema_sharded.json +++ b/examples/region_sharding/main_vschema_sharded.json @@ -4,7 +4,7 @@ "region_vdx": { "type": "region_json", "params": { - "region_map": "/vt/src/vitess.io/vitess/examples/region_sharding/countries.json", + "region_map": "./countries.json", "region_bytes": "1" } } diff --git a/examples/region_sharding/scripts/etcd-up.sh b/examples/region_sharding/scripts/etcd-up.sh deleted file mode 100755 index 9164d32806e..00000000000 --- a/examples/region_sharding/scripts/etcd-up.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that creates a quorum of ZooKeeper servers. - -source ./env.sh - -cell=${CELL:-'test'} -export ETCDCTL_API=2 - -# Check that etcd is not already running -curl "http://${ETCD_SERVER}" > /dev/null 2>&1 && fail "etcd is already running. Exiting." - -etcd --enable-v2=true --data-dir "${VTDATAROOT}/etcd/" --listen-client-urls "http://${ETCD_SERVER}" --advertise-client-urls "http://${ETCD_SERVER}" > "${VTDATAROOT}"/tmp/etcd.out 2>&1 & -PID=$! -echo $PID > "${VTDATAROOT}/tmp/etcd.pid" -sleep 5 - -echo "add /vitess/global" -etcdctl --endpoints "http://${ETCD_SERVER}" mkdir /vitess/global & - -echo "add /vitess/$cell" -etcdctl --endpoints "http://${ETCD_SERVER}" mkdir /vitess/$cell & - -# And also add the CellInfo description for the cell. -# If the node already exists, it's fine, means we used existing data. -echo "add $cell CellInfo" -set +e -# shellcheck disable=SC2086 -vtctl $TOPOLOGY_FLAGS AddCellInfo -- \ - --root /vitess/$cell \ - --server_address "${ETCD_SERVER}" \ - $cell -set -e - -echo "etcd start done..." - - diff --git a/examples/region_sharding/scripts/k3s-down.sh b/examples/region_sharding/scripts/k3s-down.sh deleted file mode 100755 index 590dc604e3e..00000000000 --- a/examples/region_sharding/scripts/k3s-down.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that stops the k3s server started by k3s-up.sh. - -set -e - -# shellcheck source=./env.sh -# shellcheck disable=SC1091 -source ./env.sh - -# Stop K3s server. -echo "Stopping k3s server..." - -pid=`cat $VTDATAROOT/tmp/k3s.pid` -echo "Stopping k3s..." -kill -9 $pid diff --git a/examples/region_sharding/scripts/k3s-up.sh b/examples/region_sharding/scripts/k3s-up.sh deleted file mode 100755 index 286b4d0ad85..00000000000 --- a/examples/region_sharding/scripts/k3s-up.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that creates a Kubernetes api for topo use by running k3s - -set -e -cell=${CELL:-'test'} - -script_root=$(dirname "${BASH_SOURCE[0]}") - -# shellcheck source=./env.sh -# shellcheck disable=SC1091 -source ./env.sh - -case $(uname) in - Linux) ;; - *) echo "WARNING: unsupported platform. K3s only supports running on Linux, the k8s topology is available for local examples."; exit 1;; -esac - -case $(uname -m) in - aarch64) ;; - x86_64) ;; - *) echo "ERROR: unsupported architecture, the k8s topology is not available for local examples."; exit 1;; -esac - -k3s server --disable-agent --data-dir "${VTDATAROOT}/k3s/" --https-listen-port "${K8S_PORT}" --write-kubeconfig "${K8S_KUBECONFIG}" > "${VTDATAROOT}"/tmp/k3s.out 2>&1 & -PID=$! -echo $PID > "${VTDATAROOT}/tmp/k3s.pid" -disown -a -echo "Waiting for k3s server to start" -sleep 15 - -# Use k3s built-in kubectl with custom config -KUBECTL="k3s kubectl --kubeconfig=${K8S_KUBECONFIG}" - -# Create the CRD for vitesstopologynodes -$KUBECTL create -f ../../go/vt/topo/k8stopo/VitessTopoNodes-crd.yaml - -# Add the CellInfo description for the cell -set +e -echo "add $cell CellInfo" -vtctl $TOPOLOGY_FLAGS AddCellInfo -- \ - --root /vitess/$cell \ - $cell -set -e - -echo "k3s start done..." diff --git a/examples/region_sharding/scripts/mysqlctl-down.sh b/examples/region_sharding/scripts/mysqlctl-down.sh deleted file mode 100755 index 37b1d0c729b..00000000000 --- a/examples/region_sharding/scripts/mysqlctl-down.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that stops the mysqld and vttablet instances -# created by vttablet-up.sh - -source ./env.sh - -cell=${CELL:-'test'} -uid=$TABLET_UID -printf -v alias '%s-%010d' $cell $uid -echo "Shutting down MySQL for tablet $alias..." - -mysqlctl --tablet_uid $TABLET_UID shutdown - diff --git a/examples/region_sharding/scripts/vtadmin-down.sh b/examples/region_sharding/scripts/vtadmin-down.sh deleted file mode 100755 index 2a7944d9d5a..00000000000 --- a/examples/region_sharding/scripts/vtadmin-down.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -source ./env.sh - -echo "Stopping vtadmin-web..." -kill -9 "$(cat "$VTDATAROOT/tmp/vtadmin-web.pid")" - -echo "Stopping vtadmin-api..." -kill -9 "$(cat "$VTDATAROOT/tmp/vtadmin-api.pid")" diff --git a/examples/region_sharding/scripts/vtadmin-up.sh b/examples/region_sharding/scripts/vtadmin-up.sh deleted file mode 100755 index 5ee04c9a959..00000000000 --- a/examples/region_sharding/scripts/vtadmin-up.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -source ./env.sh - -log_dir="${VTDATAROOT}/tmp" -web_dir="../../web/vtadmin" - -vtadmin_api_port=14200 -vtadmin_web_port=14201 - -vtadmin \ - --addr ":${vtadmin_api_port}" \ - --http-origin "http://localhost:${vtadmin_web_port}" \ - --http-tablet-url-tmpl "http://{{ .Tablet.Hostname }}:15{{ .Tablet.Alias.Uid }}" \ - --tracer "opentracing-jaeger" \ - --grpc-tracing \ - --http-tracing \ - --logtostderr \ - --alsologtostderr \ - --rbac \ - --rbac-config="./vtadmin/rbac.yaml" \ - --cluster "id=local,name=local,discovery=staticfile,discovery-staticfile-path=./vtadmin/discovery.json,tablet-fqdn-tmpl={{ .Tablet.Hostname }}:15{{ .Tablet.Alias.Uid }}" \ - > "${log_dir}/vtadmin-api.out" 2>&1 & - -vtadmin_api_pid=$! -echo ${vtadmin_api_pid} > "${log_dir}/vtadmin-api.pid" - -echo "\ -vtadmin-api is running! - - API: http://localhost:${vtadmin_api_port} - - Logs: ${log_dir}/vtadmin-api.out - - PID: ${vtadmin_api_pid} -" - -# As a TODO, it'd be nice to make the assumption that vtadmin-web is already -# installed and built (since we assume that `make` has already been run for -# other Vitess components.) -npm --prefix $web_dir --silent install - -REACT_APP_VTADMIN_API_ADDRESS="http://localhost:${vtadmin_api_port}" \ - REACT_APP_ENABLE_EXPERIMENTAL_TABLET_DEBUG_VARS="true" \ - npm run --prefix $web_dir build - -"${web_dir}/node_modules/.bin/serve" --no-clipboard -l $vtadmin_web_port -s "${web_dir}/build" \ - > "${log_dir}/vtadmin-web.out" 2>&1 & - -vtadmin_web_pid=$! -echo ${vtadmin_web_pid} > "${log_dir}/vtadmin-web.pid" - -echo "\ -vtadmin-web is running! - - Browser: http://localhost:${vtadmin_web_port} - - Logs: ${log_dir}/vtadmin-web.out - - PID: ${vtadmin_web_pid} -" diff --git a/examples/region_sharding/scripts/vtgate-up.sh b/examples/region_sharding/scripts/vtgate-up.sh deleted file mode 100755 index cb33e27839b..00000000000 --- a/examples/region_sharding/scripts/vtgate-up.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that starts a single vtgate. - -source ./env.sh - -cell=${CELL:-'test'} -web_port=15001 -grpc_port=15991 -mysql_server_port=15306 -mysql_server_socket_path="/tmp/mysql.sock" - -# Start vtgate. -# shellcheck disable=SC2086 -vtgate \ - $TOPOLOGY_FLAGS \ - --log_dir $VTDATAROOT/tmp \ - --log_queries_to_file $VTDATAROOT/tmp/vtgate_querylog.txt \ - --port $web_port \ - --grpc_port $grpc_port \ - --mysql_server_port $mysql_server_port \ - --mysql_server_socket_path $mysql_server_socket_path \ - --cell $cell \ - --cells_to_watch $cell \ - --tablet_types_to_wait PRIMARY,REPLICA \ - --service_map 'grpc-vtgateservice' \ - --pid_file $VTDATAROOT/tmp/vtgate.pid \ - --mysql_auth_server_impl none \ - > $VTDATAROOT/tmp/vtgate.out 2>&1 & - -# Block waiting for vtgate to be listening -# Not the same as healthy - -echo "Waiting for vtgate to be up..." -while true; do - curl -I "http://$hostname:$web_port/debug/status" >/dev/null 2>&1 && break - sleep 0.1 -done; -echo "vtgate is up!" - -echo "Access vtgate at http://$hostname:$web_port/debug/status" - -disown -a diff --git a/examples/region_sharding/scripts/vtorc-down.sh b/examples/region_sharding/scripts/vtorc-down.sh deleted file mode 100755 index 2fdfc1491ce..00000000000 --- a/examples/region_sharding/scripts/vtorc-down.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -source ./env.sh - -echo "Stopping vtorc." -kill -9 "$(cat "$VTDATAROOT/tmp/vtorc.pid")" - diff --git a/examples/region_sharding/scripts/vtorc-up.sh b/examples/region_sharding/scripts/vtorc-up.sh deleted file mode 100755 index f5a0d75dbba..00000000000 --- a/examples/region_sharding/scripts/vtorc-up.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -source ./env.sh - -log_dir="${VTDATAROOT}/tmp" -port=16000 - -vtorc \ - $TOPOLOGY_FLAGS \ - --logtostderr \ - --alsologtostderr \ - --config="./vtorc/config.json" \ - --port $port \ - > "${log_dir}/vtorc.out" 2>&1 & - -vtorc_pid=$! -echo ${vtorc_pid} > "${log_dir}/vtorc.pid" - -echo "\ -vtorc is running! - - UI: http://localhost:${port} - - Logs: ${log_dir}/vtorc.out - - PID: ${vtorc_pid} -" diff --git a/examples/region_sharding/scripts/vttablet-down.sh b/examples/region_sharding/scripts/vttablet-down.sh deleted file mode 100755 index 47b881b9793..00000000000 --- a/examples/region_sharding/scripts/vttablet-down.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that stops the mysqld and vttablet instances -# created by vttablet-up.sh - -source ./env.sh - -printf -v tablet_dir 'vt_%010d' $TABLET_UID -pid=`cat $VTDATAROOT/$tablet_dir/vttablet.pid` - -kill $pid - -# Wait for vttablet to die. -while ps -p $pid > /dev/null; do sleep 1; done - - diff --git a/examples/region_sharding/scripts/vttablet-up.sh b/examples/region_sharding/scripts/vttablet-up.sh deleted file mode 100755 index 5ecc6657afc..00000000000 --- a/examples/region_sharding/scripts/vttablet-up.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash - -# 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. - -source ./env.sh - -cell=${CELL:-'test'} -keyspace=${KEYSPACE:-'test_keyspace'} -shard=${SHARD:-'0'} -uid=$TABLET_UID -mysql_port=$[17000 + $uid] -port=$[15000 + $uid] -grpc_port=$[16000 + $uid] -printf -v alias '%s-%010d' $cell $uid -printf -v tablet_dir 'vt_%010d' $uid -tablet_hostname='' -printf -v tablet_logfile 'vttablet_%010d_querylog.txt' $uid - -tablet_type=replica -if [[ "${uid: -1}" -gt 1 ]]; then - tablet_type=rdonly -fi - -echo "Starting vttablet for $alias..." -# shellcheck disable=SC2086 -vttablet \ - $TOPOLOGY_FLAGS \ - --log_dir $VTDATAROOT/tmp \ - --log_queries_to_file $VTDATAROOT/tmp/$tablet_logfile \ - --tablet-path $alias \ - --tablet_hostname "$tablet_hostname" \ - --init_keyspace $keyspace \ - --init_shard $shard \ - --init_tablet_type $tablet_type \ - --health_check_interval 5s \ - --enable_replication_reporter \ - --backup_storage_implementation file \ - --file_backup_storage_root $VTDATAROOT/backups \ - --restore_from_backup \ - --port $port \ - --grpc_port $grpc_port \ - --service_map 'grpc-queryservice,grpc-tabletmanager,grpc-updatestream' \ - --pid_file $VTDATAROOT/$tablet_dir/vttablet.pid \ - --vtctld_addr http://$hostname:$vtctld_web_port/ \ - --disable_active_reparents \ - > $VTDATAROOT/$tablet_dir/vttablet.out 2>&1 & - -# Block waiting for the tablet to be listening -# Not the same as healthy - -for i in $(seq 0 300); do - curl -I "http://$hostname:$port/debug/status" >/dev/null 2>&1 && break - sleep 0.1 -done - -# check one last time -curl -I "http://$hostname:$port/debug/status" || fail "tablet could not be started!" diff --git a/examples/region_sharding/scripts/zk-up.sh b/examples/region_sharding/scripts/zk-up.sh deleted file mode 100755 index 0667d806838..00000000000 --- a/examples/region_sharding/scripts/zk-up.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that creates a quorum of ZooKeeper servers. - -source ./env.sh - -cell=${CELL:-'test'} - -# Start ZooKeeper servers. -# The "zkctl init" command won't return until the server is able to contact its -# peers, so we need to start them all in the background and then wait for them. -echo "Starting zk servers..." -for zkid in $zkids; do - action='init' - printf -v zkdir 'zk_%03d' $zkid - if [ -f $VTDATAROOT/$zkdir/myid ]; then - echo "Resuming from existing ZK data dir:" - echo " $VTDATAROOT/$zkdir" - action='start' - fi - zkctl -zk.myid $zkid -zk.cfg $zkcfg -log_dir $VTDATAROOT/tmp $action \ - > $VTDATAROOT/tmp/zkctl_$zkid.out 2>&1 & - pids[$zkid]=$! -done - -# Wait for all the zkctl commands to return. -echo "Waiting for zk servers to be ready..." - -for zkid in $zkids; do - if ! wait ${pids[$zkid]}; then - echo "ZK server number $zkid failed to start. See log:" - echo " $VTDATAROOT/tmp/zkctl_$zkid.out" - fi -done - -echo "Started zk servers." - -# Add the CellInfo description for the $CELL cell. -# If the node already exists, it's fine, means we used existing data. -set +e -# shellcheck disable=SC2086 -vtctl $TOPOLOGY_FLAGS AddCellInfo -- \ - --root /vitess/$cell \ - --server_address $ZK_SERVER \ - $cell -set -e - -echo "Configured zk servers." diff --git a/examples/region_sharding/topo-etcd2.sh b/examples/region_sharding/topo-etcd2.sh deleted file mode 100644 index c61543a806c..00000000000 --- a/examples/region_sharding/topo-etcd2.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that creates a single shard vttablet deployment. - -export TOPO='etcd2' - - diff --git a/examples/region_sharding/topo-k8s.sh b/examples/region_sharding/topo-k8s.sh deleted file mode 100644 index 92e14ba4d69..00000000000 --- a/examples/region_sharding/topo-k8s.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that creates a single shard vttablet deployment. - -export TOPO='k8s' - - diff --git a/examples/region_sharding/topo-zk2.sh b/examples/region_sharding/topo-zk2.sh deleted file mode 100644 index 29380949d8f..00000000000 --- a/examples/region_sharding/topo-zk2.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# 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. - -# This is an example script that creates a single shard vttablet deployment. - -export TOPO='zk2' - - diff --git a/examples/region_sharding/vtadmin/discovery.json b/examples/region_sharding/vtadmin/discovery.json deleted file mode 100644 index 92e20fb40d8..00000000000 --- a/examples/region_sharding/vtadmin/discovery.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "vtctlds": [ - { - "host": { - "fqdn": "localhost:15000", - "hostname": "localhost:15999" - } - } - ], - "vtgates": [ - { - "host": { - "fqdn": "localhost:15001", - "hostname": "localhost:15991" - } - } - ] -} diff --git a/examples/region_sharding/vtadmin/rbac.yaml b/examples/region_sharding/vtadmin/rbac.yaml deleted file mode 100644 index a2e665e4d8d..00000000000 --- a/examples/region_sharding/vtadmin/rbac.yaml +++ /dev/null @@ -1,5 +0,0 @@ -rules: - - resource: "*" - actions: ["*"] - subjects: ["*"] - clusters: ["*"] diff --git a/examples/region_sharding/vtorc/config.json b/examples/region_sharding/vtorc/config.json deleted file mode 100644 index e1f27ee5762..00000000000 --- a/examples/region_sharding/vtorc/config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "MySQLTopologyUser": "orc_client_user", - "MySQLTopologyPassword": "orc_client_user_password", - "MySQLReplicaUser": "vt_repl", - "MySQLReplicaPassword": "", - "RecoveryPeriodBlockSeconds": 1, - "InstancePollSeconds": 1 -} \ No newline at end of file diff --git a/examples/vtexplain/atomicity_method1.sh b/examples/vtexplain/atomicity_method1.sh new file mode 100755 index 00000000000..f4e2a300f0e --- /dev/null +++ b/examples/vtexplain/atomicity_method1.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -x +vtexplain --vschema-file atomicity_vschema.json --schema-file atomicity_schema.sql --shards 4 --sql 'INSERT /*vt+ MULTI_SHARD_AUTOCOMMIT=1 */ INTO t1 (c1) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20);' diff --git a/examples/vtexplain/atomicity_method2.sh b/examples/vtexplain/atomicity_method2.sh new file mode 100755 index 00000000000..061479ecae9 --- /dev/null +++ b/examples/vtexplain/atomicity_method2.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -x +vtexplain --vschema-file atomicity_vschema.json --schema-file atomicity_schema.sql --shards 4 --sql 'SET transaction_mode="single"; INSERT INTO t1 (c1) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20);' diff --git a/examples/vtexplain/atomicity_method2_reads.sh b/examples/vtexplain/atomicity_method2_reads.sh new file mode 100755 index 00000000000..e1b383d1ef5 --- /dev/null +++ b/examples/vtexplain/atomicity_method2_reads.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -x +vtexplain --vschema-file atomicity_vschema.json --schema-file atomicity_schema.sql --shards 4 --sql 'SET transaction_mode="single"; BEGIN; SELECT * from t1; COMMIT;' diff --git a/examples/vtexplain/atomicity_method2_working.sh b/examples/vtexplain/atomicity_method2_working.sh new file mode 100755 index 00000000000..0ba844fe08f --- /dev/null +++ b/examples/vtexplain/atomicity_method2_working.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -x +vtexplain --vschema-file atomicity_vschema.json --schema-file atomicity_schema.sql --shards 4 --sql 'SET transaction_mode="single"; INSERT INTO t1 (c1) values (10),(14),(15),(16);' diff --git a/examples/vtexplain/atomicity_method3.sh b/examples/vtexplain/atomicity_method3.sh new file mode 100755 index 00000000000..e3c013b5a8d --- /dev/null +++ b/examples/vtexplain/atomicity_method3.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -x +# SET transaction_mode="multi" is implied by default +vtexplain --vschema-file atomicity_vschema.json --schema-file atomicity_schema.sql --shards 4 --sql 'INSERT INTO t1 (c1) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20);' diff --git a/examples/local/vtexplain/atomicity_schema.sql b/examples/vtexplain/atomicity_schema.sql similarity index 100% rename from examples/local/vtexplain/atomicity_schema.sql rename to examples/vtexplain/atomicity_schema.sql diff --git a/examples/local/vtexplain/atomicity_vschema.json b/examples/vtexplain/atomicity_vschema.json similarity index 100% rename from examples/local/vtexplain/atomicity_vschema.json rename to examples/vtexplain/atomicity_vschema.json diff --git a/test/client_test.sh b/test/client_test.sh index 2a467cc62f1..4bd76286863 100755 --- a/test/client_test.sh +++ b/test/client_test.sh @@ -20,22 +20,22 @@ source build.env set -xe -cd "$VTROOT/examples/local" +cd "$VTROOT/examples/common/scripts" -CELL=test ./scripts/etcd-up.sh -CELL=test ./scripts/vtctld-up.sh +CELL=test ./etcd-up.sh +CELL=test ./vtctld-up.sh for i in 100 101 102; do - CELL=test TABLET_UID=$i ./scripts/mysqlctl-up.sh - CELL=test KEYSPACE=test_keyspace TABLET_UID=$i ./scripts/vttablet-up.sh + CELL=test TABLET_UID=$i ./mysqlctl-up.sh + CELL=test KEYSPACE=test_keyspace TABLET_UID=$i ./vttablet-up.sh done vtctlclient --server localhost:15999 InitShardPrimary -- --force test_keyspace/0 test-100 -vtctlclient --server localhost:15999 ApplySchema -- --sql-file create_test_table.sql test_keyspace +vtctlclient --server localhost:15999 ApplySchema -- --sql-file ../../local/create_test_table.sql test_keyspace vtctlclient --server localhost:15999 RebuildVSchemaGraph -CELL=test ./scripts/vtgate-up.sh +CELL=test ./vtgate-up.sh echo "Run Go client script..." go run $VTROOT/test/client/client.go --server=localhost:15991 @@ -48,13 +48,13 @@ $VTROOT/test/client_jdbc.sh # Clean up -./scripts/vtgate-down.sh +./vtgate-down.sh for i in 100 101 102; do - CELL=test TABLET_UID=$i ./scripts/vttablet-down.sh - CELL=test TABLET_UID=$i ./scripts/mysqlctl-down.sh + CELL=test TABLET_UID=$i ./vttablet-down.sh + CELL=test TABLET_UID=$i ./mysqlctl-down.sh done -./scripts/vtctld-down.sh -CELL=test ./scripts/etcd-down.sh +./vtctld-down.sh +CELL=test ./etcd-down.sh diff --git a/test/local_example.sh b/test/local_example.sh index b1954fca517..e71855f7960 100755 --- a/test/local_example.sh +++ b/test/local_example.sh @@ -20,12 +20,12 @@ source build.env -set -xe +set -xeo pipefail cd "$VTROOT/examples/local" unset VTROOT # ensure that the examples can run without VTROOT now. -source ./env.sh # Required so that "mysql" works from alias +source ../common/env.sh # Required so that "mysql" works from alias ./101_initial_cluster.sh @@ -38,25 +38,31 @@ mysql --table < ../common/select_commerce_data.sql for shard in "customer/0"; do while true; do - mysql "$shard" -e 'show tables' && break || echo "waiting for shard: $shard!" + if $(mysql "$shard" -e 'show tables' &>/dev/null); then + break + fi + echo -e "waiting for shard: $shard ..." sleep 1 - done; -done; + done +done ./202_move_tables.sh sleep 3 # required for now -exit + ./203_switch_reads.sh ./204_switch_writes.sh mysql --table < ../common/select_customer0_data.sql -# Expected to fail! -mysql --table < ../common/select_commerce_data.sql || echo "DenyList working as expected" -./205_clean_commerce.sh -# Expected to fail! -mysql --table < ../common/select_commerce_data.sql || echo "Tables missing as expected" +# We expect this to fail due to the denied tables +# rules in place. +# For some reason this succeeds... +# $(mysql --table < ../common/select_commerce_data.sql &>/dev/null || true) + +./205_clean_commerce.sh +# We expect this to fail as the keyspace is now gone. +$(mysql --table < ../common/select_commerce_data.sql &>/dev/null || true) ./301_customer_sharded.sh ./302_new_shards.sh @@ -65,16 +71,17 @@ mysql --table < ../common/select_commerce_data.sql || echo "Tables missing as ex # TODO: Eliminate this race in the examples' scripts for shard in "customer/-80" "customer/80-"; do while true; do - mysql "$shard" -e 'show tables' && break || echo "waiting for shard: $shard!" + if $(mysql "$shard" -e 'show tables' &>/dev/null); then + break + fi + echo -e "waiting for shard: $shard ..." sleep 1 - done; -done; + done +done ./303_reshard.sh - sleep 3 # TODO: Required for now! - ./304_switch_reads.sh ./305_switch_writes.sh diff --git a/test/region_example.sh b/test/region_example.sh index 785aea5d477..8ef45f58a6d 100755 --- a/test/region_example.sh +++ b/test/region_example.sh @@ -20,12 +20,12 @@ source build.env -set -xe +set -xeo pipefail cd "$VTROOT/examples/region_sharding" unset VTROOT # ensure that the examples can run without VTROOT now. -source ./env.sh # Required so that "mysql" works from alias +source ../common/env.sh # Required so that "mysql" works from alias ./101_initial_cluster.sh From 49ae2a9a0e33288c35bdd474d486a7327a5fe1fb Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Thu, 16 Feb 2023 22:13:39 +0100 Subject: [PATCH 014/233] Fix for USING when column names not lower cased (#12379) Signed-off-by: Andres Taylor --- go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json | 4 ++-- go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json | 6 +++--- go/vt/vtgate/semantics/early_rewriter.go | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json b/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json index c3798bbc2fe..c53b3034e82 100644 --- a/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json @@ -451,7 +451,7 @@ "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" } @@ -545,7 +545,7 @@ "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" diff --git a/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json b/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json index 919ce017add..6ae3785110d 100644 --- a/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json @@ -451,7 +451,7 @@ "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" } @@ -545,7 +545,7 @@ "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" @@ -583,7 +583,7 @@ "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" diff --git a/go/vt/vtgate/semantics/early_rewriter.go b/go/vt/vtgate/semantics/early_rewriter.go index dce0e6e2da2..4071cfe3837 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" "vitess.io/vitess/go/vt/vtgate/evalengine" @@ -298,7 +299,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 { From 29e137a63ed7394812a8161908ad7db790973962 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:15:48 +0100 Subject: [PATCH 015/233] Fix bug in vtexplain around JOINs (#12384) Signed-off-by: Andres Taylor Co-authored-by: Andres Taylor --- .../multi-output/unsharded-output.txt | 5 + .../uneven-keyspace-output.txt | 16 - 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 ++++++++++-------- 6 files changed, 205 insertions(+), 177 deletions(-) delete mode 100644 go/vt/vtexplain/testdata/plan_test1941596715/uneven-keyspace-output.txt 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/plan_test1941596715/uneven-keyspace-output.txt b/go/vt/vtexplain/testdata/plan_test1941596715/uneven-keyspace-output.txt deleted file mode 100644 index 38a22b7d315..00000000000 --- a/go/vt/vtexplain/testdata/plan_test1941596715/uneven-keyspace-output.txt +++ /dev/null @@ -1,16 +0,0 @@ ----------------------------------------------------------------------- -select * from user - -1 ks_sharded/-80: select * from `user` limit 10001 -1 ks_sharded/80-90: select * from `user` limit 10001 -1 ks_sharded/a0-e8: select * from `user` limit 10001 -1 ks_sharded/e8-: select * from `user` limit 10001 -2 ks_sharded/90-a0: select * from `user` limit 10001 - ----------------------------------------------------------------------- -select * from user where id in (10, 17, 42, 100000) - -1 ks_sharded/-80: select * from `user` where id in (10, 17, 42) limit 10001 -1 ks_sharded/80-90: select * from `user` where id in (100000) limit 10001 - ----------------------------------------------------------------------- diff --git a/go/vt/vtexplain/testdata/test-schema.sql b/go/vt/vtexplain/testdata/test-schema.sql index 75458c8dc96..06da14c669a 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 232459b57af..5d288121507 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 761b71cb572..91cae609251 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -507,199 +507,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 30f8294064a967f630ed4ec27a6ae46f8e6a1b81 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 21 Feb 2023 13:02:46 +0530 Subject: [PATCH 016/233] Schema RPC to fetch table/view definition (#12375) * feat: proto changes to add new rpc Signed-off-by: Harshit Gangal * feat: vttablet changes in queryservice to implement the new rpc Signed-off-by: Harshit Gangal * added test on tabletserver Signed-off-by: Harshit Gangal * feat: use the new schema rpc in vtgate to get updated view definition Signed-off-by: Harshit Gangal * remove error from getschemaresponse and change the enum name Signed-off-by: Harshit Gangal * updated proto files for vtadmin Signed-off-by: Harshit Gangal * fix e2e test Signed-off-by: Harshit Gangal --------- Signed-off-by: Harshit Gangal --- go/mysql/schema.go | 7 +- go/vt/proto/query/query.pb.go | 822 +++++++++++------- go/vt/proto/query/query_vtproto.pb.go | 466 ++++++++++ go/vt/proto/queryservice/queryservice.pb.go | 126 +-- .../queryservice/queryservice_grpc.pb.go | 38 + go/vt/vtcombo/tablet_map.go | 6 + go/vt/vtgate/schema/tracker.go | 22 +- go/vt/vtgate/schema/tracker_test.go | 134 +-- go/vt/vttablet/endtoend/framework/client.go | 4 + go/vt/vttablet/endtoend/views_test.go | 48 +- go/vt/vttablet/grpcqueryservice/server.go | 13 + go/vt/vttablet/grpctabletconn/conn.go | 20 + go/vt/vttablet/queryservice/queryservice.go | 3 + go/vt/vttablet/queryservice/wrapped.go | 9 + go/vt/vttablet/sandboxconn/sandboxconn.go | 19 + .../tabletconntest/fakequeryservice.go | 5 + go/vt/vttablet/tabletserver/query_executor.go | 57 +- go/vt/vttablet/tabletserver/tabletserver.go | 21 + proto/query.proto | 21 + proto/queryservice.proto | 3 + web/vtadmin/src/proto/vtadmin.d.ts | 199 +++++ web/vtadmin/src/proto/vtadmin.js | 510 +++++++++++ 22 files changed, 2065 insertions(+), 488 deletions(-) diff --git a/go/mysql/schema.go b/go/mysql/schema.go index a85d140fef9..4221386c674 100644 --- a/go/mysql/schema.go +++ b/go/mysql/schema.go @@ -23,12 +23,7 @@ import ( querypb "vitess.io/vitess/go/vt/proto/query" ) -// This file provides a few utility variables and methods, mostly for tests. -// The assumptions made about the types of fields and data returned -// by MySQl are validated in schema_test.go. This way all tests -// can use these variables and methods to simulate a MySQL server -// (using fakesqldb/ package for instance) and still be guaranteed correct -// data. +// This file contains the mysql queries used by different parts of the code. const ( // BaseShowPrimary is the base query for fetching primary key info. diff --git a/go/vt/proto/query/query.pb.go b/go/vt/proto/query/query.pb.go index c2bede30ad7..29302b4e662 100644 --- a/go/vt/proto/query/query.pb.go +++ b/go/vt/proto/query/query.pb.go @@ -475,6 +475,56 @@ func (TransactionState) EnumDescriptor() ([]byte, []int) { return file_query_proto_rawDescGZIP(), []int{3} } +// SchemaTableType represents the type of table requested. +type SchemaTableType int32 + +const ( + SchemaTableType_VIEWS SchemaTableType = 0 + SchemaTableType_TABLES SchemaTableType = 1 + SchemaTableType_ALL SchemaTableType = 2 +) + +// Enum value maps for SchemaTableType. +var ( + SchemaTableType_name = map[int32]string{ + 0: "VIEWS", + 1: "TABLES", + 2: "ALL", + } + SchemaTableType_value = map[string]int32{ + "VIEWS": 0, + "TABLES": 1, + "ALL": 2, + } +) + +func (x SchemaTableType) Enum() *SchemaTableType { + p := new(SchemaTableType) + *p = x + return p +} + +func (x SchemaTableType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SchemaTableType) Descriptor() protoreflect.EnumDescriptor { + return file_query_proto_enumTypes[4].Descriptor() +} + +func (SchemaTableType) Type() protoreflect.EnumType { + return &file_query_proto_enumTypes[4] +} + +func (x SchemaTableType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SchemaTableType.Descriptor instead. +func (SchemaTableType) EnumDescriptor() ([]byte, []int) { + return file_query_proto_rawDescGZIP(), []int{4} +} + type ExecuteOptions_IncludedFields int32 const ( @@ -508,11 +558,11 @@ func (x ExecuteOptions_IncludedFields) String() string { } func (ExecuteOptions_IncludedFields) Descriptor() protoreflect.EnumDescriptor { - return file_query_proto_enumTypes[4].Descriptor() + return file_query_proto_enumTypes[5].Descriptor() } func (ExecuteOptions_IncludedFields) Type() protoreflect.EnumType { - return &file_query_proto_enumTypes[4] + return &file_query_proto_enumTypes[5] } func (x ExecuteOptions_IncludedFields) Number() protoreflect.EnumNumber { @@ -560,11 +610,11 @@ func (x ExecuteOptions_Workload) String() string { } func (ExecuteOptions_Workload) Descriptor() protoreflect.EnumDescriptor { - return file_query_proto_enumTypes[5].Descriptor() + return file_query_proto_enumTypes[6].Descriptor() } func (ExecuteOptions_Workload) Type() protoreflect.EnumType { - return &file_query_proto_enumTypes[5] + return &file_query_proto_enumTypes[6] } func (x ExecuteOptions_Workload) Number() protoreflect.EnumNumber { @@ -625,11 +675,11 @@ func (x ExecuteOptions_TransactionIsolation) String() string { } func (ExecuteOptions_TransactionIsolation) Descriptor() protoreflect.EnumDescriptor { - return file_query_proto_enumTypes[6].Descriptor() + return file_query_proto_enumTypes[7].Descriptor() } func (ExecuteOptions_TransactionIsolation) Type() protoreflect.EnumType { - return &file_query_proto_enumTypes[6] + return &file_query_proto_enumTypes[7] } func (x ExecuteOptions_TransactionIsolation) Number() protoreflect.EnumNumber { @@ -686,11 +736,11 @@ func (x ExecuteOptions_PlannerVersion) String() string { } func (ExecuteOptions_PlannerVersion) Descriptor() protoreflect.EnumDescriptor { - return file_query_proto_enumTypes[7].Descriptor() + return file_query_proto_enumTypes[8].Descriptor() } func (ExecuteOptions_PlannerVersion) Type() protoreflect.EnumType { - return &file_query_proto_enumTypes[7] + return &file_query_proto_enumTypes[8] } func (x ExecuteOptions_PlannerVersion) Number() protoreflect.EnumNumber { @@ -738,11 +788,11 @@ func (x ExecuteOptions_Consolidator) String() string { } func (ExecuteOptions_Consolidator) Descriptor() protoreflect.EnumDescriptor { - return file_query_proto_enumTypes[8].Descriptor() + return file_query_proto_enumTypes[9].Descriptor() } func (ExecuteOptions_Consolidator) Type() protoreflect.EnumType { - return &file_query_proto_enumTypes[8] + return &file_query_proto_enumTypes[9] } func (x ExecuteOptions_Consolidator) Number() protoreflect.EnumNumber { @@ -787,11 +837,11 @@ func (x ExecuteOptions_TransactionAccessMode) String() string { } func (ExecuteOptions_TransactionAccessMode) Descriptor() protoreflect.EnumDescriptor { - return file_query_proto_enumTypes[9].Descriptor() + return file_query_proto_enumTypes[10].Descriptor() } func (ExecuteOptions_TransactionAccessMode) Type() protoreflect.EnumType { - return &file_query_proto_enumTypes[9] + return &file_query_proto_enumTypes[10] } func (x ExecuteOptions_TransactionAccessMode) Number() protoreflect.EnumNumber { @@ -837,11 +887,11 @@ func (x StreamEvent_Statement_Category) String() string { } func (StreamEvent_Statement_Category) Descriptor() protoreflect.EnumDescriptor { - return file_query_proto_enumTypes[10].Descriptor() + return file_query_proto_enumTypes[11].Descriptor() } func (StreamEvent_Statement_Category) Type() protoreflect.EnumType { - return &file_query_proto_enumTypes[10] + return &file_query_proto_enumTypes[11] } func (x StreamEvent_Statement_Category) Number() protoreflect.EnumNumber { @@ -5365,6 +5415,119 @@ func (x *TransactionMetadata) GetParticipants() []*Target { return nil } +// GetSchemaRequest is the payload to GetSchema +type GetSchemaRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Target *Target `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + TableType SchemaTableType `protobuf:"varint,2,opt,name=table_type,json=tableType,proto3,enum=query.SchemaTableType" json:"table_type,omitempty"` + TableNames []string `protobuf:"bytes,3,rep,name=table_names,json=tableNames,proto3" json:"table_names,omitempty"` +} + +func (x *GetSchemaRequest) Reset() { + *x = GetSchemaRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_query_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSchemaRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSchemaRequest) ProtoMessage() {} + +func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message { + mi := &file_query_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSchemaRequest.ProtoReflect.Descriptor instead. +func (*GetSchemaRequest) Descriptor() ([]byte, []int) { + return file_query_proto_rawDescGZIP(), []int{62} +} + +func (x *GetSchemaRequest) GetTarget() *Target { + if x != nil { + return x.Target + } + return nil +} + +func (x *GetSchemaRequest) GetTableType() SchemaTableType { + if x != nil { + return x.TableType + } + return SchemaTableType_VIEWS +} + +func (x *GetSchemaRequest) GetTableNames() []string { + if x != nil { + return x.TableNames + } + return nil +} + +// GetSchemaResponse is the returned value from GetSchema +type GetSchemaResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // this is for the schema definition for the requested tables. + TableDefinition map[string]string `protobuf:"bytes,2,rep,name=table_definition,json=tableDefinition,proto3" json:"table_definition,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetSchemaResponse) Reset() { + *x = GetSchemaResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_query_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSchemaResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSchemaResponse) ProtoMessage() {} + +func (x *GetSchemaResponse) ProtoReflect() protoreflect.Message { + mi := &file_query_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSchemaResponse.ProtoReflect.Descriptor instead. +func (*GetSchemaResponse) Descriptor() ([]byte, []int) { + return file_query_proto_rawDescGZIP(), []int{63} +} + +func (x *GetSchemaResponse) GetTableDefinition() map[string]string { + if x != nil { + return x.TableDefinition + } + return nil +} + // One individual Statement in a transaction. type StreamEvent_Statement struct { state protoimpl.MessageState @@ -5384,7 +5547,7 @@ type StreamEvent_Statement struct { func (x *StreamEvent_Statement) Reset() { *x = StreamEvent_Statement{} if protoimpl.UnsafeEnabled { - mi := &file_query_proto_msgTypes[63] + mi := &file_query_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5397,7 +5560,7 @@ func (x *StreamEvent_Statement) String() string { func (*StreamEvent_Statement) ProtoMessage() {} func (x *StreamEvent_Statement) ProtoReflect() protoreflect.Message { - mi := &file_query_proto_msgTypes[63] + mi := &file_query_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6267,76 +6430,100 @@ var file_query_proto_rawDesc = []byte{ 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x2a, - 0x92, 0x03, 0x0a, 0x09, 0x4d, 0x79, 0x53, 0x71, 0x6c, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x09, 0x0a, - 0x05, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x54, 0x5f, - 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x50, - 0x52, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, - 0x0f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, - 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x4b, - 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x4c, 0x4f, - 0x42, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x10, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x53, 0x49, - 0x47, 0x4e, 0x45, 0x44, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x20, 0x12, 0x11, 0x0a, 0x0d, 0x5a, - 0x45, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x4c, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x40, 0x12, 0x10, - 0x0a, 0x0b, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x01, - 0x12, 0x0e, 0x0a, 0x09, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x02, - 0x12, 0x18, 0x0a, 0x13, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45, 0x4d, 0x45, - 0x4e, 0x54, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x04, 0x12, 0x13, 0x0a, 0x0e, 0x54, 0x49, - 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x08, 0x12, - 0x0d, 0x0a, 0x08, 0x53, 0x45, 0x54, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x10, 0x12, 0x1a, - 0x0a, 0x15, 0x4e, 0x4f, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x56, 0x41, 0x4c, - 0x55, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x20, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x4e, - 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x57, 0x5f, 0x46, 0x4c, 0x41, 0x47, - 0x10, 0x80, 0x40, 0x12, 0x0e, 0x0a, 0x08, 0x4e, 0x55, 0x4d, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, - 0x80, 0x80, 0x02, 0x12, 0x13, 0x0a, 0x0d, 0x50, 0x41, 0x52, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, - 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x47, 0x52, 0x4f, 0x55, - 0x50, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x02, 0x12, 0x11, 0x0a, 0x0b, 0x55, 0x4e, - 0x49, 0x51, 0x55, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x04, 0x12, 0x11, 0x0a, - 0x0b, 0x42, 0x49, 0x4e, 0x43, 0x4d, 0x50, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x08, - 0x1a, 0x02, 0x10, 0x01, 0x2a, 0x6b, 0x0a, 0x04, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x49, 0x4e, 0x54, 0x45, - 0x47, 0x52, 0x41, 0x4c, 0x10, 0x80, 0x02, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x55, 0x4e, 0x53, - 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x80, 0x04, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x53, 0x46, 0x4c, - 0x4f, 0x41, 0x54, 0x10, 0x80, 0x08, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x53, 0x51, 0x55, 0x4f, 0x54, - 0x45, 0x44, 0x10, 0x80, 0x10, 0x12, 0x0b, 0x0a, 0x06, 0x49, 0x53, 0x54, 0x45, 0x58, 0x54, 0x10, - 0x80, 0x20, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x53, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x80, - 0x40, 0x2a, 0xc0, 0x03, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x55, - 0x4c, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x04, 0x49, 0x4e, 0x54, - 0x38, 0x10, 0x81, 0x02, 0x12, 0x0a, 0x0a, 0x05, 0x55, 0x49, 0x4e, 0x54, 0x38, 0x10, 0x82, 0x06, - 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x31, 0x36, 0x10, 0x83, 0x02, 0x12, 0x0b, 0x0a, 0x06, - 0x55, 0x49, 0x4e, 0x54, 0x31, 0x36, 0x10, 0x84, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, - 0x32, 0x34, 0x10, 0x85, 0x02, 0x12, 0x0b, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x32, 0x34, 0x10, - 0x86, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x87, 0x02, 0x12, 0x0b, - 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x88, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, - 0x4e, 0x54, 0x36, 0x34, 0x10, 0x89, 0x02, 0x12, 0x0b, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x36, - 0x34, 0x10, 0x8a, 0x06, 0x12, 0x0c, 0x0a, 0x07, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x33, 0x32, 0x10, - 0x8b, 0x08, 0x12, 0x0c, 0x0a, 0x07, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x36, 0x34, 0x10, 0x8c, 0x08, - 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x8d, 0x10, - 0x12, 0x09, 0x0a, 0x04, 0x44, 0x41, 0x54, 0x45, 0x10, 0x8e, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x54, - 0x49, 0x4d, 0x45, 0x10, 0x8f, 0x10, 0x12, 0x0d, 0x0a, 0x08, 0x44, 0x41, 0x54, 0x45, 0x54, 0x49, - 0x4d, 0x45, 0x10, 0x90, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x59, 0x45, 0x41, 0x52, 0x10, 0x91, 0x06, - 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x43, 0x49, 0x4d, 0x41, 0x4c, 0x10, 0x12, 0x12, 0x09, 0x0a, - 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x93, 0x30, 0x12, 0x09, 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, - 0x10, 0x94, 0x50, 0x12, 0x0c, 0x0a, 0x07, 0x56, 0x41, 0x52, 0x43, 0x48, 0x41, 0x52, 0x10, 0x95, - 0x30, 0x12, 0x0e, 0x0a, 0x09, 0x56, 0x41, 0x52, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x96, - 0x50, 0x12, 0x09, 0x0a, 0x04, 0x43, 0x48, 0x41, 0x52, 0x10, 0x97, 0x30, 0x12, 0x0b, 0x0a, 0x06, - 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x98, 0x50, 0x12, 0x08, 0x0a, 0x03, 0x42, 0x49, 0x54, - 0x10, 0x99, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x9a, 0x10, 0x12, 0x08, - 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x9b, 0x10, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x55, 0x50, 0x4c, - 0x45, 0x10, 0x1c, 0x12, 0x0d, 0x0a, 0x08, 0x47, 0x45, 0x4f, 0x4d, 0x45, 0x54, 0x52, 0x59, 0x10, - 0x9d, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x9e, 0x10, 0x12, 0x0e, 0x0a, - 0x0a, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x1f, 0x12, 0x0b, 0x0a, - 0x06, 0x48, 0x45, 0x58, 0x4e, 0x55, 0x4d, 0x10, 0xa0, 0x20, 0x12, 0x0b, 0x0a, 0x06, 0x48, 0x45, - 0x58, 0x56, 0x41, 0x4c, 0x10, 0xa1, 0x20, 0x12, 0x0b, 0x0a, 0x06, 0x42, 0x49, 0x54, 0x4e, 0x55, - 0x4d, 0x10, 0xa2, 0x20, 0x2a, 0x46, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x12, 0x0c, - 0x0a, 0x08, 0x52, 0x4f, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x03, 0x42, 0x35, 0x0a, 0x0f, - 0x69, 0x6f, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5a, - 0x22, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, - 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x22, + 0x91, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x16, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x10, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x42, 0x0a, 0x14, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x92, 0x03, 0x0a, 0x09, 0x4d, 0x79, 0x53, 0x71, + 0x6c, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x00, + 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x54, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x46, 0x4c, 0x41, + 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x46, + 0x4c, 0x41, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, + 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x55, + 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, + 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x4c, 0x4f, 0x42, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x10, + 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x5f, 0x46, 0x4c, 0x41, + 0x47, 0x10, 0x20, 0x12, 0x11, 0x0a, 0x0d, 0x5a, 0x45, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x4c, 0x5f, + 0x46, 0x4c, 0x41, 0x47, 0x10, 0x40, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, + 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x45, 0x4e, 0x55, 0x4d, + 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x02, 0x12, 0x18, 0x0a, 0x13, 0x41, 0x55, 0x54, 0x4f, + 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, + 0x80, 0x04, 0x12, 0x13, 0x0a, 0x0e, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, + 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x08, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x45, 0x54, 0x5f, 0x46, + 0x4c, 0x41, 0x47, 0x10, 0x80, 0x10, 0x12, 0x1a, 0x0a, 0x15, 0x4e, 0x4f, 0x5f, 0x44, 0x45, 0x46, + 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, + 0x80, 0x20, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, + 0x4e, 0x4f, 0x57, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x40, 0x12, 0x0e, 0x0a, 0x08, 0x4e, + 0x55, 0x4d, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x02, 0x12, 0x13, 0x0a, 0x0d, 0x50, + 0x41, 0x52, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x01, + 0x12, 0x10, 0x0a, 0x0a, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, + 0x80, 0x02, 0x12, 0x11, 0x0a, 0x0b, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x46, 0x4c, 0x41, + 0x47, 0x10, 0x80, 0x80, 0x04, 0x12, 0x11, 0x0a, 0x0b, 0x42, 0x49, 0x4e, 0x43, 0x4d, 0x50, 0x5f, + 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x08, 0x1a, 0x02, 0x10, 0x01, 0x2a, 0x6b, 0x0a, 0x04, + 0x46, 0x6c, 0x61, 0x67, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0a, 0x49, 0x53, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x4c, 0x10, 0x80, 0x02, 0x12, + 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x55, 0x4e, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x80, 0x04, + 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x53, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x80, 0x08, 0x12, 0x0d, + 0x0a, 0x08, 0x49, 0x53, 0x51, 0x55, 0x4f, 0x54, 0x45, 0x44, 0x10, 0x80, 0x10, 0x12, 0x0b, 0x0a, + 0x06, 0x49, 0x53, 0x54, 0x45, 0x58, 0x54, 0x10, 0x80, 0x20, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x53, + 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x80, 0x40, 0x2a, 0xc0, 0x03, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, + 0x00, 0x12, 0x09, 0x0a, 0x04, 0x49, 0x4e, 0x54, 0x38, 0x10, 0x81, 0x02, 0x12, 0x0a, 0x0a, 0x05, + 0x55, 0x49, 0x4e, 0x54, 0x38, 0x10, 0x82, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x31, + 0x36, 0x10, 0x83, 0x02, 0x12, 0x0b, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x31, 0x36, 0x10, 0x84, + 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x32, 0x34, 0x10, 0x85, 0x02, 0x12, 0x0b, 0x0a, + 0x06, 0x55, 0x49, 0x4e, 0x54, 0x32, 0x34, 0x10, 0x86, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, + 0x54, 0x33, 0x32, 0x10, 0x87, 0x02, 0x12, 0x0b, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, + 0x10, 0x88, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x89, 0x02, 0x12, + 0x0b, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x8a, 0x06, 0x12, 0x0c, 0x0a, 0x07, + 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x33, 0x32, 0x10, 0x8b, 0x08, 0x12, 0x0c, 0x0a, 0x07, 0x46, 0x4c, + 0x4f, 0x41, 0x54, 0x36, 0x34, 0x10, 0x8c, 0x08, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, + 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x8d, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x41, 0x54, 0x45, + 0x10, 0x8e, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x8f, 0x10, 0x12, 0x0d, + 0x0a, 0x08, 0x44, 0x41, 0x54, 0x45, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x90, 0x10, 0x12, 0x09, 0x0a, + 0x04, 0x59, 0x45, 0x41, 0x52, 0x10, 0x91, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x43, 0x49, + 0x4d, 0x41, 0x4c, 0x10, 0x12, 0x12, 0x09, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x93, 0x30, + 0x12, 0x09, 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x94, 0x50, 0x12, 0x0c, 0x0a, 0x07, 0x56, + 0x41, 0x52, 0x43, 0x48, 0x41, 0x52, 0x10, 0x95, 0x30, 0x12, 0x0e, 0x0a, 0x09, 0x56, 0x41, 0x52, + 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x96, 0x50, 0x12, 0x09, 0x0a, 0x04, 0x43, 0x48, 0x41, + 0x52, 0x10, 0x97, 0x30, 0x12, 0x0b, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x98, + 0x50, 0x12, 0x08, 0x0a, 0x03, 0x42, 0x49, 0x54, 0x10, 0x99, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x45, + 0x4e, 0x55, 0x4d, 0x10, 0x9a, 0x10, 0x12, 0x08, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x9b, 0x10, + 0x12, 0x09, 0x0a, 0x05, 0x54, 0x55, 0x50, 0x4c, 0x45, 0x10, 0x1c, 0x12, 0x0d, 0x0a, 0x08, 0x47, + 0x45, 0x4f, 0x4d, 0x45, 0x54, 0x52, 0x59, 0x10, 0x9d, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x4a, 0x53, + 0x4f, 0x4e, 0x10, 0x9e, 0x10, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, + 0x49, 0x4f, 0x4e, 0x10, 0x1f, 0x12, 0x0b, 0x0a, 0x06, 0x48, 0x45, 0x58, 0x4e, 0x55, 0x4d, 0x10, + 0xa0, 0x20, 0x12, 0x0b, 0x0a, 0x06, 0x48, 0x45, 0x58, 0x56, 0x41, 0x4c, 0x10, 0xa1, 0x20, 0x12, + 0x0b, 0x0a, 0x06, 0x42, 0x49, 0x54, 0x4e, 0x55, 0x4d, 0x10, 0xa2, 0x20, 0x2a, 0x46, 0x0a, 0x10, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, + 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x4f, 0x4c, 0x4c, 0x42, 0x41, + 0x43, 0x4b, 0x10, 0x03, 0x2a, 0x31, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x49, 0x45, 0x57, 0x53, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x07, + 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x42, 0x35, 0x0a, 0x0f, 0x69, 0x6f, 0x2e, 0x76, 0x69, + 0x74, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x22, 0x76, 0x69, 0x74, 0x65, + 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, + 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6351,231 +6538,238 @@ func file_query_proto_rawDescGZIP() []byte { return file_query_proto_rawDescData } -var file_query_proto_enumTypes = make([]protoimpl.EnumInfo, 11) -var file_query_proto_msgTypes = make([]protoimpl.MessageInfo, 64) +var file_query_proto_enumTypes = make([]protoimpl.EnumInfo, 12) +var file_query_proto_msgTypes = make([]protoimpl.MessageInfo, 67) var file_query_proto_goTypes = []interface{}{ (MySqlFlag)(0), // 0: query.MySqlFlag (Flag)(0), // 1: query.Flag (Type)(0), // 2: query.Type (TransactionState)(0), // 3: query.TransactionState - (ExecuteOptions_IncludedFields)(0), // 4: query.ExecuteOptions.IncludedFields - (ExecuteOptions_Workload)(0), // 5: query.ExecuteOptions.Workload - (ExecuteOptions_TransactionIsolation)(0), // 6: query.ExecuteOptions.TransactionIsolation - (ExecuteOptions_PlannerVersion)(0), // 7: query.ExecuteOptions.PlannerVersion - (ExecuteOptions_Consolidator)(0), // 8: query.ExecuteOptions.Consolidator - (ExecuteOptions_TransactionAccessMode)(0), // 9: query.ExecuteOptions.TransactionAccessMode - (StreamEvent_Statement_Category)(0), // 10: query.StreamEvent.Statement.Category - (*Target)(nil), // 11: query.Target - (*VTGateCallerID)(nil), // 12: query.VTGateCallerID - (*EventToken)(nil), // 13: query.EventToken - (*Value)(nil), // 14: query.Value - (*BindVariable)(nil), // 15: query.BindVariable - (*BoundQuery)(nil), // 16: query.BoundQuery - (*ExecuteOptions)(nil), // 17: query.ExecuteOptions - (*Field)(nil), // 18: query.Field - (*Row)(nil), // 19: query.Row - (*QueryResult)(nil), // 20: query.QueryResult - (*QueryWarning)(nil), // 21: query.QueryWarning - (*StreamEvent)(nil), // 22: query.StreamEvent - (*ExecuteRequest)(nil), // 23: query.ExecuteRequest - (*ExecuteResponse)(nil), // 24: query.ExecuteResponse - (*ResultWithError)(nil), // 25: query.ResultWithError - (*StreamExecuteRequest)(nil), // 26: query.StreamExecuteRequest - (*StreamExecuteResponse)(nil), // 27: query.StreamExecuteResponse - (*BeginRequest)(nil), // 28: query.BeginRequest - (*BeginResponse)(nil), // 29: query.BeginResponse - (*CommitRequest)(nil), // 30: query.CommitRequest - (*CommitResponse)(nil), // 31: query.CommitResponse - (*RollbackRequest)(nil), // 32: query.RollbackRequest - (*RollbackResponse)(nil), // 33: query.RollbackResponse - (*PrepareRequest)(nil), // 34: query.PrepareRequest - (*PrepareResponse)(nil), // 35: query.PrepareResponse - (*CommitPreparedRequest)(nil), // 36: query.CommitPreparedRequest - (*CommitPreparedResponse)(nil), // 37: query.CommitPreparedResponse - (*RollbackPreparedRequest)(nil), // 38: query.RollbackPreparedRequest - (*RollbackPreparedResponse)(nil), // 39: query.RollbackPreparedResponse - (*CreateTransactionRequest)(nil), // 40: query.CreateTransactionRequest - (*CreateTransactionResponse)(nil), // 41: query.CreateTransactionResponse - (*StartCommitRequest)(nil), // 42: query.StartCommitRequest - (*StartCommitResponse)(nil), // 43: query.StartCommitResponse - (*SetRollbackRequest)(nil), // 44: query.SetRollbackRequest - (*SetRollbackResponse)(nil), // 45: query.SetRollbackResponse - (*ConcludeTransactionRequest)(nil), // 46: query.ConcludeTransactionRequest - (*ConcludeTransactionResponse)(nil), // 47: query.ConcludeTransactionResponse - (*ReadTransactionRequest)(nil), // 48: query.ReadTransactionRequest - (*ReadTransactionResponse)(nil), // 49: query.ReadTransactionResponse - (*BeginExecuteRequest)(nil), // 50: query.BeginExecuteRequest - (*BeginExecuteResponse)(nil), // 51: query.BeginExecuteResponse - (*BeginStreamExecuteRequest)(nil), // 52: query.BeginStreamExecuteRequest - (*BeginStreamExecuteResponse)(nil), // 53: query.BeginStreamExecuteResponse - (*MessageStreamRequest)(nil), // 54: query.MessageStreamRequest - (*MessageStreamResponse)(nil), // 55: query.MessageStreamResponse - (*MessageAckRequest)(nil), // 56: query.MessageAckRequest - (*MessageAckResponse)(nil), // 57: query.MessageAckResponse - (*ReserveExecuteRequest)(nil), // 58: query.ReserveExecuteRequest - (*ReserveExecuteResponse)(nil), // 59: query.ReserveExecuteResponse - (*ReserveStreamExecuteRequest)(nil), // 60: query.ReserveStreamExecuteRequest - (*ReserveStreamExecuteResponse)(nil), // 61: query.ReserveStreamExecuteResponse - (*ReserveBeginExecuteRequest)(nil), // 62: query.ReserveBeginExecuteRequest - (*ReserveBeginExecuteResponse)(nil), // 63: query.ReserveBeginExecuteResponse - (*ReserveBeginStreamExecuteRequest)(nil), // 64: query.ReserveBeginStreamExecuteRequest - (*ReserveBeginStreamExecuteResponse)(nil), // 65: query.ReserveBeginStreamExecuteResponse - (*ReleaseRequest)(nil), // 66: query.ReleaseRequest - (*ReleaseResponse)(nil), // 67: query.ReleaseResponse - (*StreamHealthRequest)(nil), // 68: query.StreamHealthRequest - (*RealtimeStats)(nil), // 69: query.RealtimeStats - (*AggregateStats)(nil), // 70: query.AggregateStats - (*StreamHealthResponse)(nil), // 71: query.StreamHealthResponse - (*TransactionMetadata)(nil), // 72: query.TransactionMetadata - nil, // 73: query.BoundQuery.BindVariablesEntry - (*StreamEvent_Statement)(nil), // 74: query.StreamEvent.Statement - (topodata.TabletType)(0), // 75: topodata.TabletType - (*vtrpc.CallerID)(nil), // 76: vtrpc.CallerID - (*vtrpc.RPCError)(nil), // 77: vtrpc.RPCError - (*topodata.TabletAlias)(nil), // 78: topodata.TabletAlias + (SchemaTableType)(0), // 4: query.SchemaTableType + (ExecuteOptions_IncludedFields)(0), // 5: query.ExecuteOptions.IncludedFields + (ExecuteOptions_Workload)(0), // 6: query.ExecuteOptions.Workload + (ExecuteOptions_TransactionIsolation)(0), // 7: query.ExecuteOptions.TransactionIsolation + (ExecuteOptions_PlannerVersion)(0), // 8: query.ExecuteOptions.PlannerVersion + (ExecuteOptions_Consolidator)(0), // 9: query.ExecuteOptions.Consolidator + (ExecuteOptions_TransactionAccessMode)(0), // 10: query.ExecuteOptions.TransactionAccessMode + (StreamEvent_Statement_Category)(0), // 11: query.StreamEvent.Statement.Category + (*Target)(nil), // 12: query.Target + (*VTGateCallerID)(nil), // 13: query.VTGateCallerID + (*EventToken)(nil), // 14: query.EventToken + (*Value)(nil), // 15: query.Value + (*BindVariable)(nil), // 16: query.BindVariable + (*BoundQuery)(nil), // 17: query.BoundQuery + (*ExecuteOptions)(nil), // 18: query.ExecuteOptions + (*Field)(nil), // 19: query.Field + (*Row)(nil), // 20: query.Row + (*QueryResult)(nil), // 21: query.QueryResult + (*QueryWarning)(nil), // 22: query.QueryWarning + (*StreamEvent)(nil), // 23: query.StreamEvent + (*ExecuteRequest)(nil), // 24: query.ExecuteRequest + (*ExecuteResponse)(nil), // 25: query.ExecuteResponse + (*ResultWithError)(nil), // 26: query.ResultWithError + (*StreamExecuteRequest)(nil), // 27: query.StreamExecuteRequest + (*StreamExecuteResponse)(nil), // 28: query.StreamExecuteResponse + (*BeginRequest)(nil), // 29: query.BeginRequest + (*BeginResponse)(nil), // 30: query.BeginResponse + (*CommitRequest)(nil), // 31: query.CommitRequest + (*CommitResponse)(nil), // 32: query.CommitResponse + (*RollbackRequest)(nil), // 33: query.RollbackRequest + (*RollbackResponse)(nil), // 34: query.RollbackResponse + (*PrepareRequest)(nil), // 35: query.PrepareRequest + (*PrepareResponse)(nil), // 36: query.PrepareResponse + (*CommitPreparedRequest)(nil), // 37: query.CommitPreparedRequest + (*CommitPreparedResponse)(nil), // 38: query.CommitPreparedResponse + (*RollbackPreparedRequest)(nil), // 39: query.RollbackPreparedRequest + (*RollbackPreparedResponse)(nil), // 40: query.RollbackPreparedResponse + (*CreateTransactionRequest)(nil), // 41: query.CreateTransactionRequest + (*CreateTransactionResponse)(nil), // 42: query.CreateTransactionResponse + (*StartCommitRequest)(nil), // 43: query.StartCommitRequest + (*StartCommitResponse)(nil), // 44: query.StartCommitResponse + (*SetRollbackRequest)(nil), // 45: query.SetRollbackRequest + (*SetRollbackResponse)(nil), // 46: query.SetRollbackResponse + (*ConcludeTransactionRequest)(nil), // 47: query.ConcludeTransactionRequest + (*ConcludeTransactionResponse)(nil), // 48: query.ConcludeTransactionResponse + (*ReadTransactionRequest)(nil), // 49: query.ReadTransactionRequest + (*ReadTransactionResponse)(nil), // 50: query.ReadTransactionResponse + (*BeginExecuteRequest)(nil), // 51: query.BeginExecuteRequest + (*BeginExecuteResponse)(nil), // 52: query.BeginExecuteResponse + (*BeginStreamExecuteRequest)(nil), // 53: query.BeginStreamExecuteRequest + (*BeginStreamExecuteResponse)(nil), // 54: query.BeginStreamExecuteResponse + (*MessageStreamRequest)(nil), // 55: query.MessageStreamRequest + (*MessageStreamResponse)(nil), // 56: query.MessageStreamResponse + (*MessageAckRequest)(nil), // 57: query.MessageAckRequest + (*MessageAckResponse)(nil), // 58: query.MessageAckResponse + (*ReserveExecuteRequest)(nil), // 59: query.ReserveExecuteRequest + (*ReserveExecuteResponse)(nil), // 60: query.ReserveExecuteResponse + (*ReserveStreamExecuteRequest)(nil), // 61: query.ReserveStreamExecuteRequest + (*ReserveStreamExecuteResponse)(nil), // 62: query.ReserveStreamExecuteResponse + (*ReserveBeginExecuteRequest)(nil), // 63: query.ReserveBeginExecuteRequest + (*ReserveBeginExecuteResponse)(nil), // 64: query.ReserveBeginExecuteResponse + (*ReserveBeginStreamExecuteRequest)(nil), // 65: query.ReserveBeginStreamExecuteRequest + (*ReserveBeginStreamExecuteResponse)(nil), // 66: query.ReserveBeginStreamExecuteResponse + (*ReleaseRequest)(nil), // 67: query.ReleaseRequest + (*ReleaseResponse)(nil), // 68: query.ReleaseResponse + (*StreamHealthRequest)(nil), // 69: query.StreamHealthRequest + (*RealtimeStats)(nil), // 70: query.RealtimeStats + (*AggregateStats)(nil), // 71: query.AggregateStats + (*StreamHealthResponse)(nil), // 72: query.StreamHealthResponse + (*TransactionMetadata)(nil), // 73: query.TransactionMetadata + (*GetSchemaRequest)(nil), // 74: query.GetSchemaRequest + (*GetSchemaResponse)(nil), // 75: query.GetSchemaResponse + nil, // 76: query.BoundQuery.BindVariablesEntry + (*StreamEvent_Statement)(nil), // 77: query.StreamEvent.Statement + nil, // 78: query.GetSchemaResponse.TableDefinitionEntry + (topodata.TabletType)(0), // 79: topodata.TabletType + (*vtrpc.CallerID)(nil), // 80: vtrpc.CallerID + (*vtrpc.RPCError)(nil), // 81: vtrpc.RPCError + (*topodata.TabletAlias)(nil), // 82: topodata.TabletAlias } var file_query_proto_depIdxs = []int32{ - 75, // 0: query.Target.tablet_type:type_name -> topodata.TabletType + 79, // 0: query.Target.tablet_type:type_name -> topodata.TabletType 2, // 1: query.Value.type:type_name -> query.Type 2, // 2: query.BindVariable.type:type_name -> query.Type - 14, // 3: query.BindVariable.values:type_name -> query.Value - 73, // 4: query.BoundQuery.bind_variables:type_name -> query.BoundQuery.BindVariablesEntry - 4, // 5: query.ExecuteOptions.included_fields:type_name -> query.ExecuteOptions.IncludedFields - 5, // 6: query.ExecuteOptions.workload:type_name -> query.ExecuteOptions.Workload - 6, // 7: query.ExecuteOptions.transaction_isolation:type_name -> query.ExecuteOptions.TransactionIsolation - 7, // 8: query.ExecuteOptions.planner_version:type_name -> query.ExecuteOptions.PlannerVersion - 8, // 9: query.ExecuteOptions.consolidator:type_name -> query.ExecuteOptions.Consolidator - 9, // 10: query.ExecuteOptions.transaction_access_mode:type_name -> query.ExecuteOptions.TransactionAccessMode + 15, // 3: query.BindVariable.values:type_name -> query.Value + 76, // 4: query.BoundQuery.bind_variables:type_name -> query.BoundQuery.BindVariablesEntry + 5, // 5: query.ExecuteOptions.included_fields:type_name -> query.ExecuteOptions.IncludedFields + 6, // 6: query.ExecuteOptions.workload:type_name -> query.ExecuteOptions.Workload + 7, // 7: query.ExecuteOptions.transaction_isolation:type_name -> query.ExecuteOptions.TransactionIsolation + 8, // 8: query.ExecuteOptions.planner_version:type_name -> query.ExecuteOptions.PlannerVersion + 9, // 9: query.ExecuteOptions.consolidator:type_name -> query.ExecuteOptions.Consolidator + 10, // 10: query.ExecuteOptions.transaction_access_mode:type_name -> query.ExecuteOptions.TransactionAccessMode 2, // 11: query.Field.type:type_name -> query.Type - 18, // 12: query.QueryResult.fields:type_name -> query.Field - 19, // 13: query.QueryResult.rows:type_name -> query.Row - 74, // 14: query.StreamEvent.statements:type_name -> query.StreamEvent.Statement - 13, // 15: query.StreamEvent.event_token:type_name -> query.EventToken - 76, // 16: query.ExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 17: query.ExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 18: query.ExecuteRequest.target:type_name -> query.Target - 16, // 19: query.ExecuteRequest.query:type_name -> query.BoundQuery - 17, // 20: query.ExecuteRequest.options:type_name -> query.ExecuteOptions - 20, // 21: query.ExecuteResponse.result:type_name -> query.QueryResult - 77, // 22: query.ResultWithError.error:type_name -> vtrpc.RPCError - 20, // 23: query.ResultWithError.result:type_name -> query.QueryResult - 76, // 24: query.StreamExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 25: query.StreamExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 26: query.StreamExecuteRequest.target:type_name -> query.Target - 16, // 27: query.StreamExecuteRequest.query:type_name -> query.BoundQuery - 17, // 28: query.StreamExecuteRequest.options:type_name -> query.ExecuteOptions - 20, // 29: query.StreamExecuteResponse.result:type_name -> query.QueryResult - 76, // 30: query.BeginRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 31: query.BeginRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 32: query.BeginRequest.target:type_name -> query.Target - 17, // 33: query.BeginRequest.options:type_name -> query.ExecuteOptions - 78, // 34: query.BeginResponse.tablet_alias:type_name -> topodata.TabletAlias - 76, // 35: query.CommitRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 36: query.CommitRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 37: query.CommitRequest.target:type_name -> query.Target - 76, // 38: query.RollbackRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 39: query.RollbackRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 40: query.RollbackRequest.target:type_name -> query.Target - 76, // 41: query.PrepareRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 42: query.PrepareRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 43: query.PrepareRequest.target:type_name -> query.Target - 76, // 44: query.CommitPreparedRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 45: query.CommitPreparedRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 46: query.CommitPreparedRequest.target:type_name -> query.Target - 76, // 47: query.RollbackPreparedRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 48: query.RollbackPreparedRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 49: query.RollbackPreparedRequest.target:type_name -> query.Target - 76, // 50: query.CreateTransactionRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 51: query.CreateTransactionRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 52: query.CreateTransactionRequest.target:type_name -> query.Target - 11, // 53: query.CreateTransactionRequest.participants:type_name -> query.Target - 76, // 54: query.StartCommitRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 55: query.StartCommitRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 56: query.StartCommitRequest.target:type_name -> query.Target - 76, // 57: query.SetRollbackRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 58: query.SetRollbackRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 59: query.SetRollbackRequest.target:type_name -> query.Target - 76, // 60: query.ConcludeTransactionRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 61: query.ConcludeTransactionRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 62: query.ConcludeTransactionRequest.target:type_name -> query.Target - 76, // 63: query.ReadTransactionRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 64: query.ReadTransactionRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 65: query.ReadTransactionRequest.target:type_name -> query.Target - 72, // 66: query.ReadTransactionResponse.metadata:type_name -> query.TransactionMetadata - 76, // 67: query.BeginExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 68: query.BeginExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 69: query.BeginExecuteRequest.target:type_name -> query.Target - 16, // 70: query.BeginExecuteRequest.query:type_name -> query.BoundQuery - 17, // 71: query.BeginExecuteRequest.options:type_name -> query.ExecuteOptions - 77, // 72: query.BeginExecuteResponse.error:type_name -> vtrpc.RPCError - 20, // 73: query.BeginExecuteResponse.result:type_name -> query.QueryResult - 78, // 74: query.BeginExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias - 76, // 75: query.BeginStreamExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 76: query.BeginStreamExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 77: query.BeginStreamExecuteRequest.target:type_name -> query.Target - 16, // 78: query.BeginStreamExecuteRequest.query:type_name -> query.BoundQuery - 17, // 79: query.BeginStreamExecuteRequest.options:type_name -> query.ExecuteOptions - 77, // 80: query.BeginStreamExecuteResponse.error:type_name -> vtrpc.RPCError - 20, // 81: query.BeginStreamExecuteResponse.result:type_name -> query.QueryResult - 78, // 82: query.BeginStreamExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias - 76, // 83: query.MessageStreamRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 84: query.MessageStreamRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 85: query.MessageStreamRequest.target:type_name -> query.Target - 20, // 86: query.MessageStreamResponse.result:type_name -> query.QueryResult - 76, // 87: query.MessageAckRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 88: query.MessageAckRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 89: query.MessageAckRequest.target:type_name -> query.Target - 14, // 90: query.MessageAckRequest.ids:type_name -> query.Value - 20, // 91: query.MessageAckResponse.result:type_name -> query.QueryResult - 76, // 92: query.ReserveExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 93: query.ReserveExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 94: query.ReserveExecuteRequest.target:type_name -> query.Target - 16, // 95: query.ReserveExecuteRequest.query:type_name -> query.BoundQuery - 17, // 96: query.ReserveExecuteRequest.options:type_name -> query.ExecuteOptions - 77, // 97: query.ReserveExecuteResponse.error:type_name -> vtrpc.RPCError - 20, // 98: query.ReserveExecuteResponse.result:type_name -> query.QueryResult - 78, // 99: query.ReserveExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias - 76, // 100: query.ReserveStreamExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 101: query.ReserveStreamExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 102: query.ReserveStreamExecuteRequest.target:type_name -> query.Target - 16, // 103: query.ReserveStreamExecuteRequest.query:type_name -> query.BoundQuery - 17, // 104: query.ReserveStreamExecuteRequest.options:type_name -> query.ExecuteOptions - 77, // 105: query.ReserveStreamExecuteResponse.error:type_name -> vtrpc.RPCError - 20, // 106: query.ReserveStreamExecuteResponse.result:type_name -> query.QueryResult - 78, // 107: query.ReserveStreamExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias - 76, // 108: query.ReserveBeginExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 109: query.ReserveBeginExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 110: query.ReserveBeginExecuteRequest.target:type_name -> query.Target - 16, // 111: query.ReserveBeginExecuteRequest.query:type_name -> query.BoundQuery - 17, // 112: query.ReserveBeginExecuteRequest.options:type_name -> query.ExecuteOptions - 77, // 113: query.ReserveBeginExecuteResponse.error:type_name -> vtrpc.RPCError - 20, // 114: query.ReserveBeginExecuteResponse.result:type_name -> query.QueryResult - 78, // 115: query.ReserveBeginExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias - 76, // 116: query.ReserveBeginStreamExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 117: query.ReserveBeginStreamExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 118: query.ReserveBeginStreamExecuteRequest.target:type_name -> query.Target - 16, // 119: query.ReserveBeginStreamExecuteRequest.query:type_name -> query.BoundQuery - 17, // 120: query.ReserveBeginStreamExecuteRequest.options:type_name -> query.ExecuteOptions - 77, // 121: query.ReserveBeginStreamExecuteResponse.error:type_name -> vtrpc.RPCError - 20, // 122: query.ReserveBeginStreamExecuteResponse.result:type_name -> query.QueryResult - 78, // 123: query.ReserveBeginStreamExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias - 76, // 124: query.ReleaseRequest.effective_caller_id:type_name -> vtrpc.CallerID - 12, // 125: query.ReleaseRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 11, // 126: query.ReleaseRequest.target:type_name -> query.Target - 11, // 127: query.StreamHealthResponse.target:type_name -> query.Target - 69, // 128: query.StreamHealthResponse.realtime_stats:type_name -> query.RealtimeStats - 78, // 129: query.StreamHealthResponse.tablet_alias:type_name -> topodata.TabletAlias + 19, // 12: query.QueryResult.fields:type_name -> query.Field + 20, // 13: query.QueryResult.rows:type_name -> query.Row + 77, // 14: query.StreamEvent.statements:type_name -> query.StreamEvent.Statement + 14, // 15: query.StreamEvent.event_token:type_name -> query.EventToken + 80, // 16: query.ExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 17: query.ExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 18: query.ExecuteRequest.target:type_name -> query.Target + 17, // 19: query.ExecuteRequest.query:type_name -> query.BoundQuery + 18, // 20: query.ExecuteRequest.options:type_name -> query.ExecuteOptions + 21, // 21: query.ExecuteResponse.result:type_name -> query.QueryResult + 81, // 22: query.ResultWithError.error:type_name -> vtrpc.RPCError + 21, // 23: query.ResultWithError.result:type_name -> query.QueryResult + 80, // 24: query.StreamExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 25: query.StreamExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 26: query.StreamExecuteRequest.target:type_name -> query.Target + 17, // 27: query.StreamExecuteRequest.query:type_name -> query.BoundQuery + 18, // 28: query.StreamExecuteRequest.options:type_name -> query.ExecuteOptions + 21, // 29: query.StreamExecuteResponse.result:type_name -> query.QueryResult + 80, // 30: query.BeginRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 31: query.BeginRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 32: query.BeginRequest.target:type_name -> query.Target + 18, // 33: query.BeginRequest.options:type_name -> query.ExecuteOptions + 82, // 34: query.BeginResponse.tablet_alias:type_name -> topodata.TabletAlias + 80, // 35: query.CommitRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 36: query.CommitRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 37: query.CommitRequest.target:type_name -> query.Target + 80, // 38: query.RollbackRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 39: query.RollbackRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 40: query.RollbackRequest.target:type_name -> query.Target + 80, // 41: query.PrepareRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 42: query.PrepareRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 43: query.PrepareRequest.target:type_name -> query.Target + 80, // 44: query.CommitPreparedRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 45: query.CommitPreparedRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 46: query.CommitPreparedRequest.target:type_name -> query.Target + 80, // 47: query.RollbackPreparedRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 48: query.RollbackPreparedRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 49: query.RollbackPreparedRequest.target:type_name -> query.Target + 80, // 50: query.CreateTransactionRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 51: query.CreateTransactionRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 52: query.CreateTransactionRequest.target:type_name -> query.Target + 12, // 53: query.CreateTransactionRequest.participants:type_name -> query.Target + 80, // 54: query.StartCommitRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 55: query.StartCommitRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 56: query.StartCommitRequest.target:type_name -> query.Target + 80, // 57: query.SetRollbackRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 58: query.SetRollbackRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 59: query.SetRollbackRequest.target:type_name -> query.Target + 80, // 60: query.ConcludeTransactionRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 61: query.ConcludeTransactionRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 62: query.ConcludeTransactionRequest.target:type_name -> query.Target + 80, // 63: query.ReadTransactionRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 64: query.ReadTransactionRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 65: query.ReadTransactionRequest.target:type_name -> query.Target + 73, // 66: query.ReadTransactionResponse.metadata:type_name -> query.TransactionMetadata + 80, // 67: query.BeginExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 68: query.BeginExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 69: query.BeginExecuteRequest.target:type_name -> query.Target + 17, // 70: query.BeginExecuteRequest.query:type_name -> query.BoundQuery + 18, // 71: query.BeginExecuteRequest.options:type_name -> query.ExecuteOptions + 81, // 72: query.BeginExecuteResponse.error:type_name -> vtrpc.RPCError + 21, // 73: query.BeginExecuteResponse.result:type_name -> query.QueryResult + 82, // 74: query.BeginExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias + 80, // 75: query.BeginStreamExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 76: query.BeginStreamExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 77: query.BeginStreamExecuteRequest.target:type_name -> query.Target + 17, // 78: query.BeginStreamExecuteRequest.query:type_name -> query.BoundQuery + 18, // 79: query.BeginStreamExecuteRequest.options:type_name -> query.ExecuteOptions + 81, // 80: query.BeginStreamExecuteResponse.error:type_name -> vtrpc.RPCError + 21, // 81: query.BeginStreamExecuteResponse.result:type_name -> query.QueryResult + 82, // 82: query.BeginStreamExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias + 80, // 83: query.MessageStreamRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 84: query.MessageStreamRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 85: query.MessageStreamRequest.target:type_name -> query.Target + 21, // 86: query.MessageStreamResponse.result:type_name -> query.QueryResult + 80, // 87: query.MessageAckRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 88: query.MessageAckRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 89: query.MessageAckRequest.target:type_name -> query.Target + 15, // 90: query.MessageAckRequest.ids:type_name -> query.Value + 21, // 91: query.MessageAckResponse.result:type_name -> query.QueryResult + 80, // 92: query.ReserveExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 93: query.ReserveExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 94: query.ReserveExecuteRequest.target:type_name -> query.Target + 17, // 95: query.ReserveExecuteRequest.query:type_name -> query.BoundQuery + 18, // 96: query.ReserveExecuteRequest.options:type_name -> query.ExecuteOptions + 81, // 97: query.ReserveExecuteResponse.error:type_name -> vtrpc.RPCError + 21, // 98: query.ReserveExecuteResponse.result:type_name -> query.QueryResult + 82, // 99: query.ReserveExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias + 80, // 100: query.ReserveStreamExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 101: query.ReserveStreamExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 102: query.ReserveStreamExecuteRequest.target:type_name -> query.Target + 17, // 103: query.ReserveStreamExecuteRequest.query:type_name -> query.BoundQuery + 18, // 104: query.ReserveStreamExecuteRequest.options:type_name -> query.ExecuteOptions + 81, // 105: query.ReserveStreamExecuteResponse.error:type_name -> vtrpc.RPCError + 21, // 106: query.ReserveStreamExecuteResponse.result:type_name -> query.QueryResult + 82, // 107: query.ReserveStreamExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias + 80, // 108: query.ReserveBeginExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 109: query.ReserveBeginExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 110: query.ReserveBeginExecuteRequest.target:type_name -> query.Target + 17, // 111: query.ReserveBeginExecuteRequest.query:type_name -> query.BoundQuery + 18, // 112: query.ReserveBeginExecuteRequest.options:type_name -> query.ExecuteOptions + 81, // 113: query.ReserveBeginExecuteResponse.error:type_name -> vtrpc.RPCError + 21, // 114: query.ReserveBeginExecuteResponse.result:type_name -> query.QueryResult + 82, // 115: query.ReserveBeginExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias + 80, // 116: query.ReserveBeginStreamExecuteRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 117: query.ReserveBeginStreamExecuteRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 118: query.ReserveBeginStreamExecuteRequest.target:type_name -> query.Target + 17, // 119: query.ReserveBeginStreamExecuteRequest.query:type_name -> query.BoundQuery + 18, // 120: query.ReserveBeginStreamExecuteRequest.options:type_name -> query.ExecuteOptions + 81, // 121: query.ReserveBeginStreamExecuteResponse.error:type_name -> vtrpc.RPCError + 21, // 122: query.ReserveBeginStreamExecuteResponse.result:type_name -> query.QueryResult + 82, // 123: query.ReserveBeginStreamExecuteResponse.tablet_alias:type_name -> topodata.TabletAlias + 80, // 124: query.ReleaseRequest.effective_caller_id:type_name -> vtrpc.CallerID + 13, // 125: query.ReleaseRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 12, // 126: query.ReleaseRequest.target:type_name -> query.Target + 12, // 127: query.StreamHealthResponse.target:type_name -> query.Target + 70, // 128: query.StreamHealthResponse.realtime_stats:type_name -> query.RealtimeStats + 82, // 129: query.StreamHealthResponse.tablet_alias:type_name -> topodata.TabletAlias 3, // 130: query.TransactionMetadata.state:type_name -> query.TransactionState - 11, // 131: query.TransactionMetadata.participants:type_name -> query.Target - 15, // 132: query.BoundQuery.BindVariablesEntry.value:type_name -> query.BindVariable - 10, // 133: query.StreamEvent.Statement.category:type_name -> query.StreamEvent.Statement.Category - 18, // 134: query.StreamEvent.Statement.primary_key_fields:type_name -> query.Field - 19, // 135: query.StreamEvent.Statement.primary_key_values:type_name -> query.Row - 136, // [136:136] is the sub-list for method output_type - 136, // [136:136] is the sub-list for method input_type - 136, // [136:136] is the sub-list for extension type_name - 136, // [136:136] is the sub-list for extension extendee - 0, // [0:136] is the sub-list for field type_name + 12, // 131: query.TransactionMetadata.participants:type_name -> query.Target + 12, // 132: query.GetSchemaRequest.target:type_name -> query.Target + 4, // 133: query.GetSchemaRequest.table_type:type_name -> query.SchemaTableType + 78, // 134: query.GetSchemaResponse.table_definition:type_name -> query.GetSchemaResponse.TableDefinitionEntry + 16, // 135: query.BoundQuery.BindVariablesEntry.value:type_name -> query.BindVariable + 11, // 136: query.StreamEvent.Statement.category:type_name -> query.StreamEvent.Statement.Category + 19, // 137: query.StreamEvent.Statement.primary_key_fields:type_name -> query.Field + 20, // 138: query.StreamEvent.Statement.primary_key_values:type_name -> query.Row + 139, // [139:139] is the sub-list for method output_type + 139, // [139:139] is the sub-list for method input_type + 139, // [139:139] is the sub-list for extension type_name + 139, // [139:139] is the sub-list for extension extendee + 0, // [0:139] is the sub-list for field type_name } func init() { file_query_proto_init() } @@ -7328,7 +7522,31 @@ func file_query_proto_init() { return nil } } + file_query_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSchemaRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } file_query_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSchemaResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_query_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StreamEvent_Statement); i { case 0: return &v.state @@ -7346,8 +7564,8 @@ func file_query_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_query_proto_rawDesc, - NumEnums: 11, - NumMessages: 64, + NumEnums: 12, + NumMessages: 67, NumExtensions: 0, NumServices: 0, }, diff --git a/go/vt/proto/query/query_vtproto.pb.go b/go/vt/proto/query/query_vtproto.pb.go index 2a744ad184e..3abec4b7d1a 100644 --- a/go/vt/proto/query/query_vtproto.pb.go +++ b/go/vt/proto/query/query_vtproto.pb.go @@ -4101,6 +4101,115 @@ func (m *TransactionMetadata) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *GetSchemaRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetSchemaRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *GetSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.TableNames) > 0 { + for iNdEx := len(m.TableNames) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TableNames[iNdEx]) + copy(dAtA[i:], m.TableNames[iNdEx]) + i = encodeVarint(dAtA, i, uint64(len(m.TableNames[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if m.TableType != 0 { + i = encodeVarint(dAtA, i, uint64(m.TableType)) + i-- + dAtA[i] = 0x10 + } + if m.Target != nil { + size, err := m.Target.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GetSchemaResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetSchemaResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *GetSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.TableDefinition) > 0 { + for k := range m.TableDefinition { + v := m.TableDefinition[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + return len(dAtA) - i, nil +} + func encodeVarint(dAtA []byte, offset int, v uint64) int { offset -= sov(v) base := offset @@ -5702,6 +5811,47 @@ func (m *TransactionMetadata) SizeVT() (n int) { return n } +func (m *GetSchemaRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Target != nil { + l = m.Target.SizeVT() + n += 1 + l + sov(uint64(l)) + } + if m.TableType != 0 { + n += 1 + sov(uint64(m.TableType)) + } + if len(m.TableNames) > 0 { + for _, s := range m.TableNames { + l = len(s) + n += 1 + l + sov(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *GetSchemaResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.TableDefinition) > 0 { + for k, v := range m.TableDefinition { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) + n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + } + } + n += len(m.unknownFields) + return n +} + func sov(x uint64) (n int) { return (bits.Len64(x|1) + 6) / 7 } @@ -16313,6 +16463,322 @@ func (m *TransactionMetadata) UnmarshalVT(dAtA []byte) error { } return nil } +func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetSchemaRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Target == nil { + m.Target = &Target{} + } + if err := m.Target.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TableType", wireType) + } + m.TableType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TableType |= SchemaTableType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TableNames", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TableNames = append(m.TableNames, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetSchemaResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetSchemaResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TableDefinition", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TableDefinition == nil { + m.TableDefinition = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.TableDefinition[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skip(dAtA []byte) (n int, err error) { l := len(dAtA) diff --git a/go/vt/proto/queryservice/queryservice.pb.go b/go/vt/proto/queryservice/queryservice.pb.go index d13ad60b7c2..211030f1cee 100644 --- a/go/vt/proto/queryservice/queryservice.pb.go +++ b/go/vt/proto/queryservice/queryservice.pb.go @@ -45,7 +45,7 @@ var file_queryservice_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x32, 0x8e, 0x10, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x07, 0x45, + 0x6f, 0x32, 0xd0, 0x10, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, @@ -174,10 +174,14 @@ var file_queryservice_proto_rawDesc = []byte{ 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x42, 0x2b, 0x5a, 0x29, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, - 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x30, 0x01, 0x12, 0x40, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, + 0x17, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, + 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_queryservice_proto_goTypes = []interface{}{ @@ -207,32 +211,34 @@ var file_queryservice_proto_goTypes = []interface{}{ (*binlogdata.VStreamRequest)(nil), // 23: binlogdata.VStreamRequest (*binlogdata.VStreamRowsRequest)(nil), // 24: binlogdata.VStreamRowsRequest (*binlogdata.VStreamResultsRequest)(nil), // 25: binlogdata.VStreamResultsRequest - (*query.ExecuteResponse)(nil), // 26: query.ExecuteResponse - (*query.StreamExecuteResponse)(nil), // 27: query.StreamExecuteResponse - (*query.BeginResponse)(nil), // 28: query.BeginResponse - (*query.CommitResponse)(nil), // 29: query.CommitResponse - (*query.RollbackResponse)(nil), // 30: query.RollbackResponse - (*query.PrepareResponse)(nil), // 31: query.PrepareResponse - (*query.CommitPreparedResponse)(nil), // 32: query.CommitPreparedResponse - (*query.RollbackPreparedResponse)(nil), // 33: query.RollbackPreparedResponse - (*query.CreateTransactionResponse)(nil), // 34: query.CreateTransactionResponse - (*query.StartCommitResponse)(nil), // 35: query.StartCommitResponse - (*query.SetRollbackResponse)(nil), // 36: query.SetRollbackResponse - (*query.ConcludeTransactionResponse)(nil), // 37: query.ConcludeTransactionResponse - (*query.ReadTransactionResponse)(nil), // 38: query.ReadTransactionResponse - (*query.BeginExecuteResponse)(nil), // 39: query.BeginExecuteResponse - (*query.BeginStreamExecuteResponse)(nil), // 40: query.BeginStreamExecuteResponse - (*query.MessageStreamResponse)(nil), // 41: query.MessageStreamResponse - (*query.MessageAckResponse)(nil), // 42: query.MessageAckResponse - (*query.ReserveExecuteResponse)(nil), // 43: query.ReserveExecuteResponse - (*query.ReserveBeginExecuteResponse)(nil), // 44: query.ReserveBeginExecuteResponse - (*query.ReserveStreamExecuteResponse)(nil), // 45: query.ReserveStreamExecuteResponse - (*query.ReserveBeginStreamExecuteResponse)(nil), // 46: query.ReserveBeginStreamExecuteResponse - (*query.ReleaseResponse)(nil), // 47: query.ReleaseResponse - (*query.StreamHealthResponse)(nil), // 48: query.StreamHealthResponse - (*binlogdata.VStreamResponse)(nil), // 49: binlogdata.VStreamResponse - (*binlogdata.VStreamRowsResponse)(nil), // 50: binlogdata.VStreamRowsResponse - (*binlogdata.VStreamResultsResponse)(nil), // 51: binlogdata.VStreamResultsResponse + (*query.GetSchemaRequest)(nil), // 26: query.GetSchemaRequest + (*query.ExecuteResponse)(nil), // 27: query.ExecuteResponse + (*query.StreamExecuteResponse)(nil), // 28: query.StreamExecuteResponse + (*query.BeginResponse)(nil), // 29: query.BeginResponse + (*query.CommitResponse)(nil), // 30: query.CommitResponse + (*query.RollbackResponse)(nil), // 31: query.RollbackResponse + (*query.PrepareResponse)(nil), // 32: query.PrepareResponse + (*query.CommitPreparedResponse)(nil), // 33: query.CommitPreparedResponse + (*query.RollbackPreparedResponse)(nil), // 34: query.RollbackPreparedResponse + (*query.CreateTransactionResponse)(nil), // 35: query.CreateTransactionResponse + (*query.StartCommitResponse)(nil), // 36: query.StartCommitResponse + (*query.SetRollbackResponse)(nil), // 37: query.SetRollbackResponse + (*query.ConcludeTransactionResponse)(nil), // 38: query.ConcludeTransactionResponse + (*query.ReadTransactionResponse)(nil), // 39: query.ReadTransactionResponse + (*query.BeginExecuteResponse)(nil), // 40: query.BeginExecuteResponse + (*query.BeginStreamExecuteResponse)(nil), // 41: query.BeginStreamExecuteResponse + (*query.MessageStreamResponse)(nil), // 42: query.MessageStreamResponse + (*query.MessageAckResponse)(nil), // 43: query.MessageAckResponse + (*query.ReserveExecuteResponse)(nil), // 44: query.ReserveExecuteResponse + (*query.ReserveBeginExecuteResponse)(nil), // 45: query.ReserveBeginExecuteResponse + (*query.ReserveStreamExecuteResponse)(nil), // 46: query.ReserveStreamExecuteResponse + (*query.ReserveBeginStreamExecuteResponse)(nil), // 47: query.ReserveBeginStreamExecuteResponse + (*query.ReleaseResponse)(nil), // 48: query.ReleaseResponse + (*query.StreamHealthResponse)(nil), // 49: query.StreamHealthResponse + (*binlogdata.VStreamResponse)(nil), // 50: binlogdata.VStreamResponse + (*binlogdata.VStreamRowsResponse)(nil), // 51: binlogdata.VStreamRowsResponse + (*binlogdata.VStreamResultsResponse)(nil), // 52: binlogdata.VStreamResultsResponse + (*query.GetSchemaResponse)(nil), // 53: query.GetSchemaResponse } var file_queryservice_proto_depIdxs = []int32{ 0, // 0: queryservice.Query.Execute:input_type -> query.ExecuteRequest @@ -261,34 +267,36 @@ var file_queryservice_proto_depIdxs = []int32{ 23, // 23: queryservice.Query.VStream:input_type -> binlogdata.VStreamRequest 24, // 24: queryservice.Query.VStreamRows:input_type -> binlogdata.VStreamRowsRequest 25, // 25: queryservice.Query.VStreamResults:input_type -> binlogdata.VStreamResultsRequest - 26, // 26: queryservice.Query.Execute:output_type -> query.ExecuteResponse - 27, // 27: queryservice.Query.StreamExecute:output_type -> query.StreamExecuteResponse - 28, // 28: queryservice.Query.Begin:output_type -> query.BeginResponse - 29, // 29: queryservice.Query.Commit:output_type -> query.CommitResponse - 30, // 30: queryservice.Query.Rollback:output_type -> query.RollbackResponse - 31, // 31: queryservice.Query.Prepare:output_type -> query.PrepareResponse - 32, // 32: queryservice.Query.CommitPrepared:output_type -> query.CommitPreparedResponse - 33, // 33: queryservice.Query.RollbackPrepared:output_type -> query.RollbackPreparedResponse - 34, // 34: queryservice.Query.CreateTransaction:output_type -> query.CreateTransactionResponse - 35, // 35: queryservice.Query.StartCommit:output_type -> query.StartCommitResponse - 36, // 36: queryservice.Query.SetRollback:output_type -> query.SetRollbackResponse - 37, // 37: queryservice.Query.ConcludeTransaction:output_type -> query.ConcludeTransactionResponse - 38, // 38: queryservice.Query.ReadTransaction:output_type -> query.ReadTransactionResponse - 39, // 39: queryservice.Query.BeginExecute:output_type -> query.BeginExecuteResponse - 40, // 40: queryservice.Query.BeginStreamExecute:output_type -> query.BeginStreamExecuteResponse - 41, // 41: queryservice.Query.MessageStream:output_type -> query.MessageStreamResponse - 42, // 42: queryservice.Query.MessageAck:output_type -> query.MessageAckResponse - 43, // 43: queryservice.Query.ReserveExecute:output_type -> query.ReserveExecuteResponse - 44, // 44: queryservice.Query.ReserveBeginExecute:output_type -> query.ReserveBeginExecuteResponse - 45, // 45: queryservice.Query.ReserveStreamExecute:output_type -> query.ReserveStreamExecuteResponse - 46, // 46: queryservice.Query.ReserveBeginStreamExecute:output_type -> query.ReserveBeginStreamExecuteResponse - 47, // 47: queryservice.Query.Release:output_type -> query.ReleaseResponse - 48, // 48: queryservice.Query.StreamHealth:output_type -> query.StreamHealthResponse - 49, // 49: queryservice.Query.VStream:output_type -> binlogdata.VStreamResponse - 50, // 50: queryservice.Query.VStreamRows:output_type -> binlogdata.VStreamRowsResponse - 51, // 51: queryservice.Query.VStreamResults:output_type -> binlogdata.VStreamResultsResponse - 26, // [26:52] is the sub-list for method output_type - 0, // [0:26] is the sub-list for method input_type + 26, // 26: queryservice.Query.GetSchema:input_type -> query.GetSchemaRequest + 27, // 27: queryservice.Query.Execute:output_type -> query.ExecuteResponse + 28, // 28: queryservice.Query.StreamExecute:output_type -> query.StreamExecuteResponse + 29, // 29: queryservice.Query.Begin:output_type -> query.BeginResponse + 30, // 30: queryservice.Query.Commit:output_type -> query.CommitResponse + 31, // 31: queryservice.Query.Rollback:output_type -> query.RollbackResponse + 32, // 32: queryservice.Query.Prepare:output_type -> query.PrepareResponse + 33, // 33: queryservice.Query.CommitPrepared:output_type -> query.CommitPreparedResponse + 34, // 34: queryservice.Query.RollbackPrepared:output_type -> query.RollbackPreparedResponse + 35, // 35: queryservice.Query.CreateTransaction:output_type -> query.CreateTransactionResponse + 36, // 36: queryservice.Query.StartCommit:output_type -> query.StartCommitResponse + 37, // 37: queryservice.Query.SetRollback:output_type -> query.SetRollbackResponse + 38, // 38: queryservice.Query.ConcludeTransaction:output_type -> query.ConcludeTransactionResponse + 39, // 39: queryservice.Query.ReadTransaction:output_type -> query.ReadTransactionResponse + 40, // 40: queryservice.Query.BeginExecute:output_type -> query.BeginExecuteResponse + 41, // 41: queryservice.Query.BeginStreamExecute:output_type -> query.BeginStreamExecuteResponse + 42, // 42: queryservice.Query.MessageStream:output_type -> query.MessageStreamResponse + 43, // 43: queryservice.Query.MessageAck:output_type -> query.MessageAckResponse + 44, // 44: queryservice.Query.ReserveExecute:output_type -> query.ReserveExecuteResponse + 45, // 45: queryservice.Query.ReserveBeginExecute:output_type -> query.ReserveBeginExecuteResponse + 46, // 46: queryservice.Query.ReserveStreamExecute:output_type -> query.ReserveStreamExecuteResponse + 47, // 47: queryservice.Query.ReserveBeginStreamExecute:output_type -> query.ReserveBeginStreamExecuteResponse + 48, // 48: queryservice.Query.Release:output_type -> query.ReleaseResponse + 49, // 49: queryservice.Query.StreamHealth:output_type -> query.StreamHealthResponse + 50, // 50: queryservice.Query.VStream:output_type -> binlogdata.VStreamResponse + 51, // 51: queryservice.Query.VStreamRows:output_type -> binlogdata.VStreamRowsResponse + 52, // 52: queryservice.Query.VStreamResults:output_type -> binlogdata.VStreamResultsResponse + 53, // 53: queryservice.Query.GetSchema:output_type -> query.GetSchemaResponse + 27, // [27:54] is the sub-list for method output_type + 0, // [0:27] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/go/vt/proto/queryservice/queryservice_grpc.pb.go b/go/vt/proto/queryservice/queryservice_grpc.pb.go index 37fcc3ee240..e40c8110f06 100644 --- a/go/vt/proto/queryservice/queryservice_grpc.pb.go +++ b/go/vt/proto/queryservice/queryservice_grpc.pb.go @@ -81,6 +81,8 @@ type QueryClient interface { VStreamRows(ctx context.Context, in *binlogdata.VStreamRowsRequest, opts ...grpc.CallOption) (Query_VStreamRowsClient, error) // VStreamResults streams results along with the gtid of the snapshot. VStreamResults(ctx context.Context, in *binlogdata.VStreamResultsRequest, opts ...grpc.CallOption) (Query_VStreamResultsClient, error) + // GetSchema returns the schema information. + GetSchema(ctx context.Context, in *query.GetSchemaRequest, opts ...grpc.CallOption) (*query.GetSchemaResponse, error) } type queryClient struct { @@ -532,6 +534,15 @@ func (x *queryVStreamResultsClient) Recv() (*binlogdata.VStreamResultsResponse, return m, nil } +func (c *queryClient) GetSchema(ctx context.Context, in *query.GetSchemaRequest, opts ...grpc.CallOption) (*query.GetSchemaResponse, error) { + out := new(query.GetSchemaResponse) + err := c.cc.Invoke(ctx, "/queryservice.Query/GetSchema", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. // All implementations must embed UnimplementedQueryServer // for forward compatibility @@ -593,6 +604,8 @@ type QueryServer interface { VStreamRows(*binlogdata.VStreamRowsRequest, Query_VStreamRowsServer) error // VStreamResults streams results along with the gtid of the snapshot. VStreamResults(*binlogdata.VStreamResultsRequest, Query_VStreamResultsServer) error + // GetSchema returns the schema information. + GetSchema(context.Context, *query.GetSchemaRequest) (*query.GetSchemaResponse, error) mustEmbedUnimplementedQueryServer() } @@ -678,6 +691,9 @@ func (UnimplementedQueryServer) VStreamRows(*binlogdata.VStreamRowsRequest, Quer func (UnimplementedQueryServer) VStreamResults(*binlogdata.VStreamResultsRequest, Query_VStreamResultsServer) error { return status.Errorf(codes.Unimplemented, "method VStreamResults not implemented") } +func (UnimplementedQueryServer) GetSchema(context.Context, *query.GetSchemaRequest) (*query.GetSchemaResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSchema not implemented") +} func (UnimplementedQueryServer) mustEmbedUnimplementedQueryServer() {} // UnsafeQueryServer may be embedded to opt out of forward compatibility for this service. @@ -1186,6 +1202,24 @@ func (x *queryVStreamResultsServer) Send(m *binlogdata.VStreamResultsResponse) e return x.ServerStream.SendMsg(m) } +func _Query_GetSchema_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(query.GetSchemaRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).GetSchema(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/queryservice.Query/GetSchema", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).GetSchema(ctx, req.(*query.GetSchemaRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Query_ServiceDesc is the grpc.ServiceDesc for Query service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1261,6 +1295,10 @@ var Query_ServiceDesc = grpc.ServiceDesc{ MethodName: "Release", Handler: _Query_Release_Handler, }, + { + MethodName: "GetSchema", + Handler: _Query_GetSchema_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index 767217b442b..b68dd4ccc49 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -661,6 +661,12 @@ func (itc *internalTabletConn) Release(ctx context.Context, target *querypb.Targ return tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } +// GetSchema is part of the QueryService interface. +func (itc *internalTabletConn) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) { + response, err := itc.tablet.qsc.QueryService().GetSchema(ctx, target, tableType, tableNames) + return response, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) +} + // Close is part of queryservice.QueryService func (itc *internalTabletConn) Close(ctx context.Context) error { return nil diff --git a/go/vt/vtgate/schema/tracker.go b/go/vt/vtgate/schema/tracker.go index d10f2e7d3c0..df7a107ed80 100644 --- a/go/vt/vtgate/schema/tracker.go +++ b/go/vt/vtgate/schema/tracker.go @@ -134,7 +134,7 @@ func (t *Tracker) loadViews(conn queryservice.QueryService, target *querypb.Targ return nil } - fvRes, err := conn.Execute(t.ctx, target, mysql.FetchViews, nil, 0, 0, nil) + fvRes, err := conn.GetSchema(t.ctx, target, querypb.SchemaTableType_VIEWS, nil) if err != nil { return err } @@ -146,7 +146,7 @@ func (t *Tracker) loadViews(conn queryservice.QueryService, target *querypb.Targ // clearing out the previous view definition removes any dropped views. t.clearKeyspaceViews(target.Keyspace) t.updateViews(target.Keyspace, fvRes) - log.Infof("finished loading views for keyspace %s. Found %d views", target.Keyspace, len(fvRes.Rows)) + log.Infof("finished loading views for keyspace %s. Found %d views", target.Keyspace, len(fvRes)) return nil } @@ -300,21 +300,11 @@ func (t *Tracker) updateTables(keyspace string, res *sqltypes.Result) { func (t *Tracker) updatedViewSchema(th *discovery.TabletHealth) bool { viewsUpdated := th.Stats.ViewSchemaChanged - views, err := sqltypes.BuildBindVariable(viewsUpdated) - if err != nil { - log.Errorf("failed to read updated views from TabletHealth: %v", err) - return false - } - bv := map[string]*querypb.BindVariable{"viewNames": views} - res, err := th.Conn.Execute(t.ctx, th.Target, mysql.FetchUpdatedViews, bv, 0, 0, nil) + res, err := th.Conn.GetSchema(t.ctx, th.Target, querypb.SchemaTableType_VIEWS, viewsUpdated) if err != nil { t.tracked[th.Target.Keyspace].setLoaded(false) // TODO: optimize for the views that got errored out. log.Warningf("error fetching new views definition for %v", viewsUpdated, err) - code := vterrors.Code(err) - if code == vtrpcpb.Code_UNAUTHENTICATED || code == vtrpcpb.Code_PERMISSION_DENIED { - log.Warning(aclErrorMessageLog) - } return false } @@ -331,10 +321,8 @@ func (t *Tracker) updatedViewSchema(th *discovery.TabletHealth) bool { } -func (t *Tracker) updateViews(keyspace string, res *sqltypes.Result) { - for _, row := range res.Rows { - viewName := row[0].ToString() - viewDef := row[1].ToString() +func (t *Tracker) updateViews(keyspace string, res map[string]string) { + for viewName, viewDef := range res { t.views.set(keyspace, viewName, viewDef) } } diff --git a/go/vt/vtgate/schema/tracker_test.go b/go/vt/vtgate/schema/tracker_test.go index 85df7089f06..11cbaffab5b 100644 --- a/go/vt/vtgate/schema/tracker_test.go +++ b/go/vt/vtgate/schema/tracker_test.go @@ -309,102 +309,78 @@ func TestTrackerGetKeyspaceUpdateController(t *testing.T) { assert.Nil(t, ks3.reloadKeyspace, "ks3 already initialized") } -type delta struct { - result *sqltypes.Result - updView []string -} - // TestViewsTracking tests that the tracker is able to track views. func TestViewsTracking(t *testing.T) { target := &querypb.Target{Cell: "aa", Keyspace: "ks", Shard: "-80", TabletType: topodatapb.TabletType_PRIMARY} tablet := &topodatapb.Tablet{Keyspace: target.Keyspace, Shard: target.Shard, Type: target.TabletType} - fields := sqltypes.MakeTestFields("table_name|view_definition|create_statement", "varchar|text|text") - - var ( - d0 = delta{ - result: sqltypes.MakeTestResult(fields, - "prior|select 1 from tbl|create view prior as select 1 from tbl"), - updView: []string{"prior"}, - } - d1 = delta{ - result: sqltypes.MakeTestResult(fields, - "t1|select 1 from tbl1|create view t1 as select 1 from tbl1", - "t2|select 1 from tbl2|create view t2 as select 1 from tbl2"), - updView: []string{"t1", "t2"}, - } - - d2 = delta{ - result: sqltypes.MakeTestResult(fields, - "t1|select 1 from tbl1|create view t1 as select 1 from tbl1", - "t2|select 1,2 from tbl2|create view t2 as select 1,2 from tbl2", - "t3|select 1 from tbl3|create view t3 as select 1 from tbl3"), - updView: []string{"prior", "t1", "t2", "t3"}, - } - - d3 = delta{ - result: sqltypes.MakeTestResult(fields, - "t4|select 1 from tbl4|create view t4 as select 1 from tbl4"), - updView: []string{"t4"}, - } - ) + schemaDefResult := []map[string]string{{ + "prior": "select 1 from tbl", // create view prior as select 1 from tbl" + "t1": "select 1 from tbl1", // create view t1 as select 1 from tbl1", + "t2": "select 1 from tbl2", // create view t2 as select 1 from tbl2", + }, { + "t2": "select 1,2 from tbl2", // create view t2 as select 1,2 from tbl2", + "t3": "select 1 from tbl3", // create view t3 as select 1 from tbl3", + }, { + "t4": "select 1 from tbl4", // create view t4 as select 1 from tbl4" + }} testcases := []struct { - vName string - deltas []delta - exp map[string]string + testName string + updView []string + exp map[string]string }{{ - vName: "new views", - deltas: []delta{d0, d1}, + testName: "new views", + updView: []string{"prior", "t1", "t2"}, exp: map[string]string{ "t1": "select 1 from tbl1", "t2": "select 1 from tbl2", "prior": "select 1 from tbl"}, }, { - vName: "delete t1 and prior, updated t2 and new t3", - deltas: []delta{d0, d1, d2}, + testName: "delete prior, updated t2 and new t3", + updView: []string{"prior", "t2", "t3"}, exp: map[string]string{ + "t1": "select 1 from tbl1", "t2": "select 1, 2 from tbl2", "t3": "select 1 from tbl3"}, }, { - vName: "new t4", - deltas: []delta{d0, d1, d2, d3}, + testName: "new t4", + updView: []string{"t4"}, exp: map[string]string{ + "t1": "select 1 from tbl1", "t2": "select 1, 2 from tbl2", "t3": "select 1 from tbl3", "t4": "select 1 from tbl4"}, }} - for i, tcase := range testcases { - t.Run(fmt.Sprintf("%d - %s", i, tcase.vName), func(t *testing.T) { - sbc := sandboxconn.NewSandboxConn(tablet) - ch := make(chan *discovery.TabletHealth) - tracker := NewTracker(ch, "", true) - tracker.tables = nil // making tables map nil - so load keyspace does not try to load the tables information. - tracker.consumeDelay = 1 * time.Millisecond - tracker.Start() - defer tracker.Stop() - sbc.SetResults(getResultSet(tcase.deltas)) - sbc.Queries = nil + ch := make(chan *discovery.TabletHealth) + tracker := NewTracker(ch, "", true) + tracker.tables = nil // making tables map nil - so load keyspace does not try to load the tables information. + tracker.consumeDelay = 1 * time.Millisecond + tracker.Start() + defer tracker.Stop() - wg := sync.WaitGroup{} - wg.Add(1) - tracker.RegisterSignalReceiver(func() { - wg.Done() - }) + wg := sync.WaitGroup{} + tracker.RegisterSignalReceiver(func() { + wg.Done() + }) - for _, d := range tcase.deltas { - ch <- &discovery.TabletHealth{ - Conn: sbc, - Tablet: tablet, - Target: target, - Serving: true, - Stats: &querypb.RealtimeStats{ViewSchemaChanged: d.updView}, - } + sbc := sandboxconn.NewSandboxConn(tablet) + sbc.SetSchemaResult(schemaDefResult) + + for count, tcase := range testcases { + t.Run(tcase.testName, func(t *testing.T) { + wg.Add(1) + ch <- &discovery.TabletHealth{ + Conn: sbc, + Tablet: tablet, + Target: target, + Serving: true, + Stats: &querypb.RealtimeStats{ViewSchemaChanged: tcase.updView}, } require.False(t, waitTimeout(&wg, time.Second), "schema was updated but received no signal") - require.Equal(t, 1, len(sbc.StringQueries())) + require.EqualValues(t, count+1, sbc.GetSchemaCount.Get()) _, keyspacePresent := tracker.tracked[target.Keyspace] require.Equal(t, true, keyspacePresent) @@ -415,25 +391,3 @@ func TestViewsTracking(t *testing.T) { }) } } - -// getResultSet goes over the results and return the distinct rows -func getResultSet(deltas []delta) []*sqltypes.Result { - rows := deltas[0].result.Rows - for _, d := range deltas[1:] { - for _, deltaRow := range d.result.Rows { - same := false - for _, row := range rows { - // emulating here that if view definition is same, then we do not send the update. - // tracker will think that the view is dropped. - if row[0].String() == deltaRow[0].String() && row[1].String() == deltaRow[1].String() { - same = true - break - } - } - if !same { - rows = append(rows, deltaRow) - } - } - } - return []*sqltypes.Result{{Fields: deltas[0].result.Fields, Rows: rows}} -} diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 2b75f5b0a66..38967cab202 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -408,3 +408,7 @@ func (client *QueryClient) StreamHealth(sendFunc func(*querypb.StreamHealthRespo func (client *QueryClient) UpdateContext(ctx context.Context) { client.ctx = ctx } + +func (client *QueryClient) GetSchema(tableType querypb.SchemaTableType, tableNames ...string) (map[string]string, error) { + return client.server.GetSchema(client.ctx, client.target, tableType, tableNames) +} diff --git a/go/vt/vttablet/endtoend/views_test.go b/go/vt/vttablet/endtoend/views_test.go index 41628c7f510..ab9d519ae7e 100644 --- a/go/vt/vttablet/endtoend/views_test.go +++ b/go/vt/vttablet/endtoend/views_test.go @@ -30,6 +30,9 @@ import ( vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) +var qSelAllRows = "select table_schema, table_name, view_definition, create_statement from _vt.views" +var qDelAllRows = "delete from _vt.views" + // Test will validate create view ddls. func TestCreateViewDDL(t *testing.T) { client := framework.NewClient() @@ -39,16 +42,16 @@ func TestCreateViewDDL(t *testing.T) { &vtrpcpb.CallerID{}, &querypb.VTGateCallerID{Username: "dev"})) - defer client.Execute("delete from _vt.views", nil) + defer client.Execute(qDelAllRows, nil) _, err := client.Execute("create view vitess_view as select * from vitess_a", nil) require.NoError(t, err) // validate the row in _vt.views. - qr, err := client.Execute("select table_name, view_definition, create_statement from _vt.views", nil) + qr, err := client.Execute(qSelAllRows, nil) require.NoError(t, err) require.Equal(t, - `[[VARCHAR("vitess_view") TEXT("select * from vitess_a") TEXT("create view vitess_view as select * from vitess_a")]]`, + `[[VARCHAR("vttest") VARCHAR("vitess_view") TEXT("select * from vitess_a") TEXT("create view vitess_view as select * from vitess_a")]]`, fmt.Sprintf("%v", qr.Rows)) // view already exists. This should fail. @@ -60,10 +63,10 @@ func TestCreateViewDDL(t *testing.T) { require.NoError(t, err) // validate the row in _vt.views. - qr, err = client.Execute("select table_name, view_definition, create_statement from _vt.views", nil) + qr, err = client.Execute(qSelAllRows, nil) require.NoError(t, err) require.Equal(t, - `[[VARCHAR("vitess_view") TEXT("select id, foo from vitess_a") TEXT("create or replace view vitess_view as select id, foo from vitess_a")]]`, + `[[VARCHAR("vttest") VARCHAR("vitess_view") TEXT("select id, foo from vitess_a") TEXT("create or replace view vitess_view as select id, foo from vitess_a")]]`, fmt.Sprintf("%v", qr.Rows)) } @@ -76,7 +79,7 @@ func TestAlterViewDDL(t *testing.T) { &vtrpcpb.CallerID{}, &querypb.VTGateCallerID{Username: "dev"})) - defer client.Execute("delete from _vt.views", nil) + defer client.Execute(qDelAllRows, nil) // view does not exist, should FAIL _, err := client.Execute("alter view vitess_view as select * from vitess_a", nil) @@ -91,10 +94,10 @@ func TestAlterViewDDL(t *testing.T) { require.NoError(t, err) // validate the row in _vt.views. - qr, err := client.Execute("select table_name, view_definition, create_statement from _vt.views", nil) + qr, err := client.Execute(qSelAllRows, nil) require.NoError(t, err) require.Equal(t, - `[[VARCHAR("vitess_view") TEXT("select id, foo from vitess_a") TEXT("create view vitess_view as select id, foo from vitess_a")]]`, + `[[VARCHAR("vttest") VARCHAR("vitess_view") TEXT("select id, foo from vitess_a") TEXT("create view vitess_view as select id, foo from vitess_a")]]`, fmt.Sprintf("%v", qr.Rows)) } @@ -107,7 +110,7 @@ func TestDropViewDDL(t *testing.T) { &vtrpcpb.CallerID{}, &querypb.VTGateCallerID{Username: "dev"})) - defer client.Execute("delete from _vt.views", nil) + defer client.Execute(qDelAllRows, nil) // view does not exist, should FAIL _, err := client.Execute("drop view vitess_view", nil) @@ -132,7 +135,7 @@ func TestDropViewDDL(t *testing.T) { require.ErrorContains(t, err, "Unknown view 'vitess_view1,vitess_view3'") // validate ZERO rows in _vt.views. - qr, err := client.Execute("select * from _vt.views", nil) + qr, err := client.Execute(qSelAllRows, nil) require.NoError(t, err) require.Zero(t, qr.Rows) @@ -145,7 +148,30 @@ func TestDropViewDDL(t *testing.T) { require.NoError(t, err) // validate ZERO rows in _vt.views. - qr, err = client.Execute("select * from _vt.views", nil) + qr, err = client.Execute(qSelAllRows, nil) require.NoError(t, err) require.Zero(t, qr.Rows) } + +// TestGetSchemaRPC will validate GetSchema rpc.. +func TestGetSchemaRPC(t *testing.T) { + client := framework.NewClient() + + viewSchemaDef, err := client.GetSchema(querypb.SchemaTableType_VIEWS) + require.NoError(t, err) + require.Zero(t, len(viewSchemaDef)) + + client.UpdateContext(callerid.NewContext( + context.Background(), + &vtrpcpb.CallerID{}, + &querypb.VTGateCallerID{Username: "dev"})) + + defer client.Execute(qDelAllRows, nil) + + _, err = client.Execute("create view vitess_view as select 1 from vitess_a", nil) + require.NoError(t, err) + + viewSchemaDef, err = client.GetSchema(querypb.SchemaTableType_VIEWS) + require.NoError(t, err) + require.Equal(t, viewSchemaDef["vitess_view"], "select 1 from vitess_a") +} diff --git a/go/vt/vttablet/grpcqueryservice/server.go b/go/vt/vttablet/grpcqueryservice/server.go index bbd8d3a08c0..69ebcbf39b9 100644 --- a/go/vt/vttablet/grpcqueryservice/server.go +++ b/go/vt/vttablet/grpcqueryservice/server.go @@ -483,6 +483,19 @@ func (q *query) Release(ctx context.Context, request *querypb.ReleaseRequest) (r return &querypb.ReleaseResponse{}, nil } +// GetSchema implements the QueryServer interface +func (q *query) GetSchema(ctx context.Context, request *querypb.GetSchemaRequest) (response *querypb.GetSchemaResponse, err error) { + defer q.server.HandlePanic(&err) + var resp map[string]string + resp, err = q.server.GetSchema(ctx, request.Target, request.TableType, request.TableNames) + if err != nil { + return nil, vterrors.ToGRPC(err) + } + return &querypb.GetSchemaResponse{ + TableDefinition: resp, + }, nil +} + // Register registers the implementation on the provide gRPC Server. func Register(s *grpc.Server, server queryservice.QueryService) { queryservicepb.RegisterQueryServer(s, &query{server: server}) diff --git a/go/vt/vttablet/grpctabletconn/conn.go b/go/vt/vttablet/grpctabletconn/conn.go index a10d7d2a584..4a945d1a1af 100644 --- a/go/vt/vttablet/grpctabletconn/conn.go +++ b/go/vt/vttablet/grpctabletconn/conn.go @@ -1018,6 +1018,26 @@ func (conn *gRPCQueryClient) Release(ctx context.Context, target *querypb.Target return nil } +// GetSchema implements the queryservice interface +func (conn *gRPCQueryClient) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) { + conn.mu.RLock() + defer conn.mu.RUnlock() + if conn.cc == nil { + return nil, tabletconn.ConnClosed + } + + req := &querypb.GetSchemaRequest{ + Target: target, + TableType: tableType, + TableNames: tableNames, + } + reply, err := conn.c.GetSchema(ctx, req) + if err != nil { + return nil, tabletconn.ErrorFromGRPC(err) + } + return reply.TableDefinition, nil +} + // Close closes underlying gRPC channel. func (conn *gRPCQueryClient) Close(ctx context.Context) error { conn.mu.Lock() diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index d86812b2b40..b72ae12d653 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -117,6 +117,9 @@ type QueryService interface { Release(ctx context.Context, target *querypb.Target, transactionID, reservedID int64) error + // GetSchema returns the table definition for the specified tables. + GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) + // Close must be called for releasing resources. Close(ctx context.Context) error } diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index 5d3402f7f11..97c4732da44 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -324,6 +324,15 @@ func (ws *wrappedService) Release(ctx context.Context, target *querypb.Target, t }) } +func (ws *wrappedService) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (schemaDef map[string]string, err error) { + err = ws.wrapper(ctx, target, ws.impl, "GetSchema", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { + var innerErr error + schemaDef, innerErr = conn.GetSchema(ctx, target, tableType, tableNames) + return canRetry(ctx, innerErr), innerErr + }) + return schemaDef, err +} + func (ws *wrappedService) Close(ctx context.Context) error { return ws.wrapper(ctx, nil, ws.impl, "Close", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { // No point retrying Close. diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index b4ab30cf71d..822f6774fe9 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -76,6 +76,7 @@ type SandboxConn struct { ReadTransactionCount sync2.AtomicInt64 ReserveCount sync2.AtomicInt64 ReleaseCount sync2.AtomicInt64 + GetSchemaCount sync2.AtomicInt64 // Queries stores the non-batch requests received. Queries []*querypb.BoundQuery @@ -119,6 +120,8 @@ type SandboxConn struct { EphemeralShardErr error NotServing bool + + getSchemaResult []map[string]string } var _ queryservice.QueryService = (*SandboxConn)(nil) // compile-time interface check @@ -154,6 +157,11 @@ func (sbc *SandboxConn) SetResults(r []*sqltypes.Result) { sbc.results = r } +// SetSchemaResult sets what GetSchema should return on each call. +func (sbc *SandboxConn) SetSchemaResult(r []map[string]string) { + sbc.getSchemaResult = r +} + // Execute is part of the QueryService interface. func (sbc *SandboxConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { sbc.execMu.Lock() @@ -576,6 +584,17 @@ func (sbc *SandboxConn) Release(ctx context.Context, target *querypb.Target, tra return sbc.getError() } +// GetSchema implements the QueryService interface +func (sbc *SandboxConn) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) { + sbc.GetSchemaCount.Add(1) + var resp map[string]string + if len(sbc.getSchemaResult) > 0 { + resp = sbc.getSchemaResult[0] + sbc.getSchemaResult = sbc.getSchemaResult[1:] + } + return resp, nil +} + // Close does not change ExecCount func (sbc *SandboxConn) Close(ctx context.Context) error { return nil diff --git a/go/vt/vttablet/tabletconntest/fakequeryservice.go b/go/vt/vttablet/tabletconntest/fakequeryservice.go index 751d9ad3d57..e78194fd5db 100644 --- a/go/vt/vttablet/tabletconntest/fakequeryservice.go +++ b/go/vt/vttablet/tabletconntest/fakequeryservice.go @@ -749,6 +749,11 @@ func (f *FakeQueryService) Release(ctx context.Context, target *querypb.Target, panic("implement me") } +// GetSchema implements the QueryService interface +func (f *FakeQueryService) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) { + panic("implement me") +} + // CreateFakeServer returns the fake server for the tests func CreateFakeServer(t testing.TB) *FakeQueryService { return &FakeQueryService{ diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index 79af1d4a88f..b7b198f7f87 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -305,7 +305,7 @@ func (qre *QueryExecutor) execViewDDL(conn *StatefulConnection) (*sqltypes.Resul } func (qre *QueryExecutor) execCreateViewDDL(conn *StatefulConnection, stmt *sqlparser.CreateView) (*sqltypes.Result, error) { - bindVars := qre.generateBindVarsForViewDDLInsert(stmt) + bindVars := generateBindVarsForViewDDLInsert(stmt) sql, _, err := qre.generateFinalSQL(qre.plan.FullQuery, bindVars) if err != nil { return nil, err @@ -334,7 +334,7 @@ func (qre *QueryExecutor) execAlterViewDDL(conn *StatefulConnection, stmt *sqlpa CheckOption: stmt.CheckOption, Comments: stmt.Comments, } - bindVars := qre.generateBindVarsForViewDDLInsert(createViewDDL) + bindVars := generateBindVarsForViewDDLInsert(createViewDDL) sql, _, err := qre.generateFinalSQL(qre.plan.FullQuery, bindVars) if err != nil { return nil, err @@ -1227,10 +1227,61 @@ func (qre *QueryExecutor) recordUserQuery(queryType string, duration int64) { qre.tsv.Stats().UserTableQueryTimesNs.Add([]string{tableName, username, queryType}, duration) } -func (qre *QueryExecutor) generateBindVarsForViewDDLInsert(createView *sqlparser.CreateView) map[string]*querypb.BindVariable { +func generateBindVarsForViewDDLInsert(createView *sqlparser.CreateView) map[string]*querypb.BindVariable { bindVars := make(map[string]*querypb.BindVariable) bindVars["table_name"] = sqltypes.StringBindVariable(createView.ViewName.Name.String()) bindVars["view_definition"] = sqltypes.StringBindVariable(sqlparser.String(createView.Select)) bindVars["create_statement"] = sqltypes.StringBindVariable(sqlparser.String(createView)) return bindVars } + +func (qre *QueryExecutor) GetSchemaDefinitions(tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) { + switch tableType { + case querypb.SchemaTableType_VIEWS: + return qre.getViewDefinitions(tableNames) + } + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid table type %v", tableType) +} + +func (qre *QueryExecutor) getViewDefinitions(viewNames []string) (map[string]string, error) { + query := mysql.FetchViews + var bindVars map[string]*querypb.BindVariable + if len(viewNames) > 0 { + query = mysql.FetchUpdatedViews + bindVars = map[string]*querypb.BindVariable{ + "viewnames": sqltypes.StringBindVariable(strings.Join(viewNames, ",")), + } + } + res, err := qre.execQuery(query, bindVars) + if err != nil { + return nil, err + } + + schemaDef := make(map[string]string) + for _, row := range res.Rows { + schemaDef[row[0].ToString()] = row[1].ToString() + } + return schemaDef, nil +} + +func (qre *QueryExecutor) execQuery(query string, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { + sql := query + if len(bindVars) > 0 { + stmt, err := sqlparser.Parse(query) + if err != nil { + return nil, err + } + sql, _, err = qre.generateFinalSQL(sqlparser.NewParsedQuery(stmt), bindVars) + if err != nil { + return nil, err + } + } + + conn, err := qre.getConn() + if err != nil { + return nil, err + } + defer conn.Recycle() + + return qre.execDBConn(conn, sql, true) +} diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index daf32edc8b2..c9c5146783c 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -1395,6 +1395,27 @@ func txToReserveState(state queryservice.TransactionState) queryservice.Reserved } } +// GetSchema returns table definitions for the specified tables. +func (tsv *TabletServer) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (schemaDef map[string]string, err error) { + err = tsv.execRequest( + ctx, tsv.QueryTimeout.Get(), + "GetSchema", "", nil, + target, nil, false, /* allowOnShutdown */ + func(ctx context.Context, logStats *tabletenv.LogStats) error { + defer tsv.stats.QueryTimings.Record("GetSchema", time.Now()) + + qre := &QueryExecutor{ + ctx: ctx, + logStats: logStats, + tsv: tsv, + } + schemaDef, err = qre.GetSchemaDefinitions(tableType, tableNames) + return err + }, + ) + return +} + // execRequest performs verifications, sets up the necessary environments // and calls the supplied function for executing the request. func (tsv *TabletServer) execRequest( diff --git a/proto/query.proto b/proto/query.proto index f1ffd734317..13d2372a8c7 100644 --- a/proto/query.proto +++ b/proto/query.proto @@ -973,3 +973,24 @@ message TransactionMetadata { int64 time_created = 3; repeated Target participants = 4; } + + +// SchemaTableType represents the type of table requested. +enum SchemaTableType { + VIEWS = 0; + TABLES = 1; + ALL = 2; +} + +// GetSchemaRequest is the payload to GetSchema +message GetSchemaRequest { + Target target = 1; + SchemaTableType table_type = 2; + repeated string table_names = 3; +} + +// GetSchemaResponse is the returned value from GetSchema +message GetSchemaResponse { + // this is for the schema definition for the requested tables. + map table_definition = 2; +} \ No newline at end of file diff --git a/proto/queryservice.proto b/proto/queryservice.proto index 3f3879639e2..295fca961eb 100644 --- a/proto/queryservice.proto +++ b/proto/queryservice.proto @@ -108,4 +108,7 @@ service Query { // VStreamResults streams results along with the gtid of the snapshot. rpc VStreamResults(binlogdata.VStreamResultsRequest) returns (stream binlogdata.VStreamResultsResponse) {}; + + // GetSchema returns the schema information. + rpc GetSchema(query.GetSchemaRequest) returns (query.GetSchemaResponse) {}; } diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index 25b0c92bfa1..e55abfe9428 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -31280,6 +31280,205 @@ export namespace query { */ public toJSON(): { [k: string]: any }; } + + /** SchemaTableType enum. */ + enum SchemaTableType { + VIEWS = 0, + TABLES = 1, + ALL = 2 + } + + /** Properties of a GetSchemaRequest. */ + interface IGetSchemaRequest { + + /** GetSchemaRequest target */ + target?: (query.ITarget|null); + + /** GetSchemaRequest table_type */ + table_type?: (query.SchemaTableType|null); + + /** GetSchemaRequest table_names */ + table_names?: (string[]|null); + } + + /** Represents a GetSchemaRequest. */ + class GetSchemaRequest implements IGetSchemaRequest { + + /** + * Constructs a new GetSchemaRequest. + * @param [properties] Properties to set + */ + constructor(properties?: query.IGetSchemaRequest); + + /** GetSchemaRequest target. */ + public target?: (query.ITarget|null); + + /** GetSchemaRequest table_type. */ + public table_type: query.SchemaTableType; + + /** GetSchemaRequest table_names. */ + public table_names: string[]; + + /** + * Creates a new GetSchemaRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns GetSchemaRequest instance + */ + public static create(properties?: query.IGetSchemaRequest): query.GetSchemaRequest; + + /** + * Encodes the specified GetSchemaRequest message. Does not implicitly {@link query.GetSchemaRequest.verify|verify} messages. + * @param message GetSchemaRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: query.IGetSchemaRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GetSchemaRequest message, length delimited. Does not implicitly {@link query.GetSchemaRequest.verify|verify} messages. + * @param message GetSchemaRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: query.IGetSchemaRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GetSchemaRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GetSchemaRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): query.GetSchemaRequest; + + /** + * Decodes a GetSchemaRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GetSchemaRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): query.GetSchemaRequest; + + /** + * Verifies a GetSchemaRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GetSchemaRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GetSchemaRequest + */ + public static fromObject(object: { [k: string]: any }): query.GetSchemaRequest; + + /** + * Creates a plain object from a GetSchemaRequest message. Also converts values to other types if specified. + * @param message GetSchemaRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: query.GetSchemaRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GetSchemaRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a GetSchemaResponse. */ + interface IGetSchemaResponse { + + /** GetSchemaResponse table_definition */ + table_definition?: ({ [k: string]: string }|null); + } + + /** Represents a GetSchemaResponse. */ + class GetSchemaResponse implements IGetSchemaResponse { + + /** + * Constructs a new GetSchemaResponse. + * @param [properties] Properties to set + */ + constructor(properties?: query.IGetSchemaResponse); + + /** GetSchemaResponse table_definition. */ + public table_definition: { [k: string]: string }; + + /** + * Creates a new GetSchemaResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns GetSchemaResponse instance + */ + public static create(properties?: query.IGetSchemaResponse): query.GetSchemaResponse; + + /** + * Encodes the specified GetSchemaResponse message. Does not implicitly {@link query.GetSchemaResponse.verify|verify} messages. + * @param message GetSchemaResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: query.IGetSchemaResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GetSchemaResponse message, length delimited. Does not implicitly {@link query.GetSchemaResponse.verify|verify} messages. + * @param message GetSchemaResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: query.IGetSchemaResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GetSchemaResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GetSchemaResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): query.GetSchemaResponse; + + /** + * Decodes a GetSchemaResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GetSchemaResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): query.GetSchemaResponse; + + /** + * Verifies a GetSchemaResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GetSchemaResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GetSchemaResponse + */ + public static fromObject(object: { [k: string]: any }): query.GetSchemaResponse; + + /** + * Creates a plain object from a GetSchemaResponse message. Also converts values to other types if specified. + * @param message GetSchemaResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: query.GetSchemaResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GetSchemaResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } } /** Namespace vtrpc. */ diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index cd7a5fe2936..05ae47dbcce 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -73907,6 +73907,516 @@ $root.query = (function() { return TransactionMetadata; })(); + /** + * SchemaTableType enum. + * @name query.SchemaTableType + * @enum {number} + * @property {number} VIEWS=0 VIEWS value + * @property {number} TABLES=1 TABLES value + * @property {number} ALL=2 ALL value + */ + query.SchemaTableType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "VIEWS"] = 0; + values[valuesById[1] = "TABLES"] = 1; + values[valuesById[2] = "ALL"] = 2; + return values; + })(); + + query.GetSchemaRequest = (function() { + + /** + * Properties of a GetSchemaRequest. + * @memberof query + * @interface IGetSchemaRequest + * @property {query.ITarget|null} [target] GetSchemaRequest target + * @property {query.SchemaTableType|null} [table_type] GetSchemaRequest table_type + * @property {Array.|null} [table_names] GetSchemaRequest table_names + */ + + /** + * Constructs a new GetSchemaRequest. + * @memberof query + * @classdesc Represents a GetSchemaRequest. + * @implements IGetSchemaRequest + * @constructor + * @param {query.IGetSchemaRequest=} [properties] Properties to set + */ + function GetSchemaRequest(properties) { + this.table_names = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetSchemaRequest target. + * @member {query.ITarget|null|undefined} target + * @memberof query.GetSchemaRequest + * @instance + */ + GetSchemaRequest.prototype.target = null; + + /** + * GetSchemaRequest table_type. + * @member {query.SchemaTableType} table_type + * @memberof query.GetSchemaRequest + * @instance + */ + GetSchemaRequest.prototype.table_type = 0; + + /** + * GetSchemaRequest table_names. + * @member {Array.} table_names + * @memberof query.GetSchemaRequest + * @instance + */ + GetSchemaRequest.prototype.table_names = $util.emptyArray; + + /** + * Creates a new GetSchemaRequest instance using the specified properties. + * @function create + * @memberof query.GetSchemaRequest + * @static + * @param {query.IGetSchemaRequest=} [properties] Properties to set + * @returns {query.GetSchemaRequest} GetSchemaRequest instance + */ + GetSchemaRequest.create = function create(properties) { + return new GetSchemaRequest(properties); + }; + + /** + * Encodes the specified GetSchemaRequest message. Does not implicitly {@link query.GetSchemaRequest.verify|verify} messages. + * @function encode + * @memberof query.GetSchemaRequest + * @static + * @param {query.IGetSchemaRequest} message GetSchemaRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetSchemaRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.target != null && Object.hasOwnProperty.call(message, "target")) + $root.query.Target.encode(message.target, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.table_type != null && Object.hasOwnProperty.call(message, "table_type")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.table_type); + if (message.table_names != null && message.table_names.length) + for (var i = 0; i < message.table_names.length; ++i) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.table_names[i]); + return writer; + }; + + /** + * Encodes the specified GetSchemaRequest message, length delimited. Does not implicitly {@link query.GetSchemaRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof query.GetSchemaRequest + * @static + * @param {query.IGetSchemaRequest} message GetSchemaRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetSchemaRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetSchemaRequest message from the specified reader or buffer. + * @function decode + * @memberof query.GetSchemaRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {query.GetSchemaRequest} GetSchemaRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetSchemaRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.query.GetSchemaRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.target = $root.query.Target.decode(reader, reader.uint32()); + break; + case 2: + message.table_type = reader.int32(); + break; + case 3: + if (!(message.table_names && message.table_names.length)) + message.table_names = []; + message.table_names.push(reader.string()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetSchemaRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof query.GetSchemaRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {query.GetSchemaRequest} GetSchemaRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetSchemaRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetSchemaRequest message. + * @function verify + * @memberof query.GetSchemaRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetSchemaRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.target != null && message.hasOwnProperty("target")) { + var error = $root.query.Target.verify(message.target); + if (error) + return "target." + error; + } + if (message.table_type != null && message.hasOwnProperty("table_type")) + switch (message.table_type) { + default: + return "table_type: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.table_names != null && message.hasOwnProperty("table_names")) { + if (!Array.isArray(message.table_names)) + return "table_names: array expected"; + for (var i = 0; i < message.table_names.length; ++i) + if (!$util.isString(message.table_names[i])) + return "table_names: string[] expected"; + } + return null; + }; + + /** + * Creates a GetSchemaRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof query.GetSchemaRequest + * @static + * @param {Object.} object Plain object + * @returns {query.GetSchemaRequest} GetSchemaRequest + */ + GetSchemaRequest.fromObject = function fromObject(object) { + if (object instanceof $root.query.GetSchemaRequest) + return object; + var message = new $root.query.GetSchemaRequest(); + if (object.target != null) { + if (typeof object.target !== "object") + throw TypeError(".query.GetSchemaRequest.target: object expected"); + message.target = $root.query.Target.fromObject(object.target); + } + switch (object.table_type) { + case "VIEWS": + case 0: + message.table_type = 0; + break; + case "TABLES": + case 1: + message.table_type = 1; + break; + case "ALL": + case 2: + message.table_type = 2; + break; + } + if (object.table_names) { + if (!Array.isArray(object.table_names)) + throw TypeError(".query.GetSchemaRequest.table_names: array expected"); + message.table_names = []; + for (var i = 0; i < object.table_names.length; ++i) + message.table_names[i] = String(object.table_names[i]); + } + return message; + }; + + /** + * Creates a plain object from a GetSchemaRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof query.GetSchemaRequest + * @static + * @param {query.GetSchemaRequest} message GetSchemaRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetSchemaRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.table_names = []; + if (options.defaults) { + object.target = null; + object.table_type = options.enums === String ? "VIEWS" : 0; + } + if (message.target != null && message.hasOwnProperty("target")) + object.target = $root.query.Target.toObject(message.target, options); + if (message.table_type != null && message.hasOwnProperty("table_type")) + object.table_type = options.enums === String ? $root.query.SchemaTableType[message.table_type] : message.table_type; + if (message.table_names && message.table_names.length) { + object.table_names = []; + for (var j = 0; j < message.table_names.length; ++j) + object.table_names[j] = message.table_names[j]; + } + return object; + }; + + /** + * Converts this GetSchemaRequest to JSON. + * @function toJSON + * @memberof query.GetSchemaRequest + * @instance + * @returns {Object.} JSON object + */ + GetSchemaRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetSchemaRequest; + })(); + + query.GetSchemaResponse = (function() { + + /** + * Properties of a GetSchemaResponse. + * @memberof query + * @interface IGetSchemaResponse + * @property {Object.|null} [table_definition] GetSchemaResponse table_definition + */ + + /** + * Constructs a new GetSchemaResponse. + * @memberof query + * @classdesc Represents a GetSchemaResponse. + * @implements IGetSchemaResponse + * @constructor + * @param {query.IGetSchemaResponse=} [properties] Properties to set + */ + function GetSchemaResponse(properties) { + this.table_definition = {}; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetSchemaResponse table_definition. + * @member {Object.} table_definition + * @memberof query.GetSchemaResponse + * @instance + */ + GetSchemaResponse.prototype.table_definition = $util.emptyObject; + + /** + * Creates a new GetSchemaResponse instance using the specified properties. + * @function create + * @memberof query.GetSchemaResponse + * @static + * @param {query.IGetSchemaResponse=} [properties] Properties to set + * @returns {query.GetSchemaResponse} GetSchemaResponse instance + */ + GetSchemaResponse.create = function create(properties) { + return new GetSchemaResponse(properties); + }; + + /** + * Encodes the specified GetSchemaResponse message. Does not implicitly {@link query.GetSchemaResponse.verify|verify} messages. + * @function encode + * @memberof query.GetSchemaResponse + * @static + * @param {query.IGetSchemaResponse} message GetSchemaResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetSchemaResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.table_definition != null && Object.hasOwnProperty.call(message, "table_definition")) + for (var keys = Object.keys(message.table_definition), i = 0; i < keys.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.table_definition[keys[i]]).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetSchemaResponse message, length delimited. Does not implicitly {@link query.GetSchemaResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof query.GetSchemaResponse + * @static + * @param {query.IGetSchemaResponse} message GetSchemaResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetSchemaResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetSchemaResponse message from the specified reader or buffer. + * @function decode + * @memberof query.GetSchemaResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {query.GetSchemaResponse} GetSchemaResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetSchemaResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.query.GetSchemaResponse(), key, value; + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 2: + if (message.table_definition === $util.emptyObject) + message.table_definition = {}; + var end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.table_definition[key] = value; + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetSchemaResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof query.GetSchemaResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {query.GetSchemaResponse} GetSchemaResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetSchemaResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetSchemaResponse message. + * @function verify + * @memberof query.GetSchemaResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetSchemaResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.table_definition != null && message.hasOwnProperty("table_definition")) { + if (!$util.isObject(message.table_definition)) + return "table_definition: object expected"; + var key = Object.keys(message.table_definition); + for (var i = 0; i < key.length; ++i) + if (!$util.isString(message.table_definition[key[i]])) + return "table_definition: string{k:string} expected"; + } + return null; + }; + + /** + * Creates a GetSchemaResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof query.GetSchemaResponse + * @static + * @param {Object.} object Plain object + * @returns {query.GetSchemaResponse} GetSchemaResponse + */ + GetSchemaResponse.fromObject = function fromObject(object) { + if (object instanceof $root.query.GetSchemaResponse) + return object; + var message = new $root.query.GetSchemaResponse(); + if (object.table_definition) { + if (typeof object.table_definition !== "object") + throw TypeError(".query.GetSchemaResponse.table_definition: object expected"); + message.table_definition = {}; + for (var keys = Object.keys(object.table_definition), i = 0; i < keys.length; ++i) + message.table_definition[keys[i]] = String(object.table_definition[keys[i]]); + } + return message; + }; + + /** + * Creates a plain object from a GetSchemaResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof query.GetSchemaResponse + * @static + * @param {query.GetSchemaResponse} message GetSchemaResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetSchemaResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.objects || options.defaults) + object.table_definition = {}; + var keys2; + if (message.table_definition && (keys2 = Object.keys(message.table_definition)).length) { + object.table_definition = {}; + for (var j = 0; j < keys2.length; ++j) + object.table_definition[keys2[j]] = message.table_definition[keys2[j]]; + } + return object; + }; + + /** + * Converts this GetSchemaResponse to JSON. + * @function toJSON + * @memberof query.GetSchemaResponse + * @instance + * @returns {Object.} JSON object + */ + GetSchemaResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetSchemaResponse; + })(); + return query; })(); From cadf2730c72c937cea96e3bb2d7dfd07ae7969d9 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 21 Feb 2023 09:33:18 +0200 Subject: [PATCH 017/233] [release-16.0] VReplication: ignore GC tables in schema analysis (#12320) (#12362) * TableFilter: fix excluded RE listing Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * extract GCTableNameExpression Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * VReplication: exclude GC tables when reading schema Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * wrap schema analyzis errors for better tracability 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/vt/mysqlctl/schema.go | 4 +- go/vt/mysqlctl/tmutils/schema.go | 2 +- go/vt/mysqlctl/tmutils/schema_test.go | 70 ++++++++++--------- go/vt/schema/name_test.go | 35 ++++++++++ go/vt/schema/tablegc.go | 6 +- go/vt/vttablet/onlineddl/analysis.go | 4 +- .../tabletmanager/vreplication/vreplicator.go | 3 +- go/vt/vttablet/tabletserver/schema/engine.go | 4 +- 8 files changed, 87 insertions(+), 41 deletions(-) diff --git a/go/vt/mysqlctl/schema.go b/go/vt/mysqlctl/schema.go index 9c7ed553a25..518e9bf3ab5 100644 --- a/go/vt/mysqlctl/schema.go +++ b/go/vt/mysqlctl/schema.go @@ -232,7 +232,7 @@ func (mysqld *Mysqld) normalizedSchema(ctx context.Context, dbName, tableName, t backtickDBName := sqlescape.EscapeID(dbName) qr, fetchErr := mysqld.FetchSuperQuery(ctx, fmt.Sprintf("SHOW CREATE TABLE %s.%s", backtickDBName, sqlescape.EscapeID(tableName))) if fetchErr != nil { - return "", fetchErr + return "", vterrors.Wrapf(fetchErr, "in Mysqld.normalizedSchema()") } if len(qr.Rows) == 0 { return "", fmt.Errorf("empty create table statement for %v", tableName) @@ -322,7 +322,7 @@ func GetColumns(dbName, table string, exec func(string, int, bool) (*sqltypes.Re query := fmt.Sprintf(GetFieldsQuery, selectColumns, tableSpec) qr, err := exec(query, 0, true) if err != nil { - return nil, nil, err + return nil, nil, vterrors.Wrapf(err, "in Mysqld.GetColumns()") } columns := make([]string, len(qr.Fields)) diff --git a/go/vt/mysqlctl/tmutils/schema.go b/go/vt/mysqlctl/tmutils/schema.go index a723e58a17d..41842d40c07 100644 --- a/go/vt/mysqlctl/tmutils/schema.go +++ b/go/vt/mysqlctl/tmutils/schema.go @@ -119,7 +119,7 @@ func NewTableFilter(tables, excludeTables []string, includeViews bool) (*TableFi return nil, fmt.Errorf("cannot compile regexp %v for excludeTable: %v", table, err) } - f.excludeTableREs = append(f.tableREs, re) + f.excludeTableREs = append(f.excludeTableREs, re) } else { f.excludeTableNames = append(f.excludeTableNames, table) } diff --git a/go/vt/mysqlctl/tmutils/schema_test.go b/go/vt/mysqlctl/tmutils/schema_test.go index b355206ff7f..472093cb869 100644 --- a/go/vt/mysqlctl/tmutils/schema_test.go +++ b/go/vt/mysqlctl/tmutils/schema_test.go @@ -19,9 +19,10 @@ package tmutils import ( "errors" "fmt" - "reflect" "testing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" @@ -135,9 +136,7 @@ func TestToSQLStrings(t *testing.T) { for _, tc := range testcases { got := SchemaDefinitionToSQLStrings(tc.input) - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("ToSQLStrings() on SchemaDefinition %v returned %v; want %v", tc.input, got, tc.want) - } + assert.Equal(t, tc.want, got) } } @@ -156,12 +155,7 @@ func testDiff(t *testing.T, left, right *tabletmanagerdatapb.SchemaDefinition, l } } } - - if !equal { - t.Logf("Expected: %v", expected) - t.Logf("Actual: %v", actual) - t.Fail() - } + assert.Truef(t, equal, "expected: %v, actual: %v", expected, actual) } func TestSchemaDiff(t *testing.T) { @@ -433,6 +427,26 @@ func TestTableFilter(t *testing.T) { included: false, }, + { + desc: "exclude table list does not list table", + excludeTables: []string{"nomatch1", "nomatch2", "/nomatch3/", "/nomatch4/", "/nomatch5/"}, + includeViews: true, + + tableName: excludedTable, + tableType: TableBaseTable, + + included: true, + }, + { + desc: "exclude table list with re match", + excludeTables: []string{"nomatch1", "nomatch2", "/nomatch3/", "/" + excludedTable + "/", "/nomatch5/"}, + includeViews: true, + + tableName: excludedTable, + tableType: TableBaseTable, + + included: false, + }, { desc: "bad table regexp", tables: []string{"/*/"}, @@ -450,18 +464,16 @@ func TestTableFilter(t *testing.T) { for _, tc := range tcs { t.Run(tc.desc, func(t *testing.T) { f, err := NewTableFilter(tc.tables, tc.excludeTables, tc.includeViews) - if tc.hasErr != (err != nil) { - t.Fatalf("hasErr not right: %v, tc: %+v", err, tc) - } - if tc.hasErr { + assert.Error(t, err) return } + assert.NoError(t, err) + assert.Equal(t, len(tc.tables), len(f.tableNames)+len(f.tableREs)) + assert.Equal(t, len(tc.excludeTables), len(f.excludeTableNames)+len(f.excludeTableREs)) included := f.Includes(tc.tableName, tc.tableType) - if tc.included != included { - t.Fatalf("included is not right: %v\nfilter: %+v\ntc: %+v", included, f, tc) - } + assert.Equalf(t, tc.included, included, "filter: %v", f) }) } } @@ -638,21 +650,15 @@ func TestFilterTables(t *testing.T) { } for _, tc := range testcases { - got, err := FilterTables(tc.input, tc.tables, tc.excludeTables, tc.includeViews) - if tc.wantError != nil { - if err == nil { - t.Fatalf("FilterTables() test '%v' on SchemaDefinition %v did not return an error (result: %v), but should have, wantError %v", tc.desc, tc.input, got, tc.wantError) - } - if err.Error() != tc.wantError.Error() { - t.Errorf("FilterTables() test '%v' on SchemaDefinition %v returned wrong error '%v'; wanted error '%v'", tc.desc, tc.input, err, tc.wantError) - } - } else { - if err != nil { - t.Errorf("FilterTables() test '%v' on SchemaDefinition %v failed with error %v, want %v", tc.desc, tc.input, err, tc.want) - } - if !proto.Equal(got, tc.want) { - t.Errorf("FilterTables() test '%v' on SchemaDefinition %v returned %v; want %v", tc.desc, tc.input, got, tc.want) + t.Run(tc.desc, func(t *testing.T) { + got, err := FilterTables(tc.input, tc.tables, tc.excludeTables, tc.includeViews) + if tc.wantError != nil { + require.Error(t, err) + require.Equal(t, tc.wantError, err) + } else { + assert.NoError(t, err) + assert.Truef(t, proto.Equal(tc.want, got), "wanted: %v, got: %v", tc.want, got) } - } + }) } } diff --git a/go/vt/schema/name_test.go b/go/vt/schema/name_test.go index 7bf418066a0..ab72f80644e 100644 --- a/go/vt/schema/name_test.go +++ b/go/vt/schema/name_test.go @@ -22,6 +22,41 @@ import ( "github.com/stretchr/testify/assert" ) +func TestNameIsGCTableName(t *testing.T) { + irrelevantNames := []string{ + "t", + "_table_new", + "__table_new", + "_table_gho", + "_table_ghc", + "_table_del", + "table_old", + "vt_onlineddl_test_02", + "_4e5dcf80_354b_11eb_82cd_f875a4d24e90_20201203114014_gho", + "_4e5dcf80_354b_11eb_82cd_f875a4d24e90_20201203114014_ghc", + "_4e5dcf80_354b_11eb_82cd_f875a4d24e90_20201203114014_del", + "_4e5dcf80_354b_11eb_82cd_f875a4d24e90_20201203114013_new", + "_table_old", + "__table_old", + } + for _, tableName := range irrelevantNames { + t.Run(tableName, func(t *testing.T) { + assert.False(t, IsGCTableName(tableName)) + }) + } + relevantNames := []string{ + "_vt_DROP_6ace8bcef73211ea87e9f875a4d24e90_20200915120410", + "_vt_HOLD_6ace8bcef73211ea87e9f875a4d24e90_20200915120410", + "_vt_EVAC_6ace8bcef73211ea87e9f875a4d24e90_20200915120410", + "_vt_PURGE_6ace8bcef73211ea87e9f875a4d24e90_20200915120410", + } + for _, tableName := range relevantNames { + t.Run(tableName, func(t *testing.T) { + assert.True(t, IsGCTableName(tableName)) + }) + } +} + func TestIsInternalOperationTableName(t *testing.T) { names := []string{ "_4e5dcf80_354b_11eb_82cd_f875a4d24e90_20201203114014_gho", diff --git a/go/vt/schema/tablegc.go b/go/vt/schema/tablegc.go index ff9c5e92c92..872fb42dbe5 100644 --- a/go/vt/schema/tablegc.go +++ b/go/vt/schema/tablegc.go @@ -44,9 +44,13 @@ const ( TableDroppedGCState TableGCState = "" ) +const ( + GCTableNameExpression string = `^_vt_(HOLD|PURGE|EVAC|DROP)_([0-f]{32})_([0-9]{14})$` +) + var ( gcUUIDRegexp = regexp.MustCompile(`^[0-f]{32}$`) - gcTableNameRegexp = regexp.MustCompile(`^_vt_(HOLD|PURGE|EVAC|DROP)_([0-f]{32})_([0-9]{14})$`) + gcTableNameRegexp = regexp.MustCompile(GCTableNameExpression) gcStates = map[string]TableGCState{ string(HoldTableGCState): HoldTableGCState, diff --git a/go/vt/vttablet/onlineddl/analysis.go b/go/vt/vttablet/onlineddl/analysis.go index c86523f6880..040f79d861e 100644 --- a/go/vt/vttablet/onlineddl/analysis.go +++ b/go/vt/vttablet/onlineddl/analysis.go @@ -73,7 +73,7 @@ func (p *SpecialAlterPlan) String() string { func (e *Executor) getCreateTableStatement(ctx context.Context, tableName string) (*sqlparser.CreateTable, error) { showCreateTable, err := e.showCreateTable(ctx, tableName) if err != nil { - return nil, err + return nil, vterrors.Wrapf(err, "in Executor.getCreateTableStatement()") } stmt, err := sqlparser.ParseStrictDDL(showCreateTable) if err != nil { @@ -360,7 +360,7 @@ func (e *Executor) analyzeSpecialAlterPlan(ctx context.Context, onlineDDL *schem createTable, err := e.getCreateTableStatement(ctx, onlineDDL.Table) if err != nil { - return nil, err + return nil, vterrors.Wrapf(err, "in Executor.analyzeSpecialAlterPlan(), uuid=%v, table=%v", onlineDDL.UUID, onlineDDL.Table) } // special plans which support reverts are trivially desired: diff --git a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go index 09944f888f6..ce05c7a6071 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go @@ -26,6 +26,7 @@ import ( "time" "vitess.io/vitess/go/timer" + "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" @@ -288,7 +289,7 @@ type ColumnInfo struct { } func (vr *vreplicator) buildColInfoMap(ctx context.Context) (map[string][]*ColumnInfo, error) { - req := &tabletmanagerdatapb.GetSchemaRequest{Tables: []string{"/.*/"}} + req := &tabletmanagerdatapb.GetSchemaRequest{Tables: []string{"/.*/"}, ExcludeTables: []string{"/" + schema.GCTableNameExpression + "/"}} schema, err := vr.mysqld.GetSchema(ctx, vr.dbClient.DBName(), req) if err != nil { return nil, err diff --git a/go/vt/vttablet/tabletserver/schema/engine.go b/go/vt/vttablet/tabletserver/schema/engine.go index 0f3907685ac..61ff9fba553 100644 --- a/go/vt/vttablet/tabletserver/schema/engine.go +++ b/go/vt/vttablet/tabletserver/schema/engine.go @@ -405,7 +405,7 @@ func (se *Engine) reload(ctx context.Context, includeStats bool) error { } tableData, err := conn.Exec(ctx, showTablesQuery, maxTableCount, false) if err != nil { - return err + return vterrors.Wrapf(err, "in Engine.reload(), reading tables") } err = se.updateInnoDBRowsRead(ctx, conn) @@ -456,7 +456,7 @@ func (se *Engine) reload(ctx context.Context, includeStats bool) error { log.V(2).Infof("Reading schema for table: %s", tableName) table, err := LoadTable(conn, se.cp.DBName(), tableName, row[3].ToString()) if err != nil { - rec.RecordError(err) + rec.RecordError(vterrors.Wrapf(err, "in Engine.reload(), reading table %s", tableName)) continue } if includeStats { From 659c9c0a9e85b5d2c0106b3cf02185ccb33b182d Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 21 Feb 2023 09:35:07 +0200 Subject: [PATCH 018/233] Fix `SHOW VSCHEMA TABLES` tests using v17 vtgate that expected `dual` (#12381) * Fix SHOW VSCHEMA TABLES tests using v17 vtgate Signed-off-by: Florent Poinsard * Fix tests expectations Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard --- .../schematracker/sharded/st_sharded_test.go | 35 ++++++++++++++++--- .../unsharded/st_unsharded_test.go | 22 ++++++++++-- .../endtoend/vtgate/vschema/vschema_test.go | 17 ++++++--- 3 files changed, 62 insertions(+), 12 deletions(-) diff --git a/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go b/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go index cf12d40194c..532e5edae90 100644 --- a/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go +++ b/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go @@ -160,35 +160,54 @@ func TestInitAndUpdate(t *testing.T) { require.NoError(t, err) defer conn.Close() + vtgateVersion, err := cluster.GetMajorVersion("vtgate") + require.NoError(t, err) + + expected := `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` + if vtgateVersion >= 17 { + expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` + } utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", - `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]`, + expected, 100*time.Millisecond, 3*time.Second, "initial table list not complete") // Init _ = utils.Exec(t, conn, "create table test_sc (id bigint primary key)") + expected = `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")]]` + if vtgateVersion >= 17 { + expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")]]` + } utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", - `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")]]`, + expected, 100*time.Millisecond, 3*time.Second, "test_sc not in vschema tables") // Tables Update via health check. _ = utils.Exec(t, conn, "create table test_sc1 (id bigint primary key)") + expected = `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")] [VARCHAR("test_sc1")]]` + if vtgateVersion >= 17 { + expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")] [VARCHAR("test_sc1")]]` + } utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", - `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")] [VARCHAR("test_sc1")]]`, + expected, 100*time.Millisecond, 3*time.Second, "test_sc1 not in vschema tables") _ = utils.Exec(t, conn, "drop table test_sc, test_sc1") + expected = `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` + if vtgateVersion >= 17 { + expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` + } utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", - `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]`, + expected, 100*time.Millisecond, 3*time.Second, "test_sc and test_sc_1 should not be in vschema tables") @@ -204,10 +223,16 @@ func TestDMLOnNewTable(t *testing.T) { // create a new table which is not part of the VSchema utils.Exec(t, conn, `create table new_table_tracked(id bigint, name varchar(100), primary key(id)) Engine=InnoDB`) + vtgateVersion, err := cluster.GetMajorVersion("vtgate") + require.NoError(t, err) + expected := `[[VARCHAR("dual")] [VARCHAR("new_table_tracked")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` + if vtgateVersion >= 17 { + expected = `[[VARCHAR("new_table_tracked")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` + } // wait for vttablet's schema reload interval to pass utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", - `[[VARCHAR("dual")] [VARCHAR("new_table_tracked")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]`, + expected, 100*time.Millisecond, 3*time.Second, "test_sc not in vschema tables") diff --git a/go/test/endtoend/vtgate/schematracker/unsharded/st_unsharded_test.go b/go/test/endtoend/vtgate/schematracker/unsharded/st_unsharded_test.go index 930f288b831..d858d1d4c66 100644 --- a/go/test/endtoend/vtgate/schematracker/unsharded/st_unsharded_test.go +++ b/go/test/endtoend/vtgate/schematracker/unsharded/st_unsharded_test.go @@ -95,10 +95,17 @@ func TestNewUnshardedTable(t *testing.T) { require.NoError(t, err) defer conn.Close() + vtgateVersion, err := cluster.GetMajorVersion("vtgate") + require.NoError(t, err) + expected := `[[VARCHAR("dual")] [VARCHAR("main")]]` + if vtgateVersion >= 17 { + expected = `[[VARCHAR("main")]]` + } + // ensuring our initial table "main" is in the schema utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", - `[[VARCHAR("dual")] [VARCHAR("main")]]`, + expected, 100*time.Millisecond, 3*time.Second, "initial table list not complete") @@ -106,10 +113,15 @@ func TestNewUnshardedTable(t *testing.T) { // create a new table which is not part of the VSchema utils.Exec(t, conn, `create table new_table_tracked(id bigint, name varchar(100), primary key(id)) Engine=InnoDB`) + expected = `[[VARCHAR("dual")] [VARCHAR("main")] [VARCHAR("new_table_tracked")]]` + if vtgateVersion >= 17 { + expected = `[[VARCHAR("main")] [VARCHAR("new_table_tracked")]]` + } + // waiting for the vttablet's schema_reload interval to kick in utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", - `[[VARCHAR("dual")] [VARCHAR("main")] [VARCHAR("new_table_tracked")]]`, + expected, 100*time.Millisecond, 3*time.Second, "new_table_tracked not in vschema tables") @@ -126,9 +138,13 @@ func TestNewUnshardedTable(t *testing.T) { utils.Exec(t, conn, `drop table new_table_tracked`) // waiting for the vttablet's schema_reload interval to kick in + expected = `[[VARCHAR("dual")] [VARCHAR("main")]]` + if vtgateVersion >= 17 { + expected = `[[VARCHAR("main")]]` + } utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", - `[[VARCHAR("dual")] [VARCHAR("main")]]`, + expected, 100*time.Millisecond, 3*time.Second, "new_table_tracked not in vschema tables") diff --git a/go/test/endtoend/vtgate/vschema/vschema_test.go b/go/test/endtoend/vtgate/vschema/vschema_test.go index 80a29c6aff4..92863ff7dc8 100644 --- a/go/test/endtoend/vtgate/vschema/vschema_test.go +++ b/go/test/endtoend/vtgate/vschema/vschema_test.go @@ -111,8 +111,15 @@ func TestVSchema(t *testing.T) { utils.AssertMatches(t, conn, "delete from vt_user", `[]`) + vtgateVersion, err := cluster.GetMajorVersion("vtgate") + require.NoError(t, err) + // Test empty vschema - utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("dual")]]`) + if vtgateVersion >= 17 { + utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[]`) + } else { + utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("dual")]]`) + } // Use the DDL to create an unsharded vschema and test again @@ -128,9 +135,11 @@ func TestVSchema(t *testing.T) { utils.Exec(t, conn, "commit") // Test Showing Tables - utils.AssertMatches(t, conn, - "SHOW VSCHEMA TABLES", - `[[VARCHAR("dual")] [VARCHAR("main")] [VARCHAR("vt_user")]]`) + if vtgateVersion >= 17 { + utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("main")] [VARCHAR("vt_user")]]`) + } else { + utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("dual")] [VARCHAR("main")] [VARCHAR("vt_user")]]`) + } // Test Showing Vindexes utils.AssertMatches(t, conn, "SHOW VSCHEMA VINDEXES", `[]`) From 536bf4c20bfad38136f44a405a58a2f67f02e9cf Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 21 Feb 2023 15:24:06 +0200 Subject: [PATCH 019/233] Bump golang.org/x/net from 0.5.0 to 0.7.0 (#12400) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.5.0 to 0.7.0. - [Release notes](https://github.com/golang/net/releases) - [Commits](https://github.com/golang/net/compare/v0.5.0...v0.7.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index df53d214477..709464fd5c9 100644 --- a/go.mod +++ b/go.mod @@ -80,11 +80,11 @@ require ( golang.org/x/crypto v0.5.0 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 golang.org/x/mod v0.7.0 // indirect - golang.org/x/net v0.5.0 + golang.org/x/net v0.7.0 golang.org/x/oauth2 v0.4.0 - golang.org/x/sys v0.4.0 // indirect - golang.org/x/term v0.4.0 - golang.org/x/text v0.6.0 + 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.3.0 golang.org/x/tools v0.5.0 google.golang.org/api v0.109.0 diff --git a/go.sum b/go.sum index e47da287d26..e47c7dda131 100644 --- a/go.sum +++ b/go.sum @@ -954,8 +954,8 @@ golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +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= @@ -1061,14 +1061,14 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= -golang.org/x/sys v0.4.0/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/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +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= @@ -1081,8 +1081,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +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 08362bc249191596133763461a4173b80e2a59bc Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 22 Feb 2023 08:23:25 +0200 Subject: [PATCH 020/233] Allow zero (in) date when setting up internal _vt schema (#12262) (#12406) * Allow zero (in) date when setting up internal _vt schema * modify test sto include @@sql_mod query support * Allow zero (in) date when setting up internal _vt schema * modify test sto include @@sql_mod query support * Fix test failures * Fix failing tests. Minor refactor * change sql_mode t omost permissive (empty) * setPermissiveSQLMode * fixes per review * Add missing mock query --------- Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Signed-off-by: Rohit Nayak Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: Rohit Nayak --- go/vt/sidecardb/sidecardb.go | 40 ++++++++++++++++++++ go/vt/sidecardb/sidecardb_test.go | 9 ++++- go/vt/vtexplain/vtexplain_vttablet.go | 11 +++++- go/vt/vttablet/tabletserver/schema/engine.go | 2 +- go/vt/vttest/local_cluster.go | 18 ++++++++- 5 files changed, 75 insertions(+), 5 deletions(-) diff --git a/go/vt/sidecardb/sidecardb.go b/go/vt/sidecardb/sidecardb.go index 11f7a402592..4c3ebf6caab 100644 --- a/go/vt/sidecardb/sidecardb.go +++ b/go/vt/sidecardb/sidecardb.go @@ -194,6 +194,12 @@ func Init(ctx context.Context, exec Exec) error { return err } + resetSQLMode, err := si.setPermissiveSQLMode() + if err != nil { + return err + } + defer resetSQLMode() + for _, table := range sidecarTables { if err := si.ensureSchema(table); err != nil { return err @@ -202,6 +208,31 @@ func Init(ctx context.Context, exec Exec) error { return nil } +// setPermissiveSQLMode gets the current sql_mode for the session, removes any +// restrictions, and returns a function to restore it back to the original session value. +// We need to allow for the recreation of any data that currently exists in the table, such +// as e.g. allowing any zero dates that may already exist in a preexisting sidecar table. +func (si *schemaInit) setPermissiveSQLMode() (func(), error) { + rs, err := si.exec(si.ctx, `select @@session.sql_mode as sql_mode`, 1, false) + if err != nil { + return nil, vterrors.Errorf(vtrpcpb.Code_UNKNOWN, "could not read sql_mode: %v", err) + } + sqlMode, err := rs.Named().Row().ToString("sql_mode") + if err != nil { + return nil, vterrors.Errorf(vtrpcpb.Code_UNKNOWN, "could not read sql_mode: %v", err) + } + + resetSQLModeFunc := func() { + restoreSQLModeQuery := fmt.Sprintf("set @@session.sql_mode='%s'", sqlMode) + _, _ = si.exec(si.ctx, restoreSQLModeQuery, 0, false) + } + + if _, err := si.exec(si.ctx, "set @@session.sql_mode=''", 0, false); err != nil { + return nil, vterrors.Errorf(vtrpcpb.Code_UNKNOWN, "could not change sql_mode: %v", err) + } + return resetSQLModeFunc, nil +} + func (si *schemaInit) doesSidecarDBExist() (bool, error) { rs, err := si.exec(si.ctx, ShowSidecarDatabasesQuery, 2, false) if err != nil { @@ -374,6 +405,15 @@ func AddSchemaInitQueries(db *fakesqldb.DB, populateTables bool) { } db.AddQuery(fmt.Sprintf(ShowCreateTableQuery, table.name), result) } + + sqlModeResult := sqltypes.MakeTestResult(sqltypes.MakeTestFields( + "sql_mode", + "varchar"), + "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION", + ) + db.AddQuery("select @@session.sql_mode as sql_mode", sqlModeResult) + + db.AddQuery("set @@session.sql_mode=''", &sqltypes.Result{}) } // MatchesInitQuery returns true if query has one of the test patterns as a substring, or it matches a provided regexp. diff --git a/go/vt/sidecardb/sidecardb_test.go b/go/vt/sidecardb/sidecardb_test.go index 0c2cfcd249e..136d814f12c 100644 --- a/go/vt/sidecardb/sidecardb_test.go +++ b/go/vt/sidecardb/sidecardb_test.go @@ -27,11 +27,18 @@ import ( ) // Tests all non-error code paths in sidecardb -func TestAll(t *testing.T) { +func TestAllSidecarDB(t *testing.T) { db := fakesqldb.New(t) defer db.Close() AddSchemaInitQueries(db, false) db.AddQuery("use dbname", &sqltypes.Result{}) + sqlMode := sqltypes.MakeTestResult(sqltypes.MakeTestFields( + "sql_mode", + "varchar"), + "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION", + ) + db.AddQuery("select @@session.sql_mode as sql_mode", sqlMode) + db.AddQueryPattern("set @@session.sql_mode=.*", &sqltypes.Result{}) ctx := context.Background() cp := db.ConnParams() diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index 91cae609251..4f0a3f7d102 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -144,7 +144,7 @@ func (vte *VTExplain) newTablet(opts *Options, t *topodatapb.Tablet) *explainTab tsv.StartService(&target, dbcfgs, nil /* mysqld */) // clear all the schema initialization queries out of the tablet - // to avoid clutttering the output + // to avoid cluttering the output tablet.mysqlQueries = nil return &tablet @@ -300,6 +300,15 @@ func newTabletEnvironment(ddls []sqlparser.DDLStatement, opts *Options) (*tablet {sqltypes.NewVarBinary("STRICT_TRANS_TABLES")}, }, }, + "select @@session.sql_mode as sql_mode": { + Fields: []*querypb.Field{{ + Name: "sql_mode", + Type: sqltypes.VarChar, + }}, + Rows: [][]sqltypes.Value{ + {sqltypes.NewVarBinary("STRICT_TRANS_TABLES")}, + }, + }, "select @@autocommit": { Fields: []*querypb.Field{{ Type: sqltypes.Uint64, diff --git a/go/vt/vttablet/tabletserver/schema/engine.go b/go/vt/vttablet/tabletserver/schema/engine.go index 61ff9fba553..3e6fd16c019 100644 --- a/go/vt/vttablet/tabletserver/schema/engine.go +++ b/go/vt/vttablet/tabletserver/schema/engine.go @@ -147,7 +147,7 @@ func (se *Engine) syncSidecarDB(ctx context.Context, conn *dbconnpool.DBConnecti return nil, err } } - return conn.ExecuteFetch(query, maxRows, false) + return conn.ExecuteFetch(query, maxRows, true) } if err := sidecardb.Init(ctx, exec); err != nil { log.Errorf("Error in sidecardb.Init: %+v", err) diff --git a/go/vt/vttest/local_cluster.go b/go/vt/vttest/local_cluster.go index 3d954de860d..7dcbdc67afa 100644 --- a/go/vt/vttest/local_cluster.go +++ b/go/vt/vttest/local_cluster.go @@ -506,8 +506,7 @@ func (db *LocalCluster) createVTSchema() error { return nil, err } } - err := db.Execute([]string{query}, "") - return &sqltypes.Result{}, err + return db.ExecuteFetch(query, "") } if err := sidecardb.Init(context.Background(), sidecardbExec); err != nil { @@ -564,6 +563,21 @@ func (db *LocalCluster) Execute(sql []string, dbname string) error { return err } +// ExecuteFetch runs a SQL statement on the MySQL instance backing +// this local cluster and returns the result. +func (db *LocalCluster) ExecuteFetch(sql string, dbname string) (*sqltypes.Result, error) { + params := db.mysql.Params(dbname) + conn, err := mysql.Connect(context.Background(), ¶ms) + if err != nil { + return nil, err + } + defer conn.Close() + + log.Infof("ExecuteFetch(%s): \"%s\"", dbname, sql) + rs, err := conn.ExecuteFetch(sql, -1, true) + return rs, err +} + // Query runs a SQL query on the MySQL instance backing this local cluster and returns // its result. This is provided for debug/introspection purposes; // normal cluster access should be performed through the Vitess GRPC interface. From 52defd63c0ef374063cd4e0ffa9e946b0257079b Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:03:39 +0200 Subject: [PATCH 021/233] Add release notes summary for views (#12422) * Add release notes summary for support views Signed-off-by: Florent Poinsard * add link to the documentation Signed-off-by: Florent Poinsard * simplify views release notes Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard --- doc/releasenotes/16_0_0_summary.md | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/doc/releasenotes/16_0_0_summary.md b/doc/releasenotes/16_0_0_summary.md index bc8ba3f9ed4..9725396b574 100644 --- a/doc/releasenotes/16_0_0_summary.md +++ b/doc/releasenotes/16_0_0_summary.md @@ -382,22 +382,12 @@ This will allow users to start a transaction with these characteristics. #### Support For Views -Vitess now supports views in sharded keyspace. Views are not created on the underlying database but are logically stored -in vschema. -Any query using a view will get re-written as a derived table during query planning. -VSchema Example - -```json -{ - "sharded": true, - "vindexes": {}, - "tables": {}, - "views": { - "view1": "select * from t1", - "view2": "select * from t2", - } -} -``` +Views sharded support is released as an experimental feature in `v16.0.0`. +Views are not enabled by default in your Vitess cluster, but they can be turned on using the `--enable-views` flag on VTGate, and `--queryserver-enable-views` flag on VTTablet. + +To read more on how views are implemented you can read the [Views Support RFC](https://github.com/vitessio/vitess/issues/11559). +And if you want to learn more on how to use views and its current limitations, you can read the [Views Documentation](https://vitess.io/docs/16.0/reference/compatibility/mysql-compatibility/#views). + ### VTOrc From 85289037cc17bbd0d65a6eb1007d4b9f12d007af Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Wed, 22 Feb 2023 10:14:53 -0500 Subject: [PATCH 022/233] Examples: Correct VTAdmin Discovery File Path And Add Check (#12415) * Examples: correct VTAdmin discovery file path and add check Signed-off-by: Matt Lord * Remove jq dependency Signed-off-by: Matt Lord * vtadmin examples scripts hardcode localhost Signed-off-by: Matt Lord * Fix errant expectation Signed-off-by: Matt Lord * Adjust healthy shard indicator Signed-off-by: Matt Lord --------- Signed-off-by: Matt Lord --- examples/common/lib/utils.sh | 9 +++++---- examples/common/scripts/vtadmin-up.sh | 20 +++++++++++++++++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/examples/common/lib/utils.sh b/examples/common/lib/utils.sh index ab13e9bc6c4..f38568ccdad 100644 --- a/examples/common/lib/utils.sh +++ b/examples/common/lib/utils.sh @@ -52,18 +52,19 @@ function wait_for_healthy_shard_primary() { fi keyspace=${1} shard=${2} - healthy_indicator="PRIMARY: Serving" + unhealthy_indicator='"primary_alias": null' wait_secs=180 for _ in $(seq 1 ${wait_secs}); do - if curl -s "http://$(vtctldclient GetTablets --keyspace "${keyspace}" --shard "${shard}" | grep -i 'primary' | awk '{print $5}')/debug/status_details" | grep -qi "${healthy_indicator}"; then + if ! vtctldclient --server=localhost:15999 GetShard "${keyspace}/${shard}" | grep -qi "${unhealthy_indicator}"; then break fi sleep 1 done; - curl -s "http://$(vtctldclient GetTablets --keyspace "${keyspace}" --shard "${shard}" | grep -i 'primary' | awk '{print $5}')/debug/status_details" | grep -qi "${healthy_indicator}" \ - || fail "Timed out after ${wait_secs} seconds waiting for a primary tablet to be elected and become healthy in ${keyspace}/${shard}" + if vtctldclient --server=localhost:15999 GetShard "${keyspace}/${shard}" | grep -qi "${unhealthy_indicator}"; then + fail "Timed out after ${wait_secs} seconds waiting for a primary tablet to be elected and become healthy in ${keyspace}/${shard}" + fi } # Wait for a specified number of the keyspace/shard's tablets to show up diff --git a/examples/common/scripts/vtadmin-up.sh b/examples/common/scripts/vtadmin-up.sh index 8f3caf39c15..179e5089b90 100755 --- a/examples/common/scripts/vtadmin-up.sh +++ b/examples/common/scripts/vtadmin-up.sh @@ -3,6 +3,7 @@ script_dir="$(dirname "${BASH_SOURCE[0]:-$0}")" source "${script_dir}/../env.sh" +cluster_name="local" log_dir="${VTDATAROOT}/tmp" web_dir="${script_dir}/../../../web/vtadmin" @@ -20,7 +21,7 @@ vtadmin \ --alsologtostderr \ --rbac \ --rbac-config="${script_dir}/../vtadmin/rbac.yaml" \ - --cluster "id=local,name=local,discovery=staticfile,discovery-staticfile-path=./vtadmin/discovery.json,tablet-fqdn-tmpl={{ .Tablet.Hostname }}:15{{ .Tablet.Alias.Uid }}" \ + --cluster "id=${cluster_name},name=${cluster_name},discovery=staticfile,discovery-staticfile-path=${script_dir}/../vtadmin/discovery.json,tablet-fqdn-tmpl={{ .Tablet.Hostname }}:15{{ .Tablet.Alias.Uid }}" \ > "${log_dir}/vtadmin-api.out" 2>&1 & vtadmin_api_pid=$! @@ -33,14 +34,27 @@ vtadmin-api is running! - PID: ${vtadmin_api_pid} " +# Wait for vtadmin to successfully discover the cluster +expected_cluster_result="{\"result\":{\"clusters\":[{\"id\":\"${cluster_name}\",\"name\":\"${cluster_name}\"}]},\"ok\":true}" +for _ in {0..300}; do + result=$(curl -s "http://localhost:${vtadmin_api_port}/api/clusters") + if [[ ${result} == "${expected_cluster_result}" ]]; then + break + fi + sleep 0.1 +done + +# Check one last time +[[ $(curl -s "http://localhost:${vtadmin_api_port}/api/clusters") == "${expected_cluster_result}" ]] || fail "vtadmin failed to discover the running example Vitess cluster." + # As a TODO, it'd be nice to make the assumption that vtadmin-web is already # installed and built (since we assume that `make` has already been run for # other Vitess components.) -npm --prefix $web_dir --silent install +npm --prefix "$web_dir" --silent install REACT_APP_VTADMIN_API_ADDRESS="http://localhost:${vtadmin_api_port}" \ REACT_APP_ENABLE_EXPERIMENTAL_TABLET_DEBUG_VARS="true" \ - npm run --prefix $web_dir build + npm run --prefix "$web_dir" build "${web_dir}/node_modules/.bin/serve" --no-clipboard -l $vtadmin_web_port -s "${web_dir}/build" \ > "${log_dir}/vtadmin-web.out" 2>&1 & From fa2c0a613ef1db8b7257aee8fd0c328902a45708 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Wed, 22 Feb 2023 11:30:53 -0500 Subject: [PATCH 023/233] VReplication: Use MariaDB Compat JSON Functions (#12420) This is needed to better support importing from MariaDB into Vitess/MySQL. Signed-off-by: Matt Lord --- go/vt/vttablet/tabletmanager/vdiff/engine_test.go | 2 +- go/vt/vttablet/tabletmanager/vdiff/schema.go | 2 +- go/vt/vttablet/tabletmanager/vreplication/vreplicator.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go index 3f525a95a58..cfb9651fb11 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go @@ -236,7 +236,7 @@ func TestEngineRetryErroredVDiffs(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - vdiffenv.dbClient.ExpectRequest("select * from _vt.vdiff where state = 'error' and options->>'$.core_options.auto_retry' = 'true'", tt.retryQueryResults, nil) + vdiffenv.dbClient.ExpectRequest("select * from _vt.vdiff where state = 'error' and json_unquote(json_extract(options, '$.core_options.auto_retry')) = 'true'", tt.retryQueryResults, nil) // Right now this only supports a single row as with multiple rows we have // multiple controllers in separate goroutines and the order is not diff --git a/go/vt/vttablet/tabletmanager/vdiff/schema.go b/go/vt/vttablet/tabletmanager/vdiff/schema.go index 96040c3fa07..6524ccdd0f2 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/schema.go +++ b/go/vt/vttablet/tabletmanager/vdiff/schema.go @@ -43,7 +43,7 @@ const ( where vd.id = vdt.vdiff_id and vd.id = %d and vd.state != 'completed'` sqlGetVReplicationEntry = "select * from _vt.vreplication %s" sqlGetVDiffsToRun = "select * from _vt.vdiff where state in ('started','pending')" // what VDiffs have not been stopped or completed - sqlGetVDiffsToRetry = "select * from _vt.vdiff where state = 'error' and options->>'$.core_options.auto_retry' = 'true'" + sqlGetVDiffsToRetry = "select * from _vt.vdiff where state = 'error' and json_unquote(json_extract(options, '$.core_options.auto_retry')) = 'true'" sqlGetVDiffID = "select id as id from _vt.vdiff where vdiff_uuid = %s" sqlGetAllVDiffs = "select * from _vt.vdiff order by id desc" sqlGetAllTableRows = "select table_name as table_name, table_rows as table_rows from INFORMATION_SCHEMA.TABLES where table_schema = %s and table_name in (%s)" diff --git a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go index ce05c7a6071..9dddb573e1d 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go @@ -88,8 +88,8 @@ const ( select pca.id from _vt.post_copy_action as pca inner join _vt.vreplication as vr on (pca.vrepl_id = vr.id) where pca.table_name=%a ) for update` - sqlGetPostCopyActionTaskByType = `select action->>'$.task' from _vt.post_copy_action where - action->>'$.type'=%a and vrepl_id=%a and table_name=%a` + sqlGetPostCopyActionTaskByType = `select json_unquote(json_extract(action, '$.task')) as task from _vt.post_copy_action where + json_unquote(json_extract(action, '$.type'))=%a and vrepl_id=%a and table_name=%a` sqlDeletePostCopyAction = `delete from _vt.post_copy_action where vrepl_id=%a and table_name=%a and id=%a` ) From 79014d3104dd6f07879a1a0060761d9ec2c4d3d0 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Thu, 23 Feb 2023 04:33:34 +0200 Subject: [PATCH 024/233] Change `GetSchema` RPC to return `CreateView` instead of `SelectStmt` (#12421) * Changed getSchemaRPC to return CreateView instead of SelectStmt Signed-off-by: Florent Poinsard * test: fix expectation Signed-off-by: Harshit Gangal --------- Signed-off-by: Florent Poinsard Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- go/mysql/schema.go | 12 +++++------- go/vt/sidecardb/schema/misc/views.sql | 1 - go/vt/vtgate/schema/tracker.go | 6 +++--- go/vt/vtgate/schema/tracker_test.go | 12 ++++++------ go/vt/vttablet/endtoend/views_test.go | 10 +++++----- go/vt/vttablet/tabletserver/query_executor.go | 1 - 6 files changed, 19 insertions(+), 23 deletions(-) diff --git a/go/mysql/schema.go b/go/mysql/schema.go index 4221386c674..6cb020819b0 100644 --- a/go/mysql/schema.go +++ b/go/mysql/schema.go @@ -85,17 +85,15 @@ order by table_name, ordinal_position` InsertIntoViewsTable = `insert into _vt.views ( table_schema, table_name, - view_definition, - create_statement) values (database(), :table_name, :view_definition, :create_statement)` + create_statement) values (database(), :table_name, :create_statement)` ReplaceIntoViewsTable = `replace into _vt.views ( table_schema, table_name, - view_definition, - create_statement) values (database(), :table_name, :view_definition, :create_statement)` + create_statement) values (database(), :table_name, :create_statement)` UpdateViewsTable = `update _vt.views - set view_definition = :view_definition, create_statement = :create_statement + set create_statement = :create_statement where table_schema = database() and table_name = :table_name` DeleteFromViewsTable = `delete from _vt.views where table_schema = database() and table_name in ::table_name` @@ -105,10 +103,10 @@ order by table_name, ordinal_position` SelectAllViews = `select table_name, updated_at from _vt.views where table_schema = database()` // FetchUpdatedViews queries fetches information about updated views - FetchUpdatedViews = `select table_name, view_definition, create_statement from _vt.views where table_schema = database() and table_name in ::viewnames` + FetchUpdatedViews = `select table_name, create_statement from _vt.views where table_schema = database() and table_name in ::viewnames` // FetchViews queries fetches all views - FetchViews = `select table_name, view_definition, create_statement from _vt.views where table_schema = database()` + FetchViews = `select table_name, create_statement from _vt.views where table_schema = database()` ) // BaseShowTablesFields contains the fields returned by a BaseShowTables or a BaseShowTablesForTable command. diff --git a/go/vt/sidecardb/schema/misc/views.sql b/go/vt/sidecardb/schema/misc/views.sql index bc14b13e74f..b70d9bb41df 100644 --- a/go/vt/sidecardb/schema/misc/views.sql +++ b/go/vt/sidecardb/schema/misc/views.sql @@ -18,7 +18,6 @@ CREATE TABLE IF NOT EXISTS _vt.views ( TABLE_SCHEMA varchar(64) NOT NULL, TABLE_NAME varchar(64) NOT NULL, - VIEW_DEFINITION longtext NOT NULL, CREATE_STATEMENT longtext NOT NULL, UPDATED_AT TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (TABLE_SCHEMA, TABLE_NAME) diff --git a/go/vt/vtgate/schema/tracker.go b/go/vt/vtgate/schema/tracker.go index df7a107ed80..98f1211e39b 100644 --- a/go/vt/vtgate/schema/tracker.go +++ b/go/vt/vtgate/schema/tracker.go @@ -401,12 +401,12 @@ func (vm *viewMap) set(ks, tbl, sql string) { log.Warningf("ignoring view '%s', parsing error in view definition: '%s'", tbl, sql) return } - sel, ok := stmt.(sqlparser.SelectStatement) + cv, ok := stmt.(*sqlparser.CreateView) if !ok { - log.Warningf("ignoring view '%s', view definition is not a select query: %T", tbl, stmt) + log.Warningf("ignoring view '%s', view definition is not a create view query: %T", tbl, stmt) return } - m[tbl] = sel + m[tbl] = cv.Select } func (vm *viewMap) get(ks, tbl string) sqlparser.SelectStatement { diff --git a/go/vt/vtgate/schema/tracker_test.go b/go/vt/vtgate/schema/tracker_test.go index 11cbaffab5b..5298f62b73f 100644 --- a/go/vt/vtgate/schema/tracker_test.go +++ b/go/vt/vtgate/schema/tracker_test.go @@ -315,14 +315,14 @@ func TestViewsTracking(t *testing.T) { tablet := &topodatapb.Tablet{Keyspace: target.Keyspace, Shard: target.Shard, Type: target.TabletType} schemaDefResult := []map[string]string{{ - "prior": "select 1 from tbl", // create view prior as select 1 from tbl" - "t1": "select 1 from tbl1", // create view t1 as select 1 from tbl1", - "t2": "select 1 from tbl2", // create view t2 as select 1 from tbl2", + "prior": "create view prior as select 1 from tbl", + "t1": "create view t1 as select 1 from tbl1", + "t2": "create view t2 as select 1 from tbl2", }, { - "t2": "select 1,2 from tbl2", // create view t2 as select 1,2 from tbl2", - "t3": "select 1 from tbl3", // create view t3 as select 1 from tbl3", + "t2": "create view t2 as select 1,2 from tbl2", + "t3": "create view t3 as select 1 from tbl3", }, { - "t4": "select 1 from tbl4", // create view t4 as select 1 from tbl4" + "t4": "create view t4 as select 1 from tbl4", }} testcases := []struct { diff --git a/go/vt/vttablet/endtoend/views_test.go b/go/vt/vttablet/endtoend/views_test.go index ab9d519ae7e..1cc9c449119 100644 --- a/go/vt/vttablet/endtoend/views_test.go +++ b/go/vt/vttablet/endtoend/views_test.go @@ -30,7 +30,7 @@ import ( vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) -var qSelAllRows = "select table_schema, table_name, view_definition, create_statement from _vt.views" +var qSelAllRows = "select table_schema, table_name, create_statement from _vt.views" var qDelAllRows = "delete from _vt.views" // Test will validate create view ddls. @@ -51,7 +51,7 @@ func TestCreateViewDDL(t *testing.T) { qr, err := client.Execute(qSelAllRows, nil) require.NoError(t, err) require.Equal(t, - `[[VARCHAR("vttest") VARCHAR("vitess_view") TEXT("select * from vitess_a") TEXT("create view vitess_view as select * from vitess_a")]]`, + `[[VARCHAR("vttest") VARCHAR("vitess_view") TEXT("create view vitess_view as select * from vitess_a")]]`, fmt.Sprintf("%v", qr.Rows)) // view already exists. This should fail. @@ -66,7 +66,7 @@ func TestCreateViewDDL(t *testing.T) { qr, err = client.Execute(qSelAllRows, nil) require.NoError(t, err) require.Equal(t, - `[[VARCHAR("vttest") VARCHAR("vitess_view") TEXT("select id, foo from vitess_a") TEXT("create or replace view vitess_view as select id, foo from vitess_a")]]`, + `[[VARCHAR("vttest") VARCHAR("vitess_view") TEXT("create or replace view vitess_view as select id, foo from vitess_a")]]`, fmt.Sprintf("%v", qr.Rows)) } @@ -97,7 +97,7 @@ func TestAlterViewDDL(t *testing.T) { qr, err := client.Execute(qSelAllRows, nil) require.NoError(t, err) require.Equal(t, - `[[VARCHAR("vttest") VARCHAR("vitess_view") TEXT("select id, foo from vitess_a") TEXT("create view vitess_view as select id, foo from vitess_a")]]`, + `[[VARCHAR("vttest") VARCHAR("vitess_view") TEXT("create view vitess_view as select id, foo from vitess_a")]]`, fmt.Sprintf("%v", qr.Rows)) } @@ -173,5 +173,5 @@ func TestGetSchemaRPC(t *testing.T) { viewSchemaDef, err = client.GetSchema(querypb.SchemaTableType_VIEWS) require.NoError(t, err) - require.Equal(t, viewSchemaDef["vitess_view"], "select 1 from vitess_a") + require.Equal(t, "create view vitess_view as select 1 from vitess_a", viewSchemaDef["vitess_view"]) } diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index b7b198f7f87..d20bf62b102 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -1230,7 +1230,6 @@ func (qre *QueryExecutor) recordUserQuery(queryType string, duration int64) { func generateBindVarsForViewDDLInsert(createView *sqlparser.CreateView) map[string]*querypb.BindVariable { bindVars := make(map[string]*querypb.BindVariable) bindVars["table_name"] = sqltypes.StringBindVariable(createView.ViewName.Name.String()) - bindVars["view_definition"] = sqltypes.StringBindVariable(sqlparser.String(createView.Select)) bindVars["create_statement"] = sqltypes.StringBindVariable(sqlparser.String(createView)) return bindVars } From 91fe415aeb4a2e2d3edaad3034f4f1ed4e421c1d Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 23 Feb 2023 11:27:57 +0530 Subject: [PATCH 025/233] Create Views allowed for same keyspace (#12409) * restrict views to single keyspace Signed-off-by: Harshit Gangal * feat: also create/alter and drop views on MySQL for information-schema-support Signed-off-by: Manan Gupta * feat: do the DMLs for alter and create of view in a transaction so that they can be rolled back in case of MySQL failure Signed-off-by: Manan Gupta * ignore view changes by schema tracker in vttablet when views are enabled Signed-off-by: Harshit Gangal * test: fix test expectation Signed-off-by: Harshit Gangal * Correct syntax error in defer func of E2E test Signed-off-by: Florent Poinsard --------- Signed-off-by: Harshit Gangal Signed-off-by: Manan Gupta Signed-off-by: Florent Poinsard Co-authored-by: Manan Gupta Co-authored-by: Florent Poinsard --- go/mysql/schema.go | 20 ++++- go/vt/vtgate/planbuilder/ddl.go | 24 ++--- .../testdata/unsupported_cases.json | 2 +- .../planbuilder/testdata/view_cases.json | 18 +--- go/vt/vttablet/endtoend/views_test.go | 88 +++++++++++++++++-- .../vttablet/tabletserver/health_streamer.go | 19 +++- .../tabletserver/health_streamer_test.go | 3 +- go/vt/vttablet/tabletserver/query_executor.go | 80 +++++++---------- 8 files changed, 163 insertions(+), 91 deletions(-) diff --git a/go/mysql/schema.go b/go/mysql/schema.go index 6cb020819b0..1b3f50b31cd 100644 --- a/go/mysql/schema.go +++ b/go/mysql/schema.go @@ -46,7 +46,25 @@ FROM ( UNION ALL SELECT table_name, column_name, ordinal_position, character_set_name, collation_name, data_type, column_key - FROM _vt.schemacopy c + FROM _vt.schemacopy + WHERE table_schema = database() +) _inner +GROUP BY table_name, column_name, ordinal_position, character_set_name, collation_name, data_type, column_key +HAVING COUNT(*) = 1 +` + + // DetectSchemaChangeOnlyBaseTable query detects if there is any schema change from previous copy excluding view tables. + DetectSchemaChangeOnlyBaseTable = ` +SELECT DISTINCT table_name +FROM ( + SELECT table_name, column_name, ordinal_position, character_set_name, collation_name, data_type, column_key + FROM information_schema.columns + WHERE table_schema = database() and table_name in (select table_name from information_schema.tables where table_schema = database() and table_type = 'BASE TABLE') + + UNION ALL + + SELECT table_name, column_name, ordinal_position, character_set_name, collation_name, data_type, column_key + FROM _vt.schemacopy WHERE table_schema = database() ) _inner GROUP BY table_name, column_name, ordinal_position, character_set_name, collation_name, data_type, column_key diff --git a/go/vt/vtgate/planbuilder/ddl.go b/go/vt/vtgate/planbuilder/ddl.go index 3774d373b7c..797f3a2e52c 100644 --- a/go/vt/vtgate/planbuilder/ddl.go +++ b/go/vt/vtgate/planbuilder/ddl.go @@ -208,19 +208,20 @@ func buildAlterView(vschema plancontext.VSchema, ddl *sqlparser.AlterView, reser if err != nil { return nil, nil, err } + selPlanKs := selectPlan.primitive.GetKeyspaceName() + if keyspace.Name != selPlanKs { + return nil, nil, vterrors.VT12001(ViewDifferentKeyspace) + } if vschema.IsViewsEnabled() { if keyspace == nil { return nil, nil, vterrors.VT09005() } return destination, keyspace, nil } - isRoutePlan, keyspaceName, opCode := tryToGetRoutePlan(selectPlan.primitive) + isRoutePlan, opCode := tryToGetRoutePlan(selectPlan.primitive) if !isRoutePlan { return nil, nil, vterrors.VT12001(ViewComplex) } - if keyspace.Name != keyspaceName { - return nil, nil, vterrors.VT12001(ViewDifferentKeyspace) - } if opCode != engine.Unsharded && opCode != engine.EqualUnique && opCode != engine.Scatter { return nil, nil, vterrors.VT12001(ViewComplex) } @@ -249,19 +250,20 @@ func buildCreateView(vschema plancontext.VSchema, ddl *sqlparser.CreateView, res if err != nil { return nil, nil, err } + selPlanKs := selectPlan.primitive.GetKeyspaceName() + if keyspace.Name != selPlanKs { + return nil, nil, vterrors.VT12001(ViewDifferentKeyspace) + } if vschema.IsViewsEnabled() { if keyspace == nil { return nil, nil, vterrors.VT09005() } return destination, keyspace, nil } - isRoutePlan, keyspaceName, opCode := tryToGetRoutePlan(selectPlan.primitive) + isRoutePlan, opCode := tryToGetRoutePlan(selectPlan.primitive) if !isRoutePlan { return nil, nil, vterrors.VT12001(ViewComplex) } - if keyspace.Name != keyspaceName { - return nil, nil, vterrors.VT12001(ViewDifferentKeyspace) - } if opCode != engine.Unsharded && opCode != engine.EqualUnique && opCode != engine.Scatter { return nil, nil, vterrors.VT12001(ViewComplex) } @@ -403,13 +405,13 @@ func buildRenameTable(vschema plancontext.VSchema, renameTable *sqlparser.Rename return destination, keyspace, nil } -func tryToGetRoutePlan(selectPlan engine.Primitive) (valid bool, keyspaceName string, opCode engine.Opcode) { +func tryToGetRoutePlan(selectPlan engine.Primitive) (valid bool, opCode engine.Opcode) { switch plan := selectPlan.(type) { case *engine.Route: - return true, plan.Keyspace.Name, plan.Opcode + return true, plan.Opcode case engine.Gen4Comparer: return tryToGetRoutePlan(plan.GetGen4Primitive()) default: - return false, "", engine.Opcode(0) + return false, engine.Opcode(0) } } diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json index 4426037bdde..5a2c92451d4 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json @@ -388,7 +388,7 @@ { "comment": "create view with top level subquery in select", "query": "create view user.view_a as select a, (select col from user) from unsharded", - "plan": "VT12001: unsupported: Complex select queries are not supported in create or alter view statements" + "plan": "VT12001: unsupported: Select query does not belong to the same keyspace as the view statement" }, { "comment": "create view with sql_calc_found_rows with limit", diff --git a/go/vt/vtgate/planbuilder/testdata/view_cases.json b/go/vt/vtgate/planbuilder/testdata/view_cases.json index 3ec1120422c..5b5e76fe9ed 100644 --- a/go/vt/vtgate/planbuilder/testdata/view_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/view_cases.json @@ -19,23 +19,9 @@ } }, { - "comment": "create view", + "comment": "create view with different keyspaces", "query": "create view user.view_a as (select id from unsharded union select id from unsharded_auto) union (select id from unsharded_auto union select name from unsharded)", - "plan": { - "QueryType": "DDL", - "Original": "create view user.view_a as (select id from unsharded union select id from unsharded_auto) union (select id from unsharded_auto union select name from unsharded)", - "Instructions": { - "OperatorType": "DDL", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "Query": "create view view_a as select id from unsharded union select id from unsharded_auto union select id from unsharded_auto union select `name` from unsharded" - }, - "TablesUsed": [ - "user.view_a" - ] - } + "plan": "VT12001: unsupported: Select query does not belong to the same keyspace as the view statement" }, { "comment": "create view with authoritative columns", diff --git a/go/vt/vttablet/endtoend/views_test.go b/go/vt/vttablet/endtoend/views_test.go index 1cc9c449119..8295eafbb6a 100644 --- a/go/vt/vttablet/endtoend/views_test.go +++ b/go/vt/vttablet/endtoend/views_test.go @@ -31,7 +31,6 @@ import ( ) var qSelAllRows = "select table_schema, table_name, create_statement from _vt.views" -var qDelAllRows = "delete from _vt.views" // Test will validate create view ddls. func TestCreateViewDDL(t *testing.T) { @@ -42,7 +41,7 @@ func TestCreateViewDDL(t *testing.T) { &vtrpcpb.CallerID{}, &querypb.VTGateCallerID{Username: "dev"})) - defer client.Execute(qDelAllRows, nil) + defer client.Execute("drop view vitess_view", nil) _, err := client.Execute("create view vitess_view as select * from vitess_a", nil) require.NoError(t, err) @@ -56,7 +55,7 @@ func TestCreateViewDDL(t *testing.T) { // view already exists. This should fail. _, err = client.Execute("create view vitess_view as select * from vitess_a", nil) - require.ErrorContains(t, err, "View 'vitess_view' already exists") + require.ErrorContains(t, err, "'vitess_view' already exists") // view already exists, but create or replace syntax should allow it to replace the view. _, err = client.Execute("create or replace view vitess_view as select id, foo from vitess_a", nil) @@ -79,11 +78,11 @@ func TestAlterViewDDL(t *testing.T) { &vtrpcpb.CallerID{}, &querypb.VTGateCallerID{Username: "dev"})) - defer client.Execute(qDelAllRows, nil) + defer client.Execute("drop view vitess_view", nil) // view does not exist, should FAIL _, err := client.Execute("alter view vitess_view as select * from vitess_a", nil) - require.ErrorContains(t, err, "View 'vitess_view' does not exist") + require.ErrorContains(t, err, "Table 'vitess_view' does not exist") // create a view. _, err = client.Execute("create view vitess_view as select * from vitess_a", nil) @@ -110,11 +109,11 @@ func TestDropViewDDL(t *testing.T) { &vtrpcpb.CallerID{}, &querypb.VTGateCallerID{Username: "dev"})) - defer client.Execute(qDelAllRows, nil) + defer client.Execute("drop view vitess_view", nil) // view does not exist, should FAIL _, err := client.Execute("drop view vitess_view", nil) - require.ErrorContains(t, err, "Unknown view 'vitess_view'") + require.ErrorContains(t, err, "Unknown table 'vttest.vitess_view'") // view does not exist, using if exists clause, should PASS _, err = client.Execute("drop view if exists vitess_view", nil) @@ -132,7 +131,7 @@ func TestDropViewDDL(t *testing.T) { // drop three views, only vitess_view2 exists. This should FAIL but drops the existing view. _, err = client.Execute("drop view vitess_view1, vitess_view2, vitess_view3", nil) - require.ErrorContains(t, err, "Unknown view 'vitess_view1,vitess_view3'") + require.ErrorContains(t, err, "Unknown table 'vttest.vitess_view1,vttest.vitess_view3'") // validate ZERO rows in _vt.views. qr, err := client.Execute(qSelAllRows, nil) @@ -153,6 +152,77 @@ func TestDropViewDDL(t *testing.T) { require.Zero(t, qr.Rows) } +// TestViewDDLWithInfrSchema will validate information schema queries with views. +func TestViewDDLWithInfrSchema(t *testing.T) { + client := framework.NewClient() + + client.UpdateContext(callerid.NewContext( + context.Background(), + &vtrpcpb.CallerID{}, + &querypb.VTGateCallerID{Username: "dev"})) + + defer client.Execute("drop view vitess_view", nil) + + _, err := client.Execute("create view vitess_view as select * from vitess_a", nil) + require.NoError(t, err) + + // show create view. + qr, err := client.Execute("show create table vitess_view", nil) + require.NoError(t, err) + require.Equal(t, + "[[VARCHAR(\"vitess_view\") VARCHAR(\"CREATE ALGORITHM=UNDEFINED DEFINER=`vt_dba`@`localhost` SQL SECURITY DEFINER VIEW `vitess_view` AS select `vitess_a`.`eid` AS `eid`,`vitess_a`.`id` AS `id`,`vitess_a`.`name` AS `name`,`vitess_a`.`foo` AS `foo` from `vitess_a`\") VARCHAR(\"utf8mb4\") VARCHAR(\"utf8mb4_general_ci\")]]", + fmt.Sprintf("%v", qr.Rows)) + + // show create view. + qr, err = client.Execute("describe vitess_view", nil) + require.NoError(t, err) + require.Equal(t, + "[[VARCHAR(\"eid\") BLOB(\"bigint\") VARCHAR(\"NO\") BINARY(\"\") BLOB(\"0\") VARCHAR(\"\")] [VARCHAR(\"id\") BLOB(\"int\") VARCHAR(\"NO\") BINARY(\"\") BLOB(\"1\") VARCHAR(\"\")] [VARCHAR(\"name\") BLOB(\"varchar(128)\") VARCHAR(\"YES\") BINARY(\"\") NULL VARCHAR(\"\")] [VARCHAR(\"foo\") BLOB(\"varbinary(128)\") VARCHAR(\"YES\") BINARY(\"\") NULL VARCHAR(\"\")]]", + fmt.Sprintf("%v", qr.Rows)) + + // information schema. + qr, err = client.Execute("select table_type from information_schema.tables where table_schema = database() and table_name = 'vitess_view'", nil) + require.NoError(t, err) + require.Equal(t, + "[[BINARY(\"VIEW\")]]", + fmt.Sprintf("%v", qr.Rows)) +} + +// TestViewAndTableUnique will validate that views and tables should have unique names. +func TestViewAndTableUnique(t *testing.T) { + client := framework.NewClient() + + client.UpdateContext(callerid.NewContext( + context.Background(), + &vtrpcpb.CallerID{}, + &querypb.VTGateCallerID{Username: "dev"})) + + defer func() { + _, _ = client.Execute("drop view if exists vitess_view", nil) + _, _ = client.Execute("drop table if exists vitess_view", nil) + }() + + // create a view. + _, err := client.Execute("create view vitess_view as select * from vitess_a", nil) + require.NoError(t, err) + + // should error on create table as view already exists with same name. + _, err = client.Execute("create table vitess_view(id bigint primary key)", nil) + require.ErrorContains(t, err, "Table 'vitess_view' already exists") + + // drop the view + _, err = client.Execute("drop view vitess_view", nil) + require.NoError(t, err) + + // create the table first. + _, err = client.Execute("create table vitess_view(id bigint primary key)", nil) + require.NoError(t, err) + + // create view should fail as table already exists with same name. + _, err = client.Execute("create view vitess_view as select * from vitess_a", nil) + require.ErrorContains(t, err, "Table 'vitess_view' already exists") +} + // TestGetSchemaRPC will validate GetSchema rpc.. func TestGetSchemaRPC(t *testing.T) { client := framework.NewClient() @@ -166,7 +236,7 @@ func TestGetSchemaRPC(t *testing.T) { &vtrpcpb.CallerID{}, &querypb.VTGateCallerID{Username: "dev"})) - defer client.Execute(qDelAllRows, nil) + defer client.Execute("drop view vitess_view", nil) _, err = client.Execute("create view vitess_view as select 1 from vitess_a", nil) require.NoError(t, err) diff --git a/go/vt/vttablet/tabletserver/health_streamer.go b/go/vt/vttablet/tabletserver/health_streamer.go index 436942beaca..aed37f338c6 100644 --- a/go/vt/vttablet/tabletserver/health_streamer.go +++ b/go/vt/vttablet/tabletserver/health_streamer.go @@ -89,7 +89,8 @@ type healthStreamer struct { conns *connpool.Pool signalWhenSchemaChange bool - views map[string]string + viewsEnabled bool + views map[string]string } func newHealthStreamer(env tabletenv.Env, alias *topodatapb.TabletAlias) *healthStreamer { @@ -122,6 +123,7 @@ func newHealthStreamer(env tabletenv.Env, alias *topodatapb.TabletAlias) *health ticks: newTimer, conns: pool, signalWhenSchemaChange: env.Config().SignalWhenSchemaChange, + viewsEnabled: env.Config().EnableViews, views: map[string]string{}, } } @@ -338,7 +340,7 @@ func (hs *healthStreamer) reload() error { } defer conn.Recycle() - tables, err := getChangedTableNames(ctx, conn) + tables, err := hs.getChangedTableNames(ctx, conn) if err != nil { return err } @@ -363,7 +365,7 @@ func (hs *healthStreamer) reload() error { return nil } -func getChangedTableNames(ctx context.Context, conn *connpool.DBConn) ([]string, error) { +func (hs *healthStreamer) getChangedTableNames(ctx context.Context, conn *connpool.DBConn) ([]string, error) { var tables []string var tableNames []string @@ -380,7 +382,13 @@ func getChangedTableNames(ctx context.Context, conn *connpool.DBConn) ([]string, } alloc := func() *sqltypes.Result { return &sqltypes.Result{} } bufferSize := 1000 - err := conn.Stream(ctx, mysql.DetectSchemaChange, callback, alloc, bufferSize, 0) + + schemaChangeQuery := mysql.DetectSchemaChange + // If views are enabled, then views are tracked/handled separately and schema change does not need to track them. + if hs.viewsEnabled { + schemaChangeQuery = mysql.DetectSchemaChangeOnlyBaseTable + } + err := conn.Stream(ctx, schemaChangeQuery, callback, alloc, bufferSize, 0) if err != nil { return nil, err } @@ -419,6 +427,9 @@ func getChangedTableNames(ctx context.Context, conn *connpool.DBConn) ([]string, } func (hs *healthStreamer) getChangedViewNames(ctx context.Context, conn *connpool.DBConn) ([]string, error) { + if !hs.viewsEnabled { + return nil, nil + } var changedViews []string views := map[string]string{} diff --git a/go/vt/vttablet/tabletserver/health_streamer_test.go b/go/vt/vttablet/tabletserver/health_streamer_test.go index c1a36f938e0..73733ce8e74 100644 --- a/go/vt/vttablet/tabletserver/health_streamer_test.go +++ b/go/vt/vttablet/tabletserver/health_streamer_test.go @@ -336,6 +336,7 @@ func TestReloadView(t *testing.T) { defer db.Close() config := newConfig(db) config.SignalSchemaChangeReloadIntervalSeconds.Set(100 * time.Millisecond) + config.EnableViews = true env := tabletenv.NewEnv(config, "TestReloadView") alias := &topodatapb.TabletAlias{Cell: "cell", Uid: 1} @@ -344,7 +345,7 @@ func TestReloadView(t *testing.T) { target := &querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} configs := config.DB - db.AddQuery(mysql.DetectSchemaChange, &sqltypes.Result{}) + db.AddQuery(mysql.DetectSchemaChangeOnlyBaseTable, &sqltypes.Result{}) db.AddQuery(mysql.SelectAllViews, &sqltypes.Result{}) hs.InitDBConfig(target, configs.DbaWithDB()) diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index d20bf62b102..ee02901993d 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -184,7 +184,12 @@ func (qre *QueryExecutor) Execute() (reply *sqltypes.Result, err error) { case p.PlanInsert, p.PlanUpdate, p.PlanDelete, p.PlanInsertMessage, p.PlanDDL, p.PlanLoad: return qre.execAutocommit(qre.txConnExec) case p.PlanViewDDL: - return qre.execAutocommit(qre.execViewDDL) + switch qre.plan.FullStmt.(type) { + case *sqlparser.DropView: + return qre.execAutocommit(qre.execDropViewDDL) + default: + return qre.execAsTransaction(qre.execViewDDL) + } case p.PlanUpdateLimit, p.PlanDeleteLimit: return qre.execAsTransaction(qre.txConnExec) case p.PlanCallProc: @@ -293,15 +298,28 @@ func (qre *QueryExecutor) txConnExec(conn *StatefulConnection) (*sqltypes.Result } func (qre *QueryExecutor) execViewDDL(conn *StatefulConnection) (*sqltypes.Result, error) { + var err error switch stmt := qre.plan.FullStmt.(type) { case *sqlparser.CreateView: - return qre.execCreateViewDDL(conn, stmt) + _, err = qre.execCreateViewDDL(conn, stmt) case *sqlparser.AlterView: - return qre.execAlterViewDDL(conn, stmt) - case *sqlparser.DropView: - return qre.execDropViewDDL(conn, stmt) + _, err = qre.execAlterViewDDL(conn, stmt) + default: + err = vterrors.Errorf(vtrpcpb.Code_INTERNAL, "BUG: unexpected view DDL type: %T", qre.plan.FullStmt) + } + if err != nil { + return nil, err + } + // We need to use a different connection for executing the DDL on MySQL + // because the previous DMLs are running in a transaction and we don't want to autocommit + // those changes. + ddlConn, err := qre.getConn() + if err != nil { + return nil, err } - return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "BUG: unexpected view DDL type: %T", qre.plan.FullStmt) + defer ddlConn.Recycle() + // If MySQL fails, then we will Rollback the changes. + return ddlConn.Exec(qre.ctx, sqlparser.String(qre.plan.FullStmt), 1000, true) } func (qre *QueryExecutor) execCreateViewDDL(conn *StatefulConnection, stmt *sqlparser.CreateView) (*sqltypes.Result, error) { @@ -316,7 +334,7 @@ func (qre *QueryExecutor) execCreateViewDDL(conn *StatefulConnection, stmt *sqlp // If it is a MySQL error and its code is of duplicate entry, // then we would return duplicate create view error. if isSQLErr && sqlErr.Number() == mysql.ERDupEntry { - return nil, vterrors.Errorf(vtrpcpb.Code_ALREADY_EXISTS, "View '%s' already exists", stmt.ViewName.Name.String()) + return nil, vterrors.Errorf(vtrpcpb.Code_ALREADY_EXISTS, "Table '%s' already exists", stmt.ViewName.Name.String()) } return nil, err } @@ -344,13 +362,14 @@ func (qre *QueryExecutor) execAlterViewDDL(conn *StatefulConnection, stmt *sqlpa return nil, err } if qr.RowsAffected == 0 { - return nil, vterrors.Errorf(vtrpcpb.Code_NOT_FOUND, "View '%s' does not exist", stmt.ViewName.Name.String()) + return nil, vterrors.Errorf(vtrpcpb.Code_NOT_FOUND, "Table '%s' does not exist", stmt.ViewName.Name.String()) } return qr, nil } -func (qre *QueryExecutor) execDropViewDDL(conn *StatefulConnection, stmt *sqlparser.DropView) (*sqltypes.Result, error) { +func (qre *QueryExecutor) execDropViewDDL(conn *StatefulConnection) (*sqltypes.Result, error) { viewsMap := make(map[string]int) + stmt := qre.plan.FullStmt.(*sqlparser.DropView) var viewNames []string for pos, view := range stmt.FromTables { viewName := view.Name.String() @@ -368,58 +387,23 @@ func (qre *QueryExecutor) execDropViewDDL(conn *StatefulConnection, stmt *sqlpar "table_name": viewNamesBV, } - existErr := qre.checkViewExists(conn, stmt, bindVars, viewsMap, viewNames) - sql, _, err := qre.generateFinalSQL(qre.plan.FullQuery, bindVars) if err != nil { return nil, err } - qr, err := execWithDDLView(qre.ctx, conn, sql) + _, err = execWithDDLView(qre.ctx, conn, sql) if err != nil { return nil, err } - if existErr != nil { - return nil, existErr - } - return qr, nil + + // Drop the view on MySQL too. + return conn.Exec(qre.ctx, sqlparser.String(qre.plan.FullStmt), 1000, true) } func execWithDDLView(ctx context.Context, conn *StatefulConnection, sql string) (*sqltypes.Result, error) { return conn.Exec(ctx, sql, 10000, true) } -func (qre *QueryExecutor) checkViewExists(conn *StatefulConnection, stmt *sqlparser.DropView, bindVars map[string]*querypb.BindVariable, viewsMap map[string]int, viewNames []string) error { - if stmt.IfExists { - return nil - } - // run the select to know which views exist. - sel, err := sqlparser.Parse(mysql.SelectFromViewsTable) - if err != nil { - return err - } - sql, _, err := qre.generateFinalSQL(p.GenerateFullQuery(sel), bindVars) - if err != nil { - return err - } - - qr, err := execWithDDLView(qre.ctx, conn, sql) - if err != nil { - return err - } - if len(qr.Rows) != len(viewNames) { - // If the number of rows returned by the select is not equal to the number of views - // that we are trying to drop, then we would return the error. - for _, row := range qr.Rows { - viewName := row[0].ToString() - if pos, exists := viewsMap[viewName]; exists { - viewNames = append(viewNames[:pos], viewNames[pos+1:]...) - } - } - return vterrors.Errorf(vtrpcpb.Code_NOT_FOUND, "Unknown view '%s'", strings.Join(viewNames, ",")) - } - return nil -} - // Stream performs a streaming query execution. func (qre *QueryExecutor) Stream(callback StreamCallback) error { qre.logStats.PlanType = qre.plan.PlanID.String() From 753a6916ce10a5cc2f2875b3e8636daf66dba407 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Thu, 23 Feb 2023 12:34:19 +0200 Subject: [PATCH 026/233] Backport to v16: onlineddl_vrepl flakiness and subsequent fixes (#12426) * TableFilter: fix excluded RE listing Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * extract GCTableNameExpression Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * VReplication: exclude GC tables when reading schema Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * wrap schema analyzis errors for better tracability Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * resolve conflict Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * (re)Formalize SQLError in VReplication, add underlying wrap/unwrap functionality Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * update test to match new UnwrapAll() behavior Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * do not unwrap Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Online DDL: use LastError for retrying vreplication streams Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * differentiate between a temrinally failed workflow and one which 'has error' and can be retried Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * wording Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * simplified hasError() Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * more onlineddl_vrepl tests; use dynamic throttler config; fix wait for vreplication status Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --------- Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/mysql/sql_error_test.go | 16 ++ .../onlineddl/vrepl/onlineddl_vrepl_test.go | 144 ++++++++++++++++-- go/test/endtoend/onlineddl/vtctlutil.go | 30 ++++ go/test/endtoend/onlineddl/vttablet_util.go | 24 ++- .../throttler_topo/throttler_test.go | 44 +----- go/vt/vterrors/errors_test.go | 65 ++++++++ go/vt/vterrors/last_error.go | 92 +++++++++++ go/vt/vterrors/last_error_test.go | 86 +++++++++++ go/vt/vterrors/vterrors.go | 21 +++ go/vt/vttablet/onlineddl/executor.go | 99 +++++++----- go/vt/vttablet/onlineddl/vrepl.go | 13 +- .../tabletmanager/vreplication/controller.go | 20 +-- .../tabletmanager/vreplication/last_error.go | 79 ---------- .../vreplication/last_error_test.go | 55 ------- .../tabletmanager/vreplication/utils.go | 5 +- .../tabletmanager/vreplication/vcopier.go | 14 +- 16 files changed, 548 insertions(+), 259 deletions(-) create mode 100644 go/vt/vterrors/last_error.go create mode 100644 go/vt/vterrors/last_error_test.go delete mode 100644 go/vt/vttablet/tabletmanager/vreplication/last_error.go delete mode 100644 go/vt/vttablet/tabletmanager/vreplication/last_error_test.go diff --git a/go/mysql/sql_error_test.go b/go/mysql/sql_error_test.go index c6fe2f65251..0b29735e758 100644 --- a/go/mysql/sql_error_test.go +++ b/go/mysql/sql_error_test.go @@ -17,6 +17,7 @@ limitations under the License. package mysql import ( + "fmt" "testing" "vitess.io/vitess/go/vt/proto/vtrpc" @@ -151,6 +152,21 @@ func TestNewSQLErrorFromError(t *testing.T) { num: ERNoDb, ss: SSNoDB, }, + { + err: fmt.Errorf("just some random text here"), + num: ERUnknownError, + ss: SSUnknownSQLState, + }, + { + err: fmt.Errorf("task error: Column 'val' cannot be null (errno 1048) (sqlstate 23000) during query: insert into _edf4846d_ab65_11ed_abb1_0a43f95f28a3_20230213061619_vrepl(id,val,ts) values (1,2,'2023-02-13 04:46:16'), (2,3,'2023-02-13 04:46:16'), (3,null,'2023-02-13 04:46:16')"), + num: ERBadNullError, + ss: SSConstraintViolation, + }, + { + err: vterrors.Wrapf(fmt.Errorf("Column 'val' cannot be null (errno 1048) (sqlstate 23000) during query: insert into _edf4846d_ab65_11ed_abb1_0a43f95f28a3_20230213061619_vrepl(id,val,ts) values (1,2,'2023-02-13 04:46:16'), (2,3,'2023-02-13 04:46:16'), (3,null,'2023-02-13 04:46:16')"), "task error: %d", 17), + num: ERBadNullError, + ss: SSConstraintViolation, + }, } for _, tc := range tCases { diff --git a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go index 35500ab08a9..a0a37119819 100644 --- a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go +++ b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go @@ -171,8 +171,7 @@ func TestMain(m *testing.M) { } clusterInstance.VtTabletExtraArgs = []string{ - "--enable-lag-throttler", - "--throttle_threshold", "1s", + "--throttler-config-via-topo", "--heartbeat_enable", "--heartbeat_interval", "250ms", "--heartbeat_on_demand_duration", "5s", @@ -253,6 +252,12 @@ func TestSchemaChange(t *testing.T) { providedUUID := "" providedMigrationContext := "" + + t.Run("enabling throttler with default threshold", func(t *testing.T) { + _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, 0, "", false) + assert.NoError(t, err) + }) + testWithInitialSchema(t) t.Run("alter non_online", func(t *testing.T) { _ = testOnlineDDLStatement(t, alterTableNormalStatement, string(schema.DDLStrategyDirect), providedUUID, providedMigrationContext, "vtctl", "non_online", "", false) @@ -487,7 +492,9 @@ func TestSchemaChange(t *testing.T) { // reparent shard -80 to replica // and then reparent it back to original state // (two pretty much identical tests, the point is to end up with original state) - for currentPrimaryTabletIndex, reparentTabletIndex := range []int{1, 0} { + for _, currentPrimaryTabletIndex := range []int{0, 1} { + currentPrimaryTablet := shards[0].Vttablets[currentPrimaryTabletIndex] + reparentTablet := shards[0].Vttablets[1-currentPrimaryTabletIndex] t.Run(fmt.Sprintf("PlannedReparentShard via throttling %d/2", (currentPrimaryTabletIndex+1)), func(t *testing.T) { insertRows(t, 2) @@ -498,8 +505,8 @@ func TestSchemaChange(t *testing.T) { case 0: // this is the shard where we run PRS // Use per-tablet throttling API - body, err = throttleApp(shards[i].Vttablets[currentPrimaryTabletIndex], onlineDDLThrottlerAppName) - defer unthrottleApp(shards[i].Vttablets[currentPrimaryTabletIndex], onlineDDLThrottlerAppName) + body, err = throttleApp(currentPrimaryTablet, onlineDDLThrottlerAppName) + defer unthrottleApp(currentPrimaryTablet, onlineDDLThrottlerAppName) case 1: // no PRS on this shard // Use per-tablet throttling API @@ -511,12 +518,19 @@ func TestSchemaChange(t *testing.T) { } uuid := testOnlineDDLStatement(t, alterTableTrivialStatement, "vitess", providedUUID, providedMigrationContext, "vtgate", "test_val", "", true) - t.Run("wait for migration and vreplication to run", func(t *testing.T) { + t.Run("wait for migration to run", func(t *testing.T) { _ = onlineddl.WaitForMigrationStatus(t, &vtParams, shards, uuid, normalMigrationWait, schema.OnlineDDLStatusRunning) onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusRunning) - time.Sleep(5 * time.Second) // wait for _vt.vreplication to be created - vreplStatus := onlineddl.WaitForVReplicationStatus(t, &vtParams, shards, uuid, normalMigrationWait, "Copying") + }) + t.Run("wait for vreplication to run on shard -80", func(t *testing.T) { + vreplStatus := onlineddl.WaitForVReplicationStatus(t, &vtParams, currentPrimaryTablet, uuid, normalMigrationWait, "Copying", "Running") + require.Contains(t, []string{"Copying", "Running"}, vreplStatus) + }) + t.Run("wait for vreplication to run on shard 80-", func(t *testing.T) { + vreplStatus := onlineddl.WaitForVReplicationStatus(t, &vtParams, shards[1].Vttablets[0], uuid, normalMigrationWait, "Copying", "Running") require.Contains(t, []string{"Copying", "Running"}, vreplStatus) + }) + t.Run("check status again", func(t *testing.T) { // again see that we're still 'running' onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusRunning) testRows(t) @@ -533,7 +547,7 @@ func TestSchemaChange(t *testing.T) { switch shard { case "-80": - require.Equal(t, shards[0].Vttablets[currentPrimaryTabletIndex].Alias, tablet) + require.Equal(t, currentPrimaryTablet.Alias, tablet) case "80-": require.Equal(t, shards[1].Vttablets[0].Alias, tablet) default: @@ -543,10 +557,12 @@ func TestSchemaChange(t *testing.T) { }) t.Run("PRS shard -80", func(t *testing.T) { // migration has started and is throttled. We now run PRS - err := clusterInstance.VtctlclientProcess.ExecuteCommand("PlannedReparentShard", "--", "--keyspace_shard", keyspaceName+"/-80", "--new_primary", shards[0].Vttablets[reparentTabletIndex].Alias) + err := clusterInstance.VtctlclientProcess.ExecuteCommand("PlannedReparentShard", "--", "--keyspace_shard", keyspaceName+"/-80", "--new_primary", reparentTablet.Alias) require.NoError(t, err, "failed PRS: %v", err) + rs := onlineddl.VtgateExecQuery(t, &vtParams, "show vitess_tablets", "") + onlineddl.PrintQueryResult(os.Stdout, rs) }) - t.Run("unthrottle and expect completion", func(t *testing.T) { + t.Run("unthrottle", func(t *testing.T) { for i := range shards { var body string var err error @@ -554,7 +570,7 @@ func TestSchemaChange(t *testing.T) { case 0: // this is the shard where we run PRS // Use per-tablet throttling API - body, err = unthrottleApp(shards[i].Vttablets[currentPrimaryTabletIndex], onlineDDLThrottlerAppName) + body, err = unthrottleApp(currentPrimaryTablet, onlineDDLThrottlerAppName) case 1: // no PRS on this shard // Use per-tablet throttling API @@ -563,7 +579,8 @@ func TestSchemaChange(t *testing.T) { assert.NoError(t, err) assert.Contains(t, body, onlineDDLThrottlerAppName) } - + }) + t.Run("expect completion", func(t *testing.T) { _ = onlineddl.WaitForMigrationStatus(t, &vtParams, shards, uuid, extendedMigrationWait, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed) onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusComplete) }) @@ -581,7 +598,7 @@ func TestSchemaChange(t *testing.T) { switch shard { case "-80": // PRS for this tablet, we promoted tablet[1] - require.Equal(t, shards[0].Vttablets[reparentTabletIndex].Alias, tablet) + require.Equal(t, reparentTablet.Alias, tablet) case "80-": // No PRS for this tablet require.Equal(t, shards[1].Vttablets[0].Alias, tablet) @@ -596,6 +613,105 @@ func TestSchemaChange(t *testing.T) { }) }) } + + // reparent shard -80 to replica + // and then reparent it back to original state + // (two pretty much identical tests, the point is to end up with original state) + for _, currentPrimaryTabletIndex := range []int{0, 1} { + currentPrimaryTablet := shards[0].Vttablets[currentPrimaryTabletIndex] + reparentTablet := shards[0].Vttablets[1-currentPrimaryTabletIndex] + + t.Run(fmt.Sprintf("PlannedReparentShard via postponed %d/2", (currentPrimaryTabletIndex+1)), func(t *testing.T) { + + insertRows(t, 2) + + uuid := testOnlineDDLStatement(t, alterTableTrivialStatement, "vitess --postpone-completion", providedUUID, providedMigrationContext, "vtgate", "test_val", "", true) + + t.Run("wait for migration to run", func(t *testing.T) { + _ = onlineddl.WaitForMigrationStatus(t, &vtParams, shards, uuid, normalMigrationWait, schema.OnlineDDLStatusRunning) + onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusRunning) + }) + t.Run("wait for vreplication to run on shard -80", func(t *testing.T) { + vreplStatus := onlineddl.WaitForVReplicationStatus(t, &vtParams, currentPrimaryTablet, uuid, normalMigrationWait, "Copying", "Running") + require.Contains(t, []string{"Copying", "Running"}, vreplStatus) + }) + t.Run("wait for vreplication to run on shard 80-", func(t *testing.T) { + vreplStatus := onlineddl.WaitForVReplicationStatus(t, &vtParams, shards[1].Vttablets[0], uuid, normalMigrationWait, "Copying", "Running") + require.Contains(t, []string{"Copying", "Running"}, vreplStatus) + }) + t.Run("check status again", func(t *testing.T) { + // again see that we're still 'running' + onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusRunning) + testRows(t) + }) + + t.Run("Check tablet", func(t *testing.T) { + // onlineddl.Executor marks this migration with its tablet alias + // reminder that onlineddl.Executor runs on the primary tablet. + rs := onlineddl.ReadMigrations(t, &vtParams, uuid) + require.NotNil(t, rs) + for _, row := range rs.Named().Rows { + shard := row["shard"].ToString() + tablet := row["tablet"].ToString() + + switch shard { + case "-80": + require.Equal(t, currentPrimaryTablet.Alias, tablet) + case "80-": + require.Equal(t, shards[1].Vttablets[0].Alias, tablet) + default: + require.NoError(t, fmt.Errorf("unexpected shard name: %s", shard)) + } + } + }) + t.Run("PRS shard -80", func(t *testing.T) { + // migration has started and completion is postponed. We now PRS + err := clusterInstance.VtctlclientProcess.ExecuteCommand("PlannedReparentShard", "--", "--keyspace_shard", keyspaceName+"/-80", "--new_primary", reparentTablet.Alias) + require.NoError(t, err, "failed PRS: %v", err) + rs := onlineddl.VtgateExecQuery(t, &vtParams, "show vitess_tablets", "") + onlineddl.PrintQueryResult(os.Stdout, rs) + }) + t.Run("complete and expect completion", func(t *testing.T) { + query := fmt.Sprintf("select * from _vt.vreplication where workflow ='%s'", uuid) + rs, err := reparentTablet.VttabletProcess.QueryTablet(query, "", true) + assert.NoError(t, err) + onlineddl.PrintQueryResult(os.Stdout, rs) + + onlineddl.CheckCompleteAllMigrations(t, &vtParams, len(shards)) + + _ = onlineddl.WaitForMigrationStatus(t, &vtParams, shards, uuid, extendedMigrationWait, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed) + onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusComplete) + }) + + t.Run("Check tablet post PRS", func(t *testing.T) { + // onlineddl.Executor will find that a vrepl migration started in a different tablet. + // it will own the tablet and will update 'tablet' column in _vt.schema_migrations with its own + // (promoted primary) tablet alias. + rs := onlineddl.ReadMigrations(t, &vtParams, uuid) + require.NotNil(t, rs) + for _, row := range rs.Named().Rows { + shard := row["shard"].ToString() + tablet := row["tablet"].ToString() + + switch shard { + case "-80": + // PRS for this tablet + require.Equal(t, reparentTablet.Alias, tablet) + case "80-": + // No PRS for this tablet + require.Equal(t, shards[1].Vttablets[0].Alias, tablet) + default: + require.NoError(t, fmt.Errorf("unexpected shard name: %s", shard)) + } + } + + onlineddl.CheckRetryPartialMigration(t, &vtParams, uuid, 1) + // Now it should complete on the failed shard + _ = onlineddl.WaitForMigrationStatus(t, &vtParams, shards, uuid, extendedMigrationWait, schema.OnlineDDLStatusComplete) + }) + }) + } + t.Run("Online DROP, vtctl", func(t *testing.T) { uuid := testOnlineDDLStatement(t, onlineDDLDropTableStatement, "online", providedUUID, providedMigrationContext, "vtctl", "", "", false) t.Run("test ready to complete", func(t *testing.T) { diff --git a/go/test/endtoend/onlineddl/vtctlutil.go b/go/test/endtoend/onlineddl/vtctlutil.go index b98d1134283..70aa3b6e3ec 100644 --- a/go/test/endtoend/onlineddl/vtctlutil.go +++ b/go/test/endtoend/onlineddl/vtctlutil.go @@ -17,6 +17,7 @@ limitations under the License. package onlineddl import ( + "fmt" "testing" "vitess.io/vitess/go/test/endtoend/cluster" @@ -31,3 +32,32 @@ func CheckCancelAllMigrationsViaVtctl(t *testing.T, vtctlclient *cluster.VtctlCl _, err := vtctlclient.ApplySchemaWithOutput(keyspace, cancelQuery, cluster.VtctlClientParams{SkipPreflight: true}) assert.NoError(t, err) } + +// UpdateThrottlerTopoConfig runs vtctlclient UpdateThrottlerConfig +func UpdateThrottlerTopoConfig(clusterInstance *cluster.LocalProcessCluster, enable bool, disable bool, threshold float64, metricsQuery string, viaVtctldClient bool) (result string, err error) { + args := []string{} + if !viaVtctldClient { + args = append(args, "--") + } + args = append(args, "UpdateThrottlerConfig") + if enable { + args = append(args, "--enable") + } + if disable { + args = append(args, "--disable") + } + if threshold > 0 { + args = append(args, "--threshold", fmt.Sprintf("%f", threshold)) + } + if metricsQuery != "" { + args = append(args, "--custom-query", metricsQuery) + args = append(args, "--check-as-check-self") + } else { + args = append(args, "--check-as-check-shard") + } + args = append(args, clusterInstance.Keyspaces[0].Name) + if viaVtctldClient { + return clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(args...) + } + return clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput(args...) +} diff --git a/go/test/endtoend/onlineddl/vttablet_util.go b/go/test/endtoend/onlineddl/vttablet_util.go index 4d4e88b8189..3d4ded89dac 100644 --- a/go/test/endtoend/onlineddl/vttablet_util.go +++ b/go/test/endtoend/onlineddl/vttablet_util.go @@ -31,9 +31,9 @@ import ( ) // WaitForVReplicationStatus waits for a vreplication stream to be in one of given states, or timeout -func WaitForVReplicationStatus(t *testing.T, vtParams *mysql.ConnParams, shards []cluster.Shard, uuid string, timeout time.Duration, expectStatuses ...string) (status string) { +func WaitForVReplicationStatus(t *testing.T, vtParams *mysql.ConnParams, tablet *cluster.Vttablet, uuid string, timeout time.Duration, expectStatuses ...string) (status string) { - query, err := sqlparser.ParseAndBind("select workflow, state from _vt.vreplication where workflow=%a", + query, err := sqlparser.ParseAndBind("select state from _vt.vreplication where workflow=%a", sqltypes.StringBindVariable(uuid), ) require.NoError(t, err) @@ -45,22 +45,16 @@ func WaitForVReplicationStatus(t *testing.T, vtParams *mysql.ConnParams, shards startTime := time.Now() lastKnownStatus := "" for time.Since(startTime) < timeout { - countMatchedShards := 0 + r, err := tablet.VttabletProcess.QueryTablet(query, "", true) + require.NoError(t, err) - for _, shard := range shards { - r, err := shard.Vttablets[0].VttabletProcess.QueryTablet(query, "", false) - require.NoError(t, err) - - for _, row := range r.Named().Rows { - lastKnownStatus = row["state"].ToString() - if row["workflow"].ToString() == uuid && statusesMap[lastKnownStatus] { - countMatchedShards++ - } + if row := r.Named().Row(); row != nil { + lastKnownStatus, err = row.ToString("state") + assert.NoError(t, err) + if statusesMap[lastKnownStatus] { + return lastKnownStatus } } - if countMatchedShards == len(shards) { - return lastKnownStatus - } time.Sleep(1 * time.Second) } return lastKnownStatus diff --git a/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go b/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go index ca79447d215..78daaed63a0 100644 --- a/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go +++ b/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go @@ -31,6 +31,7 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/test/endtoend/onlineddl" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -154,35 +155,6 @@ func TestMain(m *testing.M) { os.Exit(exitCode) } -// updateThrottlerConfig runs vtctlclient UpdateThrottlerConfig -func updateThrottlerConfig(enable bool, disable bool, threshold float64, metricsQuery string, viaVtctldClient bool) (result string, err error) { - args := []string{} - if !viaVtctldClient { - args = append(args, "--") - } - args = append(args, "UpdateThrottlerConfig") - if enable { - args = append(args, "--enable") - } - if disable { - args = append(args, "--disable") - } - if threshold > 0 { - args = append(args, "--threshold", fmt.Sprintf("%f", threshold)) - } - if metricsQuery != "" { - args = append(args, "--custom-query", metricsQuery) - args = append(args, "--check-as-check-self") - } else { - args = append(args, "--check-as-check-shard") - } - args = append(args, keyspaceName) - if viaVtctldClient { - return clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(args...) - } - return clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput(args...) -} - func throttledApps(tablet *cluster.Vttablet) (resp *http.Response, respBody string, err error) { resp, err = httpClient.Get(fmt.Sprintf("http://localhost:%d/%s", tablet.HTTPPort, throttledAppsAPIPath)) if err != nil { @@ -272,35 +244,35 @@ func TestInitialThrottler(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) }) t.Run("enabling throttler with low threshold", func(t *testing.T) { - _, err := updateThrottlerConfig(true, false, unreasonablyLowThreshold.Seconds(), "", false) + _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, unreasonablyLowThreshold.Seconds(), "", false) assert.NoError(t, err) }) t.Run("validating pushback response from throttler", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) }) t.Run("disabling throttler", func(t *testing.T) { - _, err := updateThrottlerConfig(false, true, unreasonablyLowThreshold.Seconds(), "", false) + _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, false, true, unreasonablyLowThreshold.Seconds(), "", false) assert.NoError(t, err) }) t.Run("validating OK response from disabled throttler, again", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) }) t.Run("enabling throttler, again", func(t *testing.T) { - _, err := updateThrottlerConfig(true, false, 0, "", true) + _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, 0, "", true) assert.NoError(t, err) }) t.Run("validating pushback response from throttler, again", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) }) t.Run("setting high threshold", func(t *testing.T) { - _, err := updateThrottlerConfig(false, false, extremelyHighThreshold.Seconds(), "", true) + _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, false, false, extremelyHighThreshold.Seconds(), "", true) assert.NoError(t, err) }) t.Run("validating OK response from throttler with high threshold", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) }) t.Run("setting low threshold", func(t *testing.T) { - _, err := updateThrottlerConfig(false, false, throttlerThreshold.Seconds(), "", true) + _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, false, false, throttlerThreshold.Seconds(), "", true) assert.NoError(t, err) }) t.Run("validating pushback response from throttler on low threshold", func(t *testing.T) { @@ -432,7 +404,7 @@ func TestCustomQuery(t *testing.T) { defer cluster.PanicHandler(t) t.Run("enabling throttler with low threshold", func(t *testing.T) { - _, err := updateThrottlerConfig(true, false, float64(customThreshold), customQuery, false) + _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, float64(customThreshold), customQuery, false) assert.NoError(t, err) time.Sleep(applyConfigWait) }) @@ -505,7 +477,7 @@ func TestRestoreDefaultQuery(t *testing.T) { defer cluster.PanicHandler(t) t.Run("enabling throttler with standard threshold", func(t *testing.T) { - _, err := updateThrottlerConfig(true, false, throttlerThreshold.Seconds(), "", false) + _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, throttlerThreshold.Seconds(), "", false) assert.NoError(t, err) }) t.Run("validating OK response from throttler with low threshold, heartbeats running", func(t *testing.T) { diff --git a/go/vt/vterrors/errors_test.go b/go/vt/vterrors/errors_test.go index 96c034c45ee..c115fb41686 100644 --- a/go/vt/vterrors/errors_test.go +++ b/go/vt/vterrors/errors_test.go @@ -21,10 +21,13 @@ import ( "errors" "fmt" "io" + "math/rand" "reflect" "strings" "testing" + "github.com/stretchr/testify/assert" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) @@ -57,6 +60,68 @@ func TestWrap(t *testing.T) { } } +func TestUnwrap(t *testing.T) { + tests := []struct { + err error + isWrapped bool + }{ + {fmt.Errorf("some error: %d", 17), false}, + {errors.New("some new error"), false}, + {Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "some msg %d", 19), false}, + {Wrapf(errors.New("some wrapped error"), "some msg"), true}, + {nil, false}, + } + + for _, tt := range tests { + t.Run(fmt.Sprintf("%v", tt.err), func(t *testing.T) { + { + wasWrapped, unwrapped := Unwrap(tt.err) + assert.Equal(t, tt.isWrapped, wasWrapped) + if !wasWrapped { + assert.Equal(t, tt.err, unwrapped) + } + } + { + wrapped := Wrap(tt.err, "some message") + wasWrapped, unwrapped := Unwrap(wrapped) + assert.Equal(t, wasWrapped, (tt.err != nil)) + assert.Equal(t, tt.err, unwrapped) + } + }) + } +} + +func TestUnwrapAll(t *testing.T) { + tests := []struct { + err error + }{ + {fmt.Errorf("some error: %d", 17)}, + {errors.New("some new error")}, + {Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "some msg %d", 19)}, + {nil}, + } + + for _, tt := range tests { + t.Run(fmt.Sprintf("%v", tt.err), func(t *testing.T) { + { + // see that unwrapping a non-wrapped error just returns the same error + unwrapped := UnwrapAll(tt.err) + assert.Equal(t, tt.err, unwrapped) + } + { + // see that unwrapping a 5-times wrapped error returns the original error + wrapped := tt.err + for range rand.Perm(5) { + wrapped = Wrap(wrapped, "some message") + } + unwrapped := UnwrapAll(wrapped) + assert.Equal(t, tt.err, unwrapped) + } + }) + } + +} + type nilError struct{} func (nilError) Error() string { return "nil error" } diff --git a/go/vt/vterrors/last_error.go b/go/vt/vterrors/last_error.go new file mode 100644 index 00000000000..314a54aae00 --- /dev/null +++ b/go/vt/vterrors/last_error.go @@ -0,0 +1,92 @@ +/* +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 vterrors + +import ( + "sync" + "time" + + "vitess.io/vitess/go/vt/log" +) + +/* + * LastError tracks the most recent error for any ongoing process and how long it has persisted. + * 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, + } +} + +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 !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() + } +} + +func (le *LastError) ShouldRetry() bool { + le.mu.Lock() + defer le.mu.Unlock() + if le.maxTimeInError == 0 { + // The value of 0 means "no time limit" + return true + } + if le.firstSeen.IsZero() { + return true + } + if time.Since(le.firstSeen) <= le.maxTimeInError { + // within the max time range + return true + } + log.Errorf("%s: the same error was encountered continuously since %s, it is now assumed to be unrecoverable; any affected operations will need to be manually restarted once error '%s' has been addressed", + le.name, le.firstSeen.UTC(), le.err) + return false +} diff --git a/go/vt/vterrors/last_error_test.go b/go/vt/vterrors/last_error_test.go new file mode 100644 index 00000000000..09913796c9b --- /dev/null +++ b/go/vt/vterrors/last_error_test.go @@ -0,0 +1,86 @@ +/* +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 vterrors + +import ( + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +const shortWait = 1 * time.Millisecond +const longWait = 150 * time.Millisecond +const maxTimeInError = 100 * time.Millisecond + +// 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) + 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()) +} diff --git a/go/vt/vterrors/vterrors.go b/go/vt/vterrors/vterrors.go index 6e26b4cd8f1..5c5d59cf3ea 100644 --- a/go/vt/vterrors/vterrors.go +++ b/go/vt/vterrors/vterrors.go @@ -88,6 +88,7 @@ package vterrors import ( "context" + "errors" "fmt" "io" @@ -244,6 +245,26 @@ func Wrapf(err error, format string, args ...any) error { } } +// Unwrap attempts to return the Cause of the given error, if it is indeed the result of a vterrors.Wrapf() +// The function indicates whether the error was indeed wrapped. If the error was not wrapped, the function +// returns the original error. +func Unwrap(err error) (wasWrapped bool, unwrapped error) { + var w *wrapping + if errors.As(err, &w) { + return true, w.Cause() + } + return false, err +} + +// UnwrapAll attempts to recursively unwrap the given error, and returns the most underlying cause +func UnwrapAll(err error) error { + wasWrapped := true + for wasWrapped { + wasWrapped, err = Unwrap(err) + } + return err +} + type wrapping struct { cause error msg string diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index b3771dbe916..e1788cafcf9 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -208,11 +208,12 @@ type Executor struct { // - be terminated (example: pt-osc migration gone rogue, process still running even as the migration failed) // The Executor auto-reviews the map and cleans up migrations thought to be running which are not running. ownedRunningMigrations sync.Map + vreplicationLastError map[string]*vterrors.LastError tickReentranceFlag int64 reviewedRunningMigrationsFlag bool ticks *timer.Timer - isOpen bool + isOpen int64 schemaInitialized bool initVreplicationDDLOnce sync.Once @@ -302,10 +303,18 @@ func (e *Executor) InitDBConfig(keyspace, shard, dbName string) { func (e *Executor) Open() error { e.initMutex.Lock() defer e.initMutex.Unlock() - if e.isOpen || !e.env.Config().EnableOnlineDDL { + if atomic.LoadInt64(&e.isOpen) > 0 || !e.env.Config().EnableOnlineDDL { return nil } + log.Infof("onlineDDL Executor Open()") + e.reviewedRunningMigrationsFlag = false // will be set as "true" by reviewRunningMigrations() + e.ownedRunningMigrations.Range(func(k, _ any) bool { + e.ownedRunningMigrations.Delete(k) + return true + }) + e.vreplicationLastError = make(map[string]*vterrors.LastError) + e.pool.Open(e.env.Config().DB.AppWithDB(), e.env.Config().DB.DbaWithDB(), e.env.Config().DB.AppDebugWithDB()) e.ticks.Start(e.onMigrationCheckTick) e.triggerNextCheckInterval() @@ -314,28 +323,23 @@ func (e *Executor) Open() error { // this validates vexecUpdateTemplates return err } - - e.isOpen = true + atomic.StoreInt64(&e.isOpen, 1) return nil } // Close frees resources func (e *Executor) Close() { - log.Infof("onlineDDL Executor - Acquiring lock - initMutex") e.initMutex.Lock() - log.Infof("onlineDDL Executor - Acquired lock - initMutex") defer e.initMutex.Unlock() - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return } + log.Infof("onlineDDL Executor Close()") - log.Infof("onlineDDL Executor - Stopping timer ticks") e.ticks.Stop() - log.Infof("onlineDDL Executor - Closing the conpool") e.pool.Close() - e.isOpen = false - log.Infof("onlineDDL Executor - finished Close execution") + atomic.StoreInt64(&e.isOpen, 0) } // triggerNextCheckInterval the next tick sooner than normal @@ -1194,7 +1198,7 @@ func (e *Executor) validateAndEditAlterTableStatement(ctx context.Context, onlin func (e *Executor) createTableLike(ctx context.Context, newTableName string, onlineDDL *schema.OnlineDDL, conn *dbconnpool.DBConnection) (constraintMap map[string]string, err error) { existingShowCreateTable, err := e.showCreateTable(ctx, onlineDDL.Table) if err != nil { - return nil, err + return nil, vterrors.Wrapf(err, "in createTableLike(), newTableName=%s", newTableName) } stmt, err := sqlparser.ParseStrictDDL(existingShowCreateTable) if err != nil { @@ -1973,7 +1977,7 @@ func (e *Executor) terminateMigration(ctx context.Context, onlineDDL *schema.Onl // CancelMigration attempts to abort a scheduled or a running migration func (e *Executor) CancelMigration(ctx context.Context, uuid string, message string, issuedByUser bool) (result *sqltypes.Result, err error) { - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "online ddl is disabled") } log.Infof("CancelMigration: request to cancel %s with message: %v", uuid, message) @@ -2044,7 +2048,7 @@ func (e *Executor) cancelMigrations(ctx context.Context, cancellable []*cancella // CancelPendingMigrations cancels all pending migrations (that are expected to run or are running) // for this keyspace func (e *Executor) CancelPendingMigrations(ctx context.Context, message string, issuedByUser bool) (result *sqltypes.Result, err error) { - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "online ddl is disabled") } @@ -2592,14 +2596,14 @@ func (e *Executor) evaluateDeclarativeDiff(ctx context.Context, onlineDDL *schem existingShowCreateTable, err := e.showCreateTable(ctx, onlineDDL.Table) if err != nil { - return nil, err + return nil, vterrors.Wrapf(err, "in evaluateDeclarativeDiff(), for onlineDDL.Table") } if existingShowCreateTable == "" { return nil, vterrors.Errorf(vtrpcpb.Code_NOT_FOUND, "unexpected: cannot find table or view %v", onlineDDL.Table) } newShowCreateTable, err := e.showCreateTable(ctx, comparisonTableName) if err != nil { - return nil, err + return nil, vterrors.Wrapf(err, "in evaluateDeclarativeDiff(), for comparisonTableName") } if newShowCreateTable == "" { return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "unexpected: cannot find table or view even as it was just created: %v", onlineDDL.Table) @@ -3479,6 +3483,10 @@ func (e *Executor) reviewRunningMigrations(ctx context.Context) (countRunnning i e.migrationMutex.Lock() defer e.migrationMutex.Unlock() + if atomic.LoadInt64(&e.isOpen) == 0 { + return countRunnning, cancellable, nil + } + var currentUserThrottleRatio float64 if err := e.lagThrottler.CheckIsReady(); err == nil { // No point in reviewing throttler info if it's not enabled&open @@ -3548,10 +3556,25 @@ func (e *Executor) reviewRunningMigrations(ctx context.Context) (countRunnning i if isVreplicationTestSuite { e.triggerNextCheckInterval() } - if s != nil && s.isFailed() { + if s == nil { + continue + } + // Let's see if vreplication indicates an error. Many errors are recoverable, and + // we do not wish to fail on first sight. We will use LastError to repeatedly + // check if this error persists, until finally, after some timeout, we give up. + if _, ok := e.vreplicationLastError[uuid]; !ok { + e.vreplicationLastError[uuid] = vterrors.NewLastError( + fmt.Sprintf("Online DDL migration %v", uuid), + staleMigrationMinutes*time.Minute, + ) + } + lastError := e.vreplicationLastError[uuid] + isTerminal, vreplError := s.hasError() + lastError.Record(vreplError) + if isTerminal || !lastError.ShouldRetry() { cancellable = append(cancellable, newCancellableMigration(uuid, s.message)) } - if s != nil && s.isRunning() { + if s.isRunning() { // This VRepl migration may have started from outside this tablet, so // this executor may not own the migration _yet_. We make sure to own it. // VReplication migrations are unique in this respect: we are able to complete @@ -3561,7 +3584,10 @@ func (e *Executor) reviewRunningMigrations(ctx context.Context) (countRunnning i _ = e.updateMigrationTimestamp(ctx, "liveness_timestamp", uuid) _ = e.updateVitessLivenessIndicator(ctx, uuid, s.livenessTimeIndicator()) } - _ = e.updateMigrationTablet(ctx, uuid) + if onlineDDL.TabletAlias != e.TabletAliasString() { + _ = e.updateMigrationTablet(ctx, uuid) + log.Infof("migration %s adopted by tablet %s", uuid, e.TabletAliasString()) + } _ = e.updateRowsCopied(ctx, uuid, s.rowsCopied) _ = e.updateMigrationProgressByRowsCopied(ctx, uuid, s.rowsCopied) _ = e.updateMigrationETASecondsByProgress(ctx, uuid) @@ -3797,22 +3823,22 @@ func (e *Executor) deleteVReplicationEntry(ctx context.Context, uuid string) err } // gcArtifactTable garbage-collects a single table -func (e *Executor) gcArtifactTable(ctx context.Context, artifactTable, uuid string, t time.Time) error { +func (e *Executor) gcArtifactTable(ctx context.Context, artifactTable, uuid string, t time.Time) (string, error) { tableExists, err := e.tableExists(ctx, artifactTable) if err != nil { - return err + return "", err } if !tableExists { - return nil + return "", nil } // We've already concluded in gcArtifacts() that this table was held for long enough. // We therefore move it into PURGE state. - renameStatement, _, err := schema.GenerateRenameStatementWithUUID(artifactTable, schema.PurgeTableGCState, schema.OnlineDDLToGCUUID(uuid), t) + renameStatement, toTableName, err := schema.GenerateRenameStatementWithUUID(artifactTable, schema.PurgeTableGCState, schema.OnlineDDLToGCUUID(uuid), t) if err != nil { - return err + return toTableName, err } _, err = e.execQuery(ctx, renameStatement) - return err + return toTableName, err } // gcArtifacts garbage-collects migration artifacts from completed/failed migrations @@ -3853,10 +3879,11 @@ func (e *Executor) gcArtifacts(ctx context.Context) error { // is shared for all artifacts in this loop, we differentiate via timestamp log.Infof("Executor.gcArtifacts: will GC artifact %s for migration %s", artifactTable, uuid) t := timeNow.Add(time.Duration(i) * time.Second).UTC() - if err := e.gcArtifactTable(ctx, artifactTable, uuid, t); err != nil { - return err + toTableName, err := e.gcArtifactTable(ctx, artifactTable, uuid, t) + if err != nil { + return vterrors.Wrapf(err, "in gcArtifacts() for %s", artifactTable) } - log.Infof("Executor.gcArtifacts: renamed away artifact %s", artifactTable) + log.Infof("Executor.gcArtifacts: renamed away artifact %s to %s", artifactTable, toTableName) } // Remove logs: @@ -4369,7 +4396,7 @@ func (e *Executor) retryMigrationWhere(ctx context.Context, whereExpr string) (r // RetryMigration marks given migration for retry func (e *Executor) RetryMigration(ctx context.Context, uuid string) (result *sqltypes.Result, err error) { - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "online ddl is disabled") } if !schema.IsOnlineDDLUUID(uuid) { @@ -4393,7 +4420,7 @@ func (e *Executor) RetryMigration(ctx context.Context, uuid string) (result *sql // all we do is set retain_artifacts_seconds to a very small number (it's actually a negative) so that the // next iteration of gcArtifacts() picks up the migration's artifacts and schedules them for deletion func (e *Executor) CleanupMigration(ctx context.Context, uuid string) (result *sqltypes.Result, err error) { - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "online ddl is disabled") } if !schema.IsOnlineDDLUUID(uuid) { @@ -4419,7 +4446,7 @@ func (e *Executor) CleanupMigration(ctx context.Context, uuid string) (result *s // CompleteMigration clears the postpone_completion flag for a given migration, assuming it was set in the first place func (e *Executor) CompleteMigration(ctx context.Context, uuid string) (result *sqltypes.Result, err error) { - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "online ddl is disabled") } if !schema.IsOnlineDDLUUID(uuid) { @@ -4453,7 +4480,7 @@ func (e *Executor) CompleteMigration(ctx context.Context, uuid string) (result * // CompletePendingMigrations completes all pending migrations (that are expected to run or are running) // for this keyspace func (e *Executor) CompletePendingMigrations(ctx context.Context) (result *sqltypes.Result, err error) { - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "online ddl is disabled") } @@ -4478,7 +4505,7 @@ func (e *Executor) CompletePendingMigrations(ctx context.Context) (result *sqlty // LaunchMigration clears the postpone_launch flag for a given migration, assuming it was set in the first place func (e *Executor) LaunchMigration(ctx context.Context, uuid string, shardsArg string) (result *sqltypes.Result, err error) { - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "online ddl is disabled") } if !schema.IsOnlineDDLUUID(uuid) { @@ -4510,7 +4537,7 @@ func (e *Executor) LaunchMigration(ctx context.Context, uuid string, shardsArg s // LaunchMigrations launches all launch-postponed queued migrations for this keyspace func (e *Executor) LaunchMigrations(ctx context.Context) (result *sqltypes.Result, err error) { - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "online ddl is disabled") } @@ -4622,7 +4649,7 @@ func (e *Executor) SubmitMigration( ctx context.Context, stmt sqlparser.Statement, ) (*sqltypes.Result, error) { - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "online ddl is disabled") } @@ -4720,7 +4747,7 @@ func (e *Executor) SubmitMigration( // ShowMigrationLogs reads the migration log for a given migration func (e *Executor) ShowMigrationLogs(ctx context.Context, stmt *sqlparser.ShowMigrationLogs) (result *sqltypes.Result, err error) { - if !e.isOpen { + if atomic.LoadInt64(&e.isOpen) == 0 { return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "online ddl is disabled") } _, row, err := e.readMigration(ctx, stmt.UUID) diff --git a/go/vt/vttablet/onlineddl/vrepl.go b/go/vt/vttablet/onlineddl/vrepl.go index 1d10764b6ae..9b7f20411ed 100644 --- a/go/vt/vttablet/onlineddl/vrepl.go +++ b/go/vt/vttablet/onlineddl/vrepl.go @@ -25,6 +25,7 @@ package onlineddl import ( "context" + "errors" "fmt" "math" "strconv" @@ -71,7 +72,7 @@ func (v *VReplStream) livenessTimeIndicator() int64 { return v.timeUpdated } -// isFailed() returns true when the workflow is actively running +// isRunning() returns true when the workflow is actively running func (v *VReplStream) isRunning() bool { switch v.state { case binlogplayer.VReplicationInit, binlogplayer.VReplicationCopying, binlogplayer.BlpRunning: @@ -80,15 +81,15 @@ func (v *VReplStream) isRunning() bool { return false } -// isFailed() returns true when the workflow has failed and will not retry -func (v *VReplStream) isFailed() bool { +// hasError() returns true when the workflow has failed and will not retry +func (v *VReplStream) hasError() (isTerminal bool, vreplError error) { switch { case v.state == binlogplayer.BlpError: - return true + return true, errors.New(v.message) case strings.Contains(strings.ToLower(v.message), "error"): - return true + return false, errors.New(v.message) } - return false + return false, nil } // VRepl is an online DDL helper for VReplication based migrations (ddl_strategy="online") diff --git a/go/vt/vttablet/tabletmanager/vreplication/controller.go b/go/vt/vttablet/tabletmanager/vreplication/controller.go index 28ba823154d..fb446cdfd1a 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/controller.go +++ b/go/vt/vttablet/tabletmanager/vreplication/controller.go @@ -68,7 +68,7 @@ type controller struct { // The following fields are updated after start. So, they need synchronization. sourceTablet sync2.AtomicString - lastWorkflowError *lastError + lastWorkflowError *vterrors.LastError } // newController creates a new controller. Unless a stream is explicitly 'Stopped', @@ -79,13 +79,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) @@ -96,6 +95,7 @@ func newController(ctx context.Context, params map[string]string, dbClientFactor } ct.id = uint32(id) ct.workflow = params["workflow"] + ct.lastWorkflowError = vterrors.NewLastError(fmt.Sprintf("VReplication controller %d for workflow %q", ct.id, ct.workflow), maxTimeToRetryError) state := params["state"] blpStats.State.Set(state) @@ -271,10 +271,10 @@ func (ct *controller) runBlp(ctx context.Context) (err error) { vr := newVReplicator(ct.id, ct.source, vsClient, ct.blpStats, dbClient, ct.mysqld, ct.vre) err = vr.Replicate(ctx) - ct.lastWorkflowError.record(err) + ct.lastWorkflowError.Record(err) // If this is a mysql error that we know needs manual intervention OR // we cannot identify this as non-recoverable, but it has persisted beyond the retry limit (maxTimeToRetryError) - if isUnrecoverableError(err) || !ct.lastWorkflowError.shouldRetry() { + if isUnrecoverableError(err) || !ct.lastWorkflowError.ShouldRetry() { log.Errorf("vreplication stream %d going into error state due to %+v", ct.id, err) if errSetState := vr.setState(binlogplayer.BlpError, err.Error()); errSetState != nil { return err // yes, err and not errSetState. diff --git a/go/vt/vttablet/tabletmanager/vreplication/last_error.go b/go/vt/vttablet/tabletmanager/vreplication/last_error.go deleted file mode 100644 index e3a73d5b062..00000000000 --- a/go/vt/vttablet/tabletmanager/vreplication/last_error.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -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 vreplication - -import ( - "sync" - "time" - - "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/vterrors" -) - -/* - * 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 - * traces, etc. - */ -type lastError struct { - name string - err error - firstSeen 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 { - return &lastError{ - name: name, - maxTimeInError: maxTimeInError, - } -} - -func (le *lastError) record(err error) { - le.mu.Lock() - defer le.mu.Unlock() - if err == nil { - le.err = nil - le.firstSeen = time.Time{} - return - } - if !vterrors.Equals(err, le.err) { - le.firstSeen = time.Now() - le.err = err - } - // The error is unchanged so we don't need to do anything -} - -func (le *lastError) shouldRetry() bool { - le.mu.Lock() - defer le.mu.Unlock() - if le.maxTimeInError == 0 { - // The value of 0 means "no time limit" - return true - } - if le.firstSeen.IsZero() { - return true - } - if time.Since(le.firstSeen) <= le.maxTimeInError { - // within the max time range - return true - } - log.Errorf("VReplication encountered the same error continuously since %s, we will assume this is a non-recoverable error and will not retry anymore; the workflow will need to be manually restarted once error '%s' has been addressed", - le.firstSeen.UTC(), le.err) - return false -} diff --git a/go/vt/vttablet/tabletmanager/vreplication/last_error_test.go b/go/vt/vttablet/tabletmanager/vreplication/last_error_test.go deleted file mode 100644 index 8d0e353478a..00000000000 --- a/go/vt/vttablet/tabletmanager/vreplication/last_error_test.go +++ /dev/null @@ -1,55 +0,0 @@ -/* -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 vreplication - -import ( - "fmt" - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -func TestLastError(t *testing.T) { - le := newLastError("test", 100*time.Millisecond) - - t.Run("long running error", func(t *testing.T) { - err1 := fmt.Errorf("test1") - 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()) - }) -} diff --git a/go/vt/vttablet/tabletmanager/vreplication/utils.go b/go/vt/vttablet/tabletmanager/vreplication/utils.go index d43e98c6f97..fd287e28630 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/utils.go +++ b/go/vt/vttablet/tabletmanager/vreplication/utils.go @@ -124,10 +124,13 @@ func isUnrecoverableError(err error) bool { if err == nil { return false } - sqlErr, isSQLErr := err.(*mysql.SQLError) + sqlErr, isSQLErr := mysql.NewSQLErrorFromError(err).(*mysql.SQLError) if !isSQLErr { return false } + if sqlErr.Num == mysql.ERUnknownError { + return false + } switch sqlErr.Num { case // in case-insensitive alphabetical order diff --git a/go/vt/vttablet/tabletmanager/vreplication/vcopier.go b/go/vt/vttablet/tabletmanager/vreplication/vcopier.go index 0692977bd60..7e3d2a729d4 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vcopier.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vcopier.go @@ -575,7 +575,7 @@ func (vc *vcopier) copyTable(ctx context.Context, tableName string, copyState ma // Collect lastpk. Needed for logging at the end. lastpk = result.args.lastpk case vcopierCopyTaskFail: - return fmt.Errorf("task error: %s", result.err) + return vterrors.Wrapf(result.err, "task error") } } else { return io.EOF @@ -617,7 +617,7 @@ func (vc *vcopier) copyTable(ctx context.Context, tableName string, copyState ma if len(terrs) > 0 { terr := vterrors.Aggregate(terrs) log.Warningf("task error in workflow %s: %v", vc.vr.WorkflowName, terr) - return fmt.Errorf("task error: %v", terr) + return vterrors.Wrapf(terr, "task error") } // Get the last committed pk into a loggable form. @@ -1053,25 +1053,25 @@ func (vbc *vcopierCopyWorker) execute(ctx context.Context, task *vcopierCopyTask advanceFn = func(context.Context, *vcopierCopyTaskArgs) error { // Rollback to make sure we're in a clean state. if err := vbc.vdbClient.Rollback(); err != nil { - return fmt.Errorf("failed to rollback: %s", err.Error()) + return vterrors.Wrapf(err, "failed to rollback") } // Begin transaction. if err := vbc.vdbClient.Begin(); err != nil { - return fmt.Errorf("failed to start transaction: %s", err.Error()) + return vterrors.Wrapf(err, "failed to start transaction") } return nil } case vcopierCopyTaskInsertRows: advanceFn = func(ctx context.Context, args *vcopierCopyTaskArgs) error { if _, err := vbc.insertRows(ctx, args.rows); err != nil { - return fmt.Errorf("failed inserting rows: %s", err.Error()) + return vterrors.Wrapf(err, "failed inserting rows") } return nil } case vcopierCopyTaskInsertCopyState: advanceFn = func(ctx context.Context, args *vcopierCopyTaskArgs) error { if err := vbc.insertCopyState(ctx, args.lastpk); err != nil { - return fmt.Errorf("error updating _vt.copy_state: %s", err.Error()) + return vterrors.Wrapf(err, "error updating _vt.copy_state") } return nil } @@ -1079,7 +1079,7 @@ func (vbc *vcopierCopyWorker) execute(ctx context.Context, task *vcopierCopyTask advanceFn = func(context.Context, *vcopierCopyTaskArgs) error { // Commit. if err := vbc.vdbClient.Commit(); err != nil { - return fmt.Errorf("error commiting transaction: %s", err.Error()) + return vterrors.Wrapf(err, "error commiting transaction") } return nil } From c37bdd712d9a5ec7e6a284e256ddbf7f8fbc7f6a Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Thu, 23 Feb 2023 03:32:14 -0800 Subject: [PATCH 027/233] examples: Fix Vtop example and release script (#12440) * examples: should use mysql80 property for vitess image Signed-off-by: deepthi * Use MySQL80 in all examples/operator YAML files Signed-off-by: Florent Poinsard * feat: fix vtadmin image version Signed-off-by: Manan Gupta * feat: update release script to update vtadmin image version too Signed-off-by: Manan Gupta * feat: fix vtop example script to use vtctldclient instead Signed-off-by: Manan Gupta --------- Signed-off-by: deepthi Signed-off-by: Florent Poinsard Signed-off-by: Manan Gupta Co-authored-by: Florent Poinsard Co-authored-by: Manan Gupta --- examples/operator/101_initial_cluster.yaml | 4 +- examples/operator/201_customer_tablets.yaml | 4 +- examples/operator/302_new_shards.yaml | 4 +- examples/operator/306_down_shard_0.yaml | 4 +- test/vtop_example.sh | 44 ++++++++++----------- tools/release_utils.sh | 1 + 6 files changed, 31 insertions(+), 30 deletions(-) diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index a70a8decee5..12931f7232a 100644 --- a/examples/operator/101_initial_cluster.yaml +++ b/examples/operator/101_initial_cluster.yaml @@ -9,13 +9,13 @@ metadata: spec: images: vtctld: vitess/lite:v16.0.0-rc1 - vtadmin: vitess/vtadmin:latest + vtadmin: vitess/vtadmin:v16.0.0-rc1 vtgate: vitess/lite:v16.0.0-rc1 vttablet: vitess/lite:v16.0.0-rc1 vtbackup: vitess/lite:v16.0.0-rc1 vtorc: vitess/lite:v16.0.0-rc1 mysqld: - mysql56Compatible: vitess/lite:v16.0.0-rc1 + mysql80Compatible: vitess/lite:v16.0.0-rc1 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 dd69c6998d9..b2dba84cba4 100644 --- a/examples/operator/201_customer_tablets.yaml +++ b/examples/operator/201_customer_tablets.yaml @@ -5,13 +5,13 @@ metadata: spec: images: vtctld: vitess/lite:v16.0.0-rc1 - vtadmin: vitess/vtadmin:latest + vtadmin: vitess/vtadmin:v16.0.0-rc1 vtgate: vitess/lite:v16.0.0-rc1 vttablet: vitess/lite:v16.0.0-rc1 vtbackup: vitess/lite:v16.0.0-rc1 vtorc: vitess/lite:v16.0.0-rc1 mysqld: - mysql56Compatible: vitess/lite:v16.0.0-rc1 + mysql80Compatible: vitess/lite:v16.0.0-rc1 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 e20aea5814b..f0904cf6f45 100644 --- a/examples/operator/302_new_shards.yaml +++ b/examples/operator/302_new_shards.yaml @@ -5,13 +5,13 @@ metadata: spec: images: vtctld: vitess/lite:v16.0.0-rc1 - vtadmin: vitess/vtadmin:latest + vtadmin: vitess/vtadmin:v16.0.0-rc1 vtgate: vitess/lite:v16.0.0-rc1 vttablet: vitess/lite:v16.0.0-rc1 vtbackup: vitess/lite:v16.0.0-rc1 vtorc: vitess/lite:v16.0.0-rc1 mysqld: - mysql56Compatible: vitess/lite:v16.0.0-rc1 + mysql80Compatible: vitess/lite:v16.0.0-rc1 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 e1e9578c944..bfa95a730a8 100644 --- a/examples/operator/306_down_shard_0.yaml +++ b/examples/operator/306_down_shard_0.yaml @@ -5,13 +5,13 @@ metadata: spec: images: vtctld: vitess/lite:v16.0.0-rc1 - vtadmin: vitess/vtadmin:latest + vtadmin: vitess/vtadmin:v16.0.0-rc1 vtgate: vitess/lite:v16.0.0-rc1 vttablet: vitess/lite:v16.0.0-rc1 vtbackup: vitess/lite:v16.0.0-rc1 vtorc: vitess/lite:v16.0.0-rc1 mysqld: - mysql56Compatible: vitess/lite:v16.0.0-rc1 + mysql80Compatible: vitess/lite:v16.0.0-rc1 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/test/vtop_example.sh b/test/vtop_example.sh index 379217f702c..fc6b9734932 100755 --- a/test/vtop_example.sh +++ b/test/vtop_example.sh @@ -27,6 +27,7 @@ source build.env # set -x shopt -s expand_aliases alias vtctlclient="vtctlclient --server=localhost:15999" +alias vtctldclient="vtctldclient --server=localhost:15999" alias mysql="mysql -h 127.0.0.1 -P 15306 -u user" cd "$VTROOT" @@ -100,7 +101,7 @@ function applySchemaWithRetry() { ks=$2 drop_sql=$3 for i in {1..600} ; do - vtctlclient ApplySchema -sql="$(cat $schema)" $ks + vtctldclient ApplySchema --sql-file="$schema" $ks if [ $? -eq 0 ]; then return fi @@ -168,7 +169,7 @@ function get_started() { sleep 5 applySchemaWithRetry create_commerce_schema.sql commerce drop_all_commerce_tables.sql - vtctlclient ApplyVSchema -vschema="$(cat vschema_commerce_initial.json)" commerce + vtctldclient ApplyVSchema --vschema-file="vschema_commerce_initial.json" commerce if [ $? -ne 0 ]; then echo "ApplySchema failed for initial commerce" printMysqlErrorFiles @@ -232,7 +233,7 @@ function verifyVtadminSetup() { curlGetRequestWithRetry "localhost:14001/api/keyspaces" "commerce" # Verify the other APIs work as well curlGetRequestWithRetry "localhost:14001/api/tablets" '"tablets":\[{"cluster":{"id":"example","name":"example"},"tablet":{"alias":{"cell":"zone1"' - curlGetRequestWithRetry "localhost:14001/api/schemas" '"keyspace":"commerce","table_definitions":\[{"name":"corder","schema":"CREATE TABLE `corder` (\\n `order_id` bigint(20) NOT NULL AUTO_INCREMENT' + curlGetRequestWithRetry "localhost:14001/api/schemas" '"keyspace":"commerce","table_definitions":\[{"name":"corder","schema":"CREATE TABLE `corder` (\\n `order_id` bigint NOT NULL AUTO_INCREMENT' # Verify that we are able to create a keyspace curlPostRequest "localhost:14001/api/keyspace/example" '{"name":"testKeyspace"}' # List the keyspaces and check that we have them both @@ -242,7 +243,7 @@ function verifyVtadminSetup() { # We should still have both the keyspaces curlGetRequestWithRetry "localhost:14001/api/keyspaces" "commerce.*testKeyspace" # Delete the keyspace by using the vtctlclient - vtctlclient DeleteKeyspace testKeyspace + vtctldclient DeleteKeyspace testKeyspace # Verify we still have the commerce keyspace and no other keyspace curlGetRequestWithRetry "localhost:14001/api/keyspaces" "commerce.*}}}}]" } @@ -251,7 +252,7 @@ function verifyVtadminSetup() { function verifyVTOrcSetup() { # Set the primary tablet to readOnly using the vtctld and wait for VTOrc to repair primaryTablet=$(getPrimaryTablet) - vtctlclient SetReadOnly "$primaryTablet" + vtctldclient SetReadOnly "$primaryTablet" # Now that we have set the primary tablet to read only, we know that this will # only succeed if VTOrc is able to fix it @@ -331,7 +332,7 @@ function move_tables() { sleep 10 - vtctlclient MoveTables -source commerce -tables 'customer,corder' Create customer.commerce2customer + vtctldclient LegacyVtctlCommand -- MoveTables --source commerce --tables 'customer,corder' Create customer.commerce2customer if [ $? -ne 0 ]; then echo "MoveTables failed" printMysqlErrorFiles @@ -340,29 +341,28 @@ function move_tables() { sleep 10 - vdiff_out=$(vtctlclient VDiff customer.commerce2customer) - echo "$vdiff_out" | grep "ProcessedRows: 5" | wc -l | grep "2" > /dev/null - if [ $? -ne 0 ]; then - echo -e "VDiff output is invalid, got:\n$vdiff_out" - printMysqlErrorFiles - exit 1 - fi + vdiff_out=$(vtctldclient LegacyVtctlCommand -- VDiff customer.commerce2customer) + echo "$vdiff_out" | grep "ProcessedRows: 5" | wc -l | grep "2" > /dev/null + if [ $? -ne 0 ]; then + echo -e "VDiff output is invalid, got:\n$vdiff_out" + # Allow failure + fi - vtctlclient MoveTables -tablet_types=rdonly,replica SwitchTraffic customer.commerce2customer + vtctldclient LegacyVtctlCommand -- MoveTables --tablet_types='rdonly,replica' SwitchTraffic customer.commerce2customer if [ $? -ne 0 ]; then echo "SwitchTraffic for rdonly and replica failed" printMysqlErrorFiles exit 1 fi - vtctlclient MoveTables -tablet_types=primary SwitchTraffic customer.commerce2customer + vtctldclient LegacyVtctlCommand -- MoveTables --tablet_types='primary' SwitchTraffic customer.commerce2customer if [ $? -ne 0 ]; then echo "SwitchTraffic for primary failed" printMysqlErrorFiles exit 1 fi - vtctlclient MoveTables Complete customer.commerce2customer + vtctldclient LegacyVtctlCommand -- MoveTables Complete customer.commerce2customer if [ $? -ne 0 ]; then echo "MoveTables Complete failed" printMysqlErrorFiles @@ -376,14 +376,14 @@ function resharding() { echo "Create new schemas for new shards" applySchemaWithRetry create_commerce_seq.sql commerce sleep 4 - vtctlclient ApplyVSchema -vschema="$(cat vschema_commerce_seq.json)" commerce + vtctldclient ApplyVSchema --vschema-file="vschema_commerce_seq.json" commerce if [ $? -ne 0 ]; then echo "ApplyVschema commerce_seq during resharding failed" printMysqlErrorFiles exit 1 fi sleep 4 - vtctlclient ApplyVSchema -vschema="$(cat vschema_customer_sharded.json)" customer + vtctldclient ApplyVSchema --vschema-file="vschema_customer_sharded.json" customer if [ $? -ne 0 ]; then echo "ApplyVschema customer_sharded during resharding failed" printMysqlErrorFiles @@ -407,7 +407,7 @@ function resharding() { echo "Ready to reshard ..." sleep 15 - vtctlclient Reshard -source_shards '-' -target_shards '-80,80-' Create customer.cust2cust + vtctldclient LegacyVtctlCommand -- Reshard --source_shards '-' --target_shards '-80,80-' Create customer.cust2cust if [ $? -ne 0 ]; then echo "Reshard Create failed" printMysqlErrorFiles @@ -416,20 +416,20 @@ function resharding() { sleep 15 - vdiff_out=$(vtctlclient VDiff customer.cust2cust) + vdiff_out=$(vtctldclient LegacyVtctlCommand -- VDiff customer.cust2cust) echo "$vdiff_out" | grep "ProcessedRows: 5" | wc -l | grep "2" > /dev/null if [ $? -ne 0 ]; then echo -e "VDiff output is invalid, got:\n$vdiff_out" # Allow failure fi - vtctlclient Reshard -tablet_types=rdonly,replica SwitchTraffic customer.cust2cust + vtctldclient LegacyVtctlCommand -- Reshard --tablet_types='rdonly,replica' SwitchTraffic customer.cust2cust if [ $? -ne 0 ]; then echo "Reshard SwitchTraffic for replica,rdonly failed" printMysqlErrorFiles exit 1 fi - vtctlclient Reshard -tablet_types=primary SwitchTraffic customer.cust2cust + vtctldclient LegacyVtctlCommand -- Reshard --tablet_types='primary' SwitchTraffic customer.cust2cust if [ $? -ne 0 ]; then echo "Reshard SwitchTraffic for primary failed" printMysqlErrorFiles diff --git a/tools/release_utils.sh b/tools/release_utils.sh index 41c90a3fe1c..ff7d348bcd3 100755 --- a/tools/release_utils.sh +++ b/tools/release_utils.sh @@ -84,6 +84,7 @@ function updateVitessExamples () { compose_example_sub_files=$(find -E $ROOT/examples/compose/**/* -regex ".*.(go|yml)") vtop_example_files=$(find -E $ROOT/examples/operator -name "*.yaml") sed -i.bak -E "s/vitess\/lite:(.*)/vitess\/lite:v$1/g" $compose_example_files $compose_example_sub_files $vtop_example_files + sed -i.bak -E "s/vitess\/vtadmin:(.*)/vitess\/vtadmin:v$1/g" $compose_example_files $compose_example_sub_files $vtop_example_files sed -i.bak -E "s/vitess\/lite:\${VITESS_TAG:-latest}/vitess\/lite:v$1/g" $compose_example_sub_files $vtop_example_files sed -i.bak -E "s/vitess\/lite:(.*)-mysql80/vitess\/lite:v$1-mysql80/g" $(find -E $ROOT/examples/operator -name "*.md") if [ "$2" != "" ]; then From e429768d1b78fad9ffa3414f6ab618b4065c53d5 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Thu, 23 Feb 2023 13:11:24 +0100 Subject: [PATCH 028/233] Sidecar schema init: use COPY algorithm while altering sidecardb tables (#12436) * schemadiff: AlterTableAlgorithmStratgy Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Signed-off-by: Rohit Nayak * minor rename Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Signed-off-by: Rohit Nayak * Use COPY algorithm while altering sidecardb tables Signed-off-by: Rohit Nayak --------- Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Signed-off-by: Rohit Nayak Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/schemadiff/table.go | 27 ++++++++++++++++++++--- go/vt/schemadiff/table_test.go | 27 +++++++++++++++++++++++ go/vt/schemadiff/types.go | 8 +++++++ go/vt/sidecardb/sidecardb.go | 1 + go/vt/sidecardb/sidecardb_test.go | 36 +++++++++++++++++++++++++++++++ 5 files changed, 96 insertions(+), 3 deletions(-) diff --git a/go/vt/schemadiff/table.go b/go/vt/schemadiff/table.go index f6b7677e8bf..f58faa06310 100644 --- a/go/vt/schemadiff/table.go +++ b/go/vt/schemadiff/table.go @@ -775,15 +775,34 @@ func (c *CreateTableEntity) TableDiff(other *CreateTableEntity, hints *DiffHints } } tableSpecHasChanged := len(alterTable.AlterOptions) > 0 || alterTable.PartitionOption != nil || alterTable.PartitionSpec != nil + + newAlterTableEntityDiff := func(alterTable *sqlparser.AlterTable) *AlterTableEntityDiff { + d := &AlterTableEntityDiff{alterTable: alterTable, from: c, to: other} + + var algorithmValue sqlparser.AlgorithmValue + + switch hints.AlterTableAlgorithmStrategy { + case AlterTableAlgorithmStrategyCopy: + algorithmValue = sqlparser.AlgorithmValue("COPY") + case AlterTableAlgorithmStrategyInplace: + algorithmValue = sqlparser.AlgorithmValue("INPLACE") + case AlterTableAlgorithmStrategyInstant: + algorithmValue = sqlparser.AlgorithmValue("INSTANT") + } + if algorithmValue != "" { + alterTable.AlterOptions = append(alterTable.AlterOptions, algorithmValue) + } + return d + } if tableSpecHasChanged { - parentAlterTableEntityDiff = &AlterTableEntityDiff{alterTable: alterTable, from: c, to: other} + parentAlterTableEntityDiff = newAlterTableEntityDiff(alterTable) } for _, superfluousFulltextKey := range superfluousFulltextKeys { alterTable := &sqlparser.AlterTable{ Table: c.CreateTable.Table, AlterOptions: []sqlparser.AlterOption{superfluousFulltextKey}, } - diff := &AlterTableEntityDiff{alterTable: alterTable, from: c, to: other} + diff := newAlterTableEntityDiff(alterTable) // if we got superfluous fulltext keys, that means the table spec has changed, ie // parentAlterTableEntityDiff is not nil parentAlterTableEntityDiff.addSubsequentDiff(diff) @@ -793,7 +812,7 @@ func (c *CreateTableEntity) TableDiff(other *CreateTableEntity, hints *DiffHints Table: c.CreateTable.Table, PartitionSpec: partitionSpec, } - diff := &AlterTableEntityDiff{alterTable: alterTable, from: c, to: other} + diff := newAlterTableEntityDiff(alterTable) if parentAlterTableEntityDiff == nil { parentAlterTableEntityDiff = diff } else { @@ -1990,6 +2009,8 @@ func (c *CreateTableEntity) apply(diff *AlterTableEntityDiff) error { c.TableSpec.Options = append(c.TableSpec.Options, option) }() } + case sqlparser.AlgorithmValue: + // silently ignore. This has an operational effect on the MySQL engine, but has no semantical effect. default: return &UnsupportedApplyOperationError{Statement: sqlparser.CanonicalString(opt)} } diff --git a/go/vt/schemadiff/table_test.go b/go/vt/schemadiff/table_test.go index 4f5fd8424db..18fce4ec759 100644 --- a/go/vt/schemadiff/table_test.go +++ b/go/vt/schemadiff/table_test.go @@ -45,6 +45,7 @@ func TestCreateTableDiff(t *testing.T) { colrename int constraint int charset int + algorithm int }{ { name: "identical", @@ -1114,6 +1115,31 @@ func TestCreateTableDiff(t *testing.T) { diff: "alter table t1 comment ''", cdiff: "ALTER TABLE `t1` COMMENT ''", }, + // algorithm + { + name: "algorithm: COPY", + from: "create table t1 (`id` int primary key)", + to: "create table t2 (id int primary key, `i` int not null default 0)", + diff: "alter table t1 add column i int not null default 0, algorithm = COPY", + cdiff: "ALTER TABLE `t1` ADD COLUMN `i` int NOT NULL DEFAULT 0, ALGORITHM = COPY", + algorithm: AlterTableAlgorithmStrategyCopy, + }, + { + name: "algorithm: INPLACE", + from: "create table t1 (`id` int primary key)", + to: "create table t2 (id int primary key, `i` int not null default 0)", + diff: "alter table t1 add column i int not null default 0, algorithm = INPLACE", + cdiff: "ALTER TABLE `t1` ADD COLUMN `i` int NOT NULL DEFAULT 0, ALGORITHM = INPLACE", + algorithm: AlterTableAlgorithmStrategyInplace, + }, + { + name: "algorithm: INSTANT", + from: "create table t1 (`id` int primary key)", + to: "create table t2 (id int primary key, `i` int not null default 0)", + diff: "alter table t1 add column i int not null default 0, algorithm = INSTANT", + cdiff: "ALTER TABLE `t1` ADD COLUMN `i` int NOT NULL DEFAULT 0, ALGORITHM = INSTANT", + algorithm: AlterTableAlgorithmStrategyInstant, + }, } standardHints := DiffHints{} for _, ts := range tt { @@ -1140,6 +1166,7 @@ func TestCreateTableDiff(t *testing.T) { hints.ColumnRenameStrategy = ts.colrename hints.FullTextKeyStrategy = ts.fulltext hints.TableCharsetCollateStrategy = ts.charset + hints.AlterTableAlgorithmStrategy = ts.algorithm alter, err := c.Diff(other, &hints) require.Equal(t, len(ts.diffs), len(ts.cdiffs)) diff --git a/go/vt/schemadiff/types.go b/go/vt/schemadiff/types.go index 365c5cfb7fb..1f1186b41bd 100644 --- a/go/vt/schemadiff/types.go +++ b/go/vt/schemadiff/types.go @@ -94,6 +94,13 @@ const ( TableCharsetCollateIgnoreAlways ) +const ( + AlterTableAlgorithmStrategyNone int = iota + AlterTableAlgorithmStrategyInstant + AlterTableAlgorithmStrategyInplace + AlterTableAlgorithmStrategyCopy +) + // DiffHints is an assortment of rules for diffing entities type DiffHints struct { StrictIndexOrdering bool @@ -104,4 +111,5 @@ type DiffHints struct { TableRenameStrategy int FullTextKeyStrategy int TableCharsetCollateStrategy int + AlterTableAlgorithmStrategy int } diff --git a/go/vt/sidecardb/sidecardb.go b/go/vt/sidecardb/sidecardb.go index 4c3ebf6caab..840fb16b849 100644 --- a/go/vt/sidecardb/sidecardb.go +++ b/go/vt/sidecardb/sidecardb.go @@ -306,6 +306,7 @@ func (si *schemaInit) getCurrentSchema(tableName string) (string, error) { func (si *schemaInit) findTableSchemaDiff(tableName, current, desired string) (string, error) { hints := &schemadiff.DiffHints{ TableCharsetCollateStrategy: schemadiff.TableCharsetCollateIgnoreAlways, + AlterTableAlgorithmStrategy: schemadiff.AlterTableAlgorithmStrategyCopy, } diff, err := schemadiff.DiffCreateTablesQueries(current, desired, hints) if err != nil { diff --git a/go/vt/sidecardb/sidecardb_test.go b/go/vt/sidecardb/sidecardb_test.go index 136d814f12c..1f6b58ac493 100644 --- a/go/vt/sidecardb/sidecardb_test.go +++ b/go/vt/sidecardb/sidecardb_test.go @@ -20,6 +20,8 @@ import ( "context" "testing" + "vitess.io/vitess/go/vt/sqlparser" + "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql/fakesqldb" @@ -113,3 +115,37 @@ func TestValidateSchema(t *testing.T) { }) } } + +// TestAlterTableAlgorithm confirms that we use ALGORITHM=COPY during alter tables +func TestAlterTableAlgorithm(t *testing.T) { + type testCase struct { + testName string + tableName string + currentSchema string + desiredSchema string + } + testCases := []testCase{ + {"add column", "t1", "create table if not exists _vt.t1(i int)", "create table if not exists _vt.t1(i int, i1 int)"}, + {"modify column", "t1", "create table if not exists _vt.t1(i int)", "create table if not exists _vt.t(i float)"}, + } + si := &schemaInit{} + copyAlgo := sqlparser.AlgorithmValue("COPY") + for _, tc := range testCases { + t.Run(tc.testName, func(t *testing.T) { + diff, err := si.findTableSchemaDiff(tc.tableName, tc.currentSchema, tc.desiredSchema) + require.NoError(t, err) + stmt, err := sqlparser.Parse(diff) + require.NoError(t, err) + alterTable, ok := stmt.(*sqlparser.AlterTable) + require.True(t, ok) + require.NotNil(t, alterTable) + var alterAlgo sqlparser.AlterOption + for i, opt := range alterTable.AlterOptions { + if _, ok := opt.(sqlparser.AlgorithmValue); ok { + alterAlgo = alterTable.AlterOptions[i] + } + } + require.Equal(t, copyAlgo, alterAlgo) + }) + } +} From a8e11e877d5d84c2a47bb69f2990c35ffb740d88 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 23 Feb 2023 15:52:18 +0200 Subject: [PATCH 029/233] Update additional Go dependencies (#12402) Dependabot does pick up these go.mod files but somehow fails to open PRs for them to update things that are vulnerable. So doing it manually here. Signed-off-by: Dirkjan Bussink Co-authored-by: Dirkjan Bussink --- examples/are-you-alive/go.mod | 12 +- examples/are-you-alive/go.sum | 432 ++++++++++++++++++++++++++++++++-- vitess-mixin/go.mod | 1 + vitess-mixin/go.sum | 12 +- 4 files changed, 422 insertions(+), 35 deletions(-) diff --git a/examples/are-you-alive/go.mod b/examples/are-you-alive/go.mod index 83e51ec7293..e3069908616 100644 --- a/examples/are-you-alive/go.mod +++ b/examples/are-you-alive/go.mod @@ -3,11 +3,11 @@ module vitess.io/vitess/examples/are-you-alive go 1.14 require ( - github.com/go-sql-driver/mysql v1.5.0 - github.com/prometheus/client_golang v1.6.0 - github.com/sirupsen/logrus v1.6.0 + github.com/go-sql-driver/mysql v1.7.0 + github.com/prometheus/client_golang v1.14.0 + github.com/sirupsen/logrus v1.9.0 go.uber.org/atomic v1.9.0 // indirect - go.uber.org/ratelimit v0.1.0 - golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 // indirect - gopkg.in/yaml.v2 v2.2.8 + go.uber.org/ratelimit v0.2.0 + golang.org/x/sys v0.5.0 // indirect + gopkg.in/yaml.v2 v2.4.0 ) diff --git a/examples/are-you-alive/go.sum b/examples/are-you-alive/go.sum index ed267a8aa62..9d5e2d8915f 100644 --- a/examples/are-you-alive/go.sum +++ b/examples/are-you-alive/go.sum @@ -1,43 +1,148 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI= +github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +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.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -51,71 +156,348 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.6.0 h1:YVPodQOcK15POxhgARIvnDRVpLcuK8mglnMrWfyrw6A= -github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= -github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/ratelimit v0.1.0 h1:U2AruXqeTb4Eh9sYQSTrMhH8Cb7M0Ian2ibBOnBcnAw= -go.uber.org/ratelimit v0.1.0/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y= +go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA= +go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/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/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +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= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +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= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +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/vitess-mixin/go.mod b/vitess-mixin/go.mod index 1fccac806b8..321057445c1 100644 --- a/vitess-mixin/go.mod +++ b/vitess-mixin/go.mod @@ -14,6 +14,7 @@ require ( // See https://github.com/prometheus/prometheus/issues/5590#issuecomment-546368944 github.com/prometheus/prometheus v1.8.2-0.20191017095924-6f92ce560538 github.com/stretchr/testify v1.7.1 + golang.org/x/net v0.7.0 // indirect vitess.io/vitess v0.15.2 ) diff --git a/vitess-mixin/go.sum b/vitess-mixin/go.sum index 52e275f0d69..2190300691e 100644 --- a/vitess-mixin/go.sum +++ b/vitess-mixin/go.sum @@ -910,8 +910,9 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b 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-20211112202133-69e39bad7dc2/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-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1018,11 +1019,13 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/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.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= @@ -1035,8 +1038,9 @@ 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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -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-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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= From 57f469d95ab8a51849537473b7a0b627065c41c9 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 23 Feb 2023 16:53:18 +0100 Subject: [PATCH 030/233] [release-16.0] SidecarDB Init: don't fail on schema init errors (#12328) (#12431) * Don't fail on schema init errors Signed-off-by: Rohit Nayak * Fix debug var attribute name Signed-off-by: Rohit Nayak * Fix typo in debug var Signed-off-by: Rohit Nayak * Address review comment Signed-off-by: Rohit Nayak * Address review comments Signed-off-by: Rohit Nayak --------- Signed-off-by: Rohit Nayak Co-authored-by: Rohit Nayak --- .../replication_manager/tablet_test.go | 13 +- go/test/endtoend/vreplication/helper_test.go | 1 + .../endtoend/vreplication/sidecardb_test.go | 4 +- go/vt/sidecardb/sidecardb.go | 95 +++++++++-- go/vt/sidecardb/sidecardb_test.go | 150 ++++++++++++++---- 5 files changed, 218 insertions(+), 45 deletions(-) diff --git a/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go b/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go index 34f3b272e61..86b02244762 100644 --- a/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go +++ b/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go @@ -24,6 +24,8 @@ import ( "testing" "time" + "vitess.io/vitess/go/vt/sidecardb" + "github.com/stretchr/testify/require" "vitess.io/vitess/go/test/endtoend/cluster" @@ -164,11 +166,12 @@ func waitForSourcePort(ctx context.Context, t *testing.T, tablet cluster.Vttable return fmt.Errorf("time out before source port became %v for %v", expectedPort, tablet.Alias) } -func getSidecarDbDDLQueryCount(tablet *cluster.VttabletProcess) (int64, error) { +func getSidecarDBDDLQueryCount(tablet *cluster.VttabletProcess) (int64, error) { vars := tablet.GetVars() - val, ok := vars["SidecarDbDDLQueryCount"] + key := sidecardb.StatsKeyQueryCount + val, ok := vars[key] if !ok { - return 0, fmt.Errorf("SidecarDbDDLQueryCount not found in debug/vars") + return 0, fmt.Errorf("%s not found in debug/vars", key) } return int64(val.(float64)), nil } @@ -178,7 +181,7 @@ func TestReplicationRepairAfterPrimaryTabletChange(t *testing.T) { err := waitForSourcePort(ctx, t, replicaTablet, int32(primaryTablet.MySQLPort)) require.NoError(t, err) - sidecarDDLCount, err := getSidecarDbDDLQueryCount(primaryTablet.VttabletProcess) + sidecarDDLCount, err := getSidecarDBDDLQueryCount(primaryTablet.VttabletProcess) require.NoError(t, err) // sidecar db should create all _vt tables when vttablet started require.Greater(t, sidecarDDLCount, int64(0)) @@ -197,7 +200,7 @@ func TestReplicationRepairAfterPrimaryTabletChange(t *testing.T) { err = waitForSourcePort(ctx, t, replicaTablet, int32(newMysqlPort)) require.NoError(t, err) - sidecarDDLCount, err = getSidecarDbDDLQueryCount(primaryTablet.VttabletProcess) + sidecarDDLCount, err = getSidecarDBDDLQueryCount(primaryTablet.VttabletProcess) require.NoError(t, err) // sidecardb should find the desired _vt schema and not apply any new creates or upgrades when the tablet comes up again require.Equal(t, sidecarDDLCount, int64(0)) diff --git a/go/test/endtoend/vreplication/helper_test.go b/go/test/endtoend/vreplication/helper_test.go index cda35f42cfc..bc3ace3f064 100644 --- a/go/test/endtoend/vreplication/helper_test.go +++ b/go/test/endtoend/vreplication/helper_test.go @@ -526,6 +526,7 @@ func getDebugVar(t *testing.T, port int, varPath []string) (string, error) { var val []byte var err error url := fmt.Sprintf("http://localhost:%d/debug/vars", port) + log.Infof("url: %s, varPath: %s", url, strings.Join(varPath, ":")) body := getHTTPBody(url) val, _, _, err = jsonparser.Get([]byte(body), varPath...) require.NoError(t, err) diff --git a/go/test/endtoend/vreplication/sidecardb_test.go b/go/test/endtoend/vreplication/sidecardb_test.go index a40a80736af..56ca2d08acd 100644 --- a/go/test/endtoend/vreplication/sidecardb_test.go +++ b/go/test/endtoend/vreplication/sidecardb_test.go @@ -5,6 +5,8 @@ import ( "strconv" "testing" + "vitess.io/vitess/go/vt/sidecardb" + "github.com/stretchr/testify/require" "github.com/tidwall/gjson" ) @@ -130,7 +132,7 @@ func modifySidecarDBSchema(t *testing.T, vc *VitessCluster, tabletID string, ddl } func getNumExecutedDDLQueries(t *testing.T, port int) int { - val, err := getDebugVar(t, port, []string{"SidecarDbDDLQueryCount"}) + val, err := getDebugVar(t, port, []string{sidecardb.StatsKeyQueryCount}) require.NoError(t, err) i, err := strconv.Atoi(val) require.NoError(t, err) diff --git a/go/vt/sidecardb/sidecardb.go b/go/vt/sidecardb/sidecardb.go index 840fb16b849..3d955995a6a 100644 --- a/go/vt/sidecardb/sidecardb.go +++ b/go/vt/sidecardb/sidecardb.go @@ -25,7 +25,9 @@ import ( "regexp" "runtime" "strings" + "sync" + "vitess.io/vitess/go/history" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/mysql/fakesqldb" @@ -71,10 +73,50 @@ func (t *sidecarTable) String() string { var sidecarTables []*sidecarTable var ddlCount *stats.Counter +var ddlErrorCount *stats.Counter +var ddlErrorHistory *history.History +var mu sync.Mutex + +type ddlError struct { + tableName string + err error +} + +const maxDDLErrorHistoryLength = 100 + +// failOnSchemaInitError decides whether we fail the schema init process when we encounter an error while +// applying a table schema upgrade DDL or continue with the next table. +// If true, tablets will not launch. The cluster will not come up until the issue is resolved. +// If false, the init process will continue trying to upgrade other tables. So some functionality might be broken +// due to an incorrect schema, but the cluster should come up and serve queries. +// This is an operational trade-off: if we always fail it could cause a major incident since the entire cluster will be down. +// If we are more permissive, it could cause hard-to-detect errors, because a module +// doesn't load or behaves incorrectly due to an incomplete upgrade. Errors however will be reported and if the +// related stats endpoints are monitored we should be able to diagnose/get alerted in a timely fashion. +const failOnSchemaInitError = false + +const StatsKeyPrefix = "SidecarDBDDL" +const StatsKeyQueryCount = StatsKeyPrefix + "QueryCount" +const StatsKeyErrorCount = StatsKeyPrefix + "ErrorCount" +const StatsKeyErrors = StatsKeyPrefix + "Errors" func init() { initSchemaFiles() - ddlCount = stats.NewCounter("SidecarDbDDLQueryCount", "Number of create/upgrade queries executed") + ddlCount = stats.NewCounter(StatsKeyQueryCount, "Number of queries executed") + ddlErrorCount = stats.NewCounter(StatsKeyErrorCount, "Number of errors during sidecar schema upgrade") + ddlErrorHistory = history.New(maxDDLErrorHistoryLength) + stats.Publish(StatsKeyErrors, stats.StringMapFunc(func() map[string]string { + mu.Lock() + defer mu.Unlock() + result := make(map[string]string, len(ddlErrorHistory.Records())) + for _, e := range ddlErrorHistory.Records() { + d, ok := e.(*ddlError) + if ok { + result[d.tableName] = d.err.Error() + } + } + return result + })) } func validateSchemaDefinition(name, schema string) (string, error) { @@ -90,14 +132,14 @@ func validateSchemaDefinition(name, schema string) (string, error) { tableName := createTable.Table.Name.String() qualifier := createTable.Table.Qualifier.String() if qualifier != SidecarDBName { - return "", fmt.Errorf("database qualifier specified for the %s table is %s rather than the expected value of %s", + return "", vterrors.Errorf(vtrpcpb.Code_INTERNAL, "database qualifier specified for the %s table is %s rather than the expected value of %s", name, qualifier, SidecarDBName) } if !strings.EqualFold(tableName, name) { - return "", fmt.Errorf("table name of %s does not match the table name specified within the file: %s", name, tableName) + return "", vterrors.Errorf(vtrpcpb.Code_INTERNAL, "table name of %s does not match the table name specified within the file: %s", name, tableName) } if !createTable.IfNotExists { - return "", fmt.Errorf("%s file did not include the required IF NOT EXISTS clause in the CREATE TABLE statement for the %s table", name, tableName) + return "", vterrors.Errorf(vtrpcpb.Code_NOT_FOUND, "%s file did not include the required IF NOT EXISTS clause in the CREATE TABLE statement for the %s table", name, tableName) } normalizedSchema := sqlparser.CanonicalString(createTable) return normalizedSchema, nil @@ -123,7 +165,7 @@ func initSchemaFiles() { case 2: module = fmt.Sprintf("%s/%s", dirparts[0], dirparts[1]) default: - return fmt.Errorf("unexpected path value of %s specified for sidecar schema table; expected structure is [/]/.sql", dir) + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "unexpected path value of %s specified for sidecar schema table; expected structure is [/]/.sql", dir) } name := strings.Split(fname, ".")[0] @@ -163,11 +205,28 @@ type schemaInit struct { // Exec is a callback that has to be passed to Init() to execute the specified query in the database. type Exec func(ctx context.Context, query string, maxRows int, useDB bool) (*sqltypes.Result, error) -// GetDDLCount metric returns the count of sidecardb ddls that have been run as part of this vttablet's init process. +// GetDDLCount returns the count of sidecardb DDLs that have been run as part of this vttablet's init process. func GetDDLCount() int64 { return ddlCount.Get() } +// GetDDLErrorCount returns the count of sidecardb DDLs that have been errored out as part of this vttablet's init process. +func GetDDLErrorCount() int64 { + return ddlErrorCount.Get() +} + +// GetDDLErrorHistory returns the errors encountered as part of this vttablet's init process.. +func GetDDLErrorHistory() []*ddlError { + var errors []*ddlError + for _, e := range ddlErrorHistory.Records() { + ddle, ok := e.(*ddlError) + if ok { + errors = append(errors, ddle) + } + } + return errors +} + // Init creates or upgrades the sidecar database based on declarative schema for all tables in the schema. func Init(ctx context.Context, exec Exec) error { printCallerDetails() // for debug purposes only, remove in v17 @@ -249,7 +308,7 @@ func (si *schemaInit) doesSidecarDBExist() (bool, error) { return true, nil default: log.Errorf("found too many rows for sidecarDB %s: %d", SidecarDBName, len(rs.Rows)) - return false, fmt.Errorf("found too many rows for sidecarDB %s: %d", SidecarDBName, len(rs.Rows)) + return false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "found too many rows for sidecarDB %s: %d", SidecarDBName, len(rs.Rows)) } } @@ -322,7 +381,7 @@ func (si *schemaInit) findTableSchemaDiff(tableName, current, desired string) (s if ddl == "" { log.Infof("No changes needed for table %s", tableName) } else { - log.Infof("Applying ddl for table %s:\n%s", tableName, ddl) + log.Infof("Applying DDL for table %s:\n%s", tableName, ddl) } } @@ -358,10 +417,15 @@ func (si *schemaInit) ensureSchema(table *sidecarTable) error { } _, err := si.exec(ctx, ddl, 1, true) if err != nil { - log.Errorf("Error running ddl %s for table %s during sidecar database initialization %s: %+v", ddl, table, err) - return err + ddlErr := vterrors.Wrapf(err, + "Error running DDL %s for table %s during sidecar database initialization", ddl, table) + recordDDLError(table.name, ddlErr) + if failOnSchemaInitError { + return ddlErr + } + return nil } - log.Infof("Applied ddl %s for table %s during sidecar database initialization %s", ddl, table) + log.Infof("Applied DDL %s for table %s during sidecar database initialization", ddl, table) ddlCount.Add(1) return nil } @@ -369,6 +433,15 @@ func (si *schemaInit) ensureSchema(table *sidecarTable) error { return nil } +func recordDDLError(tableName string, err error) { + log.Error(err) + ddlErrorCount.Add(1) + ddlErrorHistory.Add(&ddlError{ + tableName: tableName, + err: err, + }) +} + // region unit-test-only // This section uses helpers used in tests, but also in the go/vt/vtexplain/vtexplain_vttablet.go. // Hence, it is here and not in the _test.go file. diff --git a/go/vt/sidecardb/sidecardb_test.go b/go/vt/sidecardb/sidecardb_test.go index 1f6b58ac493..1ca8f2f63a4 100644 --- a/go/vt/sidecardb/sidecardb_test.go +++ b/go/vt/sidecardb/sidecardb_test.go @@ -18,18 +18,26 @@ package sidecardb import ( "context" + "expvar" + "fmt" + "sort" + "strings" "testing" "vitess.io/vitess/go/vt/sqlparser" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/stats" + "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/sqltypes" ) -// Tests all non-error code paths in sidecardb -func TestAllSidecarDB(t *testing.T) { +// TestInitErrors validates that the schema init error stats are being correctly set +func TestInitErrors(t *testing.T) { + ctx := context.Background() + db := fakesqldb.New(t) defer db.Close() AddSchemaInitQueries(db, false) @@ -42,50 +50,79 @@ func TestAllSidecarDB(t *testing.T) { db.AddQuery("select @@session.sql_mode as sql_mode", sqlMode) db.AddQueryPattern("set @@session.sql_mode=.*", &sqltypes.Result{}) - ctx := context.Background() + ddlErrorCount.Set(0) + ddlCount.Set(0) + cp := db.ConnParams() conn, err := cp.Connect(ctx) require.NoError(t, err) + + type schemaError struct { + tableName string + errorValue string + } + + // simulate two errors during table creation to validate error stats + schemaErrors := []schemaError{ + {"vreplication_log", "vreplication_log error"}, + {"copy_state", "copy_state error"}, + } + exec := func(ctx context.Context, query string, maxRows int, useDB bool) (*sqltypes.Result, error) { if useDB { if _, err := conn.ExecuteFetch(UseSidecarDatabaseQuery, maxRows, true); err != nil { return nil, err } } + + // simulate errors for the table creation DDLs applied for tables specified in schemaErrors + stmt, err := sqlparser.Parse(query) + if err != nil { + return nil, err + } + createTable, ok := stmt.(*sqlparser.CreateTable) + if ok { + for _, e := range schemaErrors { + if strings.EqualFold(e.tableName, createTable.Table.Name.String()) { + return nil, fmt.Errorf(e.errorValue) + } + } + } return conn.ExecuteFetch(query, maxRows, true) } - // tests init on empty db require.Equal(t, int64(0), GetDDLCount()) err = Init(ctx, exec) require.NoError(t, err) - require.Equal(t, int64(len(sidecarTables)), GetDDLCount()) - - // tests init on already inited db - AddSchemaInitQueries(db, true) - err = Init(ctx, exec) - require.NoError(t, err) - require.Equal(t, int64(len(sidecarTables)), GetDDLCount()) + require.Equal(t, int64(len(sidecarTables)-len(schemaErrors)), GetDDLCount()) + require.Equal(t, int64(len(schemaErrors)), GetDDLErrorCount()) - // tests misc paths not covered above - si := &schemaInit{ - ctx: ctx, - exec: exec, + var want []string + for _, e := range schemaErrors { + want = append(want, e.errorValue) } - result := sqltypes.MakeTestResult(sqltypes.MakeTestFields( - "Database", - "varchar"), - "currentDB", - ) - db.AddQuery(SelectCurrentDatabaseQuery, result) - - currentDB, err := si.setCurrentDatabase("dbname") - require.NoError(t, err) - require.Equal(t, "currentDB", currentDB) + // sort expected and reported errors for easy comparison + sort.Strings(want) + got := GetDDLErrorHistory() + sort.Slice(got, func(i, j int) bool { + return got[i].tableName < got[j].tableName + }) + var gotErrors string + stats.Register(func(name string, v expvar.Var) { + if name == StatsKeyErrors { + gotErrors = v.String() + } + }) - require.False(t, MatchesInitQuery("abc")) - require.True(t, MatchesInitQuery(SelectCurrentDatabaseQuery)) - require.True(t, MatchesInitQuery("CREATE TABLE IF NOT EXISTS `_vt`.vreplication")) + // for DDL errors, validate both the internal data structure and the stats endpoint + for i := range want { + if !strings.Contains(got[i].err.Error(), want[i]) { + require.FailNowf(t, "incorrect schema error", "got %s, want %s", got[i], want[i]) + } + if !strings.Contains(gotErrors, want[i]) { + require.FailNowf(t, "schema error not published", "got %s, want %s", gotErrors, want[i]) + } + } } // test the logic that confirms that the user defined schema's table name and qualifier are valid @@ -149,3 +186,60 @@ func TestAlterTableAlgorithm(t *testing.T) { }) } } + +// Tests various non-error code paths in sidecardb +func TestMiscSidecarDB(t *testing.T) { + ctx := context.Background() + + db := fakesqldb.New(t) + defer db.Close() + AddSchemaInitQueries(db, false) + db.AddQuery("use dbname", &sqltypes.Result{}) + db.AddQueryPattern("set @@session.sql_mode=.*", &sqltypes.Result{}) + + cp := db.ConnParams() + conn, err := cp.Connect(ctx) + require.NoError(t, err) + exec := func(ctx context.Context, query string, maxRows int, useDB bool) (*sqltypes.Result, error) { + if useDB { + if _, err := conn.ExecuteFetch(UseSidecarDatabaseQuery, maxRows, true); err != nil { + return nil, err + } + } + return conn.ExecuteFetch(query, maxRows, true) + } + + // tests init on empty db + ddlErrorCount.Set(0) + ddlCount.Set(0) + require.Equal(t, int64(0), GetDDLCount()) + err = Init(ctx, exec) + require.NoError(t, err) + require.Equal(t, int64(len(sidecarTables)), GetDDLCount()) + + // tests init on already inited db + AddSchemaInitQueries(db, true) + err = Init(ctx, exec) + require.NoError(t, err) + require.Equal(t, int64(len(sidecarTables)), GetDDLCount()) + + // tests misc paths not covered above + si := &schemaInit{ + ctx: ctx, + exec: exec, + } + result := sqltypes.MakeTestResult(sqltypes.MakeTestFields( + "Database", + "varchar"), + "currentDB", + ) + db.AddQuery(SelectCurrentDatabaseQuery, result) + + currentDB, err := si.setCurrentDatabase("dbname") + require.NoError(t, err) + require.Equal(t, "currentDB", currentDB) + + require.False(t, MatchesInitQuery("abc")) + require.True(t, MatchesInitQuery(SelectCurrentDatabaseQuery)) + require.True(t, MatchesInitQuery("CREATE TABLE IF NOT EXISTS `_vt`.vreplication")) +} From 1deb99234d8a81bc6994ce5ba16ba2830f858f79 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 23 Feb 2023 23:52:59 +0530 Subject: [PATCH 031/233] GetSchema rpc to streaming api (#12447) * GetSchema rpc to streaming api Signed-off-by: Harshit Gangal * addressed review comment Signed-off-by: Harshit Gangal --------- Signed-off-by: Harshit Gangal --- go/vt/proto/queryservice/queryservice.pb.go | 12 +-- .../queryservice/queryservice_grpc.pb.go | 81 ++++++++++++------- go/vt/vtcombo/tablet_map.go | 6 +- go/vt/vtgate/schema/tracker.go | 44 +++++----- go/vt/vttablet/endtoend/framework/client.go | 10 ++- go/vt/vttablet/grpcqueryservice/server.go | 12 +-- go/vt/vttablet/grpctabletconn/conn.go | 42 +++++++--- go/vt/vttablet/queryservice/queryservice.go | 2 +- go/vt/vttablet/queryservice/wrapped.go | 7 +- go/vt/vttablet/sandboxconn/sandboxconn.go | 12 +-- .../tabletconntest/fakequeryservice.go | 2 +- go/vt/vttablet/tabletserver/query_executor.go | 37 ++++----- go/vt/vttablet/tabletserver/tabletserver.go | 5 +- proto/queryservice.proto | 4 +- 14 files changed, 163 insertions(+), 113 deletions(-) diff --git a/go/vt/proto/queryservice/queryservice.pb.go b/go/vt/proto/queryservice/queryservice.pb.go index 211030f1cee..3d72458cb27 100644 --- a/go/vt/proto/queryservice/queryservice.pb.go +++ b/go/vt/proto/queryservice/queryservice.pb.go @@ -45,7 +45,7 @@ var file_queryservice_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x32, 0xd0, 0x10, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x07, 0x45, + 0x6f, 0x32, 0xd2, 0x10, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, @@ -174,14 +174,14 @@ var file_queryservice_proto_rawDesc = []byte{ 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x40, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, + 0x30, 0x01, 0x12, 0x42, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x17, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, - 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0x2b, 0x5a, 0x29, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, + 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_queryservice_proto_goTypes = []interface{}{ diff --git a/go/vt/proto/queryservice/queryservice_grpc.pb.go b/go/vt/proto/queryservice/queryservice_grpc.pb.go index e40c8110f06..f9d596351e2 100644 --- a/go/vt/proto/queryservice/queryservice_grpc.pb.go +++ b/go/vt/proto/queryservice/queryservice_grpc.pb.go @@ -82,7 +82,7 @@ type QueryClient interface { // VStreamResults streams results along with the gtid of the snapshot. VStreamResults(ctx context.Context, in *binlogdata.VStreamResultsRequest, opts ...grpc.CallOption) (Query_VStreamResultsClient, error) // GetSchema returns the schema information. - GetSchema(ctx context.Context, in *query.GetSchemaRequest, opts ...grpc.CallOption) (*query.GetSchemaResponse, error) + GetSchema(ctx context.Context, in *query.GetSchemaRequest, opts ...grpc.CallOption) (Query_GetSchemaClient, error) } type queryClient struct { @@ -534,13 +534,36 @@ func (x *queryVStreamResultsClient) Recv() (*binlogdata.VStreamResultsResponse, return m, nil } -func (c *queryClient) GetSchema(ctx context.Context, in *query.GetSchemaRequest, opts ...grpc.CallOption) (*query.GetSchemaResponse, error) { - out := new(query.GetSchemaResponse) - err := c.cc.Invoke(ctx, "/queryservice.Query/GetSchema", in, out, opts...) +func (c *queryClient) GetSchema(ctx context.Context, in *query.GetSchemaRequest, opts ...grpc.CallOption) (Query_GetSchemaClient, error) { + stream, err := c.cc.NewStream(ctx, &Query_ServiceDesc.Streams[9], "/queryservice.Query/GetSchema", opts...) if err != nil { return nil, err } - return out, nil + x := &queryGetSchemaClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Query_GetSchemaClient interface { + Recv() (*query.GetSchemaResponse, error) + grpc.ClientStream +} + +type queryGetSchemaClient struct { + grpc.ClientStream +} + +func (x *queryGetSchemaClient) Recv() (*query.GetSchemaResponse, error) { + m := new(query.GetSchemaResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } // QueryServer is the server API for Query service. @@ -605,7 +628,7 @@ type QueryServer interface { // VStreamResults streams results along with the gtid of the snapshot. VStreamResults(*binlogdata.VStreamResultsRequest, Query_VStreamResultsServer) error // GetSchema returns the schema information. - GetSchema(context.Context, *query.GetSchemaRequest) (*query.GetSchemaResponse, error) + GetSchema(*query.GetSchemaRequest, Query_GetSchemaServer) error mustEmbedUnimplementedQueryServer() } @@ -691,8 +714,8 @@ func (UnimplementedQueryServer) VStreamRows(*binlogdata.VStreamRowsRequest, Quer func (UnimplementedQueryServer) VStreamResults(*binlogdata.VStreamResultsRequest, Query_VStreamResultsServer) error { return status.Errorf(codes.Unimplemented, "method VStreamResults not implemented") } -func (UnimplementedQueryServer) GetSchema(context.Context, *query.GetSchemaRequest) (*query.GetSchemaResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetSchema not implemented") +func (UnimplementedQueryServer) GetSchema(*query.GetSchemaRequest, Query_GetSchemaServer) error { + return status.Errorf(codes.Unimplemented, "method GetSchema not implemented") } func (UnimplementedQueryServer) mustEmbedUnimplementedQueryServer() {} @@ -1202,22 +1225,25 @@ func (x *queryVStreamResultsServer) Send(m *binlogdata.VStreamResultsResponse) e return x.ServerStream.SendMsg(m) } -func _Query_GetSchema_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(query.GetSchemaRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).GetSchema(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/queryservice.Query/GetSchema", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).GetSchema(ctx, req.(*query.GetSchemaRequest)) +func _Query_GetSchema_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(query.GetSchemaRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return interceptor(ctx, in, info, handler) + return srv.(QueryServer).GetSchema(m, &queryGetSchemaServer{stream}) +} + +type Query_GetSchemaServer interface { + Send(*query.GetSchemaResponse) error + grpc.ServerStream +} + +type queryGetSchemaServer struct { + grpc.ServerStream +} + +func (x *queryGetSchemaServer) Send(m *query.GetSchemaResponse) error { + return x.ServerStream.SendMsg(m) } // Query_ServiceDesc is the grpc.ServiceDesc for Query service. @@ -1295,10 +1321,6 @@ var Query_ServiceDesc = grpc.ServiceDesc{ MethodName: "Release", Handler: _Query_Release_Handler, }, - { - MethodName: "GetSchema", - Handler: _Query_GetSchema_Handler, - }, }, Streams: []grpc.StreamDesc{ { @@ -1346,6 +1368,11 @@ var Query_ServiceDesc = grpc.ServiceDesc{ Handler: _Query_VStreamResults_Handler, ServerStreams: true, }, + { + StreamName: "GetSchema", + Handler: _Query_GetSchema_Handler, + ServerStreams: true, + }, }, Metadata: "queryservice.proto", } diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index b68dd4ccc49..33548e1e1d3 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -662,9 +662,9 @@ func (itc *internalTabletConn) Release(ctx context.Context, target *querypb.Targ } // GetSchema is part of the QueryService interface. -func (itc *internalTabletConn) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) { - response, err := itc.tablet.qsc.QueryService().GetSchema(ctx, target, tableType, tableNames) - return response, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) +func (itc *internalTabletConn) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string, callback func(schemaRes *querypb.GetSchemaResponse) error) error { + err := itc.tablet.qsc.QueryService().GetSchema(ctx, target, tableType, tableNames, callback) + return tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } // Close is part of queryservice.QueryService diff --git a/go/vt/vtgate/schema/tracker.go b/go/vt/vtgate/schema/tracker.go index 98f1211e39b..a75a583ae11 100644 --- a/go/vt/vtgate/schema/tracker.go +++ b/go/vt/vtgate/schema/tracker.go @@ -134,20 +134,23 @@ func (t *Tracker) loadViews(conn queryservice.QueryService, target *querypb.Targ return nil } - fvRes, err := conn.GetSchema(t.ctx, target, querypb.SchemaTableType_VIEWS, nil) - if err != nil { - return err - } - t.mu.Lock() defer t.mu.Unlock() // We must clear out any previous view definition before loading it here as this is called - // whenever a shard's primary tablet starts and sends the initial signal. Without - // clearing out the previous view definition removes any dropped views. + // whenever a shard's primary tablet starts and sends the initial signal. + // This is needed clear out any stale view definitions. t.clearKeyspaceViews(target.Keyspace) - t.updateViews(target.Keyspace, fvRes) - log.Infof("finished loading views for keyspace %s. Found %d views", target.Keyspace, len(fvRes)) + var numViews int + err := conn.GetSchema(t.ctx, target, querypb.SchemaTableType_VIEWS, nil, func(schemaRes *querypb.GetSchemaResponse) error { + t.updateViews(target.Keyspace, schemaRes.TableDefinition) + numViews += len(schemaRes.TableDefinition) + return nil + }) + if err != nil { + return err + } + log.Infof("finished loading views for keyspace %s. Found %d views", target.Keyspace, numViews) return nil } @@ -299,26 +302,27 @@ func (t *Tracker) updateTables(keyspace string, res *sqltypes.Result) { } func (t *Tracker) updatedViewSchema(th *discovery.TabletHealth) bool { - viewsUpdated := th.Stats.ViewSchemaChanged - res, err := th.Conn.GetSchema(t.ctx, th.Target, querypb.SchemaTableType_VIEWS, viewsUpdated) - if err != nil { - t.tracked[th.Target.Keyspace].setLoaded(false) - // TODO: optimize for the views that got errored out. - log.Warningf("error fetching new views definition for %v", viewsUpdated, err) - return false - } - t.mu.Lock() defer t.mu.Unlock() + viewsUpdated := th.Stats.ViewSchemaChanged + // first we empty all prior schema. deleted tables will not show up in the result, // so this is the only chance to delete for _, view := range viewsUpdated { t.views.delete(th.Target.Keyspace, view) } - t.updateViews(th.Target.Keyspace, res) + err := th.Conn.GetSchema(t.ctx, th.Target, querypb.SchemaTableType_VIEWS, viewsUpdated, func(schemaRes *querypb.GetSchemaResponse) error { + t.updateViews(th.Target.Keyspace, schemaRes.TableDefinition) + return nil + }) + if err != nil { + t.tracked[th.Target.Keyspace].setLoaded(false) + // TODO: optimize for the views that got errored out. + log.Warningf("error fetching new views definition for %v", viewsUpdated, err) + return false + } return true - } func (t *Tracker) updateViews(keyspace string, res map[string]string) { diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 38967cab202..ea72d2ee89d 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -410,5 +410,13 @@ func (client *QueryClient) UpdateContext(ctx context.Context) { } func (client *QueryClient) GetSchema(tableType querypb.SchemaTableType, tableNames ...string) (map[string]string, error) { - return client.server.GetSchema(client.ctx, client.target, tableType, tableNames) + schemaDef := map[string]string{} + err := client.server.GetSchema(client.ctx, client.target, tableType, tableNames, func(schemaRes *querypb.GetSchemaResponse) error { + schemaDef = schemaRes.TableDefinition + return nil + }) + if err != nil { + return nil, err + } + return schemaDef, nil } diff --git a/go/vt/vttablet/grpcqueryservice/server.go b/go/vt/vttablet/grpcqueryservice/server.go index 69ebcbf39b9..e23acba630f 100644 --- a/go/vt/vttablet/grpcqueryservice/server.go +++ b/go/vt/vttablet/grpcqueryservice/server.go @@ -484,16 +484,10 @@ func (q *query) Release(ctx context.Context, request *querypb.ReleaseRequest) (r } // GetSchema implements the QueryServer interface -func (q *query) GetSchema(ctx context.Context, request *querypb.GetSchemaRequest) (response *querypb.GetSchemaResponse, err error) { +func (q *query) GetSchema(request *querypb.GetSchemaRequest, stream queryservicepb.Query_GetSchemaServer) (err error) { defer q.server.HandlePanic(&err) - var resp map[string]string - resp, err = q.server.GetSchema(ctx, request.Target, request.TableType, request.TableNames) - if err != nil { - return nil, vterrors.ToGRPC(err) - } - return &querypb.GetSchemaResponse{ - TableDefinition: resp, - }, nil + err = q.server.GetSchema(stream.Context(), request.Target, request.TableType, request.TableNames, stream.Send) + return vterrors.ToGRPC(err) } // Register registers the implementation on the provide gRPC Server. diff --git a/go/vt/vttablet/grpctabletconn/conn.go b/go/vt/vttablet/grpctabletconn/conn.go index 4a945d1a1af..7ef533f580d 100644 --- a/go/vt/vttablet/grpctabletconn/conn.go +++ b/go/vt/vttablet/grpctabletconn/conn.go @@ -1019,23 +1019,45 @@ func (conn *gRPCQueryClient) Release(ctx context.Context, target *querypb.Target } // GetSchema implements the queryservice interface -func (conn *gRPCQueryClient) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) { +func (conn *gRPCQueryClient) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string, callback func(schemaRes *querypb.GetSchemaResponse) error) error { conn.mu.RLock() defer conn.mu.RUnlock() if conn.cc == nil { - return nil, tabletconn.ConnClosed + return tabletconn.ConnClosed } - req := &querypb.GetSchemaRequest{ - Target: target, - TableType: tableType, - TableNames: tableNames, - } - reply, err := conn.c.GetSchema(ctx, req) + stream, err := func() (queryservicepb.Query_GetSchemaClient, error) { + conn.mu.RLock() + defer conn.mu.RUnlock() + if conn.cc == nil { + return nil, tabletconn.ConnClosed + } + + stream, err := conn.c.GetSchema(ctx, &querypb.GetSchemaRequest{ + Target: target, + TableType: tableType, + TableNames: tableNames, + }) + if err != nil { + return nil, tabletconn.ErrorFromGRPC(err) + } + return stream, nil + }() if err != nil { - return nil, tabletconn.ErrorFromGRPC(err) + return err + } + for { + shr, err := stream.Recv() + if err != nil { + return tabletconn.ErrorFromGRPC(err) + } + if err := callback(shr); err != nil { + if err == nil || err == io.EOF { + return nil + } + return err + } } - return reply.TableDefinition, nil } // Close closes underlying gRPC channel. diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index b72ae12d653..1b9bdac13e9 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -118,7 +118,7 @@ type QueryService interface { Release(ctx context.Context, target *querypb.Target, transactionID, reservedID int64) error // GetSchema returns the table definition for the specified tables. - GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) + GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string, callback func(schemaRes *querypb.GetSchemaResponse) error) error // Close must be called for releasing resources. Close(ctx context.Context) error diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index 97c4732da44..376c228b02a 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -324,13 +324,12 @@ func (ws *wrappedService) Release(ctx context.Context, target *querypb.Target, t }) } -func (ws *wrappedService) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (schemaDef map[string]string, err error) { +func (ws *wrappedService) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string, callback func(schemaRes *querypb.GetSchemaResponse) error) (err error) { err = ws.wrapper(ctx, target, ws.impl, "GetSchema", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { - var innerErr error - schemaDef, innerErr = conn.GetSchema(ctx, target, tableType, tableNames) + innerErr := conn.GetSchema(ctx, target, tableType, tableNames, callback) return canRetry(ctx, innerErr), innerErr }) - return schemaDef, err + return err } func (ws *wrappedService) Close(ctx context.Context) error { diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index 822f6774fe9..a1ef83f7a3a 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -585,14 +585,14 @@ func (sbc *SandboxConn) Release(ctx context.Context, target *querypb.Target, tra } // GetSchema implements the QueryService interface -func (sbc *SandboxConn) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) { +func (sbc *SandboxConn) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string, callback func(schemaRes *querypb.GetSchemaResponse) error) error { sbc.GetSchemaCount.Add(1) - var resp map[string]string - if len(sbc.getSchemaResult) > 0 { - resp = sbc.getSchemaResult[0] - sbc.getSchemaResult = sbc.getSchemaResult[1:] + if len(sbc.getSchemaResult) == 0 { + return nil } - return resp, nil + resp := sbc.getSchemaResult[0] + sbc.getSchemaResult = sbc.getSchemaResult[1:] + return callback(&querypb.GetSchemaResponse{TableDefinition: resp}) } // Close does not change ExecCount diff --git a/go/vt/vttablet/tabletconntest/fakequeryservice.go b/go/vt/vttablet/tabletconntest/fakequeryservice.go index e78194fd5db..8bfb40bceee 100644 --- a/go/vt/vttablet/tabletconntest/fakequeryservice.go +++ b/go/vt/vttablet/tabletconntest/fakequeryservice.go @@ -750,7 +750,7 @@ func (f *FakeQueryService) Release(ctx context.Context, target *querypb.Target, } // GetSchema implements the QueryService interface -func (f *FakeQueryService) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) { +func (f *FakeQueryService) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string, callback func(schemaRes *querypb.GetSchemaResponse) error) error { panic("implement me") } diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index ee02901993d..cf26d7c5019 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -1218,15 +1218,15 @@ func generateBindVarsForViewDDLInsert(createView *sqlparser.CreateView) map[stri return bindVars } -func (qre *QueryExecutor) GetSchemaDefinitions(tableType querypb.SchemaTableType, tableNames []string) (map[string]string, error) { +func (qre *QueryExecutor) GetSchemaDefinitions(tableType querypb.SchemaTableType, tableNames []string, callback func(schemaRes *querypb.GetSchemaResponse) error) error { switch tableType { case querypb.SchemaTableType_VIEWS: - return qre.getViewDefinitions(tableNames) + return qre.getViewDefinitions(tableNames, callback) } - return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid table type %v", tableType) + return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid table type %v", tableType) } -func (qre *QueryExecutor) getViewDefinitions(viewNames []string) (map[string]string, error) { +func (qre *QueryExecutor) getViewDefinitions(viewNames []string, callback func(schemaRes *querypb.GetSchemaResponse) error) error { query := mysql.FetchViews var bindVars map[string]*querypb.BindVariable if len(viewNames) > 0 { @@ -1235,36 +1235,33 @@ func (qre *QueryExecutor) getViewDefinitions(viewNames []string) (map[string]str "viewnames": sqltypes.StringBindVariable(strings.Join(viewNames, ",")), } } - res, err := qre.execQuery(query, bindVars) - if err != nil { - return nil, err - } - - schemaDef := make(map[string]string) - for _, row := range res.Rows { - schemaDef[row[0].ToString()] = row[1].ToString() - } - return schemaDef, nil + return qre.generateFinalQueryAndStreamExecute(query, bindVars, func(result *sqltypes.Result) error { + schemaDef := make(map[string]string) + for _, row := range result.Rows { + schemaDef[row[0].ToString()] = row[1].ToString() + } + return callback(&querypb.GetSchemaResponse{TableDefinition: schemaDef}) + }) } -func (qre *QueryExecutor) execQuery(query string, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { +func (qre *QueryExecutor) generateFinalQueryAndStreamExecute(query string, bindVars map[string]*querypb.BindVariable, callback func(result *sqltypes.Result) error) error { sql := query if len(bindVars) > 0 { stmt, err := sqlparser.Parse(query) if err != nil { - return nil, err + return err } sql, _, err = qre.generateFinalSQL(sqlparser.NewParsedQuery(stmt), bindVars) if err != nil { - return nil, err + return err } } - conn, err := qre.getConn() + conn, err := qre.getStreamConn() if err != nil { - return nil, err + return err } defer conn.Recycle() - return qre.execDBConn(conn, sql, true) + return qre.execStreamSQL(conn, false /* isTransaction */, sql, callback) } diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index c9c5146783c..090098aded6 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -1396,7 +1396,7 @@ func txToReserveState(state queryservice.TransactionState) queryservice.Reserved } // GetSchema returns table definitions for the specified tables. -func (tsv *TabletServer) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string) (schemaDef map[string]string, err error) { +func (tsv *TabletServer) GetSchema(ctx context.Context, target *querypb.Target, tableType querypb.SchemaTableType, tableNames []string, callback func(schemaRes *querypb.GetSchemaResponse) error) (err error) { err = tsv.execRequest( ctx, tsv.QueryTimeout.Get(), "GetSchema", "", nil, @@ -1409,8 +1409,7 @@ func (tsv *TabletServer) GetSchema(ctx context.Context, target *querypb.Target, logStats: logStats, tsv: tsv, } - schemaDef, err = qre.GetSchemaDefinitions(tableType, tableNames) - return err + return qre.GetSchemaDefinitions(tableType, tableNames, callback) }, ) return diff --git a/proto/queryservice.proto b/proto/queryservice.proto index 295fca961eb..eeed60aa50d 100644 --- a/proto/queryservice.proto +++ b/proto/queryservice.proto @@ -110,5 +110,5 @@ service Query { rpc VStreamResults(binlogdata.VStreamResultsRequest) returns (stream binlogdata.VStreamResultsResponse) {}; // GetSchema returns the schema information. - rpc GetSchema(query.GetSchemaRequest) returns (query.GetSchemaResponse) {}; -} + rpc GetSchema(query.GetSchemaRequest) returns (stream query.GetSchemaResponse) {}; +} \ No newline at end of file From 492cf00824eb107249ae1f89fe6b649707b4d5ce Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 24 Feb 2023 15:22:11 +0530 Subject: [PATCH 032/233] Fix vtctldclient command in vtop test script and the fix operator example (#12458) * feat: fix vtctldclient command Signed-off-by: Manan Gupta * examples: remove enforceSemiSync from operator example Signed-off-by: deepthi * feat: also update vitess operator version Signed-off-by: Manan Gupta --------- Signed-off-by: Manan Gupta Signed-off-by: deepthi Co-authored-by: deepthi --- examples/operator/101_initial_cluster.yaml | 3 - examples/operator/201_customer_tablets.yaml | 5 - examples/operator/302_new_shards.yaml | 7 - examples/operator/306_down_shard_0.yaml | 5 - examples/operator/operator.yaml | 660 ++++++++++++++++++-- test/vtop_example.sh | 2 +- 6 files changed, 596 insertions(+), 86 deletions(-) diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index 12931f7232a..5f15ae0087a 100644 --- a/examples/operator/101_initial_cluster.yaml +++ b/examples/operator/101_initial_cluster.yaml @@ -87,15 +87,12 @@ spec: databaseInitScriptSecret: name: example-cluster-config key: init_db.sql - replication: - enforceSemiSync: false tabletPools: - cell: zone1 type: replica replicas: 2 vttablet: extraFlags: - disable_active_reparents: "true" db_charset: utf8mb4 resources: limits: diff --git a/examples/operator/201_customer_tablets.yaml b/examples/operator/201_customer_tablets.yaml index b2dba84cba4..e2b1ce56f5a 100644 --- a/examples/operator/201_customer_tablets.yaml +++ b/examples/operator/201_customer_tablets.yaml @@ -83,15 +83,12 @@ spec: databaseInitScriptSecret: name: example-cluster-config key: init_db.sql - replication: - enforceSemiSync: false tabletPools: - cell: zone1 type: replica replicas: 2 vttablet: extraFlags: - disable_active_reparents: "true" db_charset: utf8mb4 resources: limits: @@ -121,8 +118,6 @@ spec: databaseInitScriptSecret: name: example-cluster-config key: init_db.sql - replication: - enforceSemiSync: false tabletPools: - cell: zone1 type: replica diff --git a/examples/operator/302_new_shards.yaml b/examples/operator/302_new_shards.yaml index f0904cf6f45..6491c242f32 100644 --- a/examples/operator/302_new_shards.yaml +++ b/examples/operator/302_new_shards.yaml @@ -83,15 +83,12 @@ spec: databaseInitScriptSecret: name: example-cluster-config key: init_db.sql - replication: - enforceSemiSync: false tabletPools: - cell: zone1 type: replica replicas: 2 vttablet: extraFlags: - disable_active_reparents: "true" db_charset: utf8mb4 resources: limits: @@ -121,8 +118,6 @@ spec: databaseInitScriptSecret: name: example-cluster-config key: init_db.sql - replication: - enforceSemiSync: false tabletPools: - cell: zone1 type: replica @@ -154,8 +149,6 @@ spec: databaseInitScriptSecret: name: example-cluster-config key: init_db.sql - replication: - enforceSemiSync: false tabletPools: - cell: zone1 type: replica diff --git a/examples/operator/306_down_shard_0.yaml b/examples/operator/306_down_shard_0.yaml index bfa95a730a8..921c2ec269e 100644 --- a/examples/operator/306_down_shard_0.yaml +++ b/examples/operator/306_down_shard_0.yaml @@ -83,15 +83,12 @@ spec: databaseInitScriptSecret: name: example-cluster-config key: init_db.sql - replication: - enforceSemiSync: false tabletPools: - cell: zone1 type: replica replicas: 2 vttablet: extraFlags: - disable_active_reparents: "true" db_charset: utf8mb4 resources: limits: @@ -121,8 +118,6 @@ spec: databaseInitScriptSecret: name: example-cluster-config key: init_db.sql - replication: - enforceSemiSync: false tabletPools: - cell: zone1 type: replica diff --git a/examples/operator/operator.yaml b/examples/operator/operator.yaml index bf393b07426..b840fa9fc19 100644 --- a/examples/operator/operator.yaml +++ b/examples/operator/operator.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.2 + controller-gen.kubebuilder.io/version: v0.11.3 creationTimestamp: null name: etcdlockservers.planetscale.com spec: @@ -74,8 +74,35 @@ spec: - kind - name type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -116,6 +143,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic storageClassName: type: string volumeMode: @@ -143,6 +171,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -152,6 +181,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -167,6 +197,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -178,6 +209,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -223,6 +255,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: x-kubernetes-preserve-unknown-fields: true @@ -242,6 +275,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -281,19 +326,12 @@ spec: storage: true subresources: status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.2 + controller-gen.kubebuilder.io/version: v0.11.3 creationTimestamp: null name: vitessbackups.planetscale.com spec: @@ -341,19 +379,12 @@ spec: type: object served: true storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.2 + controller-gen.kubebuilder.io/version: v0.11.3 creationTimestamp: null name: vitessbackupstorages.planetscale.com spec: @@ -514,19 +545,12 @@ spec: storage: true subresources: status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.2 + controller-gen.kubebuilder.io/version: v0.11.3 creationTimestamp: null name: vitesscells.planetscale.com spec: @@ -605,6 +629,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -614,6 +639,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -629,6 +655,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -640,6 +667,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -683,6 +711,18 @@ spec: type: integer resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -795,6 +835,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array images: properties: @@ -852,8 +893,35 @@ spec: - kind - name type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -894,6 +962,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic storageClassName: type: string volumeMode: @@ -921,6 +990,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -930,6 +1000,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -945,6 +1016,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -956,6 +1028,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1001,6 +1074,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: x-kubernetes-preserve-unknown-fields: true @@ -1020,6 +1094,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -1124,19 +1210,12 @@ spec: storage: true subresources: status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.2 + controller-gen.kubebuilder.io/version: v0.11.3 creationTimestamp: null name: vitessclusters.planetscale.com spec: @@ -1341,6 +1420,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1350,6 +1430,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1365,6 +1446,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1376,6 +1458,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1419,6 +1502,18 @@ spec: type: integer resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -1544,8 +1639,35 @@ spec: - kind - name type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -1586,6 +1708,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic storageClassName: type: string volumeMode: @@ -1613,6 +1736,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1622,6 +1746,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1637,6 +1762,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1648,6 +1774,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1693,6 +1820,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: x-kubernetes-preserve-unknown-fields: true @@ -1712,6 +1840,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -1823,8 +1963,35 @@ spec: - kind - name type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -1865,6 +2032,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic storageClassName: type: string volumeMode: @@ -1892,6 +2060,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -1901,6 +2070,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -1916,6 +2086,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -1927,6 +2098,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -1972,6 +2144,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array initContainers: x-kubernetes-preserve-unknown-fields: true @@ -1991,6 +2164,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -2052,6 +2237,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array images: properties: @@ -2131,8 +2317,6 @@ spec: type: object replication: properties: - enforceSemiSync: - type: boolean initializeBackup: type: boolean initializeMaster: @@ -2174,8 +2358,35 @@ spec: - kind - name type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -2216,6 +2427,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic storageClassName: type: string volumeMode: @@ -2285,6 +2497,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -2294,6 +2507,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -2309,6 +2523,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -2320,6 +2535,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -2359,6 +2575,18 @@ spec: type: string resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -2407,6 +2635,18 @@ spec: x-kubernetes-preserve-unknown-fields: true resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -2472,8 +2712,6 @@ spec: type: object replication: properties: - enforceSemiSync: - type: boolean initializeBackup: type: boolean initializeMaster: @@ -2515,8 +2753,35 @@ spec: - kind - name type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -2557,6 +2822,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic storageClassName: type: string volumeMode: @@ -2626,6 +2892,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -2635,6 +2902,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -2650,6 +2918,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -2661,6 +2930,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -2700,6 +2970,18 @@ spec: type: string resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -2748,6 +3030,18 @@ spec: x-kubernetes-preserve-unknown-fields: true resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -2822,6 +3116,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -2831,6 +3126,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -2846,6 +3142,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -2857,6 +3154,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -2896,6 +3194,18 @@ spec: x-kubernetes-preserve-unknown-fields: true resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -3007,6 +3317,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -3016,6 +3327,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -3031,6 +3343,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -3042,6 +3355,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -3084,6 +3398,18 @@ spec: type: integer resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -3129,6 +3455,18 @@ spec: type: array apiResources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -3170,6 +3508,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -3179,6 +3518,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -3194,6 +3534,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -3205,6 +3546,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -3273,6 +3615,18 @@ spec: x-kubernetes-preserve-unknown-fields: true webResources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -3404,19 +3758,12 @@ spec: storage: true subresources: status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.2 + controller-gen.kubebuilder.io/version: v0.11.3 creationTimestamp: null name: vitesskeyspaces.planetscale.com spec: @@ -3609,6 +3956,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array images: properties: @@ -3671,8 +4019,6 @@ spec: type: object replication: properties: - enforceSemiSync: - type: boolean initializeBackup: type: boolean initializeMaster: @@ -3714,8 +4060,35 @@ spec: - kind - name type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -3756,6 +4129,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic storageClassName: type: string volumeMode: @@ -3825,6 +4199,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -3834,6 +4209,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -3849,6 +4225,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -3860,6 +4237,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -3899,6 +4277,18 @@ spec: type: string resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -3947,6 +4337,18 @@ spec: x-kubernetes-preserve-unknown-fields: true resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -4012,8 +4414,6 @@ spec: type: object replication: properties: - enforceSemiSync: - type: boolean initializeBackup: type: boolean initializeMaster: @@ -4055,8 +4455,35 @@ spec: - kind - name type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -4097,6 +4524,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic storageClassName: type: string volumeMode: @@ -4166,6 +4594,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -4175,6 +4604,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -4190,6 +4620,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -4201,6 +4632,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -4240,6 +4672,18 @@ spec: type: string resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -4288,6 +4732,18 @@ spec: x-kubernetes-preserve-unknown-fields: true resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -4396,6 +4852,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -4405,6 +4862,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -4420,6 +4878,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -4431,6 +4890,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -4470,6 +4930,18 @@ spec: x-kubernetes-preserve-unknown-fields: true resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -4635,19 +5107,12 @@ spec: storage: true subresources: status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.2 + controller-gen.kubebuilder.io/version: v0.11.3 creationTimestamp: null name: vitessshards.planetscale.com spec: @@ -4849,6 +5314,7 @@ spec: name: type: string type: object + x-kubernetes-map-type: atomic type: array images: properties: @@ -4885,8 +5351,6 @@ spec: type: string replication: properties: - enforceSemiSync: - type: boolean initializeBackup: type: boolean initializeMaster: @@ -4928,8 +5392,35 @@ spec: - kind - name type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -4970,6 +5461,7 @@ spec: type: string type: object type: object + x-kubernetes-map-type: atomic storageClassName: type: string volumeMode: @@ -5039,6 +5531,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -5048,6 +5541,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -5063,6 +5557,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -5074,6 +5569,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -5113,6 +5609,18 @@ spec: type: string resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -5161,6 +5669,18 @@ spec: x-kubernetes-preserve-unknown-fields: true resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -5254,6 +5774,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic fieldRef: properties: apiVersion: @@ -5263,6 +5784,7 @@ spec: required: - fieldPath type: object + x-kubernetes-map-type: atomic resourceFieldRef: properties: containerName: @@ -5278,6 +5800,7 @@ spec: required: - resource type: object + x-kubernetes-map-type: atomic secretKeyRef: properties: key: @@ -5289,6 +5812,7 @@ spec: required: - key type: object + x-kubernetes-map-type: atomic type: object required: - name @@ -5328,6 +5852,18 @@ spec: x-kubernetes-preserve-unknown-fields: true resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -5479,12 +6015,6 @@ spec: storage: true subresources: status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] --- apiVersion: v1 kind: ServiceAccount diff --git a/test/vtop_example.sh b/test/vtop_example.sh index fc6b9734932..421e1c230df 100755 --- a/test/vtop_example.sh +++ b/test/vtop_example.sh @@ -252,7 +252,7 @@ function verifyVtadminSetup() { function verifyVTOrcSetup() { # Set the primary tablet to readOnly using the vtctld and wait for VTOrc to repair primaryTablet=$(getPrimaryTablet) - vtctldclient SetReadOnly "$primaryTablet" + vtctldclient SetWritable "$primaryTablet" false # Now that we have set the primary tablet to read only, we know that this will # only succeed if VTOrc is able to fix it From 8b9baff236ddb41039eb72ad52c821b71d7f326e Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 24 Feb 2023 17:34:03 +0530 Subject: [PATCH 033/233] feat: don't keep data for upgrade-downgrade tests (#12462) Signed-off-by: Manan Gupta --- .../upgrade_downgrade_test_query_serving_queries.yml | 6 +++--- ...de_downgrade_test_query_serving_queries_next_release.yml | 6 +++--- .../upgrade_downgrade_test_query_serving_schema.yml | 6 +++--- ...ade_downgrade_test_query_serving_schema_next_release.yml | 6 +++--- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index c0ca258c1db..6b4d69a4bc8 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -181,7 +181,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 @@ -201,7 +201,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 @@ -223,4 +223,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 ca75c2fbf6d..d4045ab6925 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 @@ -184,7 +184,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 @@ -204,7 +204,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 @@ -226,4 +226,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 116a211cfe1..52640c82e24 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -181,7 +181,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 @@ -201,7 +201,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 @@ -223,4 +223,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 a1bfe3fb8e9..b0388ebbd1e 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 @@ -184,7 +184,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 @@ -204,7 +204,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 @@ -226,4 +226,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 123cfc7f655..4958104141c 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -198,4 +198,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 e288c5b9c26..bb8055e5535 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -195,4 +195,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 d50b7585dcc..6be685008be 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -195,4 +195,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 ad1febeab85..8296d1851d2 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -192,4 +192,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 From 0598be60d89c14ec182759455e96d9e0e23b8054 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 24 Feb 2023 18:51:04 +0530 Subject: [PATCH 034/233] Reorder summary in order of importance (#12433) * feat: breaking changes should be the first heading Signed-off-by: Manan Gupta * feat: reorder the breaking changes in order of user impact Signed-off-by: Manan Gupta * feat: VTOrc becoming mandatory is important Signed-off-by: Manan Gupta * Reorganize the flag deletions and deprecation announcements Signed-off-by: Florent Poinsard * Fix various typo and add vtorc links Signed-off-by: Florent Poinsard * Upgrading to this release with vitess-operator Signed-off-by: Florent Poinsard * Fix various typo Signed-off-by: Florent Poinsard * Link to PRs in major changes Signed-off-by: Florent Poinsard --------- Signed-off-by: Manan Gupta Signed-off-by: Florent Poinsard Co-authored-by: Florent Poinsard --- doc/releasenotes/16_0_0_summary.md | 190 +++++++++++++++-------------- 1 file changed, 97 insertions(+), 93 deletions(-) diff --git a/doc/releasenotes/16_0_0_summary.md b/doc/releasenotes/16_0_0_summary.md index 9725396b574..95d9c31b57d 100644 --- a/doc/releasenotes/16_0_0_summary.md +++ b/doc/releasenotes/16_0_0_summary.md @@ -3,27 +3,30 @@ ### Table of Contents - **[Major Changes](#major-changes)** - - **[VReplication](#vreplication)** - - [VStream Copy Resume](#vstream-copy-resume) - - [VDiff2 GA](#vdiff2-ga) - - **[Tablet throttler](#tablet-throttler)** - - **[Incremental backup and point in time recovery](#inc-backup)** - - **[Replication manager removal and VTOrc becomes mandatory](#repl-manager-removal)** - **[Breaking Changes](#breaking-changes)** - [VTGate Advertised MySQL Version](#advertised-mysql-version) - [Default MySQL version on Docker](#default-mysql-version) - - [Running Vitess on the Operator](#running-vitess-on-the-operator) - - [vtctld UI Removal](#vtcltd-ui-removal) - - [vtctld Flag Deprecation & Deletions](#vtctld-flag-deprecations) + - [⚠️ Upgrading to this release with vitess-operator](#upgrading-to-this-release-with-vitess-operator) + - [Flag Deletions and Deprecations](#flag-deletions-and-deprecations) + - [VTCtld](#vtctld-flag-deletions-deprecations) + - [MySQLCtl](#mysqlctl-flag-deletions-deprecations) + - [VTTablet](#vttablet-flag-deletions-deprecations) + - [VTBackup](#vtbackup-flag-deletions-deprecations) + - [VTOrc](#vtorc-flag-deletions-deprecations) + - [`lock-timeout` and `remote_operation_timeout` Changes](#lock-timeout-introduction) - [Orchestrator Integration Deletion](#orc-integration-removal) - - [mysqlctl Flags](#mysqlctl-flags) + - [vtctld UI Removal](#vtcltd-ui-removal) - [Query Serving Errors](#qs-errors) - [Logstats Table and Keyspace removed](#logstats-table-keyspace) - [Removed Stats](#removed-stats) - [Deprecated Stats](#deprecated-stats) - - [Removed flag](#removed-flag) - - [`lock-timeout` and `remote_operation_timeout` Changes](#lock-timeout-introduction) - [Normalized labels in the Prometheus Exporter](#normalized-lables) + - **[Replication manager removal and VTOrc becomes mandatory](#repl-manager-removal)** + - **[VReplication](#vreplication)** + - [VStream Copy Resume](#vstream-copy-resume) + - [VDiff2 GA](#vdiff2-ga) + - **[Tablet throttler](#tablet-throttler)** + - **[Incremental backup and point in time recovery](#inc-backup)** - **[New command line flags and behavior](#new-flag)** - [VTGate: Support query timeout --query-timeout](#vtgate-query-timeout) - [VTTablet: VReplication parallel insert workers --vreplication-parallel-insert-workers](#vrepl-parallel-workers) @@ -40,8 +43,6 @@ - [Transaction Isolation Level](#transaction-isolation-level) - [Transaction Access Mode](#transaction-access-mode) - [Support for views](#support-views) - - **[VTOrc](#vtorc)** - - [Flag Deprecations](#flag-deprecations) - **[VTTestServer](#vttestserver)** - [Performance Improvement](#perf-improvement) - **[Minor Changes](#minor-changes)** @@ -51,54 +52,21 @@ ## Major Changes -### VReplication - -#### VStream Copy Resume - -In [PR #11103](https://github.com/vitessio/vitess/pull/11103) we introduced the ability to resume a `VTGate` [`VStream` copy operation](https://vitess.io/docs/design-docs/vreplication/vstream/vscopy/). This is useful when a [`VStream` copy operation](https://vitess.io/docs/design-docs/vreplication/vstream/vscopy/) is interrupted due to e.g. a network failure or a server restart. The `VStream` copy operation can be resumed by specifying each table's last seen primary key value in the `VStream` request. Please see the [`VStream` docs](https://vitess.io/docs/16.0/reference/vreplication/vstream/) for more details. - -#### VDiff2 GA - -We are marking [VDiff v2](https://vitess.io/docs/16.0/reference/vreplication/vdiff2/) as Generally Available or production-ready in v16. We now recommend that you use v2 rather than v1 going forward. V1 will be deprecated and eventually removed in future releases. -If you wish to use v1 for any reason, you will now need to specify the `--v1` flag. - -### Tablet throttler - -The tablet throttler can now be configured dynamically. Configuration is now found in the topo service, and applies to all tablets in all shards and cells of a given keyspace. For backwards compatibility `v16` still supports `vttablet`-based command line flags for throttler ocnfiguration. - -It is possible to enable/disable, to change throttling threshold as well as the throttler query. - -See https://github.com/vitessio/vitess/pull/11604 - -### Incremental backup and point in time recovery - -In [PR #11097](https://github.com/vitessio/vitess/pull/11097) we introduced native incremental backup and point in time recovery: - -- It is possible to take an incremental backup, starting with last known (full or incremental) backup, and up to either a specified (GTID) position, or current ("auto") position. -- The backup is done by copying binary logs. The binary logs are rotated as needed. -- It is then possible to restore a backup up to a given point in time (GTID position). This involves finding a restore path consisting of a full backup and zero or more incremental backups, applied up to the given point in time. -- A server restored to a point in time remains in `DRAINED` tablet type, and does not join the replication stream (thus, "frozen" in time). -- It is possible to take incremental backups from different tablets. It is OK to have overlaps in incremental backup contents. The restore process chooses a valid path, and is valid as long as there are no gaps in the backed up binary log content. - -### Replication manager removal and VTOrc becomes mandatory -VTOrc is now a **required** component of Vitess starting from v16. If the users want VTOrc to manage replication, then they must run VTOrc. -Replication manager is removed from vttablets since the responsibility of fixing replication lies entirely with VTOrc now. -The flag `disable-replication-manager` is deprecated and will be removed in a later release. - ### Breaking Changes #### VTGate Advertised MySQL Version -VTGate now advertises MySQL version 8.0.30. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. +Since [Pull Request #11989](https://github.com/vitessio/vitess/pull/11989), VTGate advertises MySQL version 8.0.30. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. The users can set the `mysql_server_version` flag to advertise the correct version. #### Default MySQL version on Docker The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the patch version of MySQL80 has been upgraded from `8.0.23` to `8.0.30`. +This change was brought by [Pull Request #12252](https://github.com/vitessio/vitess/pull/12252). -#### Running Vitess on the Operator +#### ⚠️Upgrading to this release with vitess-operator -If you are using the vitess-operator and want to remain on MySQL 5.7, we invite you to use the `vitess/lite:v16.0.0-mysql57` Docker Image. +If you are using the vitess-operator and want to remain on MySQL 5.7, **you are required** to use the `vitess/lite:v16.0.0-mysql57` Docker Image, otherwise the `vitess/lite:v16.0.0` image will be on MySQL 80. However, if you are running MySQL 8.0 on the vitess-operator, with for instance `vitess/lite:v15.0.2-mysql80`, considering that we are bumping the patch version of MySQL 80 from `8.0.23` to `8.0.30`, you will have to manually upgrade: @@ -109,12 +77,9 @@ However, if you are running MySQL 8.0 on the vitess-operator, with for instance 5. Remove `innodb_fast_shutdown=0` from your extra cnf in your YAML file. 6. Apply this file. -#### vtctld web UI Removal -In v13, the vtctld UI was deprecated. As of this release, the `web/vtctld2` directory is deleted and the UI will no longer be included in any Vitess images going forward. All build scripts and the Makefile have been updated to reflect this change. +#### Flag Deletions and Deprecations -However, the vtctld HTTP API will remain at `{$vtctld_web_port}/api`. - -#### vtctld Flag Deprecation & Deletions +##### VTCtld With the removal of the vtctld UI, the following vtctld flags have been deprecated: - `--vtctld_show_topology_crud`: This was a flag that controlled the display of CRUD topology actions in the vtctld UI. The UI is removed, so this flag is no longer necessary. @@ -127,19 +92,51 @@ The following deprecated flags have also been removed: - `--workflow_manager_use_election` - `--workflow_manager_disable` +##### MySQLCtld + +The [`mysqlctl` command-line client](https://vitess.io/docs/16.0/reference/programs/mysqlctl/) had some leftover (ignored) server flags after the [v15 pflag work](https://github.com/vitessio/enhancements/blob/main/veps/vep-4.md). Those unused flags have now been removed. If you are using any of the following flags with `mysqlctl` in your scripts or other tooling, they will need to be removed prior to upgrading to v16: +`--port --grpc_auth_static_client_creds --grpc_compression --grpc_initial_conn_window_size --grpc_initial_window_size --grpc_keepalive_time --grpc_keepalive_timeout` + +##### VTTablet + +The following flags were removed in v16: +- `--enable_semi_sync` +- `--backup_storage_hook`, use one of the builtin compression algorithms or `--external-compressor` and `--external-decompressor` instead. +- `--init_populate_metadata`, since we have deleted the `local_metadata` and `shard_metadata` sidecar database tables. + +The flag `--disable-replication-manager` is deprecated and will be removed in a future release. + +##### VTBackup + +The VTBackup flag `--backup_storage_hook` has been removed, use one of the builtin compression algorithms or `--external-compressor` and `--external-decompressor` instead. + + +##### VTOrc + +The flag `--lock-shard-timeout` has been deprecated. Please use the newly introduced `--lock-timeout` flag instead. More detail [here](#lock-timeout-introduction). + +#### `lock-timeout` and `remote_operation_timeout` Changes + +Before the changes made in [Pull Request #11881](https://github.com/vitessio/vitess/pull/11881), the shard and keyspace locks used to be capped by the `remote_operation_timeout`. This is no longer the case and instead a new flag called `lock-timeout` is introduced. +For backward compatibility, if `lock-timeout` is unspecified and `remote_operation_timeout` flag is provided, then its value will also be used for `lock-timeout`. +The default value for `remote_operation_timeout` has also changed from 30 seconds to 15 seconds. The default for the new flag `lock-timeout` is 45 seconds. + +During upgrades, if the users want to preserve the same behaviour as previous releases, then they should provide the `remote_operation_timeout` flag explicitly before upgrading. +After the upgrade, they should then alter their configuration to also specify `lock-timeout` explicitly. + #### Orchestrator Integration Deletion Orchestrator integration in `vttablet` was deprecated in the previous release and is deleted in this release. -Consider using `VTOrc` instead of `Orchestrator`. +`VTOrc` should be deployed instead. You can read more on [how VTOrc is designed](https://vitess.io/docs/16.0/reference/vtorc/) and on [how to run VTOrc in production](https://vitess.io/docs/16.0/user-guides/configuration-basic/vtorc/). -#### mysqlctl Flags +#### vtctld web UI Removal +In v13, the vtctld UI was deprecated. As of this release, the `web/vtctld2` directory is deleted and the UI will no longer be included in any Vitess images going forward. All build scripts and the Makefile have been updated to reflect this change, which was done in [Pull Request #11851](https://github.com/vitessio/vitess/pull/11851) -The [`mysqlctl` command-line client](https://vitess.io/docs/16.0/reference/programs/mysqlctl/) had some leftover (ignored) server flags after the [v15 pflag work](https://github.com/vitessio/enhancements/blob/main/veps/vep-4.md). Those unused flags have now been removed. If you are using any of the following flags with `mysqlctl` in your scripts or other tooling, they will need to be removed prior to upgrading to v16: -`--port --grpc_auth_static_client_creds --grpc_compression --grpc_initial_conn_window_size --grpc_initial_window_size --grpc_keepalive_time --grpc_keepalive_timeout` +However, the vtctld HTTP API will remain at `{$vtctld_web_port}/api`. #### Query Serving Errors -In this release, we are introducing a new way to report errors from Vitess through the query interface. +In [Pull Request #10738](https://github.com/vitessio/vitess/pull/10738) we are introducing a new way to report errors from Vitess through the query interface. Errors will now have an error code for each error, which will make it easy to search for more information on the issue. For instance, the following error: @@ -162,33 +159,54 @@ If your application is searching for specific errors, you might need to update y #### Logstats Table and Keyspace removed Information about which tables are used is now reported by the field TablesUsed added in v15, that is a string array, listing all tables and which keyspace they are in. -The Table/Keyspace fields were deprecated in v15 and are now removed in the v16 release of Vitess. +The Table/Keyspace fields were deprecated in v15 and are now removed in the v16 release, more information can be found on [Pull Request #12083](https://github.com/vitessio/vitess/pull/12083). #### Removed Stats -The stat `QueryRowCounts` is removed in v16. `QueryRowsAffected` and `QueryRowsReturned` can be used instead to gather the same information. +The stat `QueryRowCounts` is removed in v16 as part of [Pull Request #12083](https://github.com/vitessio/vitess/pull/12083). `QueryRowsAffected` and `QueryRowsReturned` can be used instead to gather the same information. #### Deprecated Stats -The stats `QueriesProcessed` and `QueriesRouted` are deprecated in v16. The same information can be inferred from the stats `QueriesProcessedByTable` and `QueriesRoutedByTable` respectively. These stats will be removed in the next release. +The stats `QueriesProcessed` and `QueriesRouted` are deprecated in v16 as part of [Pull Request #12083](https://github.com/vitessio/vitess/pull/12083). The same information can be inferred from the stats `QueriesProcessedByTable` and `QueriesRoutedByTable` respectively. These stats will be removed in the next release. -#### Removed flag +#### Normalized labels in the Prometheus Exporter -The following flag is removed in v16: -- `enable_semi_sync` +The Prometheus metrics exporter now properly normalizes _all_ label names into their `snake_case` form, as it is idiomatic for Prometheus metrics. Previously, Vitess instances were emitting inconsistent labels for their metrics, with some of them being `CamelCase` and others being `snake_case`. +More information about this change can be found on [Pull Request #12057](https://github.com/vitessio/vitess/pull/12057). -#### `lock-timeout` and `remote_operation_timeout` Changes +### Replication manager removal and VTOrc becomes mandatory +VTOrc is now a **required** component of Vitess starting from v16. If the users want Vitess to manage replication, then they must run VTOrc. +Replication manager is removed from vttablets since the responsibility of fixing replication lies entirely with VTOrc now. +The flag `disable-replication-manager` is deprecated and will be removed in a future release. -Earlier, the shard and keyspace locks used to be capped by the `remote_operation_timeout`. This is no longer the case and instead a new flag called `lock-timeout` is introduced. -For backward compatibility, if `lock-timeout` is unspecified and `remote_operation_timeout` flag is provided, then its value will also be used for `lock-timeout` as well. -The default value for `remote_operation_timeout` has also changed from 30 seconds to 15 seconds. The default for the new flag `lock-timeout` is 45 seconds. +### VReplication -During upgrades, if the users want to preserve the same behaviour as previous releases, then they should provide the `remote_operation_timeout` flag explicitly before upgrading. -After the upgrade, they should then alter their configuration to also specify `lock-timeout` explicitly. +#### VStream Copy Resume -#### Normalized labels in the Prometheus Exporter +In [Pull Request #11103](https://github.com/vitessio/vitess/pull/11103) we introduced the ability to resume a `VTGate` [`VStream` copy operation](https://vitess.io/docs/16.0/reference/vreplication/vstream/). This is useful when a [`VStream` copy operation](https://vitess.io/docs/16.0/reference/vreplication/vstream/) is interrupted due to e.g. a network failure or a server restart. The `VStream` copy operation can be resumed by specifying each table's last seen primary key value in the `VStream` request. Please see the [`VStream` docs](https://vitess.io/docs/16.0/reference/vreplication/vstream/) for more details. -The Prometheus metrics exporter now properly normalizes _all_ label names into their `snake_case` form, as it is idiomatic for Prometheus metrics. Previously, Vitess instances were emitting inconsistent labels for their metrics, with some of them being `CamelCase` and others being `snake_case`. +#### VDiff2 GA + +We are marking [VDiff v2](https://vitess.io/docs/16.0/reference/vreplication/vdiff2/) as production-ready in v16. We now recommend that you use v2 rather than v1 going forward. V1 will be deprecated and eventually removed in future releases. +If you wish to use v1 for any reason, you will now need to specify the `--v1` flag. + +### Tablet throttler + +The tablet throttler can now be configured dynamically. Configuration is now found in the topo service, and applies to all tablets in all shards and cells of a given keyspace. For backwards compatibility `v16` still supports `vttablet`-based command line flags for throttler ocnfiguration. + +It is possible to enable/disable, to change throttling threshold as well as the throttler query. + +More information on [Pull Request #11604](https://github.com/vitessio/vitess/pull/11604). + +### Incremental backup and point in time recovery + +In [Pull Request #11097](https://github.com/vitessio/vitess/pull/11097) we introduced native incremental backup and point in time recovery: + +- It is possible to take an incremental backup, starting with last known (full or incremental) backup, and up to either a specified (GTID) position, or current ("auto") position. +- The backup is done by copying binary logs. The binary logs are rotated as needed. +- It is then possible to restore a backup up to a given point in time (GTID position). This involves finding a restore path consisting of a full backup and zero or more incremental backups, applied up to the given point in time. +- A server restored to a point in time remains in `DRAINED` tablet type, and does not join the replication stream (thus, "frozen" in time). +- It is possible to take incremental backups from different tablets. It is OK to have overlaps in incremental backup contents. The restore process chooses a valid path, and is valid as long as there are no gaps in the backed up binary log content. ### New command line flags and behavior @@ -329,22 +347,15 @@ is now fixed. The full issue can be found [here](https://github.com/vitessio/vit - `vtctlclient OnlineDDL ... [complete|retry|cancel|cancel-all]` returns empty result on success instead of number of shard affected. -- VTTablet flag `--backup_storage_hook` has been removed, use one of the builtin compression algorithms or `--external-compressor` and `--external-decompressor` instead. - -- vtbackup flag `--backup_storage_hook` has been removed, use one of the builtin compression algorithms or `--external-compressor` and `--external-decompressor` instead. - -- The VTTablet flag `--init_populate_metadata` has been deprecated, since we have deleted the `local_metadata` and `shard_metadata` sidecar database tables. - - The dead legacy Workflow Manager related code was removed in [#12085](https://github.com/vitessio/vitess/pull/12085). This included the following `vtctl` client commands: `WorkflowAction`, `WorkflowCreate`, `WorkflowWait`, `WorkflowStart`, `WorkflowStop`, `WorkflowTree`, `WorkflowDelete`. - VTAdmin's `VTExplain` endpoint has been deprecated. Users can use the new `vexplain` query format instead. The endpoint will be deleted in a future release. - ### MySQL Compatibility #### Transaction Isolation Level -Support added for `set [session] transaction isolation level ` +In [Pull Request #11704](https://github.com/vitessio/vitess/pull/11704) we are adding support for `set [session] transaction isolation level ` ```sql transaction_characteristic: { @@ -365,7 +376,7 @@ This will be applied to any shard where the session will open a transaction. #### Transaction Access Mode -Support added for `start transaction` with transaction characteristic. +In [Pull Request #11704](https://github.com/vitessio/vitess/pull/11704) we are adding support for `start transaction` with transaction characteristic. ```sql START TRANSACTION @@ -388,20 +399,13 @@ Views are not enabled by default in your Vitess cluster, but they can be turned To read more on how views are implemented you can read the [Views Support RFC](https://github.com/vitessio/vitess/issues/11559). And if you want to learn more on how to use views and its current limitations, you can read the [Views Documentation](https://vitess.io/docs/16.0/reference/compatibility/mysql-compatibility/#views). - -### VTOrc - -#### Flag Deprecations - -The flag `lock-shard-timeout` has been deprecated. Please use the newly introduced `lock-timeout` instead. More detail [here](#lock-timeout-introduction). - ### VTTestServer #### Performance Improvement Creating a database with vttestserver was taking ~45 seconds. This can be problematic in test environments where testcases do a lot of `create` and `drop` database. -In an effort to minimize the database creation time, we have changed the value of `tablet_refresh_interval` to 10s while instantiating vtcombo during vttestserver initialization. We have also made this configurable so that it can be reduced further if desired. -For any production cluster the default value of this flag is still [1 minute](https://vitess.io/docs/15.0/reference/programs/vtgate/). Reducing this value might put more stress on Topo Server (since we now read from Topo server more often) but for testing purposes +In an effort to minimize the database creation time, in [Pull Request #11918](https://github.com/vitessio/vitess/pull/11918) we have changed the value of `tablet_refresh_interval` to 10s while instantiating vtcombo during vttestserver initialization. We have also made this configurable so that it can be reduced further if desired. +For any production cluster the default value of this flag is still [1 minute](https://vitess.io/docs/16.0/reference/programs/vtgate/). Reducing this value might put more stress on Topo Server (since we now read from Topo server more often) but for testing purposes this shouldn't be a concern. ## Minor changes From ae10400648f02a5e401dc6b63137f819e868a4b1 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 24 Feb 2023 21:51:45 +0530 Subject: [PATCH 035/233] Code freeze of release-16.0 (#12469) Signed-off-by: Manan Gupta --- .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 efe1d6e8856..1bb74feee50 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 721e116e3fca99cc6a20fd2515056fa2d99bb48b Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Fri, 24 Feb 2023 22:09:52 +0530 Subject: [PATCH 036/233] Fix scalar aggregation engine primitive for column truncation (#12468) * fix: scalar aggregation truncation Signed-off-by: Harshit Gangal * test: added scalar aggr engine unit test Signed-off-by: Harshit Gangal * remove onecase change Signed-off-by: Harshit Gangal --------- Signed-off-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 6ddc7f981b4..b7ef4c4a78d 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go @@ -398,3 +398,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 ff028bd892c..e5aa7cfd77b 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -3742,7 +3742,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)]]`, @@ -3756,14 +3756,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 25f615d33710934e2eeb7ddaf2e64330e6ab52cc Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Fri, 24 Feb 2023 21:23:39 -0800 Subject: [PATCH 037/233] Add port to enable vtadmin access. (#12467) (#12474) Signed-off-by: Andy Lim Signed-off-by: deepthi Co-authored-by: Andy Lim <125596831+andylim-duo@users.noreply.github.com> --- docker/local/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/local/run.sh b/docker/local/run.sh index 23a97f9843c..9ba5aa07906 100755 --- a/docker/local/run.sh +++ b/docker/local/run.sh @@ -1,3 +1,3 @@ #!/bin/bash -docker run -p 15000:15000 -p 15001:15001 -p 15991:15991 -p 15999:15999 -p 16000:16000 --rm -it vitess/local +docker run -p 14200:14200 -p 14201:14201 -p 15000:15000 -p 15001:15001 -p 15991:15991 -p 15999:15999 -p 16000:16000 --rm -it vitess/local From 2aa039ca21d91a5ec739dcec380e07a3d48e86d1 Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Fri, 24 Feb 2023 21:38:39 -0800 Subject: [PATCH 038/233] release notes: mark dynamic throttler configuration as experimental (#12475) Signed-off-by: deepthi --- doc/releasenotes/16_0_0_summary.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/releasenotes/16_0_0_summary.md b/doc/releasenotes/16_0_0_summary.md index 95d9c31b57d..7b692b2f128 100644 --- a/doc/releasenotes/16_0_0_summary.md +++ b/doc/releasenotes/16_0_0_summary.md @@ -192,11 +192,12 @@ If you wish to use v1 for any reason, you will now need to specify the `--v1` fl ### Tablet throttler -The tablet throttler can now be configured dynamically. Configuration is now found in the topo service, and applies to all tablets in all shards and cells of a given keyspace. For backwards compatibility `v16` still supports `vttablet`-based command line flags for throttler ocnfiguration. +The tablet throttler can now be configured dynamically. Configuration is now found in the topo service, and applies to all tablets in all shards and cells of a given keyspace. +It is possible to enable or disable throttling, and to change the throttling threshold as well as the throttler query. -It is possible to enable/disable, to change throttling threshold as well as the throttler query. +Please note that this feature is considered experimental in this release. For backwards compatibility `v16` still supports `vttablet`-based command line flags for throttler configuration. -More information on [Pull Request #11604](https://github.com/vitessio/vitess/pull/11604). +More information can be found on [Pull Request #11604](https://github.com/vitessio/vitess/pull/11604). ### Incremental backup and point in time recovery From aa377fb4705fde5632dc44545519b6fc4c216cb9 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:51:39 +0200 Subject: [PATCH 039/233] Upgrade `release-16.0` to `go1.20.1` (#12398) * Upgrade release-16.0 to go1.19.6 Signed-off-by: Florent Poinsard * upgrade to 1.20.1 Signed-off-by: Florent Poinsard * bump the golangci-lint version Signed-off-by: Florent Poinsard * Apply linter suggestions Signed-off-by: Florent Poinsard * Apply linter suggestions Signed-off-by: Florent Poinsard * fix TestTLSClientVerifyIdentity Signed-off-by: Florent Poinsard * Switch to using new Go 1.19 CRL parser (#12315) `x509.ParseCRL` is deprecated, we should use `x509.ParseRevocationList` instead which is new in Go 1.19. Signed-off-by: Dirkjan Bussink Signed-off-by: Florent Poinsard * Skip TestFuzz for now Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard Signed-off-by: Dirkjan Bussink Co-authored-by: Dirkjan Bussink --- .../check_make_vtadmin_authz_testgen.yml | 2 +- .../workflows/check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .../workflows/cluster_endtoend_backup_pitr.yml | 2 +- .../cluster_endtoend_backup_pitr_mysql57.yml | 2 +- ...cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .../cluster_endtoend_mysql_server_vault.yml | 2 +- .../cluster_endtoend_onlineddl_ghost.yml | 2 +- .../cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_revert.yml | 2 +- .../cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_scheduler.yml | 2 +- ...uster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- ...er_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- ...ster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- ...toend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- ...ter_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .../cluster_endtoend_schemadiff_vrepl.yml | 2 +- .../cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .../cluster_endtoend_tabletmanager_consul.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc.yml | 2 +- ...ter_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler.yml | 2 +- ...oend_tabletmanager_throttler_custom_config.yml | 2 +- ...ster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .../cluster_endtoend_topo_connection_cache.yml | 2 +- ...r_endtoend_vreplication_across_db_versions.yml | 2 +- .../cluster_endtoend_vreplication_basic.yml | 2 +- .../cluster_endtoend_vreplication_cellalias.yml | 2 +- ...end_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .../cluster_endtoend_vreplication_multicell.yml | 2 +- .../cluster_endtoend_vreplication_v2.yml | 2 +- .../cluster_endtoend_vstream_failover.yml | 2 +- ...uster_endtoend_vstream_stoponreshard_false.yml | 2 +- ...luster_endtoend_vstream_stoponreshard_true.yml | 2 +- ...r_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- ...oend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .../cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .../workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .../cluster_endtoend_vtgate_general_heavy.yml | 2 +- .../cluster_endtoend_vtgate_godriver.yml | 2 +- .../cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .../workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .../cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .../cluster_endtoend_vtgate_reservedconn.yml | 2 +- .../workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .../cluster_endtoend_vtgate_schema_tracker.yml | 2 +- ...r_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .../workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .../cluster_endtoend_vtgate_topo_consul.yml | 2 +- .../cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .../cluster_endtoend_vtgate_transaction.yml | 2 +- .../cluster_endtoend_vtgate_unsharded.yml | 2 +- .../cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .../workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .../workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .../cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .../cluster_endtoend_xb_backup_mysql57.yml | 2 +- .../workflows/cluster_endtoend_xb_recovery.yml | 2 +- .../cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 2 +- .github/workflows/docker_test_cluster_10.yml | 2 +- .github/workflows/docker_test_cluster_25.yml | 2 +- .github/workflows/e2e_race.yml | 2 +- .github/workflows/endtoend.yml | 2 +- .github/workflows/local_example.yml | 2 +- .github/workflows/region_example.yml | 2 +- .github/workflows/static_checks_etc.yml | 4 ++-- .github/workflows/unit_race.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- .../upgrade_downgrade_test_backups_e2e.yml | 2 +- ...de_downgrade_test_backups_e2e_next_release.yml | 2 +- .../upgrade_downgrade_test_backups_manual.yml | 2 +- ...downgrade_test_backups_manual_next_release.yml | 2 +- ...grade_downgrade_test_query_serving_queries.yml | 2 +- ...de_test_query_serving_queries_next_release.yml | 2 +- ...pgrade_downgrade_test_query_serving_schema.yml | 2 +- ...ade_test_query_serving_schema_next_release.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- ...grade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- ...grade_downgrade_test_reparent_old_vttablet.yml | 2 +- .golangci.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 2 +- docker/lite/Dockerfile.ubi7.mysql80 | 2 +- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 2 +- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 2 +- docker/lite/Dockerfile.ubi8.mysql80 | 2 +- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- go.mod | 2 +- go/bucketpool/bucketpool_test.go | 1 + go/mysql/client_test.go | 2 +- go/test/endtoend/recovery/recovery_util.go | 1 - go/test/fuzzing/vtctl_fuzzer.go | 8 +++----- go/vt/tlstest/tlstest.go | 13 ++++++++++--- go/vt/vtctl/grpcvtctldserver/server_test.go | 9 +++++---- go/vt/vtorc/logic/topology_recovery.go | 2 +- go/vt/vttls/crl.go | 15 +++++++-------- misc/git/hooks/golangci-lint | 2 +- test.go | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_docker.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/dockerfile.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 136 files changed, 161 insertions(+), 152 deletions(-) diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index e7bbdb30faa..dac6d60996e 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -48,7 +48,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 1541a45b482..2ff3144ed85 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -50,7 +50,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index ab3bcebe9e7..47d8315fde4 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_13.yml b/.github/workflows/cluster_endtoend_13.yml index 15c79675787..63b00f89a3e 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_15.yml b/.github/workflows/cluster_endtoend_15.yml index 89beae87130..42e5d1c91d1 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_18.yml b/.github/workflows/cluster_endtoend_18.yml index 511b1098806..bf70e99fa0b 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_21.yml b/.github/workflows/cluster_endtoend_21.yml index e0cbeaa73d6..1705e38762a 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_22.yml b/.github/workflows/cluster_endtoend_22.yml index 5d636d8015f..e1decec0259 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index 26e2eb282c7..1f913eb801e 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index 1603832e575..35f6c6c925d 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_ers_prs_newfeatures_heavy.yml b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml index 58c68b11556..a6739b71f2c 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_mysql80.yml b/.github/workflows/cluster_endtoend_mysql80.yml index ba851d33c2f..7f27203c5ce 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_mysql_server_vault.yml b/.github/workflows/cluster_endtoend_mysql_server_vault.yml index 51315e25f71..9a2c3d198ae 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_ghost.yml b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml index eecf1321494..50ca5315c86 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_ghost_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml index f0e76da3f71..a073589625f 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_revert.yml b/.github/workflows/cluster_endtoend_onlineddl_revert.yml index 288629a2791..f3479168002 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_revert_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml index 24ad72eed6a..33c9436d62a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_scheduler.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml index 2af6bca7343..45cfa768821 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_scheduler_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml index ba2db9ab9b1..4f0c1a5b698 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_vrepl.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml index e6ce70e9e31..ae982540c38 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_vrepl_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml index 208d47cdad8..45d6ae0f029 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_vrepl_stress.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml index 0415a32bafb..02236a6f4a4 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml index bd0fad7a932..42d83f85756 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_vrepl_stress_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml index 91841917549..ad52f5c396c 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml index af4095038fa..6321e28069a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_vrepl_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml index 34202d724ca..0c682296e9c 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml index 3009de041f8..fb4ab1fd4d2 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_schemadiff_vrepl.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml index 0c218f2eafa..49c0a3e0d48 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_schemadiff_vrepl_mysql57.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml index 9f9c96a2b4b..7510e14aa4c 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_tabletmanager_consul.yml b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml index 04519fbd327..21a0369083d 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_tabletmanager_tablegc.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml index 9d00e420cb0..53e26a5e1a7 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_tabletmanager_tablegc_mysql57.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml index 08b943d58b6..7ee6aaa46a3 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_tabletmanager_throttler.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml index b2912a93369..02c9ea87657 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_tabletmanager_throttler_custom_config.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml index 2be6d733f08..2deb7b3c8f5 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index c8e74579083..20b45988bdf 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_topo_connection_cache.yml b/.github/workflows/cluster_endtoend_topo_connection_cache.yml index 781f20ffa90..ce64d2ff3b6 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vreplication_across_db_versions.yml b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml index 88f5d6ec9c4..ba4d149a711 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vreplication_basic.yml b/.github/workflows/cluster_endtoend_vreplication_basic.yml index fd9f8a2de05..3e6a33ae7df 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vreplication_cellalias.yml b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml index dbdef400109..9ab7c51f43e 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml index beb668e77f4..93d71284166 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vreplication_multicell.yml b/.github/workflows/cluster_endtoend_vreplication_multicell.yml index dcad11a2178..ed1050fbde2 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vreplication_v2.yml b/.github/workflows/cluster_endtoend_vreplication_v2.yml index 620fed15598..a1a478aa982 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vstream_failover.yml b/.github/workflows/cluster_endtoend_vstream_failover.yml index e298b0ff6b7..cdf5c899ddc 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vstream_stoponreshard_false.yml b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml index f5b463138a1..978c92b4a30 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vstream_stoponreshard_true.yml b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml index ae3f801902e..983ad94e794 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vstream_with_keyspaces_to_watch.yml b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml index 6f89fd88512..f62019138cb 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index be1baee80e5..da3c849bc04 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml index 10e63b5e9b5..697e3d31780 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_concurrentdml.yml b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml index d243f0551d8..83e91d390c4 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_gen4.yml b/.github/workflows/cluster_endtoend_vtgate_gen4.yml index 3545a8caa89..7c39d688bcc 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_general_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml index 8f78d4d3706..a69c7634137 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_godriver.yml b/.github/workflows/cluster_endtoend_vtgate_godriver.yml index 27a4ecf3f39..2bf75e96788 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_partial_keyspace.yml b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml index 23a4bbd07b6..209f26943e8 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_queries.yml b/.github/workflows/cluster_endtoend_vtgate_queries.yml index 3ef3993569d..2ba81844503 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_readafterwrite.yml b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml index d2a4a063e4d..55dd4c3c34b 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_reservedconn.yml b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml index c29c7fe6aa7..d5e90674bc5 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_schema.yml b/.github/workflows/cluster_endtoend_vtgate_schema.yml index 71f4c1d9936..07f06f06452 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_schema_tracker.yml b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml index 74ef0a1b9e9..57ff927fb7d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml index 0e517952f08..e81c473ecc3 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_topo.yml b/.github/workflows/cluster_endtoend_vtgate_topo.yml index e782b71881a..bdbf6b09c6a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_topo_consul.yml b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml index 466b176eb70..36cc1319b04 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_topo_etcd.yml b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml index 0c6cd80ff13..ee9329d4fa7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_transaction.yml b/.github/workflows/cluster_endtoend_vtgate_transaction.yml index ccacbc58084..d3914dd0e2d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_unsharded.yml b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml index 4aef09736d3..679ec5ee324 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_vindex_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml index 03d7f325cbf..2372f13cfb3 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtgate_vschema.yml b/.github/workflows/cluster_endtoend_vtgate_vschema.yml index 56bf04f2997..139421f9ff7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtorc.yml b/.github/workflows/cluster_endtoend_vtorc.yml index cee7ee87af3..300dc1864ba 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vtorc_mysql57.yml b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml index 9851969e69e..e3cb4e639f1 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_vttablet_prscomplex.yml b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml index db3aacd0a59..9bc4c4d5b07 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_xb_backup.yml b/.github/workflows/cluster_endtoend_xb_backup.yml index f5f4c97831e..3e10039b7e1 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_xb_backup_mysql57.yml b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml index 6fd31738e44..3e4dcab8d04 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_xb_recovery.yml b/.github/workflows/cluster_endtoend_xb_recovery.yml index a37af27f24d..1d402e7f883 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/cluster_endtoend_xb_recovery_mysql57.yml b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml index 984a3cc6466..55562726fa4 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/codeql_analysis.yml b/.github/workflows/codeql_analysis.yml index ab2df00d423..16c7264a506 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -42,7 +42,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Get base dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 219de38e817..39cd7592fa9 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Tune the OS run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index 313fa8964ab..3438b84ef89 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index 5c6d7cca374..ae77594a6bb 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 493dec39183..682e658bb72 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index 186d709bc5c..aea86fd21e6 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index a92fb8480a2..c1b1cd3a7c2 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index ce974c4aebd..f86bd2e6a31 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 169edf4b70e..41a27adfe31 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -102,7 +102,7 @@ jobs: 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@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' @@ -169,7 +169,7 @@ jobs: - name: Install golangci-lint if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' - run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.50.1 + run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.51.2 - name: Clean Env if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 7dd42b3bb74..098741d08f2 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -55,7 +55,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 876e9a29461..86d76314b44 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 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.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index ae35bd5a009..a6e58b7adca 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 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.unit_tests == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index b7f6ddc092a..e5abdae9958 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -83,7 +83,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 29add46604e..5816c72ba6d 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -86,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 6a06378eb74..786380c7ba4 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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 dc9be0d2781..9861561121a 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 6b4d69a4bc8..90111aa524d 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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 d4045ab6925..aa14c552397 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 52640c82e24..5f78e983680 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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 b0388ebbd1e..f160aa866ff 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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 4958104141c..955bf3f46a6 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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 bb8055e5535..2bde0ef7c67 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 6be685008be..b4b347677e5 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 8296d1851d2..0caeae635e3 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/.golangci.yml b/.golangci.yml index 6342322412d..e2bdb5336e4 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -154,4 +154,4 @@ issues: # https://github.com/golangci/golangci/wiki/Configuration service: - golangci-lint-version: 1.50.1 # use the fixed version to not introduce new linters unexpectedly + golangci-lint-version: 1.51.2 # use the fixed version to not introduce new linters unexpectedly diff --git a/Makefile b/Makefile index 868f20b39d7..ace43b44d2a 100644 --- a/Makefile +++ b/Makefile @@ -275,7 +275,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=14 +BOOTSTRAP_VERSION=14.1 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index 937b3fbbb52..64a55711da8 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.19.4 || fail "Go version reported: `go version`. Version 1.19.4+ required. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.20.1 || fail "Go version reported: `go version`. Version 1.20.1+ required. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 169efb6c96a..b583c838d7d 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index a08e855f56a..a55d9776ccc 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index f784ecbb4b1..715f6f7927e 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index dbf2e7e10e7..e9c31f3717d 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index ec5b4172115..d8a3eda34ac 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -52,4 +52,8 @@ List of changes between bootstrap image versions. ## [13] - 2022-12-08 ### Changes -- Update build to golang 1.19.4 \ No newline at end of file +- Update build to golang 1.19.4 + +## [14] - 2023-02-21 +### Changes +- Update build to golang 1.20.1 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index ff14e2b7a41..72b1b961ea8 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.19.4-buster +FROM --platform=linux/amd64 golang:1.20.1-buster # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index 58eb655c89e..061a1becc19 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index 68a0ea29175..ad89047606d 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index 01e741d45cd..101ed73b5d9 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index 4f0b75e2fc2..ec67e256fbb 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index 2ae71c2f23f..9c0ffae8458 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index dd02bde5a92..d874dcafc27 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index 350c43f438d..83976d9b180 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index 8163208f68e..08f1b700970 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index 557eb65e51d..d1cdd87ab53 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index f3a5427f2b9..0f9d88596c9 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index 487067645e2..ba3fe8ec02d 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index ec7a1db0f9d..d58ece7222f 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index da696ed7379..436cd705b90 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index 3c3e299f8f5..a2867cf7d4b 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/go.mod b/go.mod index 709464fd5c9..facf8bbf177 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module vitess.io/vitess -go 1.19 +go 1.20 require ( cloud.google.com/go/storage v1.29.0 diff --git a/go/bucketpool/bucketpool_test.go b/go/bucketpool/bucketpool_test.go index 3d74c3f94ce..0f54d2ea3a6 100644 --- a/go/bucketpool/bucketpool_test.go +++ b/go/bucketpool/bucketpool_test.go @@ -167,6 +167,7 @@ func TestPoolWeirdMaxSize(t *testing.T) { } func TestFuzz(t *testing.T) { + t.Skip() maxTestSize := 16384 for i := 0; i < 20000; i++ { minSize := rand.Intn(maxTestSize) diff --git a/go/mysql/client_test.go b/go/mysql/client_test.go index ddc1c6e379b..9ac11282bdc 100644 --- a/go/mysql/client_test.go +++ b/go/mysql/client_test.go @@ -475,7 +475,7 @@ func TestTLSClientVerifyIdentity(t *testing.T) { fmt.Printf("Error: %s", err) - assert.Contains(t, err.Error(), "cannot send HandshakeResponse41: x509:") + assert.Contains(t, err.Error(), "cannot send HandshakeResponse41: tls:") // Now setup proper CA that is valid to verify params.SslCa = path.Join(root, "ca-cert.pem") diff --git a/go/test/endtoend/recovery/recovery_util.go b/go/test/endtoend/recovery/recovery_util.go index acc1d8ce616..66084e2f4b5 100644 --- a/go/test/endtoend/recovery/recovery_util.go +++ b/go/test/endtoend/recovery/recovery_util.go @@ -59,7 +59,6 @@ func RestoreTablet(t *testing.T, localCluster *cluster.LocalProcessCluster, tabl if err != nil { tm := time.Now().UTC() - tm.Format(time.RFC3339) _, err := localCluster.VtctlProcess.ExecuteCommandWithOutput("CreateKeyspace", "--", "--keyspace_type=SNAPSHOT", "--base_keyspace="+keyspaceName, "--snapshot_time", tm.Format(time.RFC3339), restoreKSName) diff --git a/go/test/fuzzing/vtctl_fuzzer.go b/go/test/fuzzing/vtctl_fuzzer.go index 158a914a1f2..aed11774cc8 100644 --- a/go/test/fuzzing/vtctl_fuzzer.go +++ b/go/test/fuzzing/vtctl_fuzzer.go @@ -168,8 +168,8 @@ func Fuzz(data []byte) int { chunkSize := len(restOfArray) / numberOfCalls command := 0 for i := 0; i < len(restOfArray); i = i + chunkSize { - from := i //lower - to := i + chunkSize //upper + from := i // lower + to := i + chunkSize // upper // Index of command in getCommandType(): commandIndex := int(commandPart[command]) % 68 @@ -178,9 +178,7 @@ func Fuzz(data []byte) int { args := strings.Split(string(restOfArray[from:to]), " ") // Add params to the command - for i := range args { - commandSlice = append(commandSlice, args[i]) - } + commandSlice = append(commandSlice, args...) _ = vtctl.RunCommand(ctx, wrangler.New(logger, topo, tmc), commandSlice) command++ diff --git a/go/vt/tlstest/tlstest.go b/go/vt/tlstest/tlstest.go index 500a3974c48..0529ea4ef09 100644 --- a/go/vt/tlstest/tlstest.go +++ b/go/vt/tlstest/tlstest.go @@ -337,12 +337,18 @@ func RevokeCertAndRegenerateCRL(root, parent, name string) { if err != nil { log.Fatal(err) } - crlList, err := x509.ParseCRL(data) + + block, _ := pem.Decode(data) + if block == nil || block.Type != "X509 CRL" { + log.Fatal("failed to parse CRL PEM") + } + + crlList, err := x509.ParseRevocationList(block.Bytes) if err != nil { log.Fatal(err) } - revoked := crlList.TBSCertList.RevokedCertificates + revoked := crlList.RevokedCertificates revoked = append(revoked, pkix.RevokedCertificate{ SerialNumber: certificate.SerialNumber, RevocationTime: time.Now(), @@ -357,9 +363,10 @@ func RevokeCertAndRegenerateCRL(root, parent, name string) { log.Fatal(err) } + var crlNumber big.Int newCrl, err := x509.CreateRevocationList(rand.Reader, &x509.RevocationList{ RevokedCertificates: revoked, - Number: big.NewInt(int64(crlList.TBSCertList.Version) + 1), + Number: crlNumber.Add(crlList.Number, big.NewInt(1)), }, caCert, caKey.(crypto.Signer)) if err != nil { log.Fatal(err) diff --git a/go/vt/vtctl/grpcvtctldserver/server_test.go b/go/vt/vtctl/grpcvtctldserver/server_test.go index 05ac69768e8..52b2176c962 100644 --- a/go/vt/vtctl/grpcvtctldserver/server_test.go +++ b/go/vt/vtctl/grpcvtctldserver/server_test.go @@ -11367,18 +11367,19 @@ func TestValidateVersionShard(t *testing.T) { } for _, tt := range tests { + curT := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() - tt.setup() - resp, err := vtctld.ValidateVersionShard(ctx, tt.req) - if tt.shouldErr { + curT.setup() + resp, err := vtctld.ValidateVersionShard(ctx, curT.req) + if curT.shouldErr { assert.Error(t, err) return } assert.NoError(t, err) - utils.MustMatch(t, tt.expected, resp) + utils.MustMatch(t, curT.expected, resp) }) } } diff --git a/go/vt/vtorc/logic/topology_recovery.go b/go/vt/vtorc/logic/topology_recovery.go index f4a67f9f564..7daf1ae479d 100644 --- a/go/vt/vtorc/logic/topology_recovery.go +++ b/go/vt/vtorc/logic/topology_recovery.go @@ -254,7 +254,7 @@ 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) + tablet, _ := inst.ReadTablet(analysisEntry.AnalyzedInstanceKey) var candidateTabletAlias *topodatapb.TabletAlias if candidateInstanceKey != nil { diff --git a/go/vt/vttls/crl.go b/go/vt/vttls/crl.go index 4d2167a7c11..63c97ecfa81 100644 --- a/go/vt/vttls/crl.go +++ b/go/vt/vttls/crl.go @@ -18,7 +18,6 @@ package vttls import ( "crypto/x509" - "crypto/x509/pkix" "encoding/pem" "fmt" "os" @@ -29,12 +28,12 @@ import ( type verifyPeerCertificateFunc func([][]byte, [][]*x509.Certificate) error -func certIsRevoked(cert *x509.Certificate, crl *pkix.CertificateList) bool { - if crl.HasExpired(time.Now()) { +func certIsRevoked(cert *x509.Certificate, crl *x509.RevocationList) bool { + if !time.Now().Before(crl.NextUpdate) { log.Warningf("The current Certificate Revocation List (CRL) is past expiry date and must be updated. Revoked certificates will still be rejected in this state.") } - for _, revoked := range crl.TBSCertList.RevokedCertificates { + for _, revoked := range crl.RevokedCertificates { if cert.SerialNumber.Cmp(revoked.SerialNumber) == 0 { return true } @@ -54,7 +53,7 @@ func verifyPeerCertificateAgainstCRL(crl string) (verifyPeerCertificateFunc, err cert := chain[i] issuerCert := chain[i+1] for _, crl := range crlSet { - if issuerCert.CheckCRLSignature(crl) == nil { + if crl.CheckSignatureFrom(issuerCert) == nil { if certIsRevoked(cert, crl) { return fmt.Errorf("Certificate revoked: CommonName=%v", cert.Subject.CommonName) } @@ -66,13 +65,13 @@ func verifyPeerCertificateAgainstCRL(crl string) (verifyPeerCertificateFunc, err }, nil } -func loadCRLSet(crl string) ([]*pkix.CertificateList, error) { +func loadCRLSet(crl string) ([]*x509.RevocationList, error) { body, err := os.ReadFile(crl) if err != nil { return nil, err } - crlSet := make([]*pkix.CertificateList, 0) + crlSet := make([]*x509.RevocationList, 0) for len(body) > 0 { var block *pem.Block block, body = pem.Decode(body) @@ -83,7 +82,7 @@ func loadCRLSet(crl string) ([]*pkix.CertificateList, error) { continue } - parsedCRL, err := x509.ParseCRL(block.Bytes) + parsedCRL, err := x509.ParseRevocationList(block.Bytes) if err != nil { return nil, err } diff --git a/misc/git/hooks/golangci-lint b/misc/git/hooks/golangci-lint index acfe1158cf5..361a3f5a8ff 100755 --- a/misc/git/hooks/golangci-lint +++ b/misc/git/hooks/golangci-lint @@ -16,7 +16,7 @@ GOLANGCI_LINT=$(command -v golangci-lint >/dev/null 2>&1) if [ $? -eq 1 ]; then echo "Downloading golangci-lint..." - go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.50.1 + go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.51.2 fi gofiles=$(git diff --cached --name-only --diff-filter=ACM | grep '^go/.*\.go$') diff --git a/test.go b/test.go index 50666660b3c..b6ea6f7bf78 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "14", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "14.1", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index 5bc2b6400c0..e7253cc3147 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/test/templates/cluster_endtoend_test_docker.tpl b/test/templates/cluster_endtoend_test_docker.tpl index 6d70c8b2a4a..1292f95cc80 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.19.4 + go-version: 1.20.1 - 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_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index 67bcb585a95..72d32a2da70 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -68,7 +68,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 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/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index bdafa6a7090..9e6c17909c0 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=14 +ARG bootstrap_version=14.1 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index 02820e68017..510db59f6fc 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -59,7 +59,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 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.unit_tests == 'true' From e55ceedbd89bf722e86bd2e42cf1790ecad3e0e6 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Mon, 27 Feb 2023 18:39:01 +0530 Subject: [PATCH 040/233] 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 --- go/vt/vtgate/executor_select_test.go | 2 +- .../planbuilder/testdata/select_cases.json | 38 +++++++++++++++++++ go/vt/vtgate/semantics/semantic_state.go | 9 ++++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index e5aa7cfd77b..f8c18aab613 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -3429,7 +3429,7 @@ func TestGen4CrossShardJoinQualifiedReferenceTable(t *testing.T) { require.NoError(t, err) unshardedWantQueries := []*querypb.BoundQuery{ { - Sql: "select `simple`.id from `simple`, zip_detail where `simple`.zip_detail_id = zip_detail.id", + Sql: "select `simple`.id from `simple` join zip_detail on `simple`.zip_detail_id = zip_detail.id", BindVariables: map[string]*querypb.BindVariable{}, }, } diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index 6475e45ac71..6adcf331f25 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -8003,5 +8003,43 @@ "user.user" ] } + }, + { + "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": { + "Instructions": { + "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", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "OperatorType": "Route", + "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", + "Variant": "Unsharded" + }, + "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;", + "QueryType": "SELECT" + }, + "gen4-plan": { + "Instructions": { + "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", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "OperatorType": "Route", + "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", + "Variant": "Unsharded" + }, + "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;", + "QueryType": "SELECT", + "TablesUsed": [ + "main.dual", + "main.unsharded_a" + ] + } } ] diff --git a/go/vt/vtgate/semantics/semantic_state.go b/go/vt/vtgate/semantics/semantic_state.go index 49fcf715d2e..7d838eb286a 100644 --- a/go/vt/vtgate/semantics/semantic_state.go +++ b/go/vt/vtgate/semantics/semantic_state.go @@ -375,7 +375,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 @@ -384,6 +384,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 a88a28aa450e260896be888331b1a23e0410f9ed Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 28 Feb 2023 12:20:02 +0530 Subject: [PATCH 041/233] Format vtctldclient GetKeyspace output using cli.MarshalJSON. (#12503) Signed-off-by: Matt Lord Co-authored-by: Matt Lord --- go/cmd/vtctldclient/command/keyspaces.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/go/cmd/vtctldclient/command/keyspaces.go b/go/cmd/vtctldclient/command/keyspaces.go index 4c887d42f23..d952168f909 100644 --- a/go/cmd/vtctldclient/command/keyspaces.go +++ b/go/cmd/vtctldclient/command/keyspaces.go @@ -266,12 +266,16 @@ func commandGetKeyspace(cmd *cobra.Command, args []string) error { resp, err := client.GetKeyspace(commandCtx, &vtctldatapb.GetKeyspaceRequest{ Keyspace: ks, }) + if err != nil { + return err + } + data, err := cli.MarshalJSON(resp.Keyspace) if err != nil { return err } - fmt.Printf("%+v\n", resp.Keyspace) + fmt.Printf("%s\n", data) return nil } From bb768df0008fc09f7e6868a4fa571c32cc1cb526 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Tue, 28 Feb 2023 20:39:03 +0530 Subject: [PATCH 042/233] Release of v16.0.0 (#12470) * Release notes for 16.0.0 Signed-off-by: Manan Gupta * Release commit for 16.0.0 Signed-off-by: Manan Gupta * Minor tweaks after review Signed-off-by: Matt Lord * Clarify user vs developer for sidecardb schema Signed-off-by: Matt Lord * feat: update the summary doc too for future patch releases Signed-off-by: Manan Gupta * feat: update release notes and changelog after recent changes Signed-off-by: Manan Gupta * feat: fix summary file to add examples of label change Signed-off-by: Manan Gupta * feat: update release notes and changelog Signed-off-by: Manan Gupta --------- Signed-off-by: Manan Gupta Signed-off-by: Matt Lord Co-authored-by: Matt Lord --- .github/workflows/code_freeze.yml | 2 +- doc/releasenotes/16_0_0_changelog.md | 76 ++++-- doc/releasenotes/16_0_0_release_notes.md | 246 +++++++++--------- doc/releasenotes/16_0_0_summary.md | 31 ++- 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 | 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 +- 20 files changed, 292 insertions(+), 225 deletions(-) diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 1bb74feee50..efe1d6e8856 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/doc/releasenotes/16_0_0_changelog.md b/doc/releasenotes/16_0_0_changelog.md index 53b503bc6e1..0849e143a05 100644 --- a/doc/releasenotes/16_0_0_changelog.md +++ b/doc/releasenotes/16_0_0_changelog.md @@ -1,4 +1,4 @@ -# Changelog of Vitess v16.0.0-rc1 +# Changelog of Vitess v16.0.0 ### Announcement #### Governance @@ -21,9 +21,17 @@ * Fix files changes filtering in CI [#11714](https://github.com/vitessio/vitess/pull/11714) * Fix `codeql` workflow timeout issue [#11760](https://github.com/vitessio/vitess/pull/11760) * Trigger OnlineDDL workflow when test data changes [#11827](https://github.com/vitessio/vitess/pull/11827) +#### CLI + * [release-16.0] vtctldclient: Format GetKeyspace output using cli.MarshalJSON (#12495) [#12503](https://github.com/vitessio/vitess/pull/12503) #### Cluster management * BugFix: Errant GTID detection for a single replica [#12024](https://github.com/vitessio/vitess/pull/12024) * BugFix: Fix race in `IsFlagProvided` [#12042](https://github.com/vitessio/vitess/pull/12042) +#### Examples + * Examples: Add lib functions to wait for shard states [#12239](https://github.com/vitessio/vitess/pull/12239) + * Examples: Correct VTAdmin Discovery File Path And Add Check [#12415](https://github.com/vitessio/vitess/pull/12415) + * examples: Fix Vtop example and release script [#12440](https://github.com/vitessio/vitess/pull/12440) + * Fix vtctldclient command in vtop test script and the fix operator example [#12458](https://github.com/vitessio/vitess/pull/12458) + * Open vtadmin-api port in docker-local example to enable vtadmin access [#12467](https://github.com/vitessio/vitess/pull/12467) #### General * [main] Stats Flags: include stats flags in the correct binaries (#11450) [#11453](https://github.com/vitessio/vitess/pull/11453) * Test flags: Update logic for parsing test flags to run unit tests within GoLand and to parse test flags in vtgate to allow running unit tests [#11551](https://github.com/vitessio/vitess/pull/11551) @@ -32,7 +40,8 @@ #### Observability * stats/prometheus: normalize labels for single-label implementations [#12057](https://github.com/vitessio/vitess/pull/12057) #### Online DDL - * Parse binlog variable length encoded columns [#11871](https://github.com/vitessio/vitess/pull/11871) + * Parse binlog variable length encoded columns [#11871](https://github.com/vitessio/vitess/pull/11871) + * Allow zero (in) date when setting up internal _vt schema [#12262](https://github.com/vitessio/vitess/pull/12262) #### Operator * [main] Increase the memory limit of the vitess-operator (#11548) [#11550](https://github.com/vitessio/vitess/pull/11550) * Fix rbac config in the vtop example [#12034](https://github.com/vitessio/vitess/pull/12034) @@ -85,13 +94,22 @@ * VTGate: Ensure HealthCheck Cache Secondary Maps Stay in Sync With Authoritative Map on Tablet Delete [#12178](https://github.com/vitessio/vitess/pull/12178) * schemadiff: fix scenario where no tables exist in schema and with just views reading from DUAL [#12189](https://github.com/vitessio/vitess/pull/12189) * Fix parsing of bitnum values larger than 64 bit [#12191](https://github.com/vitessio/vitess/pull/12191) - * Online DDL: fix deadlock by releasing mutex before calling callback [#12211](https://github.com/vitessio/vitess/pull/12211) + * Online DDL: fix deadlock by releasing mutex before calling callback [#12211](https://github.com/vitessio/vitess/pull/12211) + * fix: transaction_isolation to be applied at session level [#12281](https://github.com/vitessio/vitess/pull/12281) + * Fix aggregation on outer joins [#12298](https://github.com/vitessio/vitess/pull/12298) + * [release-16.0] fix: added null safe operator precendence rule (#12297) [#12307](https://github.com/vitessio/vitess/pull/12307) + * Fix for USING when column names not lower cased [#12379](https://github.com/vitessio/vitess/pull/12379) + * [release-16.0] Fix bug in vtexplain around JOINs (#12376) [#12384](https://github.com/vitessio/vitess/pull/12384) + * 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) #### VReplication * VReplication: escape identifiers when renaming source tables [#11670](https://github.com/vitessio/vitess/pull/11670) * VReplication: Prevent Orphaned VDiff2 Jobs [#11768](https://github.com/vitessio/vitess/pull/11768) * VDiff2: Properly Apply --only_pks Report Flag [#12025](https://github.com/vitessio/vitess/pull/12025) * VReplication: Improve Error/Status Reporting [#12052](https://github.com/vitessio/vitess/pull/12052) - * VReplication: Propagate Binlog Stream Errors [#12095](https://github.com/vitessio/vitess/pull/12095) + * VReplication: Propagate Binlog Stream Errors [#12095](https://github.com/vitessio/vitess/pull/12095) + * VReplication: ignore GC tables in schema analysis [#12320](https://github.com/vitessio/vitess/pull/12320) + * Sidecar schema init: use COPY algorithm while altering sidecardb tables [#12436](https://github.com/vitessio/vitess/pull/12436) #### VTorc * Fix VTOrc holding locks after shutdown [#11442](https://github.com/vitessio/vitess/pull/11442) * [15.0] Fix VTOrc to handle multiple failures [#11489](https://github.com/vitessio/vitess/pull/11489) @@ -129,7 +147,8 @@ * consolidating OnlineDDL 'declarative' tests into 'scheduler' tests: part 1 [#12061](https://github.com/vitessio/vitess/pull/12061) * OnlineDDL CI: remove 'revertible' tests (part 2) [#12192](https://github.com/vitessio/vitess/pull/12192) * Update vtadmin dependencies [#12201](https://github.com/vitessio/vitess/pull/12201) - * Update Go dependencies [#12215](https://github.com/vitessio/vitess/pull/12215) + * Update Go dependencies [#12215](https://github.com/vitessio/vitess/pull/12215) + * Download mariadb from vitess-resources [#12271](https://github.com/vitessio/vitess/pull/12271) #### Cluster management * Endtoend cluster improvements [#11859](https://github.com/vitessio/vitess/pull/11859) * CI, tabletmanager throttler topo tests: polling until status received [#12107](https://github.com/vitessio/vitess/pull/12107) @@ -143,7 +162,8 @@ * Add more codeowners to the `/test` directory [#11762](https://github.com/vitessio/vitess/pull/11762) #### Query Serving * Consistent sorting in Online DDL Vrepl suite test [#11821](https://github.com/vitessio/vitess/pull/11821) - * Flakes: Properly Test HealthCheck Cache Response Handling [#12226](https://github.com/vitessio/vitess/pull/12226) + * Flakes: Properly Test HealthCheck Cache Response Handling [#12226](https://github.com/vitessio/vitess/pull/12226) + * Fix `SHOW VSCHEMA TABLES` tests using v17 vtgate that expected `dual` [#12381](https://github.com/vitessio/vitess/pull/12381) #### TabletManager * Update throttler-topo workflow file [#11784](https://github.com/vitessio/vitess/pull/11784) * Fix closing the body for HTTP requests [#11842](https://github.com/vitessio/vitess/pull/11842) @@ -152,6 +172,9 @@ #### VTorc * Move vtorc runners back to normal github runners [#11482](https://github.com/vitessio/vitess/pull/11482) ### Dependabot +#### Build/CI + * [release-16.0] Bump golang.org/x/net from 0.5.0 to 0.7.0 (#12390) [#12400](https://github.com/vitessio/vitess/pull/12400) + * [release-16.0] Update additional Go dependencies (#12401) [#12402](https://github.com/vitessio/vitess/pull/12402) #### Java * build(deps): Bump protobuf-java from 3.19.4 to 3.19.6 in /java [#11439](https://github.com/vitessio/vitess/pull/11439) #### VTAdmin @@ -167,6 +190,8 @@ #### Documentation * Upgrades the release notes for v15.0.0 [#11567](https://github.com/vitessio/vitess/pull/11567) * Copy design docs over from website [#12071](https://github.com/vitessio/vitess/pull/12071) +#### Query Serving + * Add release notes summary for views [#12422](https://github.com/vitessio/vitess/pull/12422) #### VReplication * Mark VDiff V2 as GA in v16 [#12084](https://github.com/vitessio/vitess/pull/12084) ### Enhancement @@ -185,7 +210,8 @@ * Allow override of build git env in docker/base builds [#11968](https://github.com/vitessio/vitess/pull/11968) * Add vtorc port to vitess local docker run [#12001](https://github.com/vitessio/vitess/pull/12001) * Update the MySQL version used by our Docker images [#12054](https://github.com/vitessio/vitess/pull/12054) - * Fail CI when a PR is labeled with `NeedsWebsiteDocsUpdate` or `NeedsDescriptionUpdate` [#12062](https://github.com/vitessio/vitess/pull/12062) + * Fail CI when a PR is labeled with `NeedsWebsiteDocsUpdate` or `NeedsDescriptionUpdate` [#12062](https://github.com/vitessio/vitess/pull/12062) + * Revert default MySQL 80 version to `8.0.30` [#12252](https://github.com/vitessio/vitess/pull/12252) #### CLI * Add GenerateShardRanges to vtctldclient [#11492](https://github.com/vitessio/vitess/pull/11492) * Properly deprecate flags and fix default for `--cell` [#11501](https://github.com/vitessio/vitess/pull/11501) @@ -207,7 +233,8 @@ * Add default lower stack limit [#11569](https://github.com/vitessio/vitess/pull/11569) * Upgrade to `go1.19.4` [#11905](https://github.com/vitessio/vitess/pull/11905) * Add structure logging to Vitess [#11960](https://github.com/vitessio/vitess/pull/11960) - * Revert changes made in #11960 [#12219](https://github.com/vitessio/vitess/pull/12219) + * Revert changes made in #11960 [#12219](https://github.com/vitessio/vitess/pull/12219) + * Upgrade `release-16.0` to `go1.20.1` [#12398](https://github.com/vitessio/vitess/pull/12398) #### Governance * Add manan and florent to Docker files CODEOWNERS [#11981](https://github.com/vitessio/vitess/pull/11981) #### Query Serving @@ -263,7 +290,13 @@ * schemadiff: TableCharsetCollateStrategy hint [#12137](https://github.com/vitessio/vitess/pull/12137) * Support BETWEEN in the evalengine [#12150](https://github.com/vitessio/vitess/pull/12150) * Use schema for the information_schema views [#12171](https://github.com/vitessio/vitess/pull/12171) - * vtgateconn: add DeregisterDialer hook [#12213](https://github.com/vitessio/vitess/pull/12213) + * vtgateconn: add DeregisterDialer hook [#12213](https://github.com/vitessio/vitess/pull/12213) + * add database name to _vt.views table [#12368](https://github.com/vitessio/vitess/pull/12368) + * Schema RPC to fetch table/view definition [#12375](https://github.com/vitessio/vitess/pull/12375) + * Change `GetSchema` RPC to return `CreateView` instead of `SelectStmt` [#12421](https://github.com/vitessio/vitess/pull/12421) + * GetSchema rpc to streaming api [#12447](https://github.com/vitessio/vitess/pull/12447) +#### TabletManager + * SidecarDB Init: don't fail on schema init errors [#12328](https://github.com/vitessio/vitess/pull/12328) #### VReplication * VReplication Copy Phase: Parallelize Bulk Inserts [#10828](https://github.com/vitessio/vitess/pull/10828) * VSCopy: Resume the copy phase consistently from given GTID and lastpk [#11103](https://github.com/vitessio/vitess/pull/11103) @@ -273,7 +306,8 @@ * Allow users to control VReplication DDL handling [#11532](https://github.com/vitessio/vitess/pull/11532) * VReplication: Defer Secondary Index Creation [#11700](https://github.com/vitessio/vitess/pull/11700) * VSCopy: Send COPY_COMPLETED events when the copy operation is done [#11740](https://github.com/vitessio/vitess/pull/11740) - * Add `VStreamerCount` stat to `vttablet` [#11978](https://github.com/vitessio/vitess/pull/11978) + * Add `VStreamerCount` stat to `vttablet` [#11978](https://github.com/vitessio/vitess/pull/11978) + * VReplication: Use MariaDB Compat JSON Functions [#12420](https://github.com/vitessio/vitess/pull/12420) #### VTAdmin * [VTAdmin] `Validate`, `ValidateShard`, `ValidateVersionShard`, `GetFullStatus` [#11438](https://github.com/vitessio/vitess/pull/11438) * Full Status tab improvements for VTAdmin [#11470](https://github.com/vitessio/vitess/pull/11470) @@ -291,8 +325,9 @@ * Add support for views in vtgate [#11195](https://github.com/vitessio/vitess/pull/11195) * Add support for Views DDL [#11896](https://github.com/vitessio/vitess/pull/11896) * notify view change to vtgate [#12115](https://github.com/vitessio/vitess/pull/12115) - * Views Support: Updating Views in VSchema for query serving [#12124](https://github.com/vitessio/vitess/pull/12124) -#### Admin Web UI + * Views Support: Updating Views in VSchema for query serving [#12124](https://github.com/vitessio/vitess/pull/12124) + * Create Views allowed for same keyspace [#12409](https://github.com/vitessio/vitess/pull/12409) +#### web UI * [VTAdmin] Topology Browser [#11496](https://github.com/vitessio/vitess/pull/11496) ### Internal Cleanup #### Backup and Restore @@ -316,7 +351,11 @@ * Remove example script that caused some confusion [#11529](https://github.com/vitessio/vitess/pull/11529) * Remove unused ioutil2 code [#11661](https://github.com/vitessio/vitess/pull/11661) * Fix some linter errors [#11773](https://github.com/vitessio/vitess/pull/11773) - * Remove Deprecated flags, code and stats. [#12083](https://github.com/vitessio/vitess/pull/12083) + * Remove Deprecated flags, code and stats. [#12083](https://github.com/vitessio/vitess/pull/12083) + * Fix release notes on release-16.0 [#12276](https://github.com/vitessio/vitess/pull/12276) + * Fix summary and release notes [#12283](https://github.com/vitessio/vitess/pull/12283) + * Reorder summary in order of importance [#12433](https://github.com/vitessio/vitess/pull/12433) + * release notes: mark dynamic throttler configuration as experimental [#12475](https://github.com/vitessio/vitess/pull/12475) #### Governance * Correct minor inaccuracies in governing docs [#11933](https://github.com/vitessio/vitess/pull/11933) #### Online DDL @@ -343,7 +382,7 @@ * VReplication: Remove Deprecated V1 Client Commands [#11705](https://github.com/vitessio/vitess/pull/11705) #### VTAdmin * move react-scripts to dev dependencies [#11767](https://github.com/vitessio/vitess/pull/11767) -#### Admin Web UI +#### web UI * [vtctld2] Remove vtctld2 UI and vtctld server components that serve the app UI [#11851](https://github.com/vitessio/vitess/pull/11851) ### Performance #### Cluster management @@ -373,6 +412,10 @@ * Release notes for 15.0.1 [#11850](https://github.com/vitessio/vitess/pull/11850) * updating summary and release notes for v15.0.1 [#11852](https://github.com/vitessio/vitess/pull/11852) * [main] Update the release `15.0.2` summary doc (#11954) [#11956](https://github.com/vitessio/vitess/pull/11956) + * Release of v16.0.0-rc1 [#12235](https://github.com/vitessio/vitess/pull/12235) + * Back to dev mode after v16.0.0-rc1 [#12277](https://github.com/vitessio/vitess/pull/12277) + * [release-16.0] Fix release script for the version in the docker script (#12284) [#12289](https://github.com/vitessio/vitess/pull/12289) + * Code freeze of release-16.0 for v16.0.0 [#12469](https://github.com/vitessio/vitess/pull/12469) ### Testing #### Backup and Restore * go/vt/mysqlctl: add compression benchmarks [#11994](https://github.com/vitessio/vitess/pull/11994) @@ -385,9 +428,12 @@ * Remove the semgrep action [#12148](https://github.com/vitessio/vitess/pull/12148) * CI cleanup: remove onlineddl_declarative, onlineddl_singleton (cleanup part 2) [#12182](https://github.com/vitessio/vitess/pull/12182) * Online DDL CI: consolidated revertible and revert CI tests (part 1) [#12183](https://github.com/vitessio/vitess/pull/12183) - * Allow manually kicking off CodeQL [#12200](https://github.com/vitessio/vitess/pull/12200) + * Allow manually kicking off CodeQL [#12200](https://github.com/vitessio/vitess/pull/12200) + * Don't keep data in upgrade-downgrade tests [#12462](https://github.com/vitessio/vitess/pull/12462) #### General * endtoend: fix dbconfig initialization for endtoend tests [#11609](https://github.com/vitessio/vitess/pull/11609) +#### Online DDL + * Backport to v16: onlineddl_vrepl flakiness and subsequent fixes [#12426](https://github.com/vitessio/vitess/pull/12426) #### Query Serving * Add additional unit test with state changes swapped [#11192](https://github.com/vitessio/vitess/pull/11192) * Use JSON for plan tests [#11430](https://github.com/vitessio/vitess/pull/11430) diff --git a/doc/releasenotes/16_0_0_release_notes.md b/doc/releasenotes/16_0_0_release_notes.md index 36996f95f82..b860a907031 100644 --- a/doc/releasenotes/16_0_0_release_notes.md +++ b/doc/releasenotes/16_0_0_release_notes.md @@ -1,30 +1,33 @@ -# Release of Vitess v16.0.0-rc1 +# Release of Vitess v16.0.0 ## Summary ### Table of Contents - **[Major Changes](#major-changes)** - - **[VReplication](#vreplication)** - - [VStream Copy Resume](#vstream-copy-resume) - - [VDiff2 GA](#vdiff2-ga) - - **[Tablet throttler](#tablet-throttler)** - - **[Incremental backup and point in time recovery](#inc-backup)** - - **[Replication manager removal and VTOrc becomes mandatory](#repl-manager-removal)** - **[Breaking Changes](#breaking-changes)** - [VTGate Advertised MySQL Version](#advertised-mysql-version) - [Default MySQL version on Docker](#default-mysql-version) - - [Running Vitess on the Operator](#running-vitess-on-the-operator) - - [vtctld UI Removal](#vtcltd-ui-removal) - - [vtctld Flag Deprecation & Deletions](#vtctld-flag-deprecations) + - [⚠️ Upgrading to this release with vitess-operator](#upgrading-to-this-release-with-vitess-operator) + - [Flag Deletions and Deprecations](#flag-deletions-and-deprecations) + - [VTCtld](#vtctld-flag-deletions-deprecations) + - [MySQLCtl](#mysqlctl-flag-deletions-deprecations) + - [VTTablet](#vttablet-flag-deletions-deprecations) + - [VTBackup](#vtbackup-flag-deletions-deprecations) + - [VTOrc](#vtorc-flag-deletions-deprecations) + - [`lock-timeout` and `remote_operation_timeout` Changes](#lock-timeout-introduction) - [Orchestrator Integration Deletion](#orc-integration-removal) - - [mysqlctl Flags](#mysqlctl-flags) + - [vtctld UI Removal](#vtcltd-ui-removal) - [Query Serving Errors](#qs-errors) - [Logstats Table and Keyspace removed](#logstats-table-keyspace) - [Removed Stats](#removed-stats) - [Deprecated Stats](#deprecated-stats) - - [Removed flag](#removed-flag) - - [`lock-timeout` and `remote_operation_timeout` Changes](#lock-timeout-introduction) - [Normalized labels in the Prometheus Exporter](#normalized-lables) + - **[Replication manager removal and VTOrc becomes mandatory](#repl-manager-removal)** + - **[VReplication](#vreplication)** + - [VStream Copy Resume](#vstream-copy-resume) + - [VDiff2 GA](#vdiff2-ga) + - **[Tablet throttler](#tablet-throttler)** + - **[Incremental backup and point in time recovery](#inc-backup)** - **[New command line flags and behavior](#new-flag)** - [VTGate: Support query timeout --query-timeout](#vtgate-query-timeout) - [VTTablet: VReplication parallel insert workers --vreplication-parallel-insert-workers](#vrepl-parallel-workers) @@ -41,8 +44,6 @@ - [Transaction Isolation Level](#transaction-isolation-level) - [Transaction Access Mode](#transaction-access-mode) - [Support for views](#support-views) - - **[VTOrc](#vtorc)** - - [Flag Deprecations](#flag-deprecations) - **[VTTestServer](#vttestserver)** - [Performance Improvement](#perf-improvement) - **[Minor Changes](#minor-changes)** @@ -52,54 +53,21 @@ ## Major Changes -### VReplication - -#### VStream Copy Resume - -In [PR #11103](https://github.com/vitessio/vitess/pull/11103) we introduced the ability to resume a `VTGate` [`VStream` copy operation](https://vitess.io/docs/design-docs/vreplication/vstream/vscopy/). This is useful when a [`VStream` copy operation](https://vitess.io/docs/design-docs/vreplication/vstream/vscopy/) is interrupted due to e.g. a network failure or a server restart. The `VStream` copy operation can be resumed by specifying each table's last seen primary key value in the `VStream` request. Please see the [`VStream` docs](https://vitess.io/docs/16.0/reference/vreplication/vstream/) for more details. - -#### VDiff2 GA - -We are marking [VDiff v2](https://vitess.io/docs/16.0/reference/vreplication/vdiff2/) as Generally Available or production-ready in v16. We now recommend that you use v2 rather than v1 going forward. V1 will be deprecated and eventually removed in future releases. -If you wish to use v1 for any reason, you will now need to specify the `--v1` flag. - -### Tablet throttler - -The tablet throttler can now be configured dynamically. Configuration is now found in the topo service, and applies to all tablets in all shards and cells of a given keyspace. For backwards compatibility `v16` still supports `vttablet`-based command line flags for throttler ocnfiguration. - -It is possible to enable/disable, to change throttling threshold as well as the throttler query. - -See https://github.com/vitessio/vitess/pull/11604 - -### Incremental backup and point in time recovery - -In [PR #11097](https://github.com/vitessio/vitess/pull/11097) we introduced native incremental backup and point in time recovery: - -- It is possible to take an incremental backup, starting with last known (full or incremental) backup, and up to either a specified (GTID) position, or current ("auto") position. -- The backup is done by copying binary logs. The binary logs are rotated as needed. -- It is then possible to restore a backup up to a given point in time (GTID position). This involves finding a restore path consisting of a full backup and zero or more incremental backups, applied up to the given point in time. -- A server restored to a point in time remains in `DRAINED` tablet type, and does not join the replication stream (thus, "frozen" in time). -- It is possible to take incremental backups from different tablets. It is OK to have overlaps in incremental backup contents. The restore process chooses a valid path, and is valid as long as there are no gaps in the backed up binary log content. - -### Replication manager removal and VTOrc becomes mandatory -VTOrc is now a **required** component of Vitess starting from v16. If the users want VTOrc to manage replication, then they must run VTOrc. -Replication manager is removed from vttablets since the responsibility of fixing replication lies entirely with VTOrc now. -The flag `disable-replication-manager` is deprecated and will be removed in a later release. - ### Breaking Changes #### VTGate Advertised MySQL Version -VTGate now advertises MySQL version 8.0.30. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. +Since [Pull Request #11989](https://github.com/vitessio/vitess/pull/11989), VTGate advertises MySQL version 8.0.30. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. The users can set the `mysql_server_version` flag to advertise the correct version. #### Default MySQL version on Docker The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the patch version of MySQL80 has been upgraded from `8.0.23` to `8.0.30`. +This change was brought by [Pull Request #12252](https://github.com/vitessio/vitess/pull/12252). -#### Running Vitess on the Operator +#### ⚠️Upgrading to this release with vitess-operator -If you are using the vitess-operator and want to remain on MySQL 5.7, we invite you to use the `vitess/lite:v16.0.0-mysql57` Docker Image. +If you are using the vitess-operator and want to remain on MySQL 5.7, **you are required** to use the `vitess/lite:v16.0.0-mysql57` Docker Image, otherwise the `vitess/lite:v16.0.0` image will be on MySQL 80. However, if you are running MySQL 8.0 on the vitess-operator, with for instance `vitess/lite:v15.0.2-mysql80`, considering that we are bumping the patch version of MySQL 80 from `8.0.23` to `8.0.30`, you will have to manually upgrade: @@ -110,12 +78,9 @@ However, if you are running MySQL 8.0 on the vitess-operator, with for instance 5. Remove `innodb_fast_shutdown=0` from your extra cnf in your YAML file. 6. Apply this file. -#### vtctld web UI Removal -In v13, the vtctld UI was deprecated. As of this release, the `web/vtctld2` directory is deleted and the UI will no longer be included in any Vitess images going forward. All build scripts and the Makefile have been updated to reflect this change. +#### Flag Deletions and Deprecations -However, the vtctld HTTP API will remain at `{$vtctld_web_port}/api`. - -#### vtctld Flag Deprecation & Deletions +##### VTCtld With the removal of the vtctld UI, the following vtctld flags have been deprecated: - `--vtctld_show_topology_crud`: This was a flag that controlled the display of CRUD topology actions in the vtctld UI. The UI is removed, so this flag is no longer necessary. @@ -128,19 +93,51 @@ The following deprecated flags have also been removed: - `--workflow_manager_use_election` - `--workflow_manager_disable` +##### MySQLCtld + +The [`mysqlctl` command-line client](https://vitess.io/docs/16.0/reference/programs/mysqlctl/) had some leftover (ignored) server flags after the [v15 pflag work](https://github.com/vitessio/enhancements/blob/main/veps/vep-4.md). Those unused flags have now been removed. If you are using any of the following flags with `mysqlctl` in your scripts or other tooling, they will need to be removed prior to upgrading to v16: +`--port --grpc_auth_static_client_creds --grpc_compression --grpc_initial_conn_window_size --grpc_initial_window_size --grpc_keepalive_time --grpc_keepalive_timeout` + +##### VTTablet + +The following flags were removed in v16: +- `--enable_semi_sync` +- `--backup_storage_hook`, use one of the builtin compression algorithms or `--external-compressor` and `--external-decompressor` instead. +- `--init_populate_metadata`, since we have deleted the `local_metadata` and `shard_metadata` sidecar database tables. + +The flag `--disable-replication-manager` is deprecated and will be removed in a future release. + +##### VTBackup + +The VTBackup flag `--backup_storage_hook` has been removed, use one of the builtin compression algorithms or `--external-compressor` and `--external-decompressor` instead. + + +##### VTOrc + +The flag `--lock-shard-timeout` has been deprecated. Please use the newly introduced `--lock-timeout` flag instead. More detail [here](#lock-timeout-introduction). + +#### `lock-timeout` and `remote_operation_timeout` Changes + +Before the changes made in [Pull Request #11881](https://github.com/vitessio/vitess/pull/11881), the shard and keyspace locks used to be capped by the `remote_operation_timeout`. This is no longer the case and instead a new flag called `lock-timeout` is introduced. +For backward compatibility, if `lock-timeout` is unspecified and `remote_operation_timeout` flag is provided, then its value will also be used for `lock-timeout`. +The default value for `remote_operation_timeout` has also changed from 30 seconds to 15 seconds. The default for the new flag `lock-timeout` is 45 seconds. + +During upgrades, if the users want to preserve the same behaviour as previous releases, then they should provide the `remote_operation_timeout` flag explicitly before upgrading. +After the upgrade, they should then alter their configuration to also specify `lock-timeout` explicitly. + #### Orchestrator Integration Deletion Orchestrator integration in `vttablet` was deprecated in the previous release and is deleted in this release. -Consider using `VTOrc` instead of `Orchestrator`. +`VTOrc` should be deployed instead. You can read more on [how VTOrc is designed](https://vitess.io/docs/16.0/reference/vtorc/) and on [how to run VTOrc in production](https://vitess.io/docs/16.0/user-guides/configuration-basic/vtorc/). -#### mysqlctl Flags +#### vtctld web UI Removal +In v13, the vtctld UI was deprecated. As of this release, the `web/vtctld2` directory is deleted and the UI will no longer be included in any Vitess images going forward. All build scripts and the Makefile have been updated to reflect this change, which was done in [Pull Request #11851](https://github.com/vitessio/vitess/pull/11851) -The [`mysqlctl` command-line client](https://vitess.io/docs/16.0/reference/programs/mysqlctl/) had some leftover (ignored) server flags after the [v15 pflag work](https://github.com/vitessio/enhancements/blob/main/veps/vep-4.md). Those unused flags have now been removed. If you are using any of the following flags with `mysqlctl` in your scripts or other tooling, they will need to be removed prior to upgrading to v16: - `--port --grpc_auth_static_client_creds --grpc_compression --grpc_initial_conn_window_size --grpc_initial_window_size --grpc_keepalive_time --grpc_keepalive_timeout` +However, the vtctld HTTP API will remain at `{$vtctld_web_port}/api`. #### Query Serving Errors -In this release, we are introducing a new way to report errors from Vitess through the query interface. +In [Pull Request #10738](https://github.com/vitessio/vitess/pull/10738) we are introducing a new way to report errors from Vitess through the query interface. Errors will now have an error code for each error, which will make it easy to search for more information on the issue. For instance, the following error: @@ -163,33 +160,69 @@ If your application is searching for specific errors, you might need to update y #### Logstats Table and Keyspace removed Information about which tables are used is now reported by the field TablesUsed added in v15, that is a string array, listing all tables and which keyspace they are in. -The Table/Keyspace fields were deprecated in v15 and are now removed in the v16 release of Vitess. +The Table/Keyspace fields were deprecated in v15 and are now removed in the v16 release, more information can be found on [Pull Request #12083](https://github.com/vitessio/vitess/pull/12083). #### Removed Stats -The stat `QueryRowCounts` is removed in v16. `QueryRowsAffected` and `QueryRowsReturned` can be used instead to gather the same information. +The stat `QueryRowCounts` is removed in v16 as part of [Pull Request #12083](https://github.com/vitessio/vitess/pull/12083). `QueryRowsAffected` and `QueryRowsReturned` can be used instead to gather the same information. #### Deprecated Stats -The stats `QueriesProcessed` and `QueriesRouted` are deprecated in v16. The same information can be inferred from the stats `QueriesProcessedByTable` and `QueriesRoutedByTable` respectively. These stats will be removed in the next release. +The stats `QueriesProcessed` and `QueriesRouted` are deprecated in v16 as part of [Pull Request #12083](https://github.com/vitessio/vitess/pull/12083). The same information can be inferred from the stats `QueriesProcessedByTable` and `QueriesRoutedByTable` respectively. These stats will be removed in the next release. -#### Removed flag +#### Normalized labels in the Prometheus Exporter -The following flag is removed in v16: -- `enable_semi_sync` +The Prometheus metrics exporter now properly normalizes _all_ label names into their `snake_case` form, as it is idiomatic for Prometheus metrics. Previously, Vitess instances were emitting inconsistent labels for their metrics, with some of them being `CamelCase` and others being `snake_case`. +More information about this change can be found on [Pull Request #12057](https://github.com/vitessio/vitess/pull/12057). -#### `lock-timeout` and `remote_operation_timeout` Changes +For example, `vtgate_topology_watcher_errors{Operation="GetTablet"} 0` will become `vtgate_topology_watcher_errors{operation="GetTablet"} 0` -Earlier, the shard and keyspace locks used to be capped by the `remote_operation_timeout`. This is no longer the case and instead a new flag called `lock-timeout` is introduced. -For backward compatibility, if `lock-timeout` is unspecified and `remote_operation_timeout` flag is provided, then its value will also be used for `lock-timeout` as well. -The default value for `remote_operation_timeout` has also changed from 30 seconds to 15 seconds. The default for the new flag `lock-timeout` is 45 seconds. +Some more of these changes are listed here - -During upgrades, if the users want to preserve the same behaviour as previous releases, then they should provide the `remote_operation_timeout` flag explicitly before upgrading. -After the upgrade, they should then alter their configuration to also specify `lock-timeout` explicitly. +| Previous metric | New Metric | +|-------------------------------------------------------------|-------------------------------------------------------------| +| vtgate_topology_watcher_operations{Operation="AddTablet"} | vtgate_topology_watcher_operations{operation="AddTablet"} | +| vtgate_queries_processed{Plan="Reference"} | vtgate_queries_processed{plan="Reference"} | +| vtgate_queries_routed{Plan="Reference"} | vtgate_queries_routed{plan="Reference"} | +| vttablet_table_allocated_size{Table="corder"} | vttablet_table_allocated_size{table="corder"} | +| vttablet_table_file_size{Table="corder"} | vttablet_table_file_size{table="corder"} | +| vttablet_topology_watcher_errors{Operation="GetTablet"} | vttablet_topology_watcher_errors{operation="GetTablet"} | +| vttablet_topology_watcher_operations{Operation="AddTablet"} | vttablet_topology_watcher_operations{operation="AddTablet"} | -#### Normalized labels in the Prometheus Exporter +### Replication manager removal and VTOrc becomes mandatory +VTOrc is now a **required** component of Vitess starting from v16. If the users want Vitess to manage replication, then they must run VTOrc. +Replication manager is removed from vttablets since the responsibility of fixing replication lies entirely with VTOrc now. +The flag `disable-replication-manager` is deprecated and will be removed in a future release. -The Prometheus metrics exporter now properly normalizes _all_ label names into their `snake_case` form, as it is idiomatic for Prometheus metrics. Previously, Vitess instances were emitting inconsistent labels for their metrics, with some of them being `CamelCase` and others being `snake_case`. +### VReplication + +#### VStream Copy Resume + +In [Pull Request #11103](https://github.com/vitessio/vitess/pull/11103) we introduced the ability to resume a `VTGate` [`VStream` copy operation](https://vitess.io/docs/16.0/reference/vreplication/vstream/). This is useful when a [`VStream` copy operation](https://vitess.io/docs/16.0/reference/vreplication/vstream/) is interrupted due to e.g. a network failure or a server restart. The `VStream` copy operation can be resumed by specifying each table's last seen primary key value in the `VStream` request. Please see the [`VStream` docs](https://vitess.io/docs/16.0/reference/vreplication/vstream/) for more details. + +#### VDiff2 GA + +We are marking [VDiff v2](https://vitess.io/docs/16.0/reference/vreplication/vdiff2/) as production-ready in v16. We now recommend that you use v2 rather than v1 going forward. V1 will be deprecated and eventually removed in future releases. +If you wish to use v1 for any reason, you will now need to specify the `--v1` flag. + +### Tablet throttler + +The tablet throttler can now be configured dynamically. Configuration is now found in the topo service, and applies to all tablets in all shards and cells of a given keyspace. +It is possible to enable or disable throttling, and to change the throttling threshold as well as the throttler query. + +Please note that this feature is considered experimental in this release. For backwards compatibility `v16` still supports `vttablet`-based command line flags for throttler configuration. + +More information can be found on [Pull Request #11604](https://github.com/vitessio/vitess/pull/11604). + +### Incremental backup and point in time recovery + +In [Pull Request #11097](https://github.com/vitessio/vitess/pull/11097) we introduced native incremental backup and point in time recovery: + +- It is possible to take an incremental backup, starting with last known (full or incremental) backup, and up to either a specified (GTID) position, or current ("auto") position. +- The backup is done by copying binary logs. The binary logs are rotated as needed. +- It is then possible to restore a backup up to a given point in time (GTID position). This involves finding a restore path consisting of a full backup and zero or more incremental backups, applied up to the given point in time. +- A server restored to a point in time remains in `DRAINED` tablet type, and does not join the replication stream (thus, "frozen" in time). +- It is possible to take incremental backups from different tablets. It is OK to have overlaps in incremental backup contents. The restore process chooses a valid path, and is valid as long as there are no gaps in the backed up binary log content. ### New command line flags and behavior @@ -197,7 +230,7 @@ The Prometheus metrics exporter now properly normalizes _all_ label names into t `--query-timeout` allows you to specify a timeout for queries. This timeout is applied to all queries. It can be overridden by setting the `query_timeout` session variable. -Setting it as command line directive with `QUERY_TIMEOUT_MS` will override other values. +Setting it as query comment directive with `QUERY_TIMEOUT_MS` will override other values. #### VTTablet: VReplication parallel insert workers --vreplication-parallel-insert-workers @@ -262,9 +295,9 @@ $ vtctlclient -- Backup --incremental_from_pos "auto" zone1-0000000102 When the value is `auto`, the position is evaluated as the last successful backup's `Position`. The idea with incremental backups is to create a contiguous (overlaps allowed) sequence of backups that store all changes from last full backup. -The incremental backup copies binary log files. It does not take MySQL down nor places any locks. It does not interrupt traffic on the MySQL server. The incremental backup copies comlete binlog files. It initially rotates binary logs, then copies anything from the requested position and up to the last completed binary log. +The incremental backup copies binary log files. It does not take MySQL down nor places any locks. It does not interrupt traffic on the MySQL server. The incremental backup copies complete binlog files. It initially rotates binary logs, then copies anything from the requested position and up to the last completed binary log. -The backup thus does not necessarily start _exactly_ at the requested position. It starts with the first binary log that has newer entries than requested position. It is OK if the binary logs include transactions prior to the equested position. The restore process will discard any duplicates. +The backup thus does not necessarily start _exactly_ at the requested position. It starts with the first binary log that has newer entries than requested position. It is OK if the binary logs include transactions prior to the requested position. The restore process will discard any duplicates. Normally, you can expect the backups to be precisely contiguous. Consider an `auto` value: due to the nature of log rotation and the fact we copy complete binlog files, the next incremental backup will start with the first binay log not covered by the previous backup, which in itself copied the one previous binlog file in full. Again, it is completely valid to enter any good position. @@ -301,13 +334,12 @@ The `RestoreFromBackup --restore_to_pos` ends with: - tablet type is `DRAINED` #### New `vexplain` command -A new `vexplain` command has been introduced with the following syntax - +A new `vexplain` command has been introduced with the following syntax: ``` VEXPLAIN [ALL|QUERIES|PLAN] explainable_stmt ``` -This command will help the users look at the plan that vtgate comes up with for the given query (`PLAN` type), see all the queries that are executed on all the MySQL instances (`QUERIES` type), -and see the vtgate plan along with the MySQL explain output for the executed queries (`ALL` type). +This command will help users look at the plan that vtgate comes up with for the given query (`PLAN` type), see all the queries that are executed on all the MySQL instances (`QUERIES` type), and see the vtgate plan along with the MySQL explain output for the executed queries (`ALL` type). The formats `VTEXPLAIN` and `VITESS` for `EXPLAIN` queries are deprecated, and these newly introduced commands should be used instead. @@ -330,22 +362,15 @@ is now fixed. The full issue can be found [here](https://github.com/vitessio/vit - `vtctlclient OnlineDDL ... [complete|retry|cancel|cancel-all]` returns empty result on success instead of number of shard affected. -- VTTablet flag `--backup_storage_hook` has been removed, use one of the builtin compression algorithms or `--external-compressor` and `--external-decompressor` instead. - -- vtbackup flag `--backup_storage_hook` has been removed, use one of the builtin compression algorithms or `--external-compressor` and `--external-decompressor` instead. - -- The VTTablet flag `--init_populate_metadata` has been deprecated, since we have deleted the `local_metadata` and `shard_metadata` sidecar database tables. - - The dead legacy Workflow Manager related code was removed in [#12085](https://github.com/vitessio/vitess/pull/12085). This included the following `vtctl` client commands: `WorkflowAction`, `WorkflowCreate`, `WorkflowWait`, `WorkflowStart`, `WorkflowStop`, `WorkflowTree`, `WorkflowDelete`. - VTAdmin's `VTExplain` endpoint has been deprecated. Users can use the new `vexplain` query format instead. The endpoint will be deleted in a future release. - ### MySQL Compatibility #### Transaction Isolation Level -Support added for `set [session] transaction isolation level ` +In [Pull Request #11704](https://github.com/vitessio/vitess/pull/11704) we are adding support for `set [session] transaction isolation level ` ```sql transaction_characteristic: { @@ -361,12 +386,12 @@ level: { } ``` -This will set the transaction isolation level for the current session. +This will set the transaction isolation level for the current session. This will be applied to any shard where the session will open a transaction. #### Transaction Access Mode -Support added for `start transaction` with transaction characteristic. +In [Pull Request #11704](https://github.com/vitessio/vitess/pull/11704) we are adding support for `start transaction` with transaction characteristic. ```sql START TRANSACTION @@ -383,36 +408,19 @@ This will allow users to start a transaction with these characteristics. #### Support For Views -Vitess now supports views in sharded keyspace. Views are not created on the underlying database but are logically stored -in vschema. -Any query using a view will get re-written as a derived table during query planning. -VSchema Example - -```json -{ - "sharded": true, - "vindexes": {}, - "tables": {}, - "views": { - "view1": "select * from t1", - "view2": "select * from t2", - } -} -``` - -### VTOrc - -#### Flag Deprecations +Views sharded support is released as an experimental feature in `v16.0.0`. +Views are not enabled by default in your Vitess cluster, but they can be turned on using the `--enable-views` flag on VTGate, and `--queryserver-enable-views` flag on VTTablet. -The flag `lock-shard-timeout` has been deprecated. Please use the newly introduced `lock-timeout` instead. More detail [here](#lock-timeout-introduction). +To read more on how views are implemented you can read the [Views Support RFC](https://github.com/vitessio/vitess/issues/11559). +And if you want to learn more on how to use views and its current limitations, you can read the [Views Documentation](https://vitess.io/docs/16.0/reference/compatibility/mysql-compatibility/#views). ### VTTestServer #### Performance Improvement Creating a database with vttestserver was taking ~45 seconds. This can be problematic in test environments where testcases do a lot of `create` and `drop` database. -In an effort to minimize the database creation time, we have changed the value of `tablet_refresh_interval` to 10s while instantiating vtcombo during vttestserver initialization. We have also made this configurable so that it can be reduced further if desired. -For any production cluster the default value of this flag is still [1 minute](https://vitess.io/docs/15.0/reference/programs/vtgate/). Reducing this value might put more stress on Topo Server (since we now read from Topo server more often) but for testing purposes +In an effort to minimize the database creation time, in [Pull Request #11918](https://github.com/vitessio/vitess/pull/11918) we have changed the value of `tablet_refresh_interval` to 10s while instantiating vtcombo during vttestserver initialization. We have also made this configurable so that it can be reduced further if desired. +For any production cluster the default value of this flag is still [1 minute](https://vitess.io/docs/16.0/reference/programs/vtgate/). Reducing this value might put more stress on Topo Server (since we now read from Topo server more often) but for testing purposes this shouldn't be a concern. ## Minor changes @@ -458,19 +466,19 @@ BenchmarkCompressLz4Builtin This is an internal refactor and should not change the behavior of Vitess as seen by users. Developers will see a difference though: v16 changes the way we maintain vttablet's sidecar database schema (also referred to as the `_vt` -database). Instead of using the `WithDDL` package, introduced in #6348, we use a declarative approach. Users will now have to update -the desired schema in the `go/vt/sidecardb/schema` directory. +database). Instead of using the `WithDDL` package, introduced in [PR #6348](https://github.com/vitessio/vitess/pull/6348), we use a +declarative approach. Developers will now have to update the desired schema in the `go/vt/sidecardb/schema` directory. The desired schema is specified, one per table. A new module `sidecardb`, compares this to the existing schema and performs the required `create` or `alter` to reach it. This is done whenever a primary vttablet starts up. The sidecar tables `local_metadata` and `shard_metadata` are no longer in use and all references to them are removed as -part of this refactor. There were used previously for Orchestrator support, which has been superseded by `vtorc`. +part of this refactor. They were used previously for Orchestrator support, which has been superseded by `vtorc`. ------------ The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/16_0_0_changelog.md). -The release includes 331 commits (excluding merges) +The release includes 378 commits (excluding merges) Thanks to all our contributors: @EmadMokhtar, @GuptaManan100, @Weijun-H, @WilliamLu99, @ajm188, @arthurschreiber, @arvind-murty, @brendar, @brirams, @dbussink, @deepthi, @dependabot[bot], @draftcode, @ejortegau, @frouioui, @harshit-gangal, @jjh-kim, @johanoskarsson, @kbslvsk, @mattlord, @maxenglander, @mdlayher, @notfelineit, @pbibra, @pudiva, @rohit-nayak-ps, @rsajwani, @shlomi-noach, @systay, @timvaillancourt, @vitess-bot[bot], @vmg, @yoheimuta diff --git a/doc/releasenotes/16_0_0_summary.md b/doc/releasenotes/16_0_0_summary.md index 7b692b2f128..59fac06aaa5 100644 --- a/doc/releasenotes/16_0_0_summary.md +++ b/doc/releasenotes/16_0_0_summary.md @@ -174,6 +174,20 @@ The stats `QueriesProcessed` and `QueriesRouted` are deprecated in v16 as part o The Prometheus metrics exporter now properly normalizes _all_ label names into their `snake_case` form, as it is idiomatic for Prometheus metrics. Previously, Vitess instances were emitting inconsistent labels for their metrics, with some of them being `CamelCase` and others being `snake_case`. More information about this change can be found on [Pull Request #12057](https://github.com/vitessio/vitess/pull/12057). +For example, `vtgate_topology_watcher_errors{Operation="GetTablet"} 0` will become `vtgate_topology_watcher_errors{operation="GetTablet"} 0` + +Some more of these changes are listed here - + +| Previous metric | New Metric | +|-------------------------------------------------------------|-------------------------------------------------------------| +| vtgate_topology_watcher_operations{Operation="AddTablet"} | vtgate_topology_watcher_operations{operation="AddTablet"} | +| vtgate_queries_processed{Plan="Reference"} | vtgate_queries_processed{plan="Reference"} | +| vtgate_queries_routed{Plan="Reference"} | vtgate_queries_routed{plan="Reference"} | +| vttablet_table_allocated_size{Table="corder"} | vttablet_table_allocated_size{table="corder"} | +| vttablet_table_file_size{Table="corder"} | vttablet_table_file_size{table="corder"} | +| vttablet_topology_watcher_errors{Operation="GetTablet"} | vttablet_topology_watcher_errors{operation="GetTablet"} | +| vttablet_topology_watcher_operations{Operation="AddTablet"} | vttablet_topology_watcher_operations{operation="AddTablet"} | + ### Replication manager removal and VTOrc becomes mandatory VTOrc is now a **required** component of Vitess starting from v16. If the users want Vitess to manage replication, then they must run VTOrc. Replication manager is removed from vttablets since the responsibility of fixing replication lies entirely with VTOrc now. @@ -215,7 +229,7 @@ In [Pull Request #11097](https://github.com/vitessio/vitess/pull/11097) we intro `--query-timeout` allows you to specify a timeout for queries. This timeout is applied to all queries. It can be overridden by setting the `query_timeout` session variable. -Setting it as command line directive with `QUERY_TIMEOUT_MS` will override other values. +Setting it as query comment directive with `QUERY_TIMEOUT_MS` will override other values. #### VTTablet: VReplication parallel insert workers --vreplication-parallel-insert-workers @@ -280,9 +294,9 @@ $ vtctlclient -- Backup --incremental_from_pos "auto" zone1-0000000102 When the value is `auto`, the position is evaluated as the last successful backup's `Position`. The idea with incremental backups is to create a contiguous (overlaps allowed) sequence of backups that store all changes from last full backup. -The incremental backup copies binary log files. It does not take MySQL down nor places any locks. It does not interrupt traffic on the MySQL server. The incremental backup copies comlete binlog files. It initially rotates binary logs, then copies anything from the requested position and up to the last completed binary log. +The incremental backup copies binary log files. It does not take MySQL down nor places any locks. It does not interrupt traffic on the MySQL server. The incremental backup copies complete binlog files. It initially rotates binary logs, then copies anything from the requested position and up to the last completed binary log. -The backup thus does not necessarily start _exactly_ at the requested position. It starts with the first binary log that has newer entries than requested position. It is OK if the binary logs include transactions prior to the equested position. The restore process will discard any duplicates. +The backup thus does not necessarily start _exactly_ at the requested position. It starts with the first binary log that has newer entries than requested position. It is OK if the binary logs include transactions prior to the requested position. The restore process will discard any duplicates. Normally, you can expect the backups to be precisely contiguous. Consider an `auto` value: due to the nature of log rotation and the fact we copy complete binlog files, the next incremental backup will start with the first binay log not covered by the previous backup, which in itself copied the one previous binlog file in full. Again, it is completely valid to enter any good position. @@ -319,13 +333,12 @@ The `RestoreFromBackup --restore_to_pos` ends with: - tablet type is `DRAINED` #### New `vexplain` command -A new `vexplain` command has been introduced with the following syntax - +A new `vexplain` command has been introduced with the following syntax: ``` VEXPLAIN [ALL|QUERIES|PLAN] explainable_stmt ``` -This command will help the users look at the plan that vtgate comes up with for the given query (`PLAN` type), see all the queries that are executed on all the MySQL instances (`QUERIES` type), -and see the vtgate plan along with the MySQL explain output for the executed queries (`ALL` type). +This command will help users look at the plan that vtgate comes up with for the given query (`PLAN` type), see all the queries that are executed on all the MySQL instances (`QUERIES` type), and see the vtgate plan along with the MySQL explain output for the executed queries (`ALL` type). The formats `VTEXPLAIN` and `VITESS` for `EXPLAIN` queries are deprecated, and these newly introduced commands should be used instead. @@ -452,11 +465,11 @@ BenchmarkCompressLz4Builtin This is an internal refactor and should not change the behavior of Vitess as seen by users. Developers will see a difference though: v16 changes the way we maintain vttablet's sidecar database schema (also referred to as the `_vt` -database). Instead of using the `WithDDL` package, introduced in #6348, we use a declarative approach. Users will now have to update -the desired schema in the `go/vt/sidecardb/schema` directory. +database). Instead of using the `WithDDL` package, introduced in [PR #6348](https://github.com/vitessio/vitess/pull/6348), we use a +declarative approach. Developers will now have to update the desired schema in the `go/vt/sidecardb/schema` directory. The desired schema is specified, one per table. A new module `sidecardb`, compares this to the existing schema and performs the required `create` or `alter` to reach it. This is done whenever a primary vttablet starts up. The sidecar tables `local_metadata` and `shard_metadata` are no longer in use and all references to them are removed as -part of this refactor. There were used previously for Orchestrator support, which has been superseded by `vtorc`. +part of this refactor. They were used previously for Orchestrator support, which has been superseded by `vtorc`. diff --git a/docker/release.sh b/docker/release.sh index 9d97a58b7b7..d73b4ec2054 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='16.0.0-SNAPSHOT' +vt_base_version='v16.0.0' 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 00b0ca0ef5e..caed2f8b2aa 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - "15000:$WEB_PORT" - "$GRPC_PORT" @@ -81,7 +81,7 @@ services: condition: service_healthy vtgate: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - "15099:$WEB_PORT" - "$GRPC_PORT" @@ -111,7 +111,7 @@ services: condition: service_healthy schemaload: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 command: - sh - -c @@ -144,12 +144,12 @@ services: environment: - KEYSPACES=$KEYSPACE - GRPC_PORT=15999 - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - .:/script vttablet100: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - "15100:$WEB_PORT" - "$GRPC_PORT" @@ -181,7 +181,7 @@ services: retries: 15 vttablet101: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - "15101:$WEB_PORT" - "$GRPC_PORT" @@ -213,7 +213,7 @@ services: retries: 15 vttablet102: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - "15102:$WEB_PORT" - "$GRPC_PORT" @@ -245,7 +245,7 @@ services: retries: 15 vttablet103: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - "15103:$WEB_PORT" - "$GRPC_PORT" @@ -277,7 +277,7 @@ services: retries: 15 vtorc: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 command: ["sh", "-c", "/script/vtorc-up.sh"] depends_on: - vtctld @@ -307,7 +307,7 @@ services: retries: 15 vreplication: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - ".:/script" environment: diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index 5d5750caf42..9dc6af7132f 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - .:/script set_keyspace_durability_policy: @@ -115,7 +115,7 @@ services: environment: - KEYSPACES=test_keyspace lookup_keyspace - GRPC_PORT=15999 - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - .:/script vtctld: @@ -143,7 +143,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - 15000:8080 - "15999" @@ -160,7 +160,7 @@ services: --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - 15099:8080 - "15999" @@ -182,7 +182,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - 15302:8080 - "15999" diff --git a/examples/compose/vtcompose/docker-compose.test.yml b/examples/compose/vtcompose/docker-compose.test.yml index 1f53ce21c37..f31665ade16 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - .:/script set_keyspace_durability_policy_test_keyspace: @@ -117,7 +117,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=test_keyspace - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - .:/script set_keyspace_durability_policy_unsharded_keyspace: @@ -130,7 +130,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=unsharded_keyspace - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - .:/script vtctld: @@ -159,7 +159,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - 15000:8080 - "15999" @@ -176,7 +176,7 @@ services: ''grpc-vtgateservice'' --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - 15099:8080 - "15999" @@ -199,7 +199,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - 15301:8080 - "15999" diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index 2543d7ac7e0..b0c182b8765 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 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:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - "15000:%[1]d" - "%[2]d" @@ -696,7 +696,7 @@ func generateVtgate(opts vtOptions) string { - op: add path: /services/vtgate value: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 ports: - "15099:%[1]d" - "%[2]d" @@ -738,7 +738,7 @@ func generateVTOrc(dbInfo externalDbInfo, keyspaceInfoMap map[string]keyspaceInf - op: add path: /services/vtorc value: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - ".:/script" environment: @@ -763,7 +763,7 @@ func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - op: add path: /services/vreplication value: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - ".:/script" environment: @@ -791,7 +791,7 @@ func generateSetKeyspaceDurabilityPolicy( - op: add path: /services/set_keyspace_durability_policy_%[3]s value: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - ".:/script" environment: @@ -828,7 +828,7 @@ func generateSchemaload( - op: add path: /services/schemaload_%[7]s value: - image: vitess/lite:v16.0.0-rc1 + image: vitess/lite:v16.0.0 volumes: - ".:/script" environment: diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index 5f15ae0087a..325e1291515 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:v16.0.0-rc1 - vtadmin: vitess/vtadmin:v16.0.0-rc1 - vtgate: vitess/lite:v16.0.0-rc1 - vttablet: vitess/lite:v16.0.0-rc1 - vtbackup: vitess/lite:v16.0.0-rc1 - vtorc: vitess/lite:v16.0.0-rc1 + vtctld: vitess/lite:v16.0.0 + vtadmin: vitess/vtadmin:v16.0.0 + vtgate: vitess/lite:v16.0.0 + vttablet: vitess/lite:v16.0.0 + vtbackup: vitess/lite:v16.0.0 + vtorc: vitess/lite:v16.0.0 mysqld: - mysql80Compatible: vitess/lite:v16.0.0-rc1 + mysql80Compatible: vitess/lite:v16.0.0 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 e2b1ce56f5a..448c8a7190d 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:v16.0.0-rc1 - vtadmin: vitess/vtadmin:v16.0.0-rc1 - vtgate: vitess/lite:v16.0.0-rc1 - vttablet: vitess/lite:v16.0.0-rc1 - vtbackup: vitess/lite:v16.0.0-rc1 - vtorc: vitess/lite:v16.0.0-rc1 + vtctld: vitess/lite:v16.0.0 + vtadmin: vitess/vtadmin:v16.0.0 + vtgate: vitess/lite:v16.0.0 + vttablet: vitess/lite:v16.0.0 + vtbackup: vitess/lite:v16.0.0 + vtorc: vitess/lite:v16.0.0 mysqld: - mysql80Compatible: vitess/lite:v16.0.0-rc1 + mysql80Compatible: vitess/lite:v16.0.0 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 6491c242f32..d05d790565a 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:v16.0.0-rc1 - vtadmin: vitess/vtadmin:v16.0.0-rc1 - vtgate: vitess/lite:v16.0.0-rc1 - vttablet: vitess/lite:v16.0.0-rc1 - vtbackup: vitess/lite:v16.0.0-rc1 - vtorc: vitess/lite:v16.0.0-rc1 + vtctld: vitess/lite:v16.0.0 + vtadmin: vitess/vtadmin:v16.0.0 + vtgate: vitess/lite:v16.0.0 + vttablet: vitess/lite:v16.0.0 + vtbackup: vitess/lite:v16.0.0 + vtorc: vitess/lite:v16.0.0 mysqld: - mysql80Compatible: vitess/lite:v16.0.0-rc1 + mysql80Compatible: vitess/lite:v16.0.0 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 921c2ec269e..9d31fa0d730 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:v16.0.0-rc1 - vtadmin: vitess/vtadmin:v16.0.0-rc1 - vtgate: vitess/lite:v16.0.0-rc1 - vttablet: vitess/lite:v16.0.0-rc1 - vtbackup: vitess/lite:v16.0.0-rc1 - vtorc: vitess/lite:v16.0.0-rc1 + vtctld: vitess/lite:v16.0.0 + vtadmin: vitess/vtadmin:v16.0.0 + vtgate: vitess/lite:v16.0.0 + vttablet: vitess/lite:v16.0.0 + vtbackup: vitess/lite:v16.0.0 + vtorc: vitess/lite:v16.0.0 mysqld: - mysql80Compatible: vitess/lite:v16.0.0-rc1 + mysql80Compatible: vitess/lite:v16.0.0 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/operator.yaml b/examples/operator/operator.yaml index b840fa9fc19..9429889a686 100644 --- a/examples/operator/operator.yaml +++ b/examples/operator/operator.yaml @@ -6145,7 +6145,7 @@ spec: fieldPath: metadata.name - name: OPERATOR_NAME value: vitess-operator - image: planetscale/vitess-operator:v2.9.0-rc1 + image: planetscale/vitess-operator:v2.9.0 name: vitess-operator resources: limits: diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index 9018096ab32..16db2e1373c 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 = "16.0.0-SNAPSHOT" +const versionName = "16.0.0" diff --git a/java/client/pom.xml b/java/client/pom.xml index efa409db760..a286b6b6cdf 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-SNAPSHOT + 16.0.0 vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 3436995a228..697f7ffdf46 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-SNAPSHOT + 16.0.0 vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 9a5fd6ca49a..60be34c5152 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-SNAPSHOT + 16.0.0 vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 54321a065e5..7b02cc70cbf 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0-SNAPSHOT + 16.0.0 vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 4db3730f541..a327638d810 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.0-SNAPSHOT + 16.0.0 pom Vitess Java Client libraries [Parent] From dfd698d2bb33763918f4de9623a520056ebd1530 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Tue, 28 Feb 2023 23:48:50 +0530 Subject: [PATCH 043/233] Back to dev mode (#12515) Signed-off-by: Manan Gupta --- 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 d73b4ec2054..f7c7fc911e8 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.0' +vt_base_version='v16.0.1-SNAPSHOT' debian_versions='buster bullseye' default_debian_version='bullseye' diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index 16db2e1373c..ca41e7115a0 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 = "16.0.0" +const versionName = "16.0.1-SNAPSHOT" diff --git a/java/client/pom.xml b/java/client/pom.xml index a286b6b6cdf..932e48a15f1 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0 + 16.0.1-SNAPSHOT vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 697f7ffdf46..d90df15d5a5 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0 + 16.0.1-SNAPSHOT vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 60be34c5152..ff12fbb6fd6 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0 + 16.0.1-SNAPSHOT vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 7b02cc70cbf..c85f2c7c246 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.0 + 16.0.1-SNAPSHOT vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index a327638d810..76ea7fbca72 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.0 + 16.0.1-SNAPSHOT pom Vitess Java Client libraries [Parent] From 7cb8f433f890b47f10fba5298e60e99353092231 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:11:04 +0200 Subject: [PATCH 044/233] Unskip TestFuzz and fix issue (#12514) Signed-off-by: Florent Poinsard --- go/bucketpool/bucketpool_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/go/bucketpool/bucketpool_test.go b/go/bucketpool/bucketpool_test.go index 0f54d2ea3a6..7649f9b6278 100644 --- a/go/bucketpool/bucketpool_test.go +++ b/go/bucketpool/bucketpool_test.go @@ -167,10 +167,12 @@ func TestPoolWeirdMaxSize(t *testing.T) { } func TestFuzz(t *testing.T) { - t.Skip() maxTestSize := 16384 for i := 0; i < 20000; i++ { minSize := rand.Intn(maxTestSize) + if minSize == 0 { + minSize = 1 + } maxSize := rand.Intn(maxTestSize-minSize) + minSize p := New(minSize, maxSize) bufSize := rand.Intn(maxTestSize) From a62c600533d2a8c4ebfbc09fe670b3a7bc28440a Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:11:46 +0200 Subject: [PATCH 045/233] Make upgrade downgrade job names unique (#12499) Signed-off-by: Florent Poinsard --- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 4 ++-- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 4 ++-- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 4 ++-- .../upgrade_downgrade_test_backups_manual_next_release.yml | 4 ++-- .../upgrade_downgrade_test_query_serving_queries.yml | 4 ++-- ...rade_downgrade_test_query_serving_queries_next_release.yml | 4 ++-- .../workflows/upgrade_downgrade_test_query_serving_schema.yml | 4 ++-- ...grade_downgrade_test_query_serving_schema_next_release.yml | 4 ++-- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 4 ++-- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 4 ++-- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 4 ++-- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 4 ++-- 12 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index e5abdae9958..bde1a3283f7 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -10,7 +10,7 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Backups - E2E runs-on: ubuntu-22.04 outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -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-22.04 needs: - get_previous_release 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 5816c72ba6d..d92da4088e0 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -10,7 +10,7 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Backups - E2E - Next Release runs-on: ubuntu-22.04 outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -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-22.04 needs: - get_next_release diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 786380c7ba4..6201d9b49ba 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -10,7 +10,7 @@ concurrency: jobs: get_previous_release: if: always() - name: Get a recent LTS release + name: Get Previous Release - Backups - Manual runs-on: ubuntu-22.04 outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -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-22.04 needs: - get_previous_release 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 9861561121a..dc0ad902478 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -10,7 +10,7 @@ concurrency: jobs: get_next_release: if: always() - name: Get a recent LTS release + name: Get Previous Release - Backups - Manual - Next Release runs-on: ubuntu-22.04 outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -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-22.04 needs: - get_next_release diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 90111aa524d..2d8aceb6ceb 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -13,7 +13,7 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Query Serving (Queries) runs-on: ubuntu-22.04 outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -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-22.04 needs: - get_previous_release 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 aa14c552397..7de07a3892d 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,7 +13,7 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Query Serving (Queries) Next Release runs-on: ubuntu-22.04 outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -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-22.04 needs: - get_next_release diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 5f78e983680..5b8e3107757 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -13,7 +13,7 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Query Serving (Schema) runs-on: ubuntu-22.04 outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -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-22.04 needs: - get_previous_release 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 f160aa866ff..18075b62e0f 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,7 +13,7 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Query Serving (Schema) Next Release runs-on: ubuntu-22.04 outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -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-22.04 needs: - get_next_release diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml index 955bf3f46a6..cca38725a37 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -13,7 +13,7 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Reparent New Vtctl runs-on: ubuntu-22.04 outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -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-22.04 needs: - get_next_release diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml index 2bde0ef7c67..6cc0f1d9882 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -13,7 +13,7 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Reparent New VTTablet runs-on: ubuntu-22.04 outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -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-22.04 needs: - get_next_release diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index b4b347677e5..908be6519f6 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -13,7 +13,7 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Reparent Old Vtctl runs-on: ubuntu-22.04 outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -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-22.04 needs: - get_previous_release diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 0caeae635e3..bbb17c43e99 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -13,7 +13,7 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Reparent Old VTTablet runs-on: ubuntu-22.04 outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -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-22.04 needs: - get_previous_release From 86358659543679bb4d22f088222362cfc5cba9a4 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 1 Mar 2023 15:55:58 +0200 Subject: [PATCH 046/233] handle readtablet error (#12510) Signed-off-by: Florent Poinsard --- go/vt/vtorc/logic/topology_recovery.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/go/vt/vtorc/logic/topology_recovery.go b/go/vt/vtorc/logic/topology_recovery.go index 7daf1ae479d..8a56cc9235b 100644 --- a/go/vt/vtorc/logic/topology_recovery.go +++ b/go/vt/vtorc/logic/topology_recovery.go @@ -254,7 +254,10 @@ 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, _ := inst.ReadTablet(analysisEntry.AnalyzedInstanceKey) + tablet, err := inst.ReadTablet(analysisEntry.AnalyzedInstanceKey) + if err != nil { + return false, nil, err + } var candidateTabletAlias *topodatapb.TabletAlias if candidateInstanceKey != nil { From f520351bdcd1fbb8fd92fffa2ffe4140d5c83348 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Wed, 1 Mar 2023 14:10:46 -0500 Subject: [PATCH 047/233] Fix `vtctldclient`'s Root command to return an error on unknown command (#12481) (#12532) * 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 0e8c850b6d2..ae74ddfb5e6 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" "strconv" "time" @@ -78,6 +79,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 c6e48e610d6..41c0b64076f 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 49ac1d6dae3870410558b5b05fa43890ae1b72e8 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 2 Mar 2023 13:23:24 +0530 Subject: [PATCH 048/233] feat: add a known issue into the release notes (#12536) Signed-off-by: Manan Gupta --- doc/releasenotes/16_0_0_release_notes.md | 49 ++++++++++++++++++++++++ doc/releasenotes/16_0_0_summary.md | 49 ++++++++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/doc/releasenotes/16_0_0_release_notes.md b/doc/releasenotes/16_0_0_release_notes.md index b860a907031..1b91f15c28d 100644 --- a/doc/releasenotes/16_0_0_release_notes.md +++ b/doc/releasenotes/16_0_0_release_notes.md @@ -3,6 +3,8 @@ ### Table of Contents +- **[Known Issues](#known-issues)** + - [MySQL & Xtrabackup known issue](#mysql-xtrabackup-ddl) - **[Major Changes](#major-changes)** - **[Breaking Changes](#breaking-changes)** - [VTGate Advertised MySQL Version](#advertised-mysql-version) @@ -51,6 +53,53 @@ - **[Refactor](#refactor)** - **[VTTablet sidecar schema maintenance refactor](#vttablet-sidecar-schema)** +## Known Issues + +### MySQL & Xtrabackup known issue + +There is a known issue with MySQL's INSTANT DDL combined with Percona XtraBackup, that affects users of Vitess 16.0. +The problem is described in https://docs.percona.com/percona-xtrabackup/8.0/em/instant.html, and the immediate impact is you may not be able to backup your database using XtraBackup under certain conditions. + +As of MySQL 8.0.12, the default `ALGORITHM` for InnoDB's `ALTER TABLE` is `INSTANT`. In `8.0.12` only a small number of operations were eligible for `INSTANT`, but MySQL `8.0.29` added support for more common cases. +Unfortunately, the changes in `8.0.29` affect XtraBackup as follows: if you `ALTER TABLE` in MySQL `8.0.29`, and that `ALTER` is eligible for `INSTANT` DDL (e.g. add new table column), then as of that moment, XtraBackup is unable to backup that table, hence your entire database. + +It is important to note that even if you then upgrade your MySQL server to, e.g. `8.0.32`, the table still cannot be backed up. + +Versions where XtraBackup is unable to backup such tables: MySQL `8.0.29` - `8.0.31`. This does not apply to Percona Server flavor. + +The issue is resolved with Percona XtraBackup `8.0.32` combined with MySQL `8.0.32`. + +You might be affected if: + +- You're using MySQL `8.0.29` - `8.0.31` and are using XtraBackup to backup your database +- and, you have issued an `ALTER TABLE`, either directly, or using Online DDL in vitess `v16.0` and below + +A futures Vitess patch release `v16.0.1` will address the issue via Online DDL migrations. + +#### Mitigations + +- Use Percona XtraBackup `8.0.32` combined with MySQL `8.0.32`. To go with this option, you can use the docker image `vitess/lite:v16.0.0-mysql-8.0.32`. +- or, Use a Percona Server flavor +- or, always ensure to add `ALGORITHM=INPLACE` or `ALGORITHM=COPY` to your `ALTER TABLE` statements + +#### Workarounds + +If you have already been affected, these are the options to be able to backup your database: + +- Use `builtin` backups, see https://vitess.io/docs/15.0/user-guides/operating-vitess/backup-and-restore/creating-a-backup/. `builting` backups are not based on XtraBackup. +- Upgrade to MySQL `8.0.32` or above and to Xtrabackup `8.0.32`, or switch to Percona Server. To go with this option, you can use the docker image `vitess/lite:v16.0.0-mysql-8.0.32`. Then rebuild the table directly via: + - `OPTIMIZE TABLE your_table` + - or, `ALTER TABLE your_table ENGINE=INNOB` +- Upgrade to Vitess patch release `v16.0.1`, upgrade to MySQL `8.0.32` or above and to Xtrabackup `8.0.32`, or switch to Percona Server, and rebuild the table via Online DDL: +```shell +$ vtctldclient ApplySchema --skip_preflight --ddl_strategy "vitess" --sql "ALTER TABLE your_table ENGINE=InnoDB" your_keyspace +``` +or +```sql +> SET @@ddl_strategy='vitess'; +> ALTER TABLE your_table ENGINE=InnoDB; +``` + ## Major Changes ### Breaking Changes diff --git a/doc/releasenotes/16_0_0_summary.md b/doc/releasenotes/16_0_0_summary.md index 59fac06aaa5..7a14f2533b7 100644 --- a/doc/releasenotes/16_0_0_summary.md +++ b/doc/releasenotes/16_0_0_summary.md @@ -2,6 +2,8 @@ ### Table of Contents +- **[Known Issues](#known-issues)** + - [MySQL & Xtrabackup known issue](#mysql-xtrabackup-ddl) - **[Major Changes](#major-changes)** - **[Breaking Changes](#breaking-changes)** - [VTGate Advertised MySQL Version](#advertised-mysql-version) @@ -50,6 +52,53 @@ - **[Refactor](#refactor)** - **[VTTablet sidecar schema maintenance refactor](#vttablet-sidecar-schema)** +## Known Issues + +### MySQL & Xtrabackup known issue + +There is a known issue with MySQL's INSTANT DDL combined with Percona XtraBackup, that affects users of Vitess 16.0. +The problem is described in https://docs.percona.com/percona-xtrabackup/8.0/em/instant.html, and the immediate impact is you may not be able to backup your database using XtraBackup under certain conditions. + +As of MySQL 8.0.12, the default `ALGORITHM` for InnoDB's `ALTER TABLE` is `INSTANT`. In `8.0.12` only a small number of operations were eligible for `INSTANT`, but MySQL `8.0.29` added support for more common cases. +Unfortunately, the changes in `8.0.29` affect XtraBackup as follows: if you `ALTER TABLE` in MySQL `8.0.29`, and that `ALTER` is eligible for `INSTANT` DDL (e.g. add new table column), then as of that moment, XtraBackup is unable to backup that table, hence your entire database. + +It is important to note that even if you then upgrade your MySQL server to, e.g. `8.0.32`, the table still cannot be backed up. + +Versions where XtraBackup is unable to backup such tables: MySQL `8.0.29` - `8.0.31`. This does not apply to Percona Server flavor. + +The issue is resolved with Percona XtraBackup `8.0.32` combined with MySQL `8.0.32`. + +You might be affected if: + +- You're using MySQL `8.0.29` - `8.0.31` and are using XtraBackup to backup your database +- and, you have issued an `ALTER TABLE`, either directly, or using Online DDL in vitess `v16.0` and below + +A futures Vitess patch release `v16.0.1` will address the issue via Online DDL migrations. + +#### Mitigations + +- Use Percona XtraBackup `8.0.32` combined with MySQL `8.0.32`. To go with this option, you can use the docker image `vitess/lite:v16.0.0-mysql-8.0.32`. +- or, Use a Percona Server flavor +- or, always ensure to add `ALGORITHM=INPLACE` or `ALGORITHM=COPY` to your `ALTER TABLE` statements + +#### Workarounds + +If you have already been affected, these are the options to be able to backup your database: + +- Use `builtin` backups, see https://vitess.io/docs/15.0/user-guides/operating-vitess/backup-and-restore/creating-a-backup/. `builting` backups are not based on XtraBackup. +- Upgrade to MySQL `8.0.32` or above and to Xtrabackup `8.0.32`, or switch to Percona Server. To go with this option, you can use the docker image `vitess/lite:v16.0.0-mysql-8.0.32`. Then rebuild the table directly via: + - `OPTIMIZE TABLE your_table` + - or, `ALTER TABLE your_table ENGINE=INNOB` +- Upgrade to Vitess patch release `v16.0.1`, upgrade to MySQL `8.0.32` or above and to Xtrabackup `8.0.32`, or switch to Percona Server, and rebuild the table via Online DDL: +```shell +$ vtctldclient ApplySchema --skip_preflight --ddl_strategy "vitess" --sql "ALTER TABLE your_table ENGINE=InnoDB" your_keyspace +``` +or +```sql +> SET @@ddl_strategy='vitess'; +> ALTER TABLE your_table ENGINE=InnoDB; +``` + ## Major Changes ### Breaking Changes From fbfc36640a6abae5733788fb1388740f57a7487b Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Thu, 2 Mar 2023 11:46:52 +0200 Subject: [PATCH 049/233] [release-16.0] Tooling improvements backports (#12528) * 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 * 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 --------- Signed-off-by: Florent Poinsard --- .github/workflows/check_label.yml | 27 +++++++++++++-------------- doc/internal/ReleaseInstructions.md | 10 +++++++++- tools/create_release.sh | 2 +- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/.github/workflows/check_label.yml b/.github/workflows/check_label.yml index 0d9208805ae..df9e5173dd8 100644 --- a/.github/workflows/check_label.yml +++ b/.github/workflows/check_label.yml @@ -14,21 +14,12 @@ jobs: runs-on: ubuntu-22.04 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/16_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: @@ -70,4 +61,12 @@ jobs: 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 35c6fa9dd91..05286de9092 100644 --- a/doc/internal/ReleaseInstructions.md +++ b/doc/internal/ReleaseInstructions.md @@ -119,9 +119,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-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 + +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 diff --git a/tools/create_release.sh b/tools/create_release.sh index ac18dd9f61b..546b60d40c3 100755 --- a/tools/create_release.sh +++ b/tools/create_release.sh @@ -90,6 +90,6 @@ echo " " echo " " echo "Once pushed, please execute the following gh command to create the Pull Requests. Please replace 'USER_ON_WHICH_YOU_PUSHED' with the user/org on which you pushed the two branches." echo " " -echo " gh pr create -w --title 'Release of v$RELEASE_VERSION' --base $BASE_BRANCH --head USER_ON_WHICH_YOU_PUSHED:$current_branch --label 'Type: Release','Component: General' --body 'Includes the release notes and release commit for the v$RELEASE_VERSION release. Once this PR is merged, we will be able to tag v$RELEASE_VERSION on the merge commit.'" +echo " gh pr create -w --title 'Release of v$RELEASE_VERSION' --base $BASE_BRANCH --head USER_ON_WHICH_YOU_PUSHED:$current_branch --label 'Type: Release','Component: General','Do Not Merge' --body 'Includes the release notes and release commit for the v$RELEASE_VERSION release. Once this PR is merged, we will be able to tag v$RELEASE_VERSION on the merge commit.'" echo " " echo "----------------" From 7666f16c5ed447fa105a9ff1a17266916420d69c Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Thu, 2 Mar 2023 15:17:44 +0200 Subject: [PATCH 050/233] v16: Online DDL: enforce ALGORITHM=COPY on shadow table (#12522) * Online DDL: enforce ALGORITHM=COPY on shadow table Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * unit tests Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * resolve conflict Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * algorithm format Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * revert change to sql.y Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --------- Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/sqlparser/ast_format.go | 2 +- go/vt/sqlparser/constants.go | 6 ++++++ go/vt/sqlparser/parse_test.go | 6 ++++++ go/vt/vttablet/onlineddl/executor.go | 7 ++++++- go/vt/vttablet/onlineddl/executor_test.go | 24 +++++++++++------------ 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/go/vt/sqlparser/ast_format.go b/go/vt/sqlparser/ast_format.go index 333ecf1c0df..d8bb1146eb7 100644 --- a/go/vt/sqlparser/ast_format.go +++ b/go/vt/sqlparser/ast_format.go @@ -2200,7 +2200,7 @@ func (node *AddColumns) Format(buf *TrackedBuffer) { // Format formats the node. func (node AlgorithmValue) Format(buf *TrackedBuffer) { - buf.astPrintf(node, "algorithm = %s", string(node)) + buf.astPrintf(node, "algorithm = %#s", string(node)) } // Format formats the node diff --git a/go/vt/sqlparser/constants.go b/go/vt/sqlparser/constants.go index 8331060c0ff..81f2e067563 100644 --- a/go/vt/sqlparser/constants.go +++ b/go/vt/sqlparser/constants.go @@ -65,6 +65,12 @@ const ( AddSequenceStr = "add sequence" AddAutoIncStr = "add auto_increment" + // ALTER TABLE ALGORITHM string. + DefaultStr = "default" + CopyStr = "copy" + InplaceStr = "inplace" + InstantStr = "instant" + // Partition and subpartition type strings HashTypeStr = "hash" KeyTypeStr = "key" diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index c83cb35a32b..ac3050667b8 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -1238,6 +1238,12 @@ var ( input: "alter table a convert to character set utf32", }, { input: "alter table `By` add column foo int, algorithm = default", + }, { + input: "alter table `By` add column foo int, algorithm = copy", + }, { + input: "alter table `By` add column foo int, algorithm = inplace", + }, { + input: "alter table `By` add column foo int, algorithm = INPLACE", }, { input: "alter table `By` add column foo int, algorithm = instant", }, { diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index e1788cafcf9..e8410ea8e16 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -102,6 +102,7 @@ var vexecInsertTemplates = []string{ var emptyResult = &sqltypes.Result{} var acceptableDropTableIfExistsErrorCodes = []int{mysql.ERCantFindFile, mysql.ERNoSuchTable} +var copyAlgorithm = sqlparser.AlgorithmValue(sqlparser.CopyStr) var ( ghostOverridePath string @@ -1171,6 +1172,9 @@ func (e *Executor) validateAndEditAlterTableStatement(ctx context.Context, onlin for i := range alterTable.AlterOptions { opt := alterTable.AlterOptions[i] switch opt := opt.(type) { + case sqlparser.AlgorithmValue: + // we do not pass ALGORITHM. We choose our own ALGORITHM. + continue case *sqlparser.AddIndexDefinition: if opt.IndexDefinition.Info.Fulltext { countAddFullTextStatements++ @@ -1179,7 +1183,7 @@ func (e *Executor) validateAndEditAlterTableStatement(ctx context.Context, onlin // in the same statement extraAlterTable := &sqlparser.AlterTable{ Table: alterTable.Table, - AlterOptions: []sqlparser.AlterOption{opt}, + AlterOptions: []sqlparser.AlterOption{opt, copyAlgorithm}, } alters = append(alters, extraAlterTable) continue @@ -1189,6 +1193,7 @@ func (e *Executor) validateAndEditAlterTableStatement(ctx context.Context, onlin redactedOptions = append(redactedOptions, opt) } alterTable.AlterOptions = redactedOptions + alterTable.AlterOptions = append(alterTable.AlterOptions, copyAlgorithm) return alters, nil } diff --git a/go/vt/vttablet/onlineddl/executor_test.go b/go/vt/vttablet/onlineddl/executor_test.go index e4a8e352026..2cf94be2d20 100644 --- a/go/vt/vttablet/onlineddl/executor_test.go +++ b/go/vt/vttablet/onlineddl/executor_test.go @@ -182,51 +182,51 @@ func TestValidateAndEditAlterTableStatement(t *testing.T) { }{ { alter: "alter table t add column i int", - expect: []string{"alter table t add column i int"}, + expect: []string{"alter table t add column i int, algorithm = copy"}, }, { alter: "alter table t add column i int, add fulltext key name1_ft (name1)", - expect: []string{"alter table t add column i int, add fulltext key name1_ft (name1)"}, + expect: []string{"alter table t add column i int, add fulltext key name1_ft (name1), algorithm = copy"}, }, { alter: "alter table t add column i int, add fulltext key name1_ft (name1), add fulltext key name2_ft (name2)", - expect: []string{"alter table t add column i int, add fulltext key name1_ft (name1)", "alter table t add fulltext key name2_ft (name2)"}, + expect: []string{"alter table t add column i int, add fulltext key name1_ft (name1), algorithm = copy", "alter table t add fulltext key name2_ft (name2), algorithm = copy"}, }, { alter: "alter table t add fulltext key name0_ft (name0), add column i int, add fulltext key name1_ft (name1), add fulltext key name2_ft (name2)", - expect: []string{"alter table t add fulltext key name0_ft (name0), add column i int", "alter table t add fulltext key name1_ft (name1)", "alter table t add fulltext key name2_ft (name2)"}, + expect: []string{"alter table t add fulltext key name0_ft (name0), add column i int, algorithm = copy", "alter table t add fulltext key name1_ft (name1), algorithm = copy", "alter table t add fulltext key name2_ft (name2), algorithm = copy"}, }, { alter: "alter table t add constraint check (id != 1)", - expect: []string{"alter table t add constraint chk_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, + expect: []string{"alter table t add constraint chk_aulpn7bjeortljhguy86phdn9 check (id != 1), algorithm = copy"}, }, { alter: "alter table t add constraint t_chk_1 check (id != 1)", - expect: []string{"alter table t add constraint chk_1_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, + expect: []string{"alter table t add constraint chk_1_aulpn7bjeortljhguy86phdn9 check (id != 1), algorithm = copy"}, }, { alter: "alter table t add constraint some_check check (id != 1)", - expect: []string{"alter table t add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, + expect: []string{"alter table t add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1), algorithm = copy"}, }, { alter: "alter table t add constraint some_check check (id != 1), add constraint another_check check (id != 2)", - expect: []string{"alter table t add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1), add constraint another_check_4fa197273p3w96267pzm3gfi3 check (id != 2)"}, + expect: []string{"alter table t add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1), add constraint another_check_4fa197273p3w96267pzm3gfi3 check (id != 2), algorithm = copy"}, }, { alter: "alter table t add foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", - expect: []string{"alter table t add constraint fk_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, + expect: []string{"alter table t add constraint fk_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, algorithm = copy"}, }, { alter: "alter table t add constraint myfk foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", - expect: []string{"alter table t add constraint myfk_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, + expect: []string{"alter table t add constraint myfk_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, algorithm = copy"}, }, { alter: "alter table t add constraint t_fk_1 foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", - expect: []string{"alter table t add constraint fk_1_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, + expect: []string{"alter table t add constraint fk_1_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, algorithm = copy"}, }, { alter: "alter table t add constraint t_fk_1 foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, add constraint some_check check (id != 1)", - expect: []string{"alter table t add constraint fk_1_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, + expect: []string{"alter table t add constraint fk_1_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1), algorithm = copy"}, }, } for _, tc := range tt { From 8cae9d6cfdeda04bbbd6f93c5fc2098b3cc1499f Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 15:27:51 +0200 Subject: [PATCH 051/233] [release-16.0] Fix dubious ownership of git directory in `vitess/base` Docker build (#12530) (#12561) * Fix dubious ownership of git directory in vitess/base Docker build Signed-off-by: Florent Poinsard * Use consistent method to copy and build vitess between base and lite Signed-off-by: Florent Poinsard * fix all base Dockerfiles Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard Co-authored-by: Florent Poinsard --- docker/base/Dockerfile | 9 +++------ docker/base/Dockerfile.mysql57 | 9 +++------ docker/base/Dockerfile.percona57 | 9 +++------ docker/base/Dockerfile.percona80 | 5 +---- 4 files changed, 10 insertions(+), 22 deletions(-) diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index b583c838d7d..ee520efa00a 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -30,12 +30,9 @@ ARG BUILD_GIT_BRANCH ARG BUILD_GIT_REV # Re-copy sources from working tree -USER root -COPY . /vt/src/vitess.io/vitess +COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess + +USER vitess # Build Vitess RUN make build - -# Fix permissions -RUN chown -R vitess:vitess /vt -USER vitess diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index a55d9776ccc..d05fa944951 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -30,12 +30,9 @@ ARG BUILD_GIT_BRANCH ARG BUILD_GIT_REV # Re-copy sources from working tree -USER root -COPY . /vt/src/vitess.io/vitess +COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess + +USER vitess # Build Vitess RUN make build - -# Fix permissions -RUN chown -R vitess:vitess /vt -USER vitess diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index 715f6f7927e..8dcc5a909e3 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -30,12 +30,9 @@ ARG BUILD_GIT_BRANCH ARG BUILD_GIT_REV # Re-copy sources from working tree -USER root -COPY . /vt/src/vitess.io/vitess +COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess + +USER vitess # Build Vitess RUN make build - -# Fix permissions -RUN chown -R vitess:vitess /vt -USER vitess diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index e9c31f3717d..40918d35378 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -30,11 +30,8 @@ ARG BUILD_GIT_BRANCH ARG BUILD_GIT_REV # Re-copy sources from working tree -USER root -COPY . /vt/src/vitess.io/vitess +COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess -# Fix permissions -RUN chown -R vitess:vitess /vt USER vitess # Build Vitess From 2fd0845ad927adda546c90658441f227814314ba Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 8 Mar 2023 09:44:48 +0200 Subject: [PATCH 052/233] [release-16.0] collations: fix sorting in UCA900 collations (#12555) (#12556) * 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! Signed-off-by: Vicent Marti * collations: comment Signed-off-by: Vicent Marti --------- Signed-off-by: Vicent Marti Co-authored-by: Vicent Marti --- .../collations/internal/uca/iter_fast_900.go | 16 +++++--- go/mysql/collations/uca_test.go | 39 +++++++++++++++++++ 2 files changed, 49 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 diff --git a/go/mysql/collations/uca_test.go b/go/mysql/collations/uca_test.go index df5267eb29e..447a5236f6f 100644 --- a/go/mysql/collations/uca_test.go +++ b/go/mysql/collations/uca_test.go @@ -19,6 +19,7 @@ package collations import ( "bytes" "fmt" + "math/rand" "sort" "strings" "sync" @@ -27,6 +28,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/exp/slices" "vitess.io/vitess/go/mysql/collations/internal/charset" ) @@ -904,6 +906,43 @@ func TestEqualities(t *testing.T) { } } +func TestUCACollationOrder(t *testing.T) { + var sorted = []string{ + "aaaa", + "bbbb", + "cccc", + "dddd", + "zzzz", + } + + var collations = []string{ + "utf8mb4_0900_ai_ci", + "utf8mb4_0900_as_cs", + } + + for _, colname := range collations { + col := testcollation(t, colname) + + for _, a := range sorted { + for _, b := range sorted { + want := strings.Compare(a, b) < 0 + got := col.Collate([]byte(a), []byte(b), false) < 0 + require.Equalf(t, want, got, "failed to compare %q vs %q", a, b) + } + } + + ary := slices.Clone(sorted) + for i := range ary { + j := rand.Intn(i + 1) + ary[i], ary[j] = ary[j], ary[i] + } + slices.SortFunc(ary, func(a, b string) bool { + return col.Collate([]byte(a), []byte(b), false) < 0 + }) + require.Equal(t, sorted, ary) + } +} + func TestCaseChangeEqualities(t *testing.T) { for _, teststr := range AllTestStrings { str1 := []byte(teststr.Content) From 6e1f08ae9fadf464f62461e766d5b3fc51c83366 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 8 Mar 2023 16:03:10 -0800 Subject: [PATCH 053/233] [release-16.0] Throttler: Store Config in Global Keyspace Topo Record (#12520) (#12576) * Store throttler config in global Keyspace record Signed-off-by: Matt Lord * Fix unit test after ThrottlerConfig in Keyspace Signed-off-by: Matt Lord * Apply changes lost in cherry picks Signed-off-by: Matt Lord * Always wait for a status before the final check. We should not ever make an assumption about how quickly an operation will take. Signed-off-by: Matt Lord * Propagate PartialResult and other errs back to client Signed-off-by: Matt Lord * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vtctlutil.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Update go/test/endtoend/onlineddl/vtgate_util.go Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * fix grammar Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --------- Signed-off-by: Matt Lord Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: Matt Lord Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- .../onlineddl/vrepl/onlineddl_vrepl_test.go | 21 +- go/test/endtoend/onlineddl/vtctlutil.go | 31 +- go/test/endtoend/onlineddl/vtgate_util.go | 47 ++ go/vt/proto/topodata/topodata.pb.go | 620 +++++++++--------- go/vt/proto/topodata/topodata_vtproto.pb.go | 406 +++++++----- go/vt/topo/keyspace.go | 8 + go/vt/topo/srv_keyspace.go | 16 +- go/vt/topotools/rebuild_keyspace.go | 1 + go/vt/vtctl/grpcvtctldserver/server.go | 18 +- go/vt/vtctl/vtctl.go | 4 +- go/vt/vtctld/api_test.go | 7 +- .../tabletserver/throttle/throttler.go | 21 +- proto/topodata.proto | 43 +- web/vtadmin/src/proto/vtadmin.d.ts | 226 +++---- web/vtadmin/src/proto/vtadmin.js | 549 ++++++++-------- 15 files changed, 1120 insertions(+), 898 deletions(-) diff --git a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go index a0a37119819..03e08612792 100644 --- a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go +++ b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go @@ -253,10 +253,22 @@ func TestSchemaChange(t *testing.T) { providedUUID := "" providedMigrationContext := "" - t.Run("enabling throttler with default threshold", func(t *testing.T) { - _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, 0, "", false) - assert.NoError(t, err) - }) + // We execute the throttler commands via vtgate, which in turn + // executes them via vttablet. So let's wait until vtgate's view + // is updated. + err := clusterInstance.WaitForTabletsToHealthyInVtgate() + require.NoError(t, err) + + _, err = onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, 0, "", false) + require.NoError(t, err) + + for _, ks := range clusterInstance.Keyspaces { + for _, shard := range ks.Shards { + for _, tablet := range shard.Vttablets { + onlineddl.WaitForThrottlerStatusEnabled(t, tablet, extendedMigrationWait) + } + } + } testWithInitialSchema(t) t.Run("alter non_online", func(t *testing.T) { @@ -328,6 +340,7 @@ func TestSchemaChange(t *testing.T) { insertRows(t, 2) uuid := testOnlineDDLStatement(t, alterTableTrivialStatement, "vitess -postpone-completion", providedUUID, providedMigrationContext, "vtgate", "test_val", "", false) // Should be still running! + _ = onlineddl.WaitForMigrationStatus(t, &vtParams, shards, uuid, extendedMigrationWait, schema.OnlineDDLStatusRunning) onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusRunning) // Issue a complete and wait for successful completion onlineddl.CheckCompleteMigration(t, &vtParams, shards, uuid, true) diff --git a/go/test/endtoend/onlineddl/vtctlutil.go b/go/test/endtoend/onlineddl/vtctlutil.go index 70aa3b6e3ec..62cc681eab1 100644 --- a/go/test/endtoend/onlineddl/vtctlutil.go +++ b/go/test/endtoend/onlineddl/vtctlutil.go @@ -17,14 +17,18 @@ limitations under the License. package onlineddl import ( + "context" "fmt" "testing" + "time" "vitess.io/vitess/go/test/endtoend/cluster" "github.com/stretchr/testify/assert" ) +var throttlerConfigTimeout = 60 * time.Second + // CheckCancelAllMigrations cancels all pending migrations. There is no validation for affected migrations. func CheckCancelAllMigrationsViaVtctl(t *testing.T, vtctlclient *cluster.VtctlClientProcess, keyspace string) { cancelQuery := "alter vitess_migration cancel all" @@ -33,11 +37,16 @@ func CheckCancelAllMigrationsViaVtctl(t *testing.T, vtctlclient *cluster.VtctlCl assert.NoError(t, err) } -// UpdateThrottlerTopoConfig runs vtctlclient UpdateThrottlerConfig +// UpdateThrottlerTopoConfig runs vtctlclient UpdateThrottlerConfig. +// This retries the command until it succeeds or times out as the +// SrvKeyspace record may not yet exist for a newly created +// Keyspace that is still initializing before it becomes serving. func UpdateThrottlerTopoConfig(clusterInstance *cluster.LocalProcessCluster, enable bool, disable bool, threshold float64, metricsQuery string, viaVtctldClient bool) (result string, err error) { args := []string{} + clientfunc := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput if !viaVtctldClient { args = append(args, "--") + clientfunc = clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput } args = append(args, "UpdateThrottlerConfig") if enable { @@ -56,8 +65,22 @@ func UpdateThrottlerTopoConfig(clusterInstance *cluster.LocalProcessCluster, ena args = append(args, "--check-as-check-shard") } args = append(args, clusterInstance.Keyspaces[0].Name) - if viaVtctldClient { - return clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(args...) + + ctx, cancel := context.WithTimeout(context.Background(), throttlerConfigTimeout) + defer cancel() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + result, err = clientfunc(args...) + if err == nil { + return result, nil + } + select { + case <-ctx.Done(): + return "", fmt.Errorf("timed out waiting for UpdateThrottlerConfig to succeed after %v. Last seen value: %+v, error: %v", throttlerConfigTimeout, result, err) + case <-ticker.C: + } } - return clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput(args...) } diff --git a/go/test/endtoend/onlineddl/vtgate_util.go b/go/test/endtoend/onlineddl/vtgate_util.go index eb56442abd4..75c35061da9 100644 --- a/go/test/endtoend/onlineddl/vtgate_util.go +++ b/go/test/endtoend/onlineddl/vtgate_util.go @@ -19,18 +19,22 @@ package onlineddl import ( "context" "fmt" + "io" "math" + "net/http" "os" "testing" "time" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/test/endtoend/cluster" + "github.com/buger/jsonparser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -345,6 +349,49 @@ func WaitForThrottledTimestamp(t *testing.T, vtParams *mysql.ConnParams, uuid st return } +// WaitForThrottlerStatusEnabled waits for a tablet to report its throttler status as enabled. +func WaitForThrottlerStatusEnabled(t *testing.T, tablet *cluster.Vttablet, timeout time.Duration) { + jsonPath := "IsEnabled" + url := fmt.Sprintf("http://localhost:%d/throttler/status", tablet.HTTPPort) + + ctx, cancel := context.WithTimeout(context.Background(), throttlerConfigTimeout) + defer cancel() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + body := getHTTPBody(url) + val, err := jsonparser.GetBoolean([]byte(body), jsonPath) + require.NoError(t, err) + if val { + return + } + select { + case <-ctx.Done(): + t.Error("timeout waiting for tablet's throttler status to be enabled") + return + case <-ticker.C: + } + } +} + +func getHTTPBody(url string) string { + resp, err := http.Get(url) + if err != nil { + log.Infof("http Get returns %+v", err) + return "" + } + if resp.StatusCode != 200 { + log.Infof("http Get returns status %d", resp.StatusCode) + return "" + } + respByte, _ := io.ReadAll(resp.Body) + defer resp.Body.Close() + body := string(respByte) + return body +} + // ValidateSequentialMigrationIDs validates that schem_migrations.id column, which is an AUTO_INCREMENT, does // not have gaps func ValidateSequentialMigrationIDs(t *testing.T, vtParams *mysql.ConnParams, shards []cluster.Shard) { diff --git a/go/vt/proto/topodata/topodata.pb.go b/go/vt/proto/topodata/topodata.pb.go index 223402e4cea..2d129763459 100644 --- a/go/vt/proto/topodata/topodata.pb.go +++ b/go/vt/proto/topodata/topodata.pb.go @@ -683,6 +683,10 @@ type Keyspace struct { // DurabilityPolicy is the durability policy to be // used for the keyspace. DurabilityPolicy string `protobuf:"bytes,8,opt,name=durability_policy,json=durabilityPolicy,proto3" json:"durability_policy,omitempty"` + // ThrottlerConfig has the configuration for the tablet + // server's lag throttler, and applies to the entire + // keyspace, across all shards and tablets. + ThrottlerConfig *ThrottlerConfig `protobuf:"bytes,9,opt,name=throttler_config,json=throttlerConfig,proto3" json:"throttler_config,omitempty"` } func (x *Keyspace) Reset() { @@ -752,6 +756,13 @@ func (x *Keyspace) GetDurabilityPolicy() string { return "" } +func (x *Keyspace) GetThrottlerConfig() *ThrottlerConfig { + if x != nil { + return x.ThrottlerConfig + } + return nil +} + // ShardReplication describes the MySQL replication relationships // whithin a cell. type ShardReplication struct { @@ -985,6 +996,86 @@ func (x *ShardTabletControl) GetQueryServiceDisabled() bool { return false } +type ThrottlerConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Enabled indicates that the throttler is actually checking state for + // requests. When disabled, it automatically returns 200 OK for all + // checks. + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Threshold is the threshold for either the default check (heartbeat + // lag) or custom check. + Threshold float64 `protobuf:"fixed64,2,opt,name=threshold,proto3" json:"threshold,omitempty"` + // CustomQuery is an optional query that overrides the default check + // query. + CustomQuery string `protobuf:"bytes,3,opt,name=custom_query,json=customQuery,proto3" json:"custom_query,omitempty"` + // CheckAsCheckSelf indicates whether a throttler /check request + // should behave like a /check-self. + CheckAsCheckSelf bool `protobuf:"varint,4,opt,name=check_as_check_self,json=checkAsCheckSelf,proto3" json:"check_as_check_self,omitempty"` +} + +func (x *ThrottlerConfig) Reset() { + *x = ThrottlerConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_topodata_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ThrottlerConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ThrottlerConfig) ProtoMessage() {} + +func (x *ThrottlerConfig) ProtoReflect() protoreflect.Message { + mi := &file_topodata_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ThrottlerConfig.ProtoReflect.Descriptor instead. +func (*ThrottlerConfig) Descriptor() ([]byte, []int) { + return file_topodata_proto_rawDescGZIP(), []int{9} +} + +func (x *ThrottlerConfig) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *ThrottlerConfig) GetThreshold() float64 { + if x != nil { + return x.Threshold + } + return 0 +} + +func (x *ThrottlerConfig) GetCustomQuery() string { + if x != nil { + return x.CustomQuery + } + return "" +} + +func (x *ThrottlerConfig) GetCheckAsCheckSelf() bool { + if x != nil { + return x.CheckAsCheckSelf + } + return false +} + // SrvKeyspace is a rollup node for the keyspace itself. type SrvKeyspace struct { state protoimpl.MessageState @@ -994,14 +1085,17 @@ type SrvKeyspace struct { // The partitions this keyspace is serving, per tablet type. Partitions []*SrvKeyspace_KeyspacePartition `protobuf:"bytes,1,rep,name=partitions,proto3" json:"partitions,omitempty"` ServedFrom []*SrvKeyspace_ServedFrom `protobuf:"bytes,4,rep,name=served_from,json=servedFrom,proto3" json:"served_from,omitempty"` - // ThrottlerConfig has the configuration for the tablet server's lag throttler, and applies to the entire keyspace, across all shards and tablets - ThrottlerConfig *SrvKeyspace_ThrottlerConfig `protobuf:"bytes,6,opt,name=throttler_config,json=throttlerConfig,proto3" json:"throttler_config,omitempty"` + // ThrottlerConfig has the configuration for the tablet server's + // lag throttler, and applies to the entire keyspace, across all + // shards and tablets. This is copied from the global keyspace + // object. + ThrottlerConfig *ThrottlerConfig `protobuf:"bytes,6,opt,name=throttler_config,json=throttlerConfig,proto3" json:"throttler_config,omitempty"` } func (x *SrvKeyspace) Reset() { *x = SrvKeyspace{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[9] + mi := &file_topodata_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1014,7 +1108,7 @@ func (x *SrvKeyspace) String() string { func (*SrvKeyspace) ProtoMessage() {} func (x *SrvKeyspace) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[9] + mi := &file_topodata_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1027,7 +1121,7 @@ func (x *SrvKeyspace) ProtoReflect() protoreflect.Message { // Deprecated: Use SrvKeyspace.ProtoReflect.Descriptor instead. func (*SrvKeyspace) Descriptor() ([]byte, []int) { - return file_topodata_proto_rawDescGZIP(), []int{9} + return file_topodata_proto_rawDescGZIP(), []int{10} } func (x *SrvKeyspace) GetPartitions() []*SrvKeyspace_KeyspacePartition { @@ -1044,7 +1138,7 @@ func (x *SrvKeyspace) GetServedFrom() []*SrvKeyspace_ServedFrom { return nil } -func (x *SrvKeyspace) GetThrottlerConfig() *SrvKeyspace_ThrottlerConfig { +func (x *SrvKeyspace) GetThrottlerConfig() *ThrottlerConfig { if x != nil { return x.ThrottlerConfig } @@ -1072,7 +1166,7 @@ type CellInfo struct { func (x *CellInfo) Reset() { *x = CellInfo{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[10] + mi := &file_topodata_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1085,7 +1179,7 @@ func (x *CellInfo) String() string { func (*CellInfo) ProtoMessage() {} func (x *CellInfo) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[10] + mi := &file_topodata_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1098,7 +1192,7 @@ func (x *CellInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CellInfo.ProtoReflect.Descriptor instead. func (*CellInfo) Descriptor() ([]byte, []int) { - return file_topodata_proto_rawDescGZIP(), []int{10} + return file_topodata_proto_rawDescGZIP(), []int{11} } func (x *CellInfo) GetServerAddress() string { @@ -1128,7 +1222,7 @@ type CellsAlias struct { func (x *CellsAlias) Reset() { *x = CellsAlias{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[11] + mi := &file_topodata_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1141,7 +1235,7 @@ func (x *CellsAlias) String() string { func (*CellsAlias) ProtoMessage() {} func (x *CellsAlias) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[11] + mi := &file_topodata_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1154,7 +1248,7 @@ func (x *CellsAlias) ProtoReflect() protoreflect.Message { // Deprecated: Use CellsAlias.ProtoReflect.Descriptor instead. func (*CellsAlias) Descriptor() ([]byte, []int) { - return file_topodata_proto_rawDescGZIP(), []int{11} + return file_topodata_proto_rawDescGZIP(), []int{12} } func (x *CellsAlias) GetCells() []string { @@ -1177,7 +1271,7 @@ type TopoConfig struct { func (x *TopoConfig) Reset() { *x = TopoConfig{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[12] + mi := &file_topodata_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1190,7 +1284,7 @@ func (x *TopoConfig) String() string { func (*TopoConfig) ProtoMessage() {} func (x *TopoConfig) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[12] + mi := &file_topodata_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1203,7 +1297,7 @@ func (x *TopoConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use TopoConfig.ProtoReflect.Descriptor instead. func (*TopoConfig) Descriptor() ([]byte, []int) { - return file_topodata_proto_rawDescGZIP(), []int{12} + return file_topodata_proto_rawDescGZIP(), []int{13} } func (x *TopoConfig) GetTopoType() string { @@ -1238,7 +1332,7 @@ type ExternalVitessCluster struct { func (x *ExternalVitessCluster) Reset() { *x = ExternalVitessCluster{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[13] + mi := &file_topodata_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1251,7 +1345,7 @@ func (x *ExternalVitessCluster) String() string { func (*ExternalVitessCluster) ProtoMessage() {} func (x *ExternalVitessCluster) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[13] + mi := &file_topodata_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1264,7 +1358,7 @@ func (x *ExternalVitessCluster) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalVitessCluster.ProtoReflect.Descriptor instead. func (*ExternalVitessCluster) Descriptor() ([]byte, []int) { - return file_topodata_proto_rawDescGZIP(), []int{13} + return file_topodata_proto_rawDescGZIP(), []int{14} } func (x *ExternalVitessCluster) GetTopoConfig() *TopoConfig { @@ -1286,7 +1380,7 @@ type ExternalClusters struct { func (x *ExternalClusters) Reset() { *x = ExternalClusters{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[14] + mi := &file_topodata_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1299,7 +1393,7 @@ func (x *ExternalClusters) String() string { func (*ExternalClusters) ProtoMessage() {} func (x *ExternalClusters) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[14] + mi := &file_topodata_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1312,7 +1406,7 @@ func (x *ExternalClusters) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalClusters.ProtoReflect.Descriptor instead. func (*ExternalClusters) Descriptor() ([]byte, []int) { - return file_topodata_proto_rawDescGZIP(), []int{14} + return file_topodata_proto_rawDescGZIP(), []int{15} } func (x *ExternalClusters) GetVitessCluster() []*ExternalVitessCluster { @@ -1345,7 +1439,7 @@ type Shard_SourceShard struct { func (x *Shard_SourceShard) Reset() { *x = Shard_SourceShard{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[17] + mi := &file_topodata_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1358,7 +1452,7 @@ func (x *Shard_SourceShard) String() string { func (*Shard_SourceShard) ProtoMessage() {} func (x *Shard_SourceShard) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[17] + mi := &file_topodata_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1427,7 +1521,7 @@ type Shard_TabletControl struct { func (x *Shard_TabletControl) Reset() { *x = Shard_TabletControl{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[18] + mi := &file_topodata_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1440,7 +1534,7 @@ func (x *Shard_TabletControl) String() string { func (*Shard_TabletControl) ProtoMessage() {} func (x *Shard_TabletControl) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[18] + mi := &file_topodata_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1502,7 +1596,7 @@ type Keyspace_ServedFrom struct { func (x *Keyspace_ServedFrom) Reset() { *x = Keyspace_ServedFrom{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[19] + mi := &file_topodata_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1515,7 +1609,7 @@ func (x *Keyspace_ServedFrom) String() string { func (*Keyspace_ServedFrom) ProtoMessage() {} func (x *Keyspace_ServedFrom) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[19] + mi := &file_topodata_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1564,7 +1658,7 @@ type ShardReplication_Node struct { func (x *ShardReplication_Node) Reset() { *x = ShardReplication_Node{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[20] + mi := &file_topodata_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1577,7 +1671,7 @@ func (x *ShardReplication_Node) String() string { func (*ShardReplication_Node) ProtoMessage() {} func (x *ShardReplication_Node) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[20] + mi := &file_topodata_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1616,7 +1710,7 @@ type SrvKeyspace_KeyspacePartition struct { func (x *SrvKeyspace_KeyspacePartition) Reset() { *x = SrvKeyspace_KeyspacePartition{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[21] + mi := &file_topodata_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1629,7 +1723,7 @@ func (x *SrvKeyspace_KeyspacePartition) String() string { func (*SrvKeyspace_KeyspacePartition) ProtoMessage() {} func (x *SrvKeyspace_KeyspacePartition) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[21] + mi := &file_topodata_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1642,7 +1736,7 @@ func (x *SrvKeyspace_KeyspacePartition) ProtoReflect() protoreflect.Message { // Deprecated: Use SrvKeyspace_KeyspacePartition.ProtoReflect.Descriptor instead. func (*SrvKeyspace_KeyspacePartition) Descriptor() ([]byte, []int) { - return file_topodata_proto_rawDescGZIP(), []int{9, 0} + return file_topodata_proto_rawDescGZIP(), []int{10, 0} } func (x *SrvKeyspace_KeyspacePartition) GetServedType() TabletType { @@ -1682,7 +1776,7 @@ type SrvKeyspace_ServedFrom struct { func (x *SrvKeyspace_ServedFrom) Reset() { *x = SrvKeyspace_ServedFrom{} if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[22] + mi := &file_topodata_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1695,7 +1789,7 @@ func (x *SrvKeyspace_ServedFrom) String() string { func (*SrvKeyspace_ServedFrom) ProtoMessage() {} func (x *SrvKeyspace_ServedFrom) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[22] + mi := &file_topodata_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1708,7 +1802,7 @@ func (x *SrvKeyspace_ServedFrom) ProtoReflect() protoreflect.Message { // Deprecated: Use SrvKeyspace_ServedFrom.ProtoReflect.Descriptor instead. func (*SrvKeyspace_ServedFrom) Descriptor() ([]byte, []int) { - return file_topodata_proto_rawDescGZIP(), []int{9, 1} + return file_topodata_proto_rawDescGZIP(), []int{10, 1} } func (x *SrvKeyspace_ServedFrom) GetTabletType() TabletType { @@ -1725,81 +1819,6 @@ func (x *SrvKeyspace_ServedFrom) GetKeyspace() string { return "" } -type SrvKeyspace_ThrottlerConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Enabled indicates that the throttler is actually checking state for requests. When disabled, it automatically returns 200 OK for all checks - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - // Threshold is the threshold for either the default check (heartbeat lag) or custom check - Threshold float64 `protobuf:"fixed64,2,opt,name=threshold,proto3" json:"threshold,omitempty"` - // CustomQuery is an optional query that overrides the default check query - CustomQuery string `protobuf:"bytes,3,opt,name=custom_query,json=customQuery,proto3" json:"custom_query,omitempty"` - // CheckAsCheckSelf indicates whether a throttler /check request should behave like a /check-self - CheckAsCheckSelf bool `protobuf:"varint,4,opt,name=check_as_check_self,json=checkAsCheckSelf,proto3" json:"check_as_check_self,omitempty"` -} - -func (x *SrvKeyspace_ThrottlerConfig) Reset() { - *x = SrvKeyspace_ThrottlerConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_topodata_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SrvKeyspace_ThrottlerConfig) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SrvKeyspace_ThrottlerConfig) ProtoMessage() {} - -func (x *SrvKeyspace_ThrottlerConfig) ProtoReflect() protoreflect.Message { - mi := &file_topodata_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SrvKeyspace_ThrottlerConfig.ProtoReflect.Descriptor instead. -func (*SrvKeyspace_ThrottlerConfig) Descriptor() ([]byte, []int) { - return file_topodata_proto_rawDescGZIP(), []int{9, 2} -} - -func (x *SrvKeyspace_ThrottlerConfig) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false -} - -func (x *SrvKeyspace_ThrottlerConfig) GetThreshold() float64 { - if x != nil { - return x.Threshold - } - return 0 -} - -func (x *SrvKeyspace_ThrottlerConfig) GetCustomQuery() string { - if x != nil { - return x.CustomQuery - } - return "" -} - -func (x *SrvKeyspace_ThrottlerConfig) GetCheckAsCheckSelf() bool { - if x != nil { - return x.CheckAsCheckSelf - } - return false -} - var File_topodata_proto protoreflect.FileDescriptor var file_topodata_proto_rawDesc = []byte{ @@ -1902,7 +1921,7 @@ var file_topodata_proto_rawDesc = []byte{ 0x69, 0x65, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, - 0x05, 0x10, 0x06, 0x22, 0x97, 0x03, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x05, 0x10, 0x06, 0x22, 0xdd, 0x03, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, @@ -1919,137 +1938,141 @@ var file_topodata_proto_rawDesc = []byte{ 0x68, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x75, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, - 0x6f, 0x6d, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, - 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x8b, 0x01, - 0x0a, 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x1a, 0x40, 0x0a, 0x04, 0x4e, 0x6f, 0x64, - 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x15, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x39, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, - 0x11, 0x54, 0x4f, 0x50, 0x4f, 0x4c, 0x4f, 0x47, 0x59, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, - 0x43, 0x48, 0x10, 0x02, 0x22, 0x55, 0x0a, 0x0e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x6b, 0x65, - 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x12, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x44, 0x0a, 0x10, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x74, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x75, 0x0a, 0x0a, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, + 0x03, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x1a, + 0x40, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x15, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x38, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, + 0x39, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, + 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x4f, 0x50, 0x4f, 0x4c, 0x4f, 0x47, 0x59, 0x5f, + 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x02, 0x22, 0x55, 0x0a, 0x0e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x2f, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, + 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x34, 0x0a, + 0x16, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x22, 0x9b, 0x01, 0x0a, 0x0f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x6c, + 0x66, 0x22, 0xb6, 0x04, 0x0a, 0x0b, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x0b, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, + 0x6d, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x44, 0x0a, + 0x10, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x0f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x1a, 0xe1, 0x01, 0x0a, 0x11, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x0b, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x43, 0x0a, 0x10, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x15, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xe0, 0x05, - 0x0a, 0x0b, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x47, 0x0a, - 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x72, 0x76, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x0a, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x50, 0x0a, 0x10, 0x74, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x74, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xe1, 0x01, 0x0a, 0x11, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x35, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x43, 0x0a, 0x10, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0f, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x50, 0x0a, - 0x15, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x13, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x1a, - 0x5f, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x35, 0x0a, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x1a, 0x9b, 0x01, 0x0a, 0x0f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x2d, 0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x6c, 0x66, 0x4a, 0x04, - 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, - 0x22, 0x4b, 0x0a, 0x08, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x22, 0x0a, - 0x0a, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x22, 0x55, 0x0a, 0x0a, 0x54, 0x6f, 0x70, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x4e, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x56, 0x69, 0x74, 0x65, 0x73, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x74, 0x6f, - 0x70, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x5a, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x46, 0x0a, 0x0e, - 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x56, 0x69, 0x74, 0x65, 0x73, 0x73, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x0d, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x2a, 0x28, 0x0a, 0x0c, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, - 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x10, 0x01, 0x2a, 0x9d, - 0x01, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, - 0x49, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x41, 0x53, 0x54, 0x45, - 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x10, 0x02, - 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, - 0x42, 0x41, 0x54, 0x43, 0x48, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x41, 0x52, 0x45, - 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, - 0x41, 0x4c, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x10, 0x06, - 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0b, 0x0a, - 0x07, 0x44, 0x52, 0x41, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x08, 0x1a, 0x02, 0x10, 0x01, 0x42, 0x38, - 0x0a, 0x0f, 0x69, 0x6f, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x5a, 0x25, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, - 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6c, 0x52, 0x13, 0x73, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x1a, 0x5f, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, + 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x4b, 0x0a, 0x08, 0x43, 0x65, + 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, + 0x74, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x22, 0x0a, 0x0a, 0x43, 0x65, 0x6c, 0x6c, 0x73, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x55, 0x0a, 0x0a, 0x54, + 0x6f, 0x70, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, + 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, + 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, + 0x6f, 0x74, 0x22, 0x4e, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x56, 0x69, + 0x74, 0x65, 0x73, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x0b, 0x74, + 0x6f, 0x70, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x6f, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0x5a, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x46, 0x0a, 0x0e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, + 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x56, 0x69, 0x74, 0x65, 0x73, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x0d, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2a, 0x28, + 0x0a, 0x0c, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x4e, + 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x10, 0x01, 0x2a, 0x9d, 0x01, 0x0a, 0x0a, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x49, 0x4d, 0x41, 0x52, 0x59, 0x10, + 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x41, 0x53, 0x54, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x44, + 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x41, 0x54, 0x43, 0x48, 0x10, + 0x03, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x41, 0x52, 0x45, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, + 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x0a, + 0x0a, 0x06, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, + 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x52, 0x41, 0x49, 0x4e, + 0x45, 0x44, 0x10, 0x08, 0x1a, 0x02, 0x10, 0x01, 0x42, 0x38, 0x0a, 0x0f, 0x69, 0x6f, 0x2e, 0x76, + 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x25, 0x76, 0x69, 0x74, + 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, + 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2079,61 +2102,62 @@ var file_topodata_proto_goTypes = []interface{}{ (*ShardReplicationError)(nil), // 9: topodata.ShardReplicationError (*ShardReference)(nil), // 10: topodata.ShardReference (*ShardTabletControl)(nil), // 11: topodata.ShardTabletControl - (*SrvKeyspace)(nil), // 12: topodata.SrvKeyspace - (*CellInfo)(nil), // 13: topodata.CellInfo - (*CellsAlias)(nil), // 14: topodata.CellsAlias - (*TopoConfig)(nil), // 15: topodata.TopoConfig - (*ExternalVitessCluster)(nil), // 16: topodata.ExternalVitessCluster - (*ExternalClusters)(nil), // 17: topodata.ExternalClusters - nil, // 18: topodata.Tablet.PortMapEntry - nil, // 19: topodata.Tablet.TagsEntry - (*Shard_SourceShard)(nil), // 20: topodata.Shard.SourceShard - (*Shard_TabletControl)(nil), // 21: topodata.Shard.TabletControl - (*Keyspace_ServedFrom)(nil), // 22: topodata.Keyspace.ServedFrom - (*ShardReplication_Node)(nil), // 23: topodata.ShardReplication.Node - (*SrvKeyspace_KeyspacePartition)(nil), // 24: topodata.SrvKeyspace.KeyspacePartition - (*SrvKeyspace_ServedFrom)(nil), // 25: topodata.SrvKeyspace.ServedFrom - (*SrvKeyspace_ThrottlerConfig)(nil), // 26: topodata.SrvKeyspace.ThrottlerConfig + (*ThrottlerConfig)(nil), // 12: topodata.ThrottlerConfig + (*SrvKeyspace)(nil), // 13: topodata.SrvKeyspace + (*CellInfo)(nil), // 14: topodata.CellInfo + (*CellsAlias)(nil), // 15: topodata.CellsAlias + (*TopoConfig)(nil), // 16: topodata.TopoConfig + (*ExternalVitessCluster)(nil), // 17: topodata.ExternalVitessCluster + (*ExternalClusters)(nil), // 18: topodata.ExternalClusters + nil, // 19: topodata.Tablet.PortMapEntry + nil, // 20: topodata.Tablet.TagsEntry + (*Shard_SourceShard)(nil), // 21: topodata.Shard.SourceShard + (*Shard_TabletControl)(nil), // 22: topodata.Shard.TabletControl + (*Keyspace_ServedFrom)(nil), // 23: topodata.Keyspace.ServedFrom + (*ShardReplication_Node)(nil), // 24: topodata.ShardReplication.Node + (*SrvKeyspace_KeyspacePartition)(nil), // 25: topodata.SrvKeyspace.KeyspacePartition + (*SrvKeyspace_ServedFrom)(nil), // 26: topodata.SrvKeyspace.ServedFrom (*vttime.Time)(nil), // 27: vttime.Time } var file_topodata_proto_depIdxs = []int32{ 4, // 0: topodata.Tablet.alias:type_name -> topodata.TabletAlias - 18, // 1: topodata.Tablet.port_map:type_name -> topodata.Tablet.PortMapEntry + 19, // 1: topodata.Tablet.port_map:type_name -> topodata.Tablet.PortMapEntry 3, // 2: topodata.Tablet.key_range:type_name -> topodata.KeyRange 1, // 3: topodata.Tablet.type:type_name -> topodata.TabletType - 19, // 4: topodata.Tablet.tags:type_name -> topodata.Tablet.TagsEntry + 20, // 4: topodata.Tablet.tags:type_name -> topodata.Tablet.TagsEntry 27, // 5: topodata.Tablet.primary_term_start_time:type_name -> vttime.Time 4, // 6: topodata.Shard.primary_alias:type_name -> topodata.TabletAlias 27, // 7: topodata.Shard.primary_term_start_time:type_name -> vttime.Time 3, // 8: topodata.Shard.key_range:type_name -> topodata.KeyRange - 20, // 9: topodata.Shard.source_shards:type_name -> topodata.Shard.SourceShard - 21, // 10: topodata.Shard.tablet_controls:type_name -> topodata.Shard.TabletControl - 22, // 11: topodata.Keyspace.served_froms:type_name -> topodata.Keyspace.ServedFrom + 21, // 9: topodata.Shard.source_shards:type_name -> topodata.Shard.SourceShard + 22, // 10: topodata.Shard.tablet_controls:type_name -> topodata.Shard.TabletControl + 23, // 11: topodata.Keyspace.served_froms:type_name -> topodata.Keyspace.ServedFrom 0, // 12: topodata.Keyspace.keyspace_type:type_name -> topodata.KeyspaceType 27, // 13: topodata.Keyspace.snapshot_time:type_name -> vttime.Time - 23, // 14: topodata.ShardReplication.nodes:type_name -> topodata.ShardReplication.Node - 2, // 15: topodata.ShardReplicationError.type:type_name -> topodata.ShardReplicationError.Type - 4, // 16: topodata.ShardReplicationError.tablet_alias:type_name -> topodata.TabletAlias - 3, // 17: topodata.ShardReference.key_range:type_name -> topodata.KeyRange - 3, // 18: topodata.ShardTabletControl.key_range:type_name -> topodata.KeyRange - 24, // 19: topodata.SrvKeyspace.partitions:type_name -> topodata.SrvKeyspace.KeyspacePartition - 25, // 20: topodata.SrvKeyspace.served_from:type_name -> topodata.SrvKeyspace.ServedFrom - 26, // 21: topodata.SrvKeyspace.throttler_config:type_name -> topodata.SrvKeyspace.ThrottlerConfig - 15, // 22: topodata.ExternalVitessCluster.topo_config:type_name -> topodata.TopoConfig - 16, // 23: topodata.ExternalClusters.vitess_cluster:type_name -> topodata.ExternalVitessCluster - 3, // 24: topodata.Shard.SourceShard.key_range:type_name -> topodata.KeyRange - 1, // 25: topodata.Shard.TabletControl.tablet_type:type_name -> topodata.TabletType - 1, // 26: topodata.Keyspace.ServedFrom.tablet_type:type_name -> topodata.TabletType - 4, // 27: topodata.ShardReplication.Node.tablet_alias:type_name -> topodata.TabletAlias - 1, // 28: topodata.SrvKeyspace.KeyspacePartition.served_type:type_name -> topodata.TabletType - 10, // 29: topodata.SrvKeyspace.KeyspacePartition.shard_references:type_name -> topodata.ShardReference - 11, // 30: topodata.SrvKeyspace.KeyspacePartition.shard_tablet_controls:type_name -> topodata.ShardTabletControl - 1, // 31: topodata.SrvKeyspace.ServedFrom.tablet_type:type_name -> topodata.TabletType - 32, // [32:32] is the sub-list for method output_type - 32, // [32:32] is the sub-list for method input_type - 32, // [32:32] is the sub-list for extension type_name - 32, // [32:32] is the sub-list for extension extendee - 0, // [0:32] is the sub-list for field type_name + 12, // 14: topodata.Keyspace.throttler_config:type_name -> topodata.ThrottlerConfig + 24, // 15: topodata.ShardReplication.nodes:type_name -> topodata.ShardReplication.Node + 2, // 16: topodata.ShardReplicationError.type:type_name -> topodata.ShardReplicationError.Type + 4, // 17: topodata.ShardReplicationError.tablet_alias:type_name -> topodata.TabletAlias + 3, // 18: topodata.ShardReference.key_range:type_name -> topodata.KeyRange + 3, // 19: topodata.ShardTabletControl.key_range:type_name -> topodata.KeyRange + 25, // 20: topodata.SrvKeyspace.partitions:type_name -> topodata.SrvKeyspace.KeyspacePartition + 26, // 21: topodata.SrvKeyspace.served_from:type_name -> topodata.SrvKeyspace.ServedFrom + 12, // 22: topodata.SrvKeyspace.throttler_config:type_name -> topodata.ThrottlerConfig + 16, // 23: topodata.ExternalVitessCluster.topo_config:type_name -> topodata.TopoConfig + 17, // 24: topodata.ExternalClusters.vitess_cluster:type_name -> topodata.ExternalVitessCluster + 3, // 25: topodata.Shard.SourceShard.key_range:type_name -> topodata.KeyRange + 1, // 26: topodata.Shard.TabletControl.tablet_type:type_name -> topodata.TabletType + 1, // 27: topodata.Keyspace.ServedFrom.tablet_type:type_name -> topodata.TabletType + 4, // 28: topodata.ShardReplication.Node.tablet_alias:type_name -> topodata.TabletAlias + 1, // 29: topodata.SrvKeyspace.KeyspacePartition.served_type:type_name -> topodata.TabletType + 10, // 30: topodata.SrvKeyspace.KeyspacePartition.shard_references:type_name -> topodata.ShardReference + 11, // 31: topodata.SrvKeyspace.KeyspacePartition.shard_tablet_controls:type_name -> topodata.ShardTabletControl + 1, // 32: topodata.SrvKeyspace.ServedFrom.tablet_type:type_name -> topodata.TabletType + 33, // [33:33] is the sub-list for method output_type + 33, // [33:33] is the sub-list for method input_type + 33, // [33:33] is the sub-list for extension type_name + 33, // [33:33] is the sub-list for extension extendee + 0, // [0:33] is the sub-list for field type_name } func init() { file_topodata_proto_init() } @@ -2251,7 +2275,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SrvKeyspace); i { + switch v := v.(*ThrottlerConfig); i { case 0: return &v.state case 1: @@ -2263,7 +2287,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CellInfo); i { + switch v := v.(*SrvKeyspace); i { case 0: return &v.state case 1: @@ -2275,7 +2299,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CellsAlias); i { + switch v := v.(*CellInfo); i { case 0: return &v.state case 1: @@ -2287,7 +2311,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TopoConfig); i { + switch v := v.(*CellsAlias); i { case 0: return &v.state case 1: @@ -2299,7 +2323,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalVitessCluster); i { + switch v := v.(*TopoConfig); i { case 0: return &v.state case 1: @@ -2311,7 +2335,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalClusters); i { + switch v := v.(*ExternalVitessCluster); i { case 0: return &v.state case 1: @@ -2322,8 +2346,8 @@ func file_topodata_proto_init() { return nil } } - file_topodata_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Shard_SourceShard); i { + file_topodata_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExternalClusters); i { case 0: return &v.state case 1: @@ -2335,7 +2359,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Shard_TabletControl); i { + switch v := v.(*Shard_SourceShard); i { case 0: return &v.state case 1: @@ -2347,7 +2371,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Keyspace_ServedFrom); i { + switch v := v.(*Shard_TabletControl); i { case 0: return &v.state case 1: @@ -2359,7 +2383,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShardReplication_Node); i { + switch v := v.(*Keyspace_ServedFrom); i { case 0: return &v.state case 1: @@ -2371,7 +2395,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SrvKeyspace_KeyspacePartition); i { + switch v := v.(*ShardReplication_Node); i { case 0: return &v.state case 1: @@ -2383,7 +2407,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SrvKeyspace_ServedFrom); i { + switch v := v.(*SrvKeyspace_KeyspacePartition); i { case 0: return &v.state case 1: @@ -2395,7 +2419,7 @@ func file_topodata_proto_init() { } } file_topodata_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SrvKeyspace_ThrottlerConfig); i { + switch v := v.(*SrvKeyspace_ServedFrom); i { case 0: return &v.state case 1: diff --git a/go/vt/proto/topodata/topodata_vtproto.pb.go b/go/vt/proto/topodata/topodata_vtproto.pb.go index d8cb07ddbd6..14b3d524afb 100644 --- a/go/vt/proto/topodata/topodata_vtproto.pb.go +++ b/go/vt/proto/topodata/topodata_vtproto.pb.go @@ -589,6 +589,16 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.ThrottlerConfig != nil { + size, err := m.ThrottlerConfig.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x4a + } if len(m.DurabilityPolicy) > 0 { i -= len(m.DurabilityPolicy) copy(dAtA[i:], m.DurabilityPolicy) @@ -879,6 +889,72 @@ func (m *ShardTabletControl) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ThrottlerConfig) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ThrottlerConfig) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ThrottlerConfig) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.CheckAsCheckSelf { + i-- + if m.CheckAsCheckSelf { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.CustomQuery) > 0 { + i -= len(m.CustomQuery) + copy(dAtA[i:], m.CustomQuery) + i = encodeVarint(dAtA, i, uint64(len(m.CustomQuery))) + i-- + dAtA[i] = 0x1a + } + if m.Threshold != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Threshold)))) + i-- + dAtA[i] = 0x11 + } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *SrvKeyspace_KeyspacePartition) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -986,72 +1062,6 @@ func (m *SrvKeyspace_ServedFrom) MarshalToSizedBufferVT(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *SrvKeyspace_ThrottlerConfig) MarshalVT() (dAtA []byte, err error) { - if m == nil { - return nil, nil - } - size := m.SizeVT() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBufferVT(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SrvKeyspace_ThrottlerConfig) MarshalToVT(dAtA []byte) (int, error) { - size := m.SizeVT() - return m.MarshalToSizedBufferVT(dAtA[:size]) -} - -func (m *SrvKeyspace_ThrottlerConfig) MarshalToSizedBufferVT(dAtA []byte) (int, error) { - if m == nil { - return 0, nil - } - i := len(dAtA) - _ = i - var l int - _ = l - if m.unknownFields != nil { - i -= len(m.unknownFields) - copy(dAtA[i:], m.unknownFields) - } - if m.CheckAsCheckSelf { - i-- - if m.CheckAsCheckSelf { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if len(m.CustomQuery) > 0 { - i -= len(m.CustomQuery) - copy(dAtA[i:], m.CustomQuery) - i = encodeVarint(dAtA, i, uint64(len(m.CustomQuery))) - i-- - dAtA[i] = 0x1a - } - if m.Threshold != 0 { - i -= 8 - binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Threshold)))) - i-- - dAtA[i] = 0x11 - } - if m.Enabled { - i-- - if m.Enabled { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - func (m *SrvKeyspace) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -1613,6 +1623,10 @@ func (m *Keyspace) SizeVT() (n int) { if l > 0 { n += 1 + l + sov(uint64(l)) } + if m.ThrottlerConfig != nil { + l = m.ThrottlerConfig.SizeVT() + n += 1 + l + sov(uint64(l)) + } n += len(m.unknownFields) return n } @@ -1703,6 +1717,29 @@ func (m *ShardTabletControl) SizeVT() (n int) { return n } +func (m *ThrottlerConfig) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Enabled { + n += 2 + } + if m.Threshold != 0 { + n += 9 + } + l = len(m.CustomQuery) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + if m.CheckAsCheckSelf { + n += 2 + } + n += len(m.unknownFields) + return n +} + func (m *SrvKeyspace_KeyspacePartition) SizeVT() (n int) { if m == nil { return 0 @@ -1745,29 +1782,6 @@ func (m *SrvKeyspace_ServedFrom) SizeVT() (n int) { return n } -func (m *SrvKeyspace_ThrottlerConfig) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Enabled { - n += 2 - } - if m.Threshold != 0 { - n += 9 - } - l = len(m.CustomQuery) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.CheckAsCheckSelf { - n += 2 - } - n += len(m.unknownFields) - return n -} - func (m *SrvKeyspace) SizeVT() (n int) { if m == nil { return 0 @@ -3674,6 +3688,42 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } m.DurabilityPolicy = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ThrottlerConfig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ThrottlerConfig == nil { + m.ThrottlerConfig = &ThrottlerConfig{} + } + if err := m.ThrottlerConfig.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -4232,7 +4282,7 @@ func (m *ShardTabletControl) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { +func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4255,17 +4305,17 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SrvKeyspace_KeyspacePartition: wiretype end group for non-group") + return fmt.Errorf("proto: ThrottlerConfig: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SrvKeyspace_KeyspacePartition: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ThrottlerConfig: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ServedType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) } - m.ServedType = 0 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -4275,16 +4325,28 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.ServedType |= TabletType(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } + m.Enabled = bool(v != 0) case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Threshold", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Threshold = float64(math.Float64frombits(v)) + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShardReferences", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CustomQuery", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -4294,31 +4356,29 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ShardReferences = append(m.ShardReferences, &ShardReference{}) - if err := m.ShardReferences[len(m.ShardReferences)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.CustomQuery = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShardTabletControls", wireType) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CheckAsCheckSelf", wireType) } - var msglen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -4328,26 +4388,12 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ShardTabletControls = append(m.ShardTabletControls, &ShardTabletControl{}) - if err := m.ShardTabletControls[len(m.ShardTabletControls)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex + m.CheckAsCheckSelf = bool(v != 0) default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -4370,7 +4416,7 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SrvKeyspace_ServedFrom) UnmarshalVT(dAtA []byte) error { +func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4393,17 +4439,17 @@ func (m *SrvKeyspace_ServedFrom) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SrvKeyspace_ServedFrom: wiretype end group for non-group") + return fmt.Errorf("proto: SrvKeyspace_KeyspacePartition: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SrvKeyspace_ServedFrom: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SrvKeyspace_KeyspacePartition: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TabletType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ServedType", wireType) } - m.TabletType = 0 + m.ServedType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -4413,16 +4459,16 @@ func (m *SrvKeyspace_ServedFrom) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.TabletType |= TabletType(b&0x7F) << shift + m.ServedType |= TabletType(b&0x7F) << shift if b < 0x80 { break } } case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ShardReferences", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -4432,23 +4478,59 @@ func (m *SrvKeyspace_ServedFrom) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) + m.ShardReferences = append(m.ShardReferences, &ShardReference{}) + if err := m.ShardReferences[len(m.ShardReferences)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShardTabletControls", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ShardTabletControls = append(m.ShardTabletControls, &ShardTabletControl{}) + if err := m.ShardTabletControls[len(m.ShardTabletControls)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -4472,7 +4554,7 @@ func (m *SrvKeyspace_ServedFrom) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SrvKeyspace_ThrottlerConfig) UnmarshalVT(dAtA []byte) error { +func (m *SrvKeyspace_ServedFrom) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4495,17 +4577,17 @@ func (m *SrvKeyspace_ThrottlerConfig) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SrvKeyspace_ThrottlerConfig: wiretype end group for non-group") + return fmt.Errorf("proto: SrvKeyspace_ServedFrom: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SrvKeyspace_ThrottlerConfig: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SrvKeyspace_ServedFrom: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TabletType", wireType) } - var v int + m.TabletType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -4515,26 +4597,14 @@ func (m *SrvKeyspace_ThrottlerConfig) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + m.TabletType |= TabletType(b&0x7F) << shift if b < 0x80 { break } } - m.Enabled = bool(v != 0) case 2: - if wireType != 1 { - return fmt.Errorf("proto: wrong wireType = %d for field Threshold", wireType) - } - var v uint64 - if (iNdEx + 8) > l { - return io.ErrUnexpectedEOF - } - v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) - iNdEx += 8 - m.Threshold = float64(math.Float64frombits(v)) - case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CustomQuery", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4562,28 +4632,8 @@ func (m *SrvKeyspace_ThrottlerConfig) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.CustomQuery = string(dAtA[iNdEx:postIndex]) + m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CheckAsCheckSelf", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.CheckAsCheckSelf = bool(v != 0) default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -4733,7 +4783,7 @@ func (m *SrvKeyspace) UnmarshalVT(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.ThrottlerConfig == nil { - m.ThrottlerConfig = &SrvKeyspace_ThrottlerConfig{} + m.ThrottlerConfig = &ThrottlerConfig{} } if err := m.ThrottlerConfig.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/go/vt/topo/keyspace.go b/go/vt/topo/keyspace.go index 996203b9556..aeacacb232f 100755 --- a/go/vt/topo/keyspace.go +++ b/go/vt/topo/keyspace.go @@ -213,6 +213,14 @@ func (ts *Server) GetKeyspaceDurability(ctx context.Context, keyspace string) (s return "none", nil } +func (ts *Server) GetThrottlerConfig(ctx context.Context, keyspace string) (*topodatapb.ThrottlerConfig, error) { + keyspaceInfo, err := ts.GetKeyspace(ctx, keyspace) + if err != nil { + return nil, err + } + return keyspaceInfo.ThrottlerConfig, nil +} + // UpdateKeyspace updates the keyspace data. It checks the keyspace is locked. func (ts *Server) UpdateKeyspace(ctx context.Context, ki *KeyspaceInfo) error { // make sure it is locked first diff --git a/go/vt/topo/srv_keyspace.go b/go/vt/topo/srv_keyspace.go index 5a0e8c1f4c6..e431ce55c40 100644 --- a/go/vt/topo/srv_keyspace.go +++ b/go/vt/topo/srv_keyspace.go @@ -397,16 +397,16 @@ func (ts *Server) DeleteSrvKeyspacePartitions(ctx context.Context, keyspace stri } // UpdateSrvKeyspaceThrottlerConfig updates existing throttler configuration -func (ts *Server) UpdateSrvKeyspaceThrottlerConfig(ctx context.Context, keyspace string, cells []string, update func(throttlerConfig *topodatapb.SrvKeyspace_ThrottlerConfig) *topodatapb.SrvKeyspace_ThrottlerConfig) (updatedCells []string, err error) { +func (ts *Server) UpdateSrvKeyspaceThrottlerConfig(ctx context.Context, keyspace string, cells []string, update func(throttlerConfig *topodatapb.ThrottlerConfig) *topodatapb.ThrottlerConfig) (updatedCells []string, err error) { if err = CheckKeyspaceLocked(ctx, keyspace); err != nil { - return cells, err + return updatedCells, err } - // The caller intents to update all cells in this case + // The caller intends to update all cells in this case if len(cells) == 0 { cells, err = ts.GetCellInfoNames(ctx) if err != nil { - return cells, err + return updatedCells, err } } @@ -424,8 +424,10 @@ func (ts *Server) UpdateSrvKeyspaceThrottlerConfig(ctx context.Context, keyspace rec.RecordError(err) return } + updatedCells = append(updatedCells, cell) + return case IsErrType(err, NoNode): - // NOOP + // NOOP as not every cell will contain a serving tablet in the keyspace default: rec.RecordError(err) return @@ -434,9 +436,9 @@ func (ts *Server) UpdateSrvKeyspaceThrottlerConfig(ctx context.Context, keyspace } wg.Wait() if rec.HasErrors() { - return cells, NewError(PartialResult, rec.Error().Error()) + return updatedCells, NewError(PartialResult, rec.Error().Error()) } - return cells, nil + return updatedCells, nil } // UpdateDisableQueryService will make sure the disableQueryService is diff --git a/go/vt/topotools/rebuild_keyspace.go b/go/vt/topotools/rebuild_keyspace.go index 4882799870d..d58ce0b7160 100644 --- a/go/vt/topotools/rebuild_keyspace.go +++ b/go/vt/topotools/rebuild_keyspace.go @@ -96,6 +96,7 @@ func RebuildKeyspaceLocked(ctx context.Context, log logutil.Logger, ts *topo.Ser srvKeyspaceMap[cell] = &topodatapb.SrvKeyspace{ ServedFrom: ki.ComputeCellServedFrom(cell), } + srvKeyspaceMap[cell].ThrottlerConfig = ki.ThrottlerConfig } servedTypes := []topodatapb.TabletType{topodatapb.TabletType_PRIMARY, topodatapb.TabletType_REPLICA, topodatapb.TabletType_RDONLY} diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index 197c99d0913..1885536f98f 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -1581,9 +1581,9 @@ func (s *VtctldServer) UpdateThrottlerConfig(ctx context.Context, req *vtctldata return nil, fmt.Errorf("--check-as-check-self and --check-as-check-shard are mutually exclusive") } - update := func(throttlerConfig *topodatapb.SrvKeyspace_ThrottlerConfig) *topodatapb.SrvKeyspace_ThrottlerConfig { + update := func(throttlerConfig *topodatapb.ThrottlerConfig) *topodatapb.ThrottlerConfig { if throttlerConfig == nil { - throttlerConfig = &topodatapb.SrvKeyspace_ThrottlerConfig{} + throttlerConfig = &topodatapb.ThrottlerConfig{} } if req.CustomQuerySet { // custom query provided @@ -1616,11 +1616,21 @@ func (s *VtctldServer) UpdateThrottlerConfig(ctx context.Context, req *vtctldata } defer unlock(&err) - _, err = s.ts.UpdateSrvKeyspaceThrottlerConfig(ctx, req.Keyspace, []string{}, update) + ki, err := s.ts.GetKeyspace(ctx, req.Keyspace) if err != nil { return nil, err } - return &vtctldatapb.UpdateThrottlerConfigResponse{}, nil + + ki.ThrottlerConfig = update(ki.ThrottlerConfig) + + err = s.ts.UpdateKeyspace(ctx, ki) + if err != nil { + return nil, err + } + + _, err = s.ts.UpdateSrvKeyspaceThrottlerConfig(ctx, req.Keyspace, []string{}, update) + + return &vtctldatapb.UpdateThrottlerConfigResponse{}, err } // GetSrvVSchema is part of the vtctlservicepb.VtctldServer interface. diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 965d1688896..682576b7a49 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -3529,9 +3529,9 @@ func commandUpdateThrottlerConfig(ctx context.Context, wr *wrangler.Wrangler, su keyspace := subFlags.Arg(0) - update := func(throttlerConfig *topodatapb.SrvKeyspace_ThrottlerConfig) *topodatapb.SrvKeyspace_ThrottlerConfig { + update := func(throttlerConfig *topodatapb.ThrottlerConfig) *topodatapb.ThrottlerConfig { if throttlerConfig == nil { - throttlerConfig = &topodatapb.SrvKeyspace_ThrottlerConfig{} + throttlerConfig = &topodatapb.ThrottlerConfig{} } if customQuerySet { // custom query provided diff --git a/go/vt/vtctld/api_test.go b/go/vt/vtctld/api_test.go index 9607e16d8bf..1d8c1863666 100644 --- a/go/vt/vtctld/api_test.go +++ b/go/vt/vtctld/api_test.go @@ -305,7 +305,8 @@ func TestAPI(t *testing.T) { "keyspace_type":0, "base_keyspace":"", "snapshot_time":null, - "durability_policy":"semi_sync" + "durability_policy":"semi_sync", + "throttler_config": null }`, http.StatusOK}, {"GET", "keyspaces/nonexistent", "", "404 page not found", http.StatusNotFound}, {"POST", "keyspaces/ks1?action=TestKeyspaceAction", "", `{ @@ -440,11 +441,11 @@ func TestAPI(t *testing.T) { // vtctl RunCommand {"POST", "vtctl/", `["GetKeyspace","ks1"]`, `{ "Error": "", - "Output": "{\n \"served_froms\": [],\n \"keyspace_type\": 0,\n \"base_keyspace\": \"\",\n \"snapshot_time\": null,\n \"durability_policy\": \"semi_sync\"\n}\n\n" + "Output": "{\n \"served_froms\": [],\n \"keyspace_type\": 0,\n \"base_keyspace\": \"\",\n \"snapshot_time\": null,\n \"durability_policy\": \"semi_sync\",\n \"throttler_config\": null\n}\n\n" }`, http.StatusOK}, {"POST", "vtctl/", `["GetKeyspace","ks3"]`, `{ "Error": "", - "Output": "{\n \"served_froms\": [],\n \"keyspace_type\": 1,\n \"base_keyspace\": \"ks1\",\n \"snapshot_time\": {\n \"seconds\": \"1136214245\",\n \"nanoseconds\": 0\n },\n \"durability_policy\": \"none\"\n}\n\n" + "Output": "{\n \"served_froms\": [],\n \"keyspace_type\": 1,\n \"base_keyspace\": \"ks1\",\n \"snapshot_time\": {\n \"seconds\": \"1136214245\",\n \"nanoseconds\": 0\n },\n \"durability_policy\": \"none\",\n \"throttler_config\": null\n}\n\n" }`, http.StatusOK}, {"POST", "vtctl/", `["GetVSchema","ks3"]`, `{ "Error": "", diff --git a/go/vt/vttablet/tabletserver/throttle/throttler.go b/go/vt/vttablet/tabletserver/throttle/throttler.go index cbec6893e27..df415ddf582 100644 --- a/go/vt/vttablet/tabletserver/throttle/throttler.go +++ b/go/vt/vttablet/tabletserver/throttle/throttler.go @@ -130,7 +130,7 @@ type Throttler struct { mysqlThrottleMetricChan chan *mysql.MySQLThrottleMetric mysqlInventoryChan chan *mysql.Inventory mysqlClusterProbesChan chan *mysql.ClusterProbes - throttlerConfigChan chan *topodatapb.SrvKeyspace_ThrottlerConfig + throttlerConfigChan chan *topodatapb.ThrottlerConfig mysqlInventory *mysql.Inventory @@ -161,6 +161,7 @@ type ThrottlerStatus struct { IsLeader bool IsOpen bool + IsEnabled bool IsDormant bool AggregatedMetrics map[string]base.MetricResult @@ -188,7 +189,7 @@ func NewThrottler(env tabletenv.Env, srvTopoServer srvtopo.Server, ts *topo.Serv throttler.mysqlThrottleMetricChan = make(chan *mysql.MySQLThrottleMetric) throttler.mysqlInventoryChan = make(chan *mysql.Inventory, 1) throttler.mysqlClusterProbesChan = make(chan *mysql.ClusterProbes) - throttler.throttlerConfigChan = make(chan *topodatapb.SrvKeyspace_ThrottlerConfig) + throttler.throttlerConfigChan = make(chan *topodatapb.ThrottlerConfig) throttler.mysqlInventory = mysql.NewInventory() throttler.throttledApps = cache.New(cache.NoExpiration, 0) @@ -280,7 +281,7 @@ func (throttler *Throttler) initConfig() { } // readThrottlerConfig proactively reads the throttler's config from SrvKeyspace in local topo -func (throttler *Throttler) readThrottlerConfig(ctx context.Context) (*topodatapb.SrvKeyspace_ThrottlerConfig, error) { +func (throttler *Throttler) readThrottlerConfig(ctx context.Context) (*topodatapb.ThrottlerConfig, error) { srvks, err := throttler.ts.GetSrvKeyspace(ctx, throttler.cell, throttler.keyspace) if err != nil { return nil, err @@ -289,9 +290,9 @@ func (throttler *Throttler) readThrottlerConfig(ctx context.Context) (*topodatap } // normalizeThrottlerConfig noramlizes missing throttler config information, as needed. -func (throttler *Throttler) normalizeThrottlerConfig(thottlerConfig *topodatapb.SrvKeyspace_ThrottlerConfig) *topodatapb.SrvKeyspace_ThrottlerConfig { +func (throttler *Throttler) normalizeThrottlerConfig(thottlerConfig *topodatapb.ThrottlerConfig) *topodatapb.ThrottlerConfig { if thottlerConfig == nil { - thottlerConfig = &topodatapb.SrvKeyspace_ThrottlerConfig{} + thottlerConfig = &topodatapb.ThrottlerConfig{} } if thottlerConfig.CustomQuery == "" { // no custom query; we check replication lag @@ -302,12 +303,7 @@ func (throttler *Throttler) normalizeThrottlerConfig(thottlerConfig *topodatapb. return thottlerConfig } -// WatchSrvKeyspaceCallback gets called whenever SrvKeyspace has been modified. This callback only examines the ThrottlerConfig part of -// SrvKeyspace, and proceeds to inform the throttler of the new config func (throttler *Throttler) WatchSrvKeyspaceCallback(srvks *topodatapb.SrvKeyspace, err error) bool { - throttler.enableMutex.Lock() - defer throttler.enableMutex.Unlock() - if err != nil { log.Errorf("WatchSrvKeyspaceCallback error: %v", err) return false @@ -329,7 +325,7 @@ func (throttler *Throttler) WatchSrvKeyspaceCallback(srvks *topodatapb.SrvKeyspa // applyThrottlerConfig receives a Throttlerconfig as read from SrvKeyspace, and applies the configuration. This may cause // the throttler to be enabled/disabled, and of course it affects the throttling query/threshold. -func (throttler *Throttler) applyThrottlerConfig(ctx context.Context, throttlerConfig *topodatapb.SrvKeyspace_ThrottlerConfig) { +func (throttler *Throttler) applyThrottlerConfig(ctx context.Context, throttlerConfig *topodatapb.ThrottlerConfig) { if !throttlerConfigViaTopo { return } @@ -539,7 +535,7 @@ func (throttler *Throttler) isDormant() bool { } // Operate is the main entry point for the throttler operation and logic. It will -// run the probes, colelct metrics, refresh inventory, etc. +// run the probes, collect metrics, refresh inventory, etc. func (throttler *Throttler) Operate(ctx context.Context) { tickers := [](*timer.SuspendableTicker){} @@ -1032,6 +1028,7 @@ func (throttler *Throttler) Status() *ThrottlerStatus { IsLeader: (atomic.LoadInt64(&throttler.isLeader) > 0), IsOpen: (atomic.LoadInt64(&throttler.isOpen) > 0), + IsEnabled: (atomic.LoadInt64(&throttler.isEnabled) > 0), IsDormant: throttler.isDormant(), AggregatedMetrics: throttler.aggregatedMetricsSnapshot(), diff --git a/proto/topodata.proto b/proto/topodata.proto index 1461fdffe09..775f6b2ed71 100644 --- a/proto/topodata.proto +++ b/proto/topodata.proto @@ -304,6 +304,11 @@ message Keyspace { // DurabilityPolicy is the durability policy to be // used for the keyspace. string durability_policy = 8; + + // ThrottlerConfig has the configuration for the tablet + // server's lag throttler, and applies to the entire + // keyspace, across all shards and tablets. + ThrottlerConfig throttler_config = 9; } // ShardReplication describes the MySQL replication relationships @@ -358,6 +363,25 @@ message ShardTabletControl { bool query_service_disabled = 3; } +message ThrottlerConfig { + // Enabled indicates that the throttler is actually checking state for + // requests. When disabled, it automatically returns 200 OK for all + // checks. + bool enabled = 1; + + // Threshold is the threshold for either the default check (heartbeat + // lag) or custom check. + double threshold = 2; + + // CustomQuery is an optional query that overrides the default check + // query. + string custom_query = 3; + + // CheckAsCheckSelf indicates whether a throttler /check request + // should behave like a /check-self. + bool check_as_check_self = 4; +} + // SrvKeyspace is a rollup node for the keyspace itself. message SrvKeyspace { message KeyspacePartition { @@ -396,21 +420,10 @@ message SrvKeyspace { // OBSOLETE int32 split_shard_count = 5; reserved 5; - message ThrottlerConfig { - // Enabled indicates that the throttler is actually checking state for requests. When disabled, it automatically returns 200 OK for all checks - bool enabled = 1; - - // Threshold is the threshold for either the default check (heartbeat lag) or custom check - double threshold = 2; - - // CustomQuery is an optional query that overrides the default check query - string custom_query = 3; - - // CheckAsCheckSelf indicates whether a throttler /check request should behave like a /check-self - bool check_as_check_self = 4; - } - - // ThrottlerConfig has the configuration for the tablet server's lag throttler, and applies to the entire keyspace, across all shards and tablets + // ThrottlerConfig has the configuration for the tablet server's + // lag throttler, and applies to the entire keyspace, across all + // shards and tablets. This is copied from the global keyspace + // object. ThrottlerConfig throttler_config = 6; } diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index e55abfe9428..9932d065be8 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -13241,6 +13241,9 @@ export namespace topodata { /** Keyspace durability_policy */ durability_policy?: (string|null); + + /** Keyspace throttler_config */ + throttler_config?: (topodata.IThrottlerConfig|null); } /** Represents a Keyspace. */ @@ -13267,6 +13270,9 @@ export namespace topodata { /** Keyspace durability_policy. */ public durability_policy: string; + /** Keyspace throttler_config. */ + public throttler_config?: (topodata.IThrottlerConfig|null); + /** * Creates a new Keyspace instance using the specified properties. * @param [properties] Properties to set @@ -13930,6 +13936,114 @@ export namespace topodata { public toJSON(): { [k: string]: any }; } + /** Properties of a ThrottlerConfig. */ + interface IThrottlerConfig { + + /** ThrottlerConfig enabled */ + enabled?: (boolean|null); + + /** ThrottlerConfig threshold */ + threshold?: (number|null); + + /** ThrottlerConfig custom_query */ + custom_query?: (string|null); + + /** ThrottlerConfig check_as_check_self */ + check_as_check_self?: (boolean|null); + } + + /** Represents a ThrottlerConfig. */ + class ThrottlerConfig implements IThrottlerConfig { + + /** + * Constructs a new ThrottlerConfig. + * @param [properties] Properties to set + */ + constructor(properties?: topodata.IThrottlerConfig); + + /** ThrottlerConfig enabled. */ + public enabled: boolean; + + /** ThrottlerConfig threshold. */ + public threshold: number; + + /** ThrottlerConfig custom_query. */ + public custom_query: string; + + /** ThrottlerConfig check_as_check_self. */ + public check_as_check_self: boolean; + + /** + * Creates a new ThrottlerConfig instance using the specified properties. + * @param [properties] Properties to set + * @returns ThrottlerConfig instance + */ + public static create(properties?: topodata.IThrottlerConfig): topodata.ThrottlerConfig; + + /** + * Encodes the specified ThrottlerConfig message. Does not implicitly {@link topodata.ThrottlerConfig.verify|verify} messages. + * @param message ThrottlerConfig message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: topodata.IThrottlerConfig, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ThrottlerConfig message, length delimited. Does not implicitly {@link topodata.ThrottlerConfig.verify|verify} messages. + * @param message ThrottlerConfig message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: topodata.IThrottlerConfig, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ThrottlerConfig message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ThrottlerConfig + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): topodata.ThrottlerConfig; + + /** + * Decodes a ThrottlerConfig message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ThrottlerConfig + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): topodata.ThrottlerConfig; + + /** + * Verifies a ThrottlerConfig message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ThrottlerConfig message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ThrottlerConfig + */ + public static fromObject(object: { [k: string]: any }): topodata.ThrottlerConfig; + + /** + * Creates a plain object from a ThrottlerConfig message. Also converts values to other types if specified. + * @param message ThrottlerConfig + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: topodata.ThrottlerConfig, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ThrottlerConfig to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + /** Properties of a SrvKeyspace. */ interface ISrvKeyspace { @@ -13940,7 +14054,7 @@ export namespace topodata { served_from?: (topodata.SrvKeyspace.IServedFrom[]|null); /** SrvKeyspace throttler_config */ - throttler_config?: (topodata.SrvKeyspace.IThrottlerConfig|null); + throttler_config?: (topodata.IThrottlerConfig|null); } /** Represents a SrvKeyspace. */ @@ -13959,7 +14073,7 @@ export namespace topodata { public served_from: topodata.SrvKeyspace.IServedFrom[]; /** SrvKeyspace throttler_config. */ - public throttler_config?: (topodata.SrvKeyspace.IThrottlerConfig|null); + public throttler_config?: (topodata.IThrottlerConfig|null); /** * Creates a new SrvKeyspace instance using the specified properties. @@ -14231,114 +14345,6 @@ export namespace topodata { */ public toJSON(): { [k: string]: any }; } - - /** Properties of a ThrottlerConfig. */ - interface IThrottlerConfig { - - /** ThrottlerConfig enabled */ - enabled?: (boolean|null); - - /** ThrottlerConfig threshold */ - threshold?: (number|null); - - /** ThrottlerConfig custom_query */ - custom_query?: (string|null); - - /** ThrottlerConfig check_as_check_self */ - check_as_check_self?: (boolean|null); - } - - /** Represents a ThrottlerConfig. */ - class ThrottlerConfig implements IThrottlerConfig { - - /** - * Constructs a new ThrottlerConfig. - * @param [properties] Properties to set - */ - constructor(properties?: topodata.SrvKeyspace.IThrottlerConfig); - - /** ThrottlerConfig enabled. */ - public enabled: boolean; - - /** ThrottlerConfig threshold. */ - public threshold: number; - - /** ThrottlerConfig custom_query. */ - public custom_query: string; - - /** ThrottlerConfig check_as_check_self. */ - public check_as_check_self: boolean; - - /** - * Creates a new ThrottlerConfig instance using the specified properties. - * @param [properties] Properties to set - * @returns ThrottlerConfig instance - */ - public static create(properties?: topodata.SrvKeyspace.IThrottlerConfig): topodata.SrvKeyspace.ThrottlerConfig; - - /** - * Encodes the specified ThrottlerConfig message. Does not implicitly {@link topodata.SrvKeyspace.ThrottlerConfig.verify|verify} messages. - * @param message ThrottlerConfig message or plain object to encode - * @param [writer] Writer to encode to - * @returns Writer - */ - public static encode(message: topodata.SrvKeyspace.IThrottlerConfig, writer?: $protobuf.Writer): $protobuf.Writer; - - /** - * Encodes the specified ThrottlerConfig message, length delimited. Does not implicitly {@link topodata.SrvKeyspace.ThrottlerConfig.verify|verify} messages. - * @param message ThrottlerConfig message or plain object to encode - * @param [writer] Writer to encode to - * @returns Writer - */ - public static encodeDelimited(message: topodata.SrvKeyspace.IThrottlerConfig, writer?: $protobuf.Writer): $protobuf.Writer; - - /** - * Decodes a ThrottlerConfig message from the specified reader or buffer. - * @param reader Reader or buffer to decode from - * @param [length] Message length if known beforehand - * @returns ThrottlerConfig - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): topodata.SrvKeyspace.ThrottlerConfig; - - /** - * Decodes a ThrottlerConfig message from the specified reader or buffer, length delimited. - * @param reader Reader or buffer to decode from - * @returns ThrottlerConfig - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): topodata.SrvKeyspace.ThrottlerConfig; - - /** - * Verifies a ThrottlerConfig message. - * @param message Plain object to verify - * @returns `null` if valid, otherwise the reason why it is not - */ - public static verify(message: { [k: string]: any }): (string|null); - - /** - * Creates a ThrottlerConfig message from a plain object. Also converts values to their respective internal types. - * @param object Plain object - * @returns ThrottlerConfig - */ - public static fromObject(object: { [k: string]: any }): topodata.SrvKeyspace.ThrottlerConfig; - - /** - * Creates a plain object from a ThrottlerConfig message. Also converts values to other types if specified. - * @param message ThrottlerConfig - * @param [options] Conversion options - * @returns Plain object - */ - public static toObject(message: topodata.SrvKeyspace.ThrottlerConfig, options?: $protobuf.IConversionOptions): { [k: string]: any }; - - /** - * Converts this ThrottlerConfig to JSON. - * @returns JSON object - */ - public toJSON(): { [k: string]: any }; - } } /** Properties of a CellInfo. */ diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index 05ae47dbcce..ccd61f1e2d0 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -30666,6 +30666,7 @@ $root.topodata = (function() { * @property {string|null} [base_keyspace] Keyspace base_keyspace * @property {vttime.ITime|null} [snapshot_time] Keyspace snapshot_time * @property {string|null} [durability_policy] Keyspace durability_policy + * @property {topodata.IThrottlerConfig|null} [throttler_config] Keyspace throttler_config */ /** @@ -30724,6 +30725,14 @@ $root.topodata = (function() { */ Keyspace.prototype.durability_policy = ""; + /** + * Keyspace throttler_config. + * @member {topodata.IThrottlerConfig|null|undefined} throttler_config + * @memberof topodata.Keyspace + * @instance + */ + Keyspace.prototype.throttler_config = null; + /** * Creates a new Keyspace instance using the specified properties. * @function create @@ -30759,6 +30768,8 @@ $root.topodata = (function() { $root.vttime.Time.encode(message.snapshot_time, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); if (message.durability_policy != null && Object.hasOwnProperty.call(message, "durability_policy")) writer.uint32(/* id 8, wireType 2 =*/66).string(message.durability_policy); + if (message.throttler_config != null && Object.hasOwnProperty.call(message, "throttler_config")) + $root.topodata.ThrottlerConfig.encode(message.throttler_config, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); return writer; }; @@ -30810,6 +30821,9 @@ $root.topodata = (function() { case 8: message.durability_policy = reader.string(); break; + case 9: + message.throttler_config = $root.topodata.ThrottlerConfig.decode(reader, reader.uint32()); + break; default: reader.skipType(tag & 7); break; @@ -30873,6 +30887,11 @@ $root.topodata = (function() { if (message.durability_policy != null && message.hasOwnProperty("durability_policy")) if (!$util.isString(message.durability_policy)) return "durability_policy: string expected"; + if (message.throttler_config != null && message.hasOwnProperty("throttler_config")) { + var error = $root.topodata.ThrottlerConfig.verify(message.throttler_config); + if (error) + return "throttler_config." + error; + } return null; }; @@ -30917,6 +30936,11 @@ $root.topodata = (function() { } if (object.durability_policy != null) message.durability_policy = String(object.durability_policy); + if (object.throttler_config != null) { + if (typeof object.throttler_config !== "object") + throw TypeError(".topodata.Keyspace.throttler_config: object expected"); + message.throttler_config = $root.topodata.ThrottlerConfig.fromObject(object.throttler_config); + } return message; }; @@ -30940,6 +30964,7 @@ $root.topodata = (function() { object.base_keyspace = ""; object.snapshot_time = null; object.durability_policy = ""; + object.throttler_config = null; } if (message.served_froms && message.served_froms.length) { object.served_froms = []; @@ -30954,6 +30979,8 @@ $root.topodata = (function() { object.snapshot_time = $root.vttime.Time.toObject(message.snapshot_time, options); if (message.durability_policy != null && message.hasOwnProperty("durability_policy")) object.durability_policy = message.durability_policy; + if (message.throttler_config != null && message.hasOwnProperty("throttler_config")) + object.throttler_config = $root.topodata.ThrottlerConfig.toObject(message.throttler_config, options); return object; }; @@ -32379,6 +32406,260 @@ $root.topodata = (function() { return ShardTabletControl; })(); + topodata.ThrottlerConfig = (function() { + + /** + * Properties of a ThrottlerConfig. + * @memberof topodata + * @interface IThrottlerConfig + * @property {boolean|null} [enabled] ThrottlerConfig enabled + * @property {number|null} [threshold] ThrottlerConfig threshold + * @property {string|null} [custom_query] ThrottlerConfig custom_query + * @property {boolean|null} [check_as_check_self] ThrottlerConfig check_as_check_self + */ + + /** + * Constructs a new ThrottlerConfig. + * @memberof topodata + * @classdesc Represents a ThrottlerConfig. + * @implements IThrottlerConfig + * @constructor + * @param {topodata.IThrottlerConfig=} [properties] Properties to set + */ + function ThrottlerConfig(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ThrottlerConfig enabled. + * @member {boolean} enabled + * @memberof topodata.ThrottlerConfig + * @instance + */ + ThrottlerConfig.prototype.enabled = false; + + /** + * ThrottlerConfig threshold. + * @member {number} threshold + * @memberof topodata.ThrottlerConfig + * @instance + */ + ThrottlerConfig.prototype.threshold = 0; + + /** + * ThrottlerConfig custom_query. + * @member {string} custom_query + * @memberof topodata.ThrottlerConfig + * @instance + */ + ThrottlerConfig.prototype.custom_query = ""; + + /** + * ThrottlerConfig check_as_check_self. + * @member {boolean} check_as_check_self + * @memberof topodata.ThrottlerConfig + * @instance + */ + ThrottlerConfig.prototype.check_as_check_self = false; + + /** + * Creates a new ThrottlerConfig instance using the specified properties. + * @function create + * @memberof topodata.ThrottlerConfig + * @static + * @param {topodata.IThrottlerConfig=} [properties] Properties to set + * @returns {topodata.ThrottlerConfig} ThrottlerConfig instance + */ + ThrottlerConfig.create = function create(properties) { + return new ThrottlerConfig(properties); + }; + + /** + * Encodes the specified ThrottlerConfig message. Does not implicitly {@link topodata.ThrottlerConfig.verify|verify} messages. + * @function encode + * @memberof topodata.ThrottlerConfig + * @static + * @param {topodata.IThrottlerConfig} message ThrottlerConfig message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ThrottlerConfig.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.enabled != null && Object.hasOwnProperty.call(message, "enabled")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.enabled); + if (message.threshold != null && Object.hasOwnProperty.call(message, "threshold")) + writer.uint32(/* id 2, wireType 1 =*/17).double(message.threshold); + if (message.custom_query != null && Object.hasOwnProperty.call(message, "custom_query")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.custom_query); + if (message.check_as_check_self != null && Object.hasOwnProperty.call(message, "check_as_check_self")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.check_as_check_self); + return writer; + }; + + /** + * Encodes the specified ThrottlerConfig message, length delimited. Does not implicitly {@link topodata.ThrottlerConfig.verify|verify} messages. + * @function encodeDelimited + * @memberof topodata.ThrottlerConfig + * @static + * @param {topodata.IThrottlerConfig} message ThrottlerConfig message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ThrottlerConfig.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ThrottlerConfig message from the specified reader or buffer. + * @function decode + * @memberof topodata.ThrottlerConfig + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {topodata.ThrottlerConfig} ThrottlerConfig + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ThrottlerConfig.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.topodata.ThrottlerConfig(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.enabled = reader.bool(); + break; + case 2: + message.threshold = reader.double(); + break; + case 3: + message.custom_query = reader.string(); + break; + case 4: + message.check_as_check_self = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ThrottlerConfig message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof topodata.ThrottlerConfig + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {topodata.ThrottlerConfig} ThrottlerConfig + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ThrottlerConfig.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ThrottlerConfig message. + * @function verify + * @memberof topodata.ThrottlerConfig + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ThrottlerConfig.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.enabled != null && message.hasOwnProperty("enabled")) + if (typeof message.enabled !== "boolean") + return "enabled: boolean expected"; + if (message.threshold != null && message.hasOwnProperty("threshold")) + if (typeof message.threshold !== "number") + return "threshold: number expected"; + if (message.custom_query != null && message.hasOwnProperty("custom_query")) + if (!$util.isString(message.custom_query)) + return "custom_query: string expected"; + if (message.check_as_check_self != null && message.hasOwnProperty("check_as_check_self")) + if (typeof message.check_as_check_self !== "boolean") + return "check_as_check_self: boolean expected"; + return null; + }; + + /** + * Creates a ThrottlerConfig message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof topodata.ThrottlerConfig + * @static + * @param {Object.} object Plain object + * @returns {topodata.ThrottlerConfig} ThrottlerConfig + */ + ThrottlerConfig.fromObject = function fromObject(object) { + if (object instanceof $root.topodata.ThrottlerConfig) + return object; + var message = new $root.topodata.ThrottlerConfig(); + if (object.enabled != null) + message.enabled = Boolean(object.enabled); + if (object.threshold != null) + message.threshold = Number(object.threshold); + if (object.custom_query != null) + message.custom_query = String(object.custom_query); + if (object.check_as_check_self != null) + message.check_as_check_self = Boolean(object.check_as_check_self); + return message; + }; + + /** + * Creates a plain object from a ThrottlerConfig message. Also converts values to other types if specified. + * @function toObject + * @memberof topodata.ThrottlerConfig + * @static + * @param {topodata.ThrottlerConfig} message ThrottlerConfig + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ThrottlerConfig.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.enabled = false; + object.threshold = 0; + object.custom_query = ""; + object.check_as_check_self = false; + } + if (message.enabled != null && message.hasOwnProperty("enabled")) + object.enabled = message.enabled; + if (message.threshold != null && message.hasOwnProperty("threshold")) + object.threshold = options.json && !isFinite(message.threshold) ? String(message.threshold) : message.threshold; + if (message.custom_query != null && message.hasOwnProperty("custom_query")) + object.custom_query = message.custom_query; + if (message.check_as_check_self != null && message.hasOwnProperty("check_as_check_self")) + object.check_as_check_self = message.check_as_check_self; + return object; + }; + + /** + * Converts this ThrottlerConfig to JSON. + * @function toJSON + * @memberof topodata.ThrottlerConfig + * @instance + * @returns {Object.} JSON object + */ + ThrottlerConfig.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ThrottlerConfig; + })(); + topodata.SrvKeyspace = (function() { /** @@ -32387,7 +32668,7 @@ $root.topodata = (function() { * @interface ISrvKeyspace * @property {Array.|null} [partitions] SrvKeyspace partitions * @property {Array.|null} [served_from] SrvKeyspace served_from - * @property {topodata.SrvKeyspace.IThrottlerConfig|null} [throttler_config] SrvKeyspace throttler_config + * @property {topodata.IThrottlerConfig|null} [throttler_config] SrvKeyspace throttler_config */ /** @@ -32425,7 +32706,7 @@ $root.topodata = (function() { /** * SrvKeyspace throttler_config. - * @member {topodata.SrvKeyspace.IThrottlerConfig|null|undefined} throttler_config + * @member {topodata.IThrottlerConfig|null|undefined} throttler_config * @memberof topodata.SrvKeyspace * @instance */ @@ -32462,7 +32743,7 @@ $root.topodata = (function() { for (var i = 0; i < message.served_from.length; ++i) $root.topodata.SrvKeyspace.ServedFrom.encode(message.served_from[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); if (message.throttler_config != null && Object.hasOwnProperty.call(message, "throttler_config")) - $root.topodata.SrvKeyspace.ThrottlerConfig.encode(message.throttler_config, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + $root.topodata.ThrottlerConfig.encode(message.throttler_config, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); return writer; }; @@ -32508,7 +32789,7 @@ $root.topodata = (function() { message.served_from.push($root.topodata.SrvKeyspace.ServedFrom.decode(reader, reader.uint32())); break; case 6: - message.throttler_config = $root.topodata.SrvKeyspace.ThrottlerConfig.decode(reader, reader.uint32()); + message.throttler_config = $root.topodata.ThrottlerConfig.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -32564,7 +32845,7 @@ $root.topodata = (function() { } } if (message.throttler_config != null && message.hasOwnProperty("throttler_config")) { - var error = $root.topodata.SrvKeyspace.ThrottlerConfig.verify(message.throttler_config); + var error = $root.topodata.ThrottlerConfig.verify(message.throttler_config); if (error) return "throttler_config." + error; } @@ -32606,7 +32887,7 @@ $root.topodata = (function() { if (object.throttler_config != null) { if (typeof object.throttler_config !== "object") throw TypeError(".topodata.SrvKeyspace.throttler_config: object expected"); - message.throttler_config = $root.topodata.SrvKeyspace.ThrottlerConfig.fromObject(object.throttler_config); + message.throttler_config = $root.topodata.ThrottlerConfig.fromObject(object.throttler_config); } return message; }; @@ -32641,7 +32922,7 @@ $root.topodata = (function() { object.served_from[j] = $root.topodata.SrvKeyspace.ServedFrom.toObject(message.served_from[j], options); } if (message.throttler_config != null && message.hasOwnProperty("throttler_config")) - object.throttler_config = $root.topodata.SrvKeyspace.ThrottlerConfig.toObject(message.throttler_config, options); + object.throttler_config = $root.topodata.ThrottlerConfig.toObject(message.throttler_config, options); return object; }; @@ -33257,260 +33538,6 @@ $root.topodata = (function() { return ServedFrom; })(); - SrvKeyspace.ThrottlerConfig = (function() { - - /** - * Properties of a ThrottlerConfig. - * @memberof topodata.SrvKeyspace - * @interface IThrottlerConfig - * @property {boolean|null} [enabled] ThrottlerConfig enabled - * @property {number|null} [threshold] ThrottlerConfig threshold - * @property {string|null} [custom_query] ThrottlerConfig custom_query - * @property {boolean|null} [check_as_check_self] ThrottlerConfig check_as_check_self - */ - - /** - * Constructs a new ThrottlerConfig. - * @memberof topodata.SrvKeyspace - * @classdesc Represents a ThrottlerConfig. - * @implements IThrottlerConfig - * @constructor - * @param {topodata.SrvKeyspace.IThrottlerConfig=} [properties] Properties to set - */ - function ThrottlerConfig(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * ThrottlerConfig enabled. - * @member {boolean} enabled - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @instance - */ - ThrottlerConfig.prototype.enabled = false; - - /** - * ThrottlerConfig threshold. - * @member {number} threshold - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @instance - */ - ThrottlerConfig.prototype.threshold = 0; - - /** - * ThrottlerConfig custom_query. - * @member {string} custom_query - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @instance - */ - ThrottlerConfig.prototype.custom_query = ""; - - /** - * ThrottlerConfig check_as_check_self. - * @member {boolean} check_as_check_self - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @instance - */ - ThrottlerConfig.prototype.check_as_check_self = false; - - /** - * Creates a new ThrottlerConfig instance using the specified properties. - * @function create - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @static - * @param {topodata.SrvKeyspace.IThrottlerConfig=} [properties] Properties to set - * @returns {topodata.SrvKeyspace.ThrottlerConfig} ThrottlerConfig instance - */ - ThrottlerConfig.create = function create(properties) { - return new ThrottlerConfig(properties); - }; - - /** - * Encodes the specified ThrottlerConfig message. Does not implicitly {@link topodata.SrvKeyspace.ThrottlerConfig.verify|verify} messages. - * @function encode - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @static - * @param {topodata.SrvKeyspace.IThrottlerConfig} message ThrottlerConfig message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - ThrottlerConfig.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.enabled != null && Object.hasOwnProperty.call(message, "enabled")) - writer.uint32(/* id 1, wireType 0 =*/8).bool(message.enabled); - if (message.threshold != null && Object.hasOwnProperty.call(message, "threshold")) - writer.uint32(/* id 2, wireType 1 =*/17).double(message.threshold); - if (message.custom_query != null && Object.hasOwnProperty.call(message, "custom_query")) - writer.uint32(/* id 3, wireType 2 =*/26).string(message.custom_query); - if (message.check_as_check_self != null && Object.hasOwnProperty.call(message, "check_as_check_self")) - writer.uint32(/* id 4, wireType 0 =*/32).bool(message.check_as_check_self); - return writer; - }; - - /** - * Encodes the specified ThrottlerConfig message, length delimited. Does not implicitly {@link topodata.SrvKeyspace.ThrottlerConfig.verify|verify} messages. - * @function encodeDelimited - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @static - * @param {topodata.SrvKeyspace.IThrottlerConfig} message ThrottlerConfig message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - ThrottlerConfig.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a ThrottlerConfig message from the specified reader or buffer. - * @function decode - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {topodata.SrvKeyspace.ThrottlerConfig} ThrottlerConfig - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - ThrottlerConfig.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.topodata.SrvKeyspace.ThrottlerConfig(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.enabled = reader.bool(); - break; - case 2: - message.threshold = reader.double(); - break; - case 3: - message.custom_query = reader.string(); - break; - case 4: - message.check_as_check_self = reader.bool(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a ThrottlerConfig message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {topodata.SrvKeyspace.ThrottlerConfig} ThrottlerConfig - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - ThrottlerConfig.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a ThrottlerConfig message. - * @function verify - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - ThrottlerConfig.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.enabled != null && message.hasOwnProperty("enabled")) - if (typeof message.enabled !== "boolean") - return "enabled: boolean expected"; - if (message.threshold != null && message.hasOwnProperty("threshold")) - if (typeof message.threshold !== "number") - return "threshold: number expected"; - if (message.custom_query != null && message.hasOwnProperty("custom_query")) - if (!$util.isString(message.custom_query)) - return "custom_query: string expected"; - if (message.check_as_check_self != null && message.hasOwnProperty("check_as_check_self")) - if (typeof message.check_as_check_self !== "boolean") - return "check_as_check_self: boolean expected"; - return null; - }; - - /** - * Creates a ThrottlerConfig message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @static - * @param {Object.} object Plain object - * @returns {topodata.SrvKeyspace.ThrottlerConfig} ThrottlerConfig - */ - ThrottlerConfig.fromObject = function fromObject(object) { - if (object instanceof $root.topodata.SrvKeyspace.ThrottlerConfig) - return object; - var message = new $root.topodata.SrvKeyspace.ThrottlerConfig(); - if (object.enabled != null) - message.enabled = Boolean(object.enabled); - if (object.threshold != null) - message.threshold = Number(object.threshold); - if (object.custom_query != null) - message.custom_query = String(object.custom_query); - if (object.check_as_check_self != null) - message.check_as_check_self = Boolean(object.check_as_check_self); - return message; - }; - - /** - * Creates a plain object from a ThrottlerConfig message. Also converts values to other types if specified. - * @function toObject - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @static - * @param {topodata.SrvKeyspace.ThrottlerConfig} message ThrottlerConfig - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - ThrottlerConfig.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) { - object.enabled = false; - object.threshold = 0; - object.custom_query = ""; - object.check_as_check_self = false; - } - if (message.enabled != null && message.hasOwnProperty("enabled")) - object.enabled = message.enabled; - if (message.threshold != null && message.hasOwnProperty("threshold")) - object.threshold = options.json && !isFinite(message.threshold) ? String(message.threshold) : message.threshold; - if (message.custom_query != null && message.hasOwnProperty("custom_query")) - object.custom_query = message.custom_query; - if (message.check_as_check_self != null && message.hasOwnProperty("check_as_check_self")) - object.check_as_check_self = message.check_as_check_self; - return object; - }; - - /** - * Converts this ThrottlerConfig to JSON. - * @function toJSON - * @memberof topodata.SrvKeyspace.ThrottlerConfig - * @instance - * @returns {Object.} JSON object - */ - ThrottlerConfig.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return ThrottlerConfig; - })(); - return SrvKeyspace; })(); From 824e12365a63027c4750b0fa830dd8b26b02c782 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 9 Mar 2023 01:58:15 -0500 Subject: [PATCH 054/233] Examples, Flakes: Wait for Shard's VReplication Engine to Open (#12560) (#12581) * Examples: wait for shard's vreplication engine to open * Minor comment changes --------- Signed-off-by: Matt Lord --- examples/common/lib/utils.sh | 52 +++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/examples/common/lib/utils.sh b/examples/common/lib/utils.sh index f38568ccdad..24e776c84a9 100644 --- a/examples/common/lib/utils.sh +++ b/examples/common/lib/utils.sh @@ -24,10 +24,10 @@ function wait_for_shard_tablets() { if [[ -z ${1} || -z ${2} || -z ${3} ]]; then fail "A keyspace, shard, and number of tablets must be specified when waiting for tablets to come up" fi - keyspace=${1} - shard=${2} - num_tablets=${3} - wait_secs=180 + local keyspace=${1} + local shard=${2} + local num_tablets=${3} + local wait_secs=180 for _ in $(seq 1 ${wait_secs}); do cur_tablets=$(vtctldclient GetTablets --keyspace "${keyspace}" --shard "${shard}" | wc -l) @@ -50,10 +50,10 @@ function wait_for_healthy_shard_primary() { if [[ -z ${1} || -z ${2} ]]; then fail "A keyspace and shard must be specified when waiting for the shard's primary to be healthy" fi - keyspace=${1} - shard=${2} - unhealthy_indicator='"primary_alias": null' - wait_secs=180 + local keyspace=${1} + local shard=${2} + local unhealthy_indicator='"primary_alias": null' + local wait_secs=180 for _ in $(seq 1 ${wait_secs}); do if ! vtctldclient --server=localhost:15999 GetShard "${keyspace}/${shard}" | grep -qi "${unhealthy_indicator}"; then @@ -67,21 +67,49 @@ function wait_for_healthy_shard_primary() { fi } +# Wait for the shard primary tablet's VReplication engine to open. +# There is currently no API call or client command that can be specifically used +# to check the VReplication engine's status (no vars in /debug/vars etc. either). +# So we use the Workflow listall client command as the method to check for that +# as it will return an error when the engine is closed -- even when there are +# no workflows. +function wait_for_shard_vreplication_engine() { + if [[ -z ${1} || -z ${2} ]]; then + fail "A keyspace and shard must be specified when waiting for the shard primary tablet's VReplication engine to open" + fi + local keyspace=${1} + local shard=${2} + local wait_secs=90 + + for _ in $(seq 1 ${wait_secs}); do + if vtctlclient --server=localhost:15999 Workflow -- "${keyspace}" listall &>/dev/null; then + break + fi + sleep 1 + done; + + if ! vtctlclient --server=localhost:15999 Workflow -- "${keyspace}" listall &>/dev/null; then + fail "Timed out after ${wait_secs} seconds waiting for the primary tablet's VReplication engine to open in ${keyspace}/${shard}" + fi +} + # Wait for a specified number of the keyspace/shard's tablets to show up # in the topology server (3 is the default if no value is specified) and # then wait for one of the tablets to be promoted to primary and become -# healthy and serving. Example: +# healthy and serving. Lastly, wait for the new primary tablet's +# VReplication engine to fully open. Example: # wait_for_healthy_shard commerce 0 function wait_for_healthy_shard() { if [[ -z ${1} || -z ${2} ]]; then fail "A keyspace and shard must be specified when waiting for tablets to come up" fi - keyspace=${1} - shard=${2} - num_tablets=${3:-3} + local keyspace=${1} + local shard=${2} + local num_tablets=${3:-3} wait_for_shard_tablets "${keyspace}" "${shard}" "${num_tablets}" wait_for_healthy_shard_primary "${keyspace}" "${shard}" + wait_for_shard_vreplication_engine "${keyspace}" "${shard}" } # Print error message and exit with error code. From cb7005dee896f8d884552b00cf31b39bfd9ae7d2 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 9 Mar 2023 12:42:37 +0200 Subject: [PATCH 055/233] CI: increase overall test timeouts for all OnlineDDL tests (#12589) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- test/config.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/config.json b/test/config.json index 4e9accdb8c4..13ab5bfcbf0 100644 --- a/test/config.json +++ b/test/config.json @@ -252,7 +252,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", @@ -261,7 +261,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", @@ -297,7 +297,7 @@ }, "onlineddl_revert": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/revert", "-timeout", "20m"], + "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/revert", "-timeout", "30m"], "Command": [], "Manual": false, "Shard": "onlineddl_revert", @@ -306,7 +306,7 @@ }, "onlineddl_scheduler": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/scheduler", "-timeout", "20m"], + "Args": ["vitess.io/vitess/go/test/endtoend/onlineddl/scheduler", "-timeout", "30m"], "Command": [], "Manual": false, "Shard": "onlineddl_scheduler", @@ -315,7 +315,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 cec7b1a8165429c98a1699d22c28b41e0373b5f8 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 9 Mar 2023 14:54:35 +0200 Subject: [PATCH 056/233] [release-16.0] CI: extend timeouts in onlineddl_vrepl due to slow CI runners (#12583) (#12588) * 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 03e08612792..001ded3d9cb 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 0489fdbfa45443dd4a8149f84072b04a195f9bf1 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Mon, 13 Mar 2023 17:04:52 -0400 Subject: [PATCH 057/233] Purge logs without panicking (#12187) (#12616) * 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 ae74ddfb5e6..9e59276993c 100644 --- a/go/cmd/vtctldclient/command/root.go +++ b/go/cmd/vtctldclient/command/root.go @@ -27,6 +27,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" ) @@ -50,6 +51,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") client, err = getClientForCommand(cmd) ctx := cmd.Context() 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 d8dbe510c8d..9f3d63f1a02 100644 --- a/go/vt/servenv/servenv.go +++ b/go/vt/servenv/servenv.go @@ -335,6 +335,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. @@ -364,6 +366,8 @@ func ParseFlagsWithArgs(cmd string) []string { log.Exitf("%s expected at least one positional argument", cmd) } + logutil.PurgeLogs() + return args } From 2b43fd7dfb804b421f71705eedab7c043675b648 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:41:19 +0100 Subject: [PATCH 058/233] VStreamer: improve representation of integers in json data types (#12630) * Add signed and unsigned integer types to forked ason library to fix issue of integers being parsed as float64 by the source binlog parser. This results in larger integers being stored as floats on the target and sent with scientific notation in vstream events. Signed-off-by: Rohit Nayak * Use go.mod reference to the ajson module to make it easier to switch to the upstream module once changes are made there Signed-off-by: Rohit Nayak --------- Signed-off-by: Rohit Nayak --- go.mod | 4 +- go.sum | 4 +- go/mysql/binlog_event_json.go | 196 +++++++++++++----- go/mysql/binlog_event_json_test.go | 87 +++++++- .../vreplication/unsharded_init_data.sql | 2 +- .../vreplication/vreplication_test.go | 14 +- .../vreplication/vplayer_flaky_test.go | 21 +- 7 files changed, 249 insertions(+), 79 deletions(-) diff --git a/go.mod b/go.mod index facf8bbf177..8a2a3f839e2 100644 --- a/go.mod +++ b/go.mod @@ -65,7 +65,6 @@ require ( github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.15.0 - github.com/spyzhov/ajson v0.7.2 github.com/stretchr/testify v1.8.1 github.com/tchap/go-patricia v2.3.0+incompatible github.com/tidwall/gjson v1.12.1 @@ -112,6 +111,7 @@ require ( github.com/kr/pretty v0.3.1 github.com/kr/text v0.2.0 github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249 + github.com/spyzhov/ajson v0.8.0 golang.org/x/exp v0.0.0-20230131160201-f062dba9d201 modernc.org/sqlite v1.20.3 ) @@ -216,3 +216,5 @@ require ( sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect ) + +replace github.com/spyzhov/ajson v0.8.0 => github.com/rohit-nayak-ps/ajson v0.7.2-0.20230316112806-97deb03d883c diff --git a/go.sum b/go.sum index e47c7dda131..3c33c669e84 100644 --- a/go.sum +++ b/go.sum @@ -690,6 +690,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rohit-nayak-ps/ajson v0.7.2-0.20230316112806-97deb03d883c h1:Y/4qcogoZA2WUtLWMk/yXfJSpaIG3mK3r9Lw4kaARL4= +github.com/rohit-nayak-ps/ajson v0.7.2-0.20230316112806-97deb03d883c/go.mod h1:63V+CGM6f1Bu/p4nLIN8885ojBdt88TbLoSFzyqMuVA= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -734,8 +736,6 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= -github.com/spyzhov/ajson v0.7.2 h1:kyl+ovUoId/RSBbSbCm31xyQvPixA6Sxgvb0eWyt1Ko= -github.com/spyzhov/ajson v0.7.2/go.mod h1:63V+CGM6f1Bu/p4nLIN8885ojBdt88TbLoSFzyqMuVA= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/go/mysql/binlog_event_json.go b/go/mysql/binlog_event_json.go index 82b53311c0f..e055b8866ca 100644 --- a/go/mysql/binlog_event_json.go +++ b/go/mysql/binlog_event_json.go @@ -153,7 +153,7 @@ func (jh *BinlogJSON) register(typ jsonDataType, Plugin jsonPlugin) { func (jh *BinlogJSON) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { Plugin := jh.plugins[typ] if Plugin == nil { - return nil, fmt.Errorf("Plugin not found for type %d", typ) + return nil, fmt.Errorf("plugin not found for type %d", typ) } return Plugin.getNode(typ, data, pos) } @@ -316,59 +316,157 @@ type intPlugin struct { var _ jsonPlugin = (*intPlugin)(nil) -func (ih intPlugin) getVal(typ jsonDataType, data []byte, pos int) (value float64) { +func (ipl intPlugin) getVal(typ jsonDataType, data []byte, pos int) (value int64) { var val uint64 - var val2 float64 - size := ih.sizes[typ] + var val2 int64 + size := ipl.sizes[typ] for i := 0; i < size; i++ { val = val + uint64(data[pos+i])<<(8*i) } switch typ { case jsonInt16: - val2 = float64(int16(val)) - case jsonUint16: - val2 = float64(uint16(val)) + val2 = int64(int16(val)) case jsonInt32: - val2 = float64(int32(val)) - case jsonUint32: - val2 = float64(uint32(val)) + val2 = int64(int32(val)) case jsonInt64: - val2 = float64(int64(val)) - case jsonUint64: - val2 = float64(val) - case jsonDouble: - val2 = math.Float64frombits(val) + val2 = int64(val) } return val2 } -func (ih intPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { - val := ih.getVal(typ, data, pos) - node = ajson.NumericNode("", val) +func (ipl intPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { + val := ipl.getVal(typ, data, pos) + node = ajson.IntegerNode("", val) return node, nil } func newIntPlugin() *intPlugin { - ih := &intPlugin{ + ipl := &intPlugin{ info: &jsonPluginInfo{ name: "Int", - types: []jsonDataType{jsonInt64, jsonInt32, jsonInt16, jsonUint16, jsonUint32, jsonUint64, jsonDouble}, + types: []jsonDataType{jsonInt64, jsonInt32, jsonInt16}, + }, + sizes: make(map[jsonDataType]int), + } + ipl.sizes = map[jsonDataType]int{ + jsonInt64: 8, + jsonInt32: 4, + jsonInt16: 2, + } + for _, typ := range ipl.info.types { + binlogJSON.register(typ, ipl) + } + return ipl +} + +//endregion + +//region uint plugin + +func init() { + newUintPlugin() +} + +type uintPlugin struct { + info *jsonPluginInfo + sizes map[jsonDataType]int +} + +var _ jsonPlugin = (*uintPlugin)(nil) + +func (upl uintPlugin) getVal(typ jsonDataType, data []byte, pos int) (value uint64) { + var val uint64 + var val2 uint64 + size := upl.sizes[typ] + for i := 0; i < size; i++ { + val = val + uint64(data[pos+i])<<(8*i) + } + switch typ { + case jsonUint16: + val2 = uint64(uint16(val)) + case jsonUint32: + val2 = uint64(uint32(val)) + case jsonUint64: + val2 = val + } + return val2 +} + +func (upl uintPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { + val := upl.getVal(typ, data, pos) + node = ajson.UnsignedIntegerNode("", val) + return node, nil +} + +func newUintPlugin() *uintPlugin { + upl := &uintPlugin{ + info: &jsonPluginInfo{ + name: "Uint", + types: []jsonDataType{jsonUint16, jsonUint32, jsonUint64}, }, sizes: make(map[jsonDataType]int), } - ih.sizes = map[jsonDataType]int{ + upl.sizes = map[jsonDataType]int{ jsonUint64: 8, - jsonInt64: 8, jsonUint32: 4, - jsonInt32: 4, jsonUint16: 2, - jsonInt16: 2, + } + for _, typ := range upl.info.types { + binlogJSON.register(typ, upl) + } + return upl +} + +//endregion + +//region float plugin + +func init() { + newFloatPlugin() +} + +type floatPlugin struct { + info *jsonPluginInfo + sizes map[jsonDataType]int +} + +var _ jsonPlugin = (*floatPlugin)(nil) + +func (flp floatPlugin) getVal(typ jsonDataType, data []byte, pos int) (value float64) { + var val uint64 + var val2 float64 + size := flp.sizes[typ] + for i := 0; i < size; i++ { + val = val + uint64(data[pos+i])<<(8*i) + } + switch typ { + case jsonDouble: + val2 = math.Float64frombits(val) + } + return val2 +} + +func (flp floatPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { + val := flp.getVal(typ, data, pos) + node = ajson.NumericNode("", val) + return node, nil +} + +func newFloatPlugin() *floatPlugin { + fp := &floatPlugin{ + info: &jsonPluginInfo{ + name: "Float", + types: []jsonDataType{jsonDouble}, + }, + sizes: make(map[jsonDataType]int), + } + fp.sizes = map[jsonDataType]int{ jsonDouble: 8, } - for _, typ := range ih.info.types { - binlogJSON.register(typ, ih) + for _, typ := range fp.info.types { + binlogJSON.register(typ, fp) } - return ih + return fp } //endregion @@ -385,7 +483,7 @@ type literalPlugin struct { var _ jsonPlugin = (*literalPlugin)(nil) -func (lh literalPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { +func (lpl literalPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { val := jsonDataLiteral(data[pos]) switch val { case jsonNullLiteral: @@ -401,14 +499,14 @@ func (lh literalPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *a } func newLiteralPlugin() *literalPlugin { - lh := &literalPlugin{ + lpl := &literalPlugin{ info: &jsonPluginInfo{ name: "Literal", types: []jsonDataType{jsonLiteral}, }, } - binlogJSON.register(jsonLiteral, lh) - return lh + binlogJSON.register(jsonLiteral, lpl) + return lpl } //endregion @@ -427,7 +525,7 @@ var _ jsonPlugin = (*opaquePlugin)(nil) // other types are stored as catch-all opaque types: documentation on these is scarce. // we currently know about (and support) date/time/datetime/decimal. -func (oh opaquePlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { +func (opl opaquePlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { dataType := data[pos] start := 3 // account for length of stored value end := start + 8 // all currently supported opaque data types are 8 bytes in size @@ -484,14 +582,14 @@ func (oh opaquePlugin) getNode(typ jsonDataType, data []byte, pos int) (node *aj } func newOpaquePlugin() *opaquePlugin { - oh := &opaquePlugin{ + opl := &opaquePlugin{ info: &jsonPluginInfo{ name: "Opaque", types: []jsonDataType{jsonOpaque}, }, } - binlogJSON.register(jsonOpaque, oh) - return oh + binlogJSON.register(jsonOpaque, opl) + return opl } //endregion @@ -508,7 +606,7 @@ type stringPlugin struct { var _ jsonPlugin = (*stringPlugin)(nil) -func (sh stringPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { +func (spl stringPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { size, pos := readVariableLength(data, pos) node = ajson.StringNode("", string(data[pos:pos+size])) @@ -516,14 +614,14 @@ func (sh stringPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *aj } func newStringPlugin() *stringPlugin { - sh := &stringPlugin{ + spl := &stringPlugin{ info: &jsonPluginInfo{ name: "String", types: []jsonDataType{jsonString}, }, } - binlogJSON.register(jsonString, sh) - return sh + binlogJSON.register(jsonString, spl) + return spl } //endregion @@ -542,7 +640,7 @@ var _ jsonPlugin = (*arrayPlugin)(nil) // arrays are stored thus: // | type_identifier(one of [2,3]) | elem count | obj size | list of offsets+lengths of values | actual values | -func (ah arrayPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { +func (apl arrayPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { jlog("JSON Array %s, len %d", jsonDataTypeToString(uint(typ)), len(data)) var nodes []*ajson.Node var elem *ajson.Node @@ -565,15 +663,15 @@ func (ah arrayPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajs } func newArrayPlugin() *arrayPlugin { - ah := &arrayPlugin{ + apl := &arrayPlugin{ info: &jsonPluginInfo{ name: "Array", types: []jsonDataType{jsonSmallArray, jsonLargeArray}, }, } - binlogJSON.register(jsonSmallArray, ah) - binlogJSON.register(jsonLargeArray, ah) - return ah + binlogJSON.register(jsonSmallArray, apl) + binlogJSON.register(jsonLargeArray, apl) + return apl } //endregion @@ -592,7 +690,7 @@ var _ jsonPlugin = (*objectPlugin)(nil) // objects are stored thus: // | type_identifier(0/1) | elem count | obj size | list of offsets+lengths of keys | list of offsets+lengths of values | actual keys | actual values | -func (oh objectPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { +func (opl objectPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *ajson.Node, err error) { jlog("JSON Type is %s, len %d", jsonDataTypeToString(uint(typ)), len(data)) // "large" decides number of bytes used to specify element count and total object size: 4 bytes for large, 2 for small @@ -640,15 +738,15 @@ func (oh objectPlugin) getNode(typ jsonDataType, data []byte, pos int) (node *aj } func newObjectPlugin() *objectPlugin { - oh := &objectPlugin{ + opl := &objectPlugin{ info: &jsonPluginInfo{ name: "Object", types: []jsonDataType{jsonSmallObject, jsonLargeObject}, }, } - binlogJSON.register(jsonSmallObject, oh) - binlogJSON.register(jsonLargeObject, oh) - return oh + binlogJSON.register(jsonSmallObject, opl) + binlogJSON.register(jsonLargeObject, opl) + return opl } //endregion diff --git a/go/mysql/binlog_event_json_test.go b/go/mysql/binlog_event_json_test.go index 711965386ed..5cc61440084 100644 --- a/go/mysql/binlog_event_json_test.go +++ b/go/mysql/binlog_event_json_test.go @@ -18,50 +18,65 @@ package mysql import ( "encoding/json" + "fmt" "testing" "github.com/stretchr/testify/require" ) func TestJSONTypes(t *testing.T) { + // most of these test cases have been taken from open source java/python adapters + // like https://github.com/shyiko/mysql-binlog-connector-java/pull/119/files testcases := []struct { + name string data []byte expected string isMap bool }{{ + name: "null", data: []byte{}, expected: `null`, }, { + name: "map, string value", data: []byte{0, 1, 0, 14, 0, 11, 0, 1, 0, 12, 12, 0, 97, 1, 98}, expected: `{"a":"b"}`, }, { + name: "map, int value", data: []byte{0, 1, 0, 12, 0, 11, 0, 1, 0, 5, 2, 0, 97}, expected: `{"a":2}`, }, { + name: "map, object value", data: []byte{0, 1, 0, 29, 0, 11, 0, 4, 0, 0, 15, 0, 97, 115, 100, 102, 1, 0, 14, 0, 11, 0, 3, 0, 5, 123, 0, 102, 111, 111}, expected: `{"asdf":{"foo":123}}`, }, { + name: "list of ints", data: []byte{2, 2, 0, 10, 0, 5, 1, 0, 5, 2, 0}, expected: `[1,2]`, }, { + name: "list of maps", data: []byte{0, 4, 0, 60, 0, 32, 0, 1, 0, 33, 0, 1, 0, 34, 0, 2, 0, 36, 0, 2, 0, 12, 38, 0, 12, 40, 0, 12, 42, 0, 2, 46, 0, 97, 99, 97, 98, 98, 99, 1, 98, 1, 100, 3, 97, 98, 99, 2, 0, 14, 0, 12, 10, 0, 12, 12, 0, 1, 120, 1, 121}, expected: `{"a":"b","c":"d","ab":"abc","bc":["x","y"]}`, isMap: true, }, { + name: "list with one string", data: []byte{2, 1, 0, 37, 0, 12, 8, 0, 0, 4, 104, 101, 114, 101}, expected: `["here"]`, }, { + name: "list varied", data: []byte{2, 3, 0, 37, 0, 12, 13, 0, 2, 18, 0, 12, 33, 0, 4, 104, 101, 114, 101, 2, 0, 15, 0, 12, 10, 0, 12, 12, 0, 1, 73, 2, 97, 109, 3, 33, 33, 33}, expected: `["here",["I","am"],"!!!"]`, }, { + name: "string", data: []byte{12, 13, 115, 99, 97, 108, 97, 114, 32, 115, 116, 114, 105, 110, 103}, expected: `"scalar string"`, }, { + name: "map, long string value", data: []byte{0, 1, 0, 149, 0, 11, 0, 6, 0, 12, 17, 0, 115, 99, 111, 112, 101, 115, 130, 1, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 69, 65, 65, 65, 65, 65, 65, 69, 65, 65, 65, 65, 65, 65, 56, 65, 65, 65, 66, 103, 65, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 67, 65, 65, 65, 65, 65, 65, 65, 65, 65, 84, 216, 142, 184}, expected: `{"scopes":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAEAAAAAAEAAAAAA8AAABgAAAAAABAAAACAAAAAAAAA"}`, }, { // repeat the same string 10 times, to test the case where length of string // requires 2 bytes to store + name: "long string", data: []byte{12, 130, 1, 115, 99, 97, 108, 97, 114, 32, 115, 116, 114, 105, 110, 103, 115, 99, 97, 108, 97, 114, 32, 115, 116, 114, 105, 110, 103, @@ -75,89 +90,139 @@ func TestJSONTypes(t *testing.T) { 115, 99, 97, 108, 97, 114, 32, 115, 116, 114, 105, 110, 103}, expected: `"scalar stringscalar stringscalar stringscalar stringscalar stringscalar stringscalar stringscalar stringscalar stringscalar string"`, }, { + name: "bool true", data: []byte{4, 1}, expected: `true`, }, { + name: "bool false", data: []byte{4, 2}, expected: `false`, }, { + name: "bool null", data: []byte{4, 0}, expected: `null`, }, { + name: "uint16 max", + data: []byte{6, 255, 255}, + expected: `65535`, + }, { + name: "uint32 max", + data: []byte{8, 255, 255, 255, 255}, + expected: `4294967295`, + }, { + name: "uint64 max", + data: []byte{10, 255, 255, 255, 255, 255, 255, 255, 255}, + expected: `18446744073709551615`, + }, { + name: "int16 -1", data: []byte{5, 255, 255}, expected: `-1`, }, { - data: []byte{6, 1, 0}, - expected: `1`, + name: "int32 -1", + data: []byte{7, 255, 255, 255, 255}, + expected: `-1`, + }, { + name: "int64 -1", + data: []byte{9, 255, 255, 255, 255, 255, 255, 255, 255}, + expected: `-1`, }, { + name: "int16 max", data: []byte{5, 255, 127}, expected: `32767`, }, { + name: "int32 max", + data: []byte{7, 255, 255, 255, 127}, + expected: `2147483647`, + }, { + name: "int64 max", + data: []byte{9, 255, 255, 255, 255, 255, 255, 255, 127}, + expected: `9223372036854775807`, + }, { + name: "uint16/1", + data: []byte{6, 1, 0}, + expected: `1`, + }, { + name: "int32/32768", data: []byte{7, 0, 128, 0, 0}, expected: `32768`, }, { + name: "int16/neg", data: []byte{5, 0, 128}, expected: `-32768`, }, { + name: "int32/neg", data: []byte{7, 255, 127, 255, 255}, expected: `-32769`, }, { - data: []byte{7, 255, 255, 255, 127}, - expected: `2.147483647e+09`, - }, { + name: "uint32", data: []byte{8, 0, 128, 0, 0}, expected: `32768`, }, { + name: "int64", data: []byte{9, 0, 0, 0, 128, 0, 0, 0, 0}, - expected: `2.147483648e+09`, + expected: `2147483648`, }, { + name: "int32/neg", data: []byte{7, 0, 0, 0, 128}, - expected: `-2.147483648e+09`, + expected: `-2147483648`, }, { + name: "int64/neg", data: []byte{9, 255, 255, 255, 127, 255, 255, 255, 255}, - expected: `-2.147483649e+09`, + expected: `-2147483649`, }, { + name: "uint64", data: []byte{10, 255, 255, 255, 255, 255, 255, 255, 255}, - expected: `1.8446744073709552e+19`, + expected: `18446744073709551615`, }, { + name: "int64/neg", data: []byte{9, 0, 0, 0, 0, 0, 0, 0, 128}, - expected: `-9.223372036854776e+18`, + expected: `-9223372036854775808`, }, { + name: "double", data: []byte{11, 110, 134, 27, 240, 249, 33, 9, 64}, expected: `3.14159`, }, { + name: "empty map", data: []byte{0, 0, 0, 4, 0}, expected: `{}`, }, { + name: "empty list", data: []byte{2, 0, 0, 4, 0}, expected: `[]`, }, { // opaque, datetime + name: "datetime", data: []byte{15, 12, 8, 0, 0, 0, 25, 118, 31, 149, 25}, expected: `"2015-01-15 23:24:25.000000"`, }, { // opaque, time + name: "time", data: []byte{15, 11, 8, 0, 0, 0, 25, 118, 1, 0, 0}, expected: `"23:24:25.000000"`, }, { // opaque, time + name: "time2", data: []byte{15, 11, 8, 192, 212, 1, 25, 118, 1, 0, 0}, expected: `"23:24:25.120000"`, }, { // opaque, date + name: "date", data: []byte{15, 10, 8, 0, 0, 0, 0, 0, 30, 149, 25}, expected: `"2015-01-15"`, }, { // opaque, decimal + name: "decimal", data: []byte{15, 246, 8, 13, 4, 135, 91, 205, 21, 4, 210}, expected: `1.234567891234e+08`, }, { // opaque, bit field. Not yet implemented. + name: "bitfield: unimplemented", data: []byte{15, 16, 2, 202, 254}, expected: `opaque type 16 is not supported yet, data [2 202 254]`, }} for _, tc := range testcases { - t.Run(tc.expected, func(t *testing.T) { + name := fmt.Sprintf("%s (%s)", tc.name, tc.expected) + t.Run(name, func(t *testing.T) { val, err := getJSONValue(tc.data) if err != nil { require.Equal(t, tc.expected, err.Error()) diff --git a/go/test/endtoend/vreplication/unsharded_init_data.sql b/go/test/endtoend/vreplication/unsharded_init_data.sql index b12aaa9bf79..019945609db 100644 --- a/go/test/endtoend/vreplication/unsharded_init_data.sql +++ b/go/test/endtoend/vreplication/unsharded_init_data.sql @@ -1,6 +1,6 @@ insert into customer(cid, name, typ, sport, meta) values(1, 'Jøhn "❤️" Rizzolo',1,'football,baseball','{}'); insert into customer(cid, name, typ, sport, meta) values(2, 'Paül','soho','cricket',convert(x'7b7d' using utf8mb4)); -insert into customer(cid, name, typ, sport) values(3, 'ringo','enterprise',''); +insert into customer(cid, name, typ, sport, meta) values(3, 'ringo','enterprise','',null); insert into merchant(mname, category) values('Monoprice', 'eléctronics'); insert into merchant(mname, category) values('newegg', 'elec†ronics'); insert into product(pid, description) values(1, 'keyböard ⌨️'); diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go index 1875ef6d8f5..4858dbbc749 100644 --- a/go/test/endtoend/vreplication/vreplication_test.go +++ b/go/test/endtoend/vreplication/vreplication_test.go @@ -736,9 +736,11 @@ func shardCustomer(t *testing.T, testReverse bool, cells []*Cell, sourceCellOrAl query := "select cid from customer" require.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, productTab, "product", query, query)) - insertQuery1 := "insert into customer(cid, name) values(1001, 'tempCustomer1')" - matchInsertQuery1 := "insert into customer(cid, `name`) values (:vtg1, :vtg2)" - require.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, productTab, "product", insertQuery1, matchInsertQuery1)) + insertQuery1 := "insert into customer(cid, name, meta) values(1001, 'tempCustomer1', '{\"a\": 1629849600, \"b\": 930701976723823}')" + + matchInsertQuery0 := "insert into customer(cid, `name`) values (:vtg1, :vtg2)" + matchInsertQuery1 := "insert into customer(cid, `name`, meta) values (:vtg1, :vtg2, :vtg3)" + validateThatQueryExecutesOnTablet(t, vtgateConn, productTab, "product", insertQuery1, matchInsertQuery1) // confirm that the backticking of table names in the routing rules works tbls := []string{"Lead", "Lead-1"} @@ -800,12 +802,12 @@ func shardCustomer(t *testing.T, testReverse bool, cells []*Cell, sourceCellOrAl require.Contains(t, output, "'customer.bmd5'") insertQuery1 = "insert into customer(cid, name) values(1002, 'tempCustomer5')" - require.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, productTab, "product", insertQuery1, matchInsertQuery1)) + require.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, productTab, "product", insertQuery1, matchInsertQuery0)) // both inserts go into 80-, this tests the edge-case where a stream (-80) has no relevant new events after the previous switch insertQuery1 = "insert into customer(cid, name) values(1003, 'tempCustomer6')" - require.False(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab1, "customer", insertQuery1, matchInsertQuery1)) + require.False(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab1, "customer", insertQuery1, matchInsertQuery0)) insertQuery1 = "insert into customer(cid, name) values(1004, 'tempCustomer7')" - require.False(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab2, "customer", insertQuery1, matchInsertQuery1)) + require.False(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab2, "customer", insertQuery1, matchInsertQuery0)) waitForNoWorkflowLag(t, vc, targetKs, workflow) diff --git a/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go b/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go index f508c632c9f..60378c8924a 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go @@ -27,13 +27,16 @@ import ( "testing" "time" + "vitess.io/vitess/go/mysql" + "github.com/spyzhov/ajson" "github.com/stretchr/testify/require" - "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/binlog/binlogplayer" - "vitess.io/vitess/go/vt/log" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" qh "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication/queryhistory" ) @@ -1512,21 +1515,21 @@ func TestPlayerTypes(t *testing.T) { }} if enableJSONColumnTesting { testcases = append(testcases, testcase{ - input: "insert into vitess_json(val1,val2,val3,val4,val5) values (null,'{}','123','{\"a\":[42,100]}', '{\"foo\":\"bar\"}')", + input: "insert into vitess_json(val1,val2,val3,val4,val5) values (null,'{}','1629849600','{\"a\":[42,-1,3.1415,-128,127,-9223372036854775808,9223372036854775807,18446744073709551615]}', '{\"foo\":\"bar\"}')", output: "insert into vitess_json(id,val1,val2,val3,val4,val5) values (1," + - "convert(null using utf8mb4)," + "convert('{}' using utf8mb4)," + "convert('123' using utf8mb4)," + - "convert('{\\\"a\\\":[42,100]}' using utf8mb4)," + "convert('{\\\"foo\\\":\\\"bar\\\"}' using utf8mb4))", + "convert(null using utf8mb4)," + "convert('{}' using utf8mb4)," + "convert('1629849600' using utf8mb4)," + + "convert('{\\\"a\\\":[42,-1,3.1415,-128,127,-9223372036854775808,9223372036854775807,18446744073709551615]}' using utf8mb4)," + "convert('{\\\"foo\\\":\\\"bar\\\"}' using utf8mb4))", table: "vitess_json", data: [][]string{ - {"1", "", "{}", "123", `{"a": [42, 100]}`, `{"foo": "bar"}`}, + {"1", "", "{}", "1629849600", `{"a": [42, -1, 3.1415, -128, 127, -9223372036854775808, 9223372036854775807, 18446744073709551615]}`, `{"foo": "bar"}`}, }, }) testcases = append(testcases, testcase{ - input: "update vitess_json set val4 = '{\"a\": [98, 123]}', val5 = convert(x'7b7d' using utf8mb4)", - output: "update vitess_json set val1=convert(null using utf8mb4), val2=convert('{}' using utf8mb4), val3=convert('123' using utf8mb4), val4=convert('{\\\"a\\\":[98,123]}' using utf8mb4), val5=convert('{}' using utf8mb4) where id=1", + input: "update vitess_json set val4 = '{\"a\": [-9223372036854775808, -2147483648]}', val5 = convert(x'7b7d' using utf8mb4)", + output: "update vitess_json set val1=convert(null using utf8mb4), val2=convert('{}' using utf8mb4), val3=convert('1629849600' using utf8mb4), val4=convert('{\\\"a\\\":[-9223372036854775808,-2147483648]}' using utf8mb4), val5=convert('{}' using utf8mb4) where id=1", table: "vitess_json", data: [][]string{ - {"1", "", "{}", "123", `{"a": [98, 123]}`, `{}`}, + {"1", "", "{}", "1629849600", `{"a": [-9223372036854775808, -2147483648]}`, `{}`}, }, }) } From fcd0d607356a5a0e00c8126b79e2bba82bfa9b82 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 21 Mar 2023 15:28:33 +0200 Subject: [PATCH 059/233] [release-16.0] Re-organize the `releasenotes` directory into `changelog` (#12566) (#12660) * 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/check_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 .../14.0/14.0.4/changelog.md | 0 .../14.0/14.0.4/release_notes.md | 2 +- .../14.0/14.0.4/summary.md | 0 changelog/14.0/README.md | 20 +++ .../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 + .../16.0/16.0.0/changelog.md | 0 .../16.0/16.0.0/release_notes.md | 2 +- .../16.0/16.0.0/summary.md | 0 changelog/16.0/README.md | 5 + changelog/16.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 | 11 ++ doc/internal/ReleaseInstructions.md | 11 +- go/tools/release-notes/release_notes.go | 28 +++- go/tools/release-notes/release_notes_test.go | 6 +- go/tools/releases/releases.go | 143 ++++++++++++++++++ 95 files changed, 359 insertions(+), 29 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 (90%) 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 (91%) 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%) rename doc/releasenotes/14_0_4_changelog.md => changelog/14.0/14.0.4/changelog.md (100%) rename doc/releasenotes/14_0_4_release_notes.md => changelog/14.0/14.0.4/release_notes.md (93%) rename doc/releasenotes/14_0_4_summary.md => changelog/14.0/14.0.4/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/16_0_0_changelog.md => changelog/16.0/16.0.0/changelog.md (100%) rename doc/releasenotes/16_0_0_release_notes.md => changelog/16.0/16.0.0/release_notes.md (99%) rename doc/releasenotes/16_0_0_summary.md => changelog/16.0/16.0.0/summary.md (100%) create mode 100644 changelog/16.0/README.md create mode 100644 changelog/16.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/check_label.yml b/.github/workflows/check_label.yml index df9e5173dd8..81e093ba637 100644 --- a/.github/workflows/check_label.yml +++ b/.github/workflows/check_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/16.0/16.0.1/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 41a27adfe31..0395117e2e6 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -97,6 +97,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') @@ -206,3 +209,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 25dfe2c63f3..3595b9673d8 100644 --- a/.gitignore +++ b/.gitignore @@ -70,7 +70,7 @@ _test/ /vendor/*/ # release folder -releases +/releases/ # Local examples /examples/local/vtdataroot 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 90% 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 91% 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/doc/releasenotes/14_0_4_changelog.md b/changelog/14.0/14.0.4/changelog.md similarity index 100% rename from doc/releasenotes/14_0_4_changelog.md rename to changelog/14.0/14.0.4/changelog.md diff --git a/doc/releasenotes/14_0_4_release_notes.md b/changelog/14.0/14.0.4/release_notes.md similarity index 93% rename from doc/releasenotes/14_0_4_release_notes.md rename to changelog/14.0/14.0.4/release_notes.md index 334efefd05f..31cbbc26627 100644 --- a/doc/releasenotes/14_0_4_release_notes.md +++ b/changelog/14.0/14.0.4/release_notes.md @@ -14,7 +14,7 @@ Below is a summary of this patch release. You can learn more [here](https://go.d An issue in versions `<= v14.0.3` and `<= v15.0.0` that generated corrupted results for non-full-group-by queries with a JOIN is now fixed. The full issue can be found [here](https://github.com/vitessio/vitess/issues/11625), and its fix [here](https://github.com/vitessio/vitess/pull/11633). ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/14_0_4_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/14.0/14.0.4/changelog.md). The release includes 24 commits (excluding merges) diff --git a/doc/releasenotes/14_0_4_summary.md b/changelog/14.0/14.0.4/summary.md similarity index 100% rename from doc/releasenotes/14_0_4_summary.md rename to changelog/14.0/14.0.4/summary.md diff --git a/changelog/14.0/README.md b/changelog/14.0/README.md new file mode 100644 index 00000000000..10f12867483 --- /dev/null +++ b/changelog/14.0/README.md @@ -0,0 +1,20 @@ +## v14.0 +* **[14.0.4](14.0.4)** + * [Changelog](14.0.4/changelog.md) + * [Release Notes](14.0.4/release_notes.md) + +* **[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/16_0_0_changelog.md b/changelog/16.0/16.0.0/changelog.md similarity index 100% rename from doc/releasenotes/16_0_0_changelog.md rename to changelog/16.0/16.0.0/changelog.md diff --git a/doc/releasenotes/16_0_0_release_notes.md b/changelog/16.0/16.0.0/release_notes.md similarity index 99% rename from doc/releasenotes/16_0_0_release_notes.md rename to changelog/16.0/16.0.0/release_notes.md index 1b91f15c28d..a9fdc0b47c0 100644 --- a/doc/releasenotes/16_0_0_release_notes.md +++ b/changelog/16.0/16.0.0/release_notes.md @@ -525,7 +525,7 @@ The sidecar tables `local_metadata` and `shard_metadata` are no longer in use an part of this refactor. They were used previously for Orchestrator support, which has been superseded by `vtorc`. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/16_0_0_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/16.0/16.0.0/changelog.md). The release includes 378 commits (excluding merges) diff --git a/doc/releasenotes/16_0_0_summary.md b/changelog/16.0/16.0.0/summary.md similarity index 100% rename from doc/releasenotes/16_0_0_summary.md rename to changelog/16.0/16.0.0/summary.md diff --git a/changelog/16.0/README.md b/changelog/16.0/README.md new file mode 100644 index 00000000000..342df67eaea --- /dev/null +++ b/changelog/16.0/README.md @@ -0,0 +1,5 @@ +## v16.0 +The dedicated team for this release can be found [here](team.md). +* **[16.0.0](16.0.0)** + * [Changelog](16.0.0/changelog.md) + * [Release Notes](16.0.0/release_notes.md) diff --git a/changelog/16.0/team.md b/changelog/16.0/team.md new file mode 100644 index 00000000000..76b11c38145 --- /dev/null +++ b/changelog/16.0/team.md @@ -0,0 +1,5 @@ +## Release Team for v16 + +- **Lead:** Manan Gupta ([GuptaManan100](https://github.com/GuptaManan100)) manan@planetscale.com +- **Shadow:** Matt Lord ([mattlord](https://github.com/mattlord)) mlord@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..f443a473b08 --- /dev/null +++ b/changelog/README.md @@ -0,0 +1,11 @@ +## Releases +* [16.0](16.0) +* [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 05286de9092..ed6ee84d510 100644 --- a/doc/internal/ReleaseInstructions.md +++ b/doc/internal/ReleaseInstructions.md @@ -161,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. @@ -255,14 +256,14 @@ We need to verify that _arewefastyet_ has finished the benchmark too. 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="./doc/releasenotes/15_0_0_summary.md" release-notes + 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="./doc/releasenotes/15_0_0_summary.md" release-notes + 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 `./doc/releasenotes/15_0_0_summary.md` to prefix the release notes with a text that the maintainers wrote before the release. + 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. @@ -301,7 +302,7 @@ This section is divided into two parts: 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 `doc/releasenotes/15_0_0_*.md`. +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`. 5. Run the back to dev mode tool. ```shell 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 0f0ed28a76da18f90a86a0eeb5a56044af7ded94 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 21 Mar 2023 15:38:24 +0200 Subject: [PATCH 060/233] Add the vtadmin web directory to the release packages (#12639) (#12671) Signed-off-by: Florent Poinsard --- tools/make-release-packages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/make-release-packages.sh b/tools/make-release-packages.sh index 36450530c9e..21ecdcda7ee 100755 --- a/tools/make-release-packages.sh +++ b/tools/make-release-packages.sh @@ -41,7 +41,7 @@ done; # Copy remaining files, preserving date/permissions # But resolving symlinks -cp -rpfL examples "${RELEASE_DIR}" +cp -rpfL {web,examples} "${RELEASE_DIR}" echo "Follow the installation instructions at: https://vitess.io/docs/get-started/local/" > "${RELEASE_DIR}"/examples/README.md From 480a99d7c0c655508bff1e12b1e206702a55f9c9 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 21 Mar 2023 16:18:26 +0200 Subject: [PATCH 061/233] [gen4 planner] Make sure to not push down expressions when not possible (#12607) (#12648) * 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 Co-authored-by: Andres Taylor --- .../queries/aggregation/aggregation_test.go | 10 +++ .../vtgate/queries/aggregation/schema.sql | 5 ++ .../vtgate/queries/aggregation/vschema.json | 8 ++ go/vt/vtgate/executor_select_test.go | 34 ++++++++ go/vt/vtgate/planbuilder/gen4_planner.go | 36 ++++----- go/vt/vtgate/planbuilder/horizon_planning.go | 26 +++++- .../planbuilder/operators/queryprojection.go | 80 ++++++++++++++++++- .../planbuilder/testdata/aggr_cases.json | 40 ++++++++++ 8 files changed, 218 insertions(+), 21 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go index b7ef4c4a78d..f07fb734df8 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go @@ -425,3 +425,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 t10(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 t10 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 a538a3dafed..0375bdb8499 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/schema.sql +++ b/go/test/endtoend/vtgate/queries/aggregation/schema.sql @@ -71,3 +71,8 @@ CREATE TABLE t2 ( PRIMARY KEY (id) ) ENGINE InnoDB; +CREATE TABLE t10 ( + k BIGINT PRIMARY KEY, + a INT, + b INT +); \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/aggregation/vschema.json b/go/test/endtoend/vtgate/queries/aggregation/vschema.json index c2d3f133a35..4d1623d5633 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" } ] + }, + "t10": { + "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 f8c18aab613..5e158ed4e2e 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -3856,6 +3856,40 @@ func TestSelectAggregationData(t *testing.T) { } } +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 TestSelectHexAndBit(t *testing.T) { executor, _, _, _ := createExecutorEnv() executor.normalize = true diff --git a/go/vt/vtgate/planbuilder/gen4_planner.go b/go/vt/vtgate/planbuilder/gen4_planner.go index dc49ae0a700..6822dcff642 100644 --- a/go/vt/vtgate/planbuilder/gen4_planner.go +++ b/go/vt/vtgate/planbuilder/gen4_planner.go @@ -216,7 +216,7 @@ func newBuildSelectPlan( return nil, nil, nil, err } - plan = optimizePlan(plan) + optimizePlan(plan) sel, isSel := selStmt.(*sqlparser.Select) if isSel { @@ -238,25 +238,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 eea1400b916..4e33f62ebe5 100644 --- a/go/vt/vtgate/planbuilder/horizon_planning.go +++ b/go/vt/vtgate/planbuilder/horizon_planning.go @@ -60,7 +60,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 @@ -75,10 +76,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) @@ -92,6 +94,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/operators/queryprojection.go b/go/vt/vtgate/planbuilder/operators/queryprojection.go index 29e356c6650..8de53a762be 100644 --- a/go/vt/vtgate/planbuilder/operators/queryprojection.go +++ b/go/vt/vtgate/planbuilder/operators/queryprojection.go @@ -418,7 +418,85 @@ func (qp *QueryProjection) NeedsAggregation() bool { return qp.HasAggr || len(qp.groupByExprs) > 0 } -func (qp QueryProjection) onlyAggr() bool { +// 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 + } + + stopOnError := func(sqlparser.SQLNode, sqlparser.SQLNode) bool { + return err == nil + } + rewriter := func(cursor *sqlparser.CopyOnWriteCursor) { + col, isCol := cursor.Node().(*sqlparser.ColName) + if !isCol { + return + } + var tableInfo semantics.TableInfo + tableInfo, err = ctx.SemTable.TableInfoForExpr(col) + if err != nil { + return + } + dt, isDT := tableInfo.(*semantics.DerivedTable) + if !isDT { + return + } + + rewritten := semantics.RewriteDerivedTableExpression(col, dt) + if sqlparser.ContainsAggregation(rewritten) { + offset, tErr := pusher(&sqlparser.AliasedExpr{Expr: col}) + if tErr != nil { + err = tErr + return + } + + cursor.Replace(sqlparser.NewOffset(offset, col)) + } + } + newExpr := sqlparser.CopyOnRewrite(expr, stopOnError, rewriter, nil) + + if err != nil { + return + } + + if newExpr != expr { + // if we changed the expression, it means that we have to evaluate the rest at the vtgate level + expressions = append(expressions, newExpr.(sqlparser.Expr)) + 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 (qp *QueryProjection) onlyAggr() bool { if !qp.HasAggr { return false } diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index f80fa0ec338..4acdc0ad356 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -4964,5 +4964,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": "VT12001: 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" + ] + } } ] From 0f2277c80d6a2271db62fae78f4555e240cb9a87 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Wed, 22 Mar 2023 10:30:59 +0200 Subject: [PATCH 062/233] Mysqld.GetSchema: tolerate tables being dropped while inspecting schema (#12641) (#12664) * 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 518e9bf3ab5..d6d629bc3bf 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 dc0bd699088b53536ca0406c0b1134c4a1a5d4b6 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 22 Mar 2023 11:40:03 +0200 Subject: [PATCH 063/233] Always add columns in the `Derived` operator (#12634) (#12670) * Always add column in the derived operator * Fix plan tests expectations --------- Signed-off-by: Florent Poinsard Signed-off-by: Andres Taylor Co-authored-by: Andres Taylor --- go/vt/vtgate/planbuilder/operators/derived.go | 2 +- go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json | 6 +++--- go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go/vt/vtgate/planbuilder/operators/derived.go b/go/vt/vtgate/planbuilder/operators/derived.go index 1488162bf46..06fa8a3f7af 100644 --- a/go/vt/vtgate/planbuilder/operators/derived.go +++ b/go/vt/vtgate/planbuilder/operators/derived.go @@ -145,9 +145,9 @@ func (d *Derived) AddColumn(ctx *plancontext.PlanningContext, expr sqlparser.Exp var pos int d.ColumnsOffset, pos = addToIntSlice(d.ColumnsOffset, i) + d.Columns = append(d.Columns, col) // add it to the source if we were not already passing it through if i <= -1 { - d.Columns = append(d.Columns, col) _, err := d.Source.AddColumn(ctx, sqlparser.NewColName(col.Name.String())) if err != nil { return 0, err diff --git a/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json b/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json index c53b3034e82..04cd660afb5 100644 --- a/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json @@ -1011,7 +1011,7 @@ "Instructions": { "OperatorType": "Join", "Variant": "Join", - "JoinColumnIndexes": "L:0", + "JoinColumnIndexes": "L:1", "JoinVars": { "x_COLUMN_NAME": 0 }, @@ -1024,8 +1024,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" }, { diff --git a/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json b/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json index 6ae3785110d..5faea3ef96f 100644 --- a/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json @@ -1069,7 +1069,7 @@ "Instructions": { "OperatorType": "Join", "Variant": "Join", - "JoinColumnIndexes": "L:0", + "JoinColumnIndexes": "L:1", "JoinVars": { "x_COLUMN_NAME": 0 }, @@ -1082,8 +1082,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 db53f78e4a7e296bb21758d5e51d49c0223741c7 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 23 Mar 2023 12:38:08 +0530 Subject: [PATCH 064/233] Fix initialization code to also stop replication to prevent crash (#12534) (#12691) * 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 3c41ed5ec47..db7784f6459 100644 --- a/go/test/endtoend/reparent/newfeaturetest/reparent_test.go +++ b/go/test/endtoend/reparent/newfeaturetest/reparent_test.go @@ -96,3 +96,16 @@ func TestSingleReplicaERS(t *testing.T) { // Also check the writes succeed after failover utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{}) } + +// 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 e100bad310b..c1e5899aac6 100644 --- a/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go +++ b/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go @@ -60,6 +60,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", @@ -73,6 +74,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 d597eb6597d..408f5b44947 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -882,7 +882,7 @@ func (tm *TabletManager) initializeReplication(ctx context.Context, tabletType t log.Warningf("primary tablet in the shard record does not have mysql hostname specified, possibly because that tablet has been shut down.") 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 e1225abd464..1773a7fab50 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 56ca6392864..5956add57f6 100644 --- a/go/vt/wrangler/testlib/backup_test.go +++ b/go/vt/wrangler/testlib/backup_test.go @@ -175,7 +175,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", @@ -224,13 +225,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", @@ -405,7 +408,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", @@ -475,13 +479,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", @@ -621,7 +627,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", @@ -663,13 +670,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 e46dab25bb0..b32e2c3d937 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" @@ -73,7 +72,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 b7c8cceed8c..de7b6f45930 100644 --- a/go/vt/wrangler/testlib/emergency_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/emergency_reparent_shard_test.go @@ -134,7 +134,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", @@ -166,7 +167,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", @@ -265,7 +267,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 0d80405aa43..e3b13f48958 100644 --- a/go/vt/wrangler/testlib/planned_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/planned_reparent_shard_test.go @@ -116,7 +116,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", @@ -232,7 +233,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", @@ -248,7 +250,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", @@ -448,7 +451,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", @@ -464,7 +468,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", @@ -558,7 +563,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", @@ -574,7 +580,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", @@ -636,7 +643,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", @@ -718,7 +726,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", @@ -828,7 +837,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", @@ -844,7 +854,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", @@ -943,7 +954,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", @@ -959,7 +971,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 75b02ea348a54b08db8a9eec6b6b33c4bec8bee0 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Thu, 23 Mar 2023 21:51:14 +0200 Subject: [PATCH 065/233] [planner bugfix] add expressions to HAVING (#12668) (#12698) * [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 Co-authored-by: Andres Taylor --- go/vt/sqlparser/ast_funcs.go | 6 +-- go/vt/sqlparser/ast_test.go | 34 +++++------------ .../planbuilder/operators/SQL_builder.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 aa680b84729..bc427c16636 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -1010,10 +1010,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/operators/SQL_builder.go b/go/vt/vtgate/planbuilder/operators/SQL_builder.go index 93618a95675..74e5f20fea4 100644 --- a/go/vt/vtgate/planbuilder/operators/SQL_builder.go +++ b/go/vt/vtgate/planbuilder/operators/SQL_builder.go @@ -87,12 +87,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) } } @@ -349,7 +353,7 @@ func buildQuery(op ops.Operator, qb *queryBuilder) error { 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, TableID(op), &sqlparser.DerivedTable{ Select: sel, @@ -380,3 +384,17 @@ func buildQuery(op ops.Operator, qb *queryBuilder) error { } return nil } + +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 4acdc0ad356..7f0ab1555c3 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -5004,5 +5004,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" + ] + } } ] From 98ef624bb903393eb9d6c91b5858e69ab997750c Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Fri, 24 Mar 2023 09:26:51 +0200 Subject: [PATCH 066/233] [release-16.0] Auto upgrade the Golang version (#12585) (#12709) * 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 --------- 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 | 3 +- go/tools/go-upgrade/go-upgrade.go | 504 ++++++++++++++++++++ 4 files changed, 581 insertions(+), 1 deletion(-) 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 8a2a3f839e2..265d6d0b72a 100644 --- a/go.mod +++ b/go.mod @@ -108,6 +108,7 @@ require ( require ( github.com/bndr/gotabulate v1.1.2 + github.com/hashicorp/go-version v1.6.0 github.com/kr/pretty v0.3.1 github.com/kr/text v0.2.0 github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249 diff --git a/go.sum b/go.sum index 3c33c669e84..46ae97a30fb 100644 --- a/go.sum +++ b/go.sum @@ -458,8 +458,9 @@ 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.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +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/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= diff --git a/go/tools/go-upgrade/go-upgrade.go b/go/tools/go-upgrade/go-upgrade.go new file mode 100644 index 00000000000..2720725a2ec --- /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(time.DateOnly), 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 7f9e1e14a0e4add26e1f3ce58fcc49a6a426aa1d Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Mon, 27 Mar 2023 13:02:35 +0530 Subject: [PATCH 067/233] Run launchable only on PRs against `main` (#12694) (#12721) * feat: reenable launchable for unit_tests * feat: only run CI on PRs against main * feat: use base_ref instead of ref --------- Signed-off-by: Manan Gupta --- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr_mysql57.yml | 2 +- .../workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .github/workflows/cluster_endtoend_mysql_server_vault.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_scheduler.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_consul.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_tablegc.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_throttler.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler_custom_config.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .github/workflows/cluster_endtoend_topo_connection_cache.yml | 2 +- .../cluster_endtoend_vreplication_across_db_versions.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_basic.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_cellalias.yml | 2 +- .../cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_multicell.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_v2.yml | 2 +- .github/workflows/cluster_endtoend_vstream_failover.yml | 2 +- .../workflows/cluster_endtoend_vstream_stoponreshard_false.yml | 2 +- .../workflows/cluster_endtoend_vstream_stoponreshard_true.yml | 2 +- .../cluster_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- .../cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_general_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_godriver.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_reservedconn.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema_tracker.yml | 2 +- .../cluster_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_consul.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_transaction.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_unsharded.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .github/workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 76 files changed, 76 insertions(+), 76 deletions(-) diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 47d8315fde4..faed8018a11 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_13.yml b/.github/workflows/cluster_endtoend_13.yml index 63b00f89a3e..e892f932a54 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_15.yml b/.github/workflows/cluster_endtoend_15.yml index 42e5d1c91d1..90662c24be0 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_18.yml b/.github/workflows/cluster_endtoend_18.yml index bf70e99fa0b..f01f5a71fab 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -107,7 +107,7 @@ jobs: make tools - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_21.yml b/.github/workflows/cluster_endtoend_21.yml index 1705e38762a..6295c51db3c 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_22.yml b/.github/workflows/cluster_endtoend_22.yml index e1decec0259..403829573a6 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index 1f913eb801e..cc9a718a8f1 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index 35f6c6c925d..158f597e4b2 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -113,7 +113,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml index a6739b71f2c..30312a2a333 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_mysql80.yml b/.github/workflows/cluster_endtoend_mysql80.yml index 7f27203c5ce..aef5ccda039 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_mysql_server_vault.yml b/.github/workflows/cluster_endtoend_mysql_server_vault.yml index 9a2c3d198ae..5c84de93c30 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -107,7 +107,7 @@ jobs: make tools - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml index 50ca5315c86..d5e4789eeee 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -103,7 +103,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml index a073589625f..cbf48b97219 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -114,7 +114,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert.yml b/.github/workflows/cluster_endtoend_onlineddl_revert.yml index f3479168002..5dd33132bf5 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -103,7 +103,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml index 33c9436d62a..158bb3f2af7 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -114,7 +114,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml index 45cfa768821..35fa69728af 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -103,7 +103,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml index 4f0c1a5b698..1e492e20e96 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -114,7 +114,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml index ae982540c38..971ebcfc6bc 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -103,7 +103,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml index 45d6ae0f029..ed575841b5b 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -114,7 +114,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml index 02236a6f4a4..ee41ac19de9 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -103,7 +103,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml index 42d83f85756..45a2f6efb6b 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -114,7 +114,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml index ad52f5c396c..aa09a1c4a8a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -103,7 +103,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null 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 6321e28069a..ecbc044baca 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -114,7 +114,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml index 0c682296e9c..d54554041c0 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -103,7 +103,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml index fb4ab1fd4d2..90bee3f4711 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -114,7 +114,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml index 49c0a3e0d48..7bd4690aa08 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -103,7 +103,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml index 7510e14aa4c..ec8cc567052 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -114,7 +114,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml index 21a0369083d..8ca716c6f24 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -107,7 +107,7 @@ jobs: make tools - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml index 53e26a5e1a7..03adba8d3f8 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml index 7ee6aaa46a3..fac289e089c 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -113,7 +113,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml index 02c9ea87657..2184432f10c 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml index 2deb7b3c8f5..84fc2c9ead5 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 20b45988bdf..0b335e95033 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_topo_connection_cache.yml b/.github/workflows/cluster_endtoend_topo_connection_cache.yml index ce64d2ff3b6..07712368ac5 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml index ba4d149a711..3c402c0f86d 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vreplication_basic.yml b/.github/workflows/cluster_endtoend_vreplication_basic.yml index 3e6a33ae7df..ec57945275c 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml index 9ab7c51f43e..2fdd736c8fc 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null 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 93d71284166..9fef7d64957 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vreplication_multicell.yml b/.github/workflows/cluster_endtoend_vreplication_multicell.yml index ed1050fbde2..2fd6e23ae58 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vreplication_v2.yml b/.github/workflows/cluster_endtoend_vreplication_v2.yml index a1a478aa982..ea14624619e 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vstream_failover.yml b/.github/workflows/cluster_endtoend_vstream_failover.yml index cdf5c899ddc..176375eda36 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml index 978c92b4a30..27ff940f7e2 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml index 983ad94e794..554b3e1d4cf 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null 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 f62019138cb..f741a5fcc65 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index da3c849bc04..057858377e6 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml index 697e3d31780..b13dc43be98 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml index 83e91d390c4..c2687621b8b 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_gen4.yml b/.github/workflows/cluster_endtoend_vtgate_gen4.yml index 7c39d688bcc..606296db0c2 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml index a69c7634137..8673154b474 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_godriver.yml b/.github/workflows/cluster_endtoend_vtgate_godriver.yml index 2bf75e96788..1908c55bc1b 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml index 209f26943e8..1888a4d88d9 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_queries.yml b/.github/workflows/cluster_endtoend_vtgate_queries.yml index 2ba81844503..3509083ba4f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml index 55dd4c3c34b..da279903e3b 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml index d5e90674bc5..d60a0bdb7bb 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_schema.yml b/.github/workflows/cluster_endtoend_vtgate_schema.yml index 07f06f06452..4f198738337 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml index 57ff927fb7d..a0a8d213fe1 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml index e81c473ecc3..5987812125d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_topo.yml b/.github/workflows/cluster_endtoend_vtgate_topo.yml index bdbf6b09c6a..b39da1df2db 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml index 36cc1319b04..897b5d01773 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -107,7 +107,7 @@ jobs: make tools - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml index ee9329d4fa7..4bea07d4132 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_transaction.yml b/.github/workflows/cluster_endtoend_vtgate_transaction.yml index d3914dd0e2d..90c6848e2ab 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml index 679ec5ee324..26555888d23 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml index 2372f13cfb3..85782763425 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtgate_vschema.yml b/.github/workflows/cluster_endtoend_vtgate_vschema.yml index 139421f9ff7..8beb739089d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtorc.yml b/.github/workflows/cluster_endtoend_vtorc.yml index 300dc1864ba..39055f9c974 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml index e3cb4e639f1..1a3f364f015 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -113,7 +113,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml index 9bc4c4d5b07..29de76c5f18 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -102,7 +102,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_xb_backup.yml b/.github/workflows/cluster_endtoend_xb_backup.yml index 3e10039b7e1..3b0bca9ffac 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -105,7 +105,7 @@ jobs: sudo apt-get install percona-xtrabackup-80 lz4 - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml index 3e4dcab8d04..18063e7cafe 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -129,7 +129,7 @@ jobs: fi - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_xb_recovery.yml b/.github/workflows/cluster_endtoend_xb_recovery.yml index 1d402e7f883..2a2e5fbcbd9 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -105,7 +105,7 @@ jobs: sudo apt-get install percona-xtrabackup-80 lz4 - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml index 55562726fa4..1708df14340 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -129,7 +129,7 @@ jobs: fi - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 86d76314b44..01710b1210d 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -125,7 +125,7 @@ jobs: make tools - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index a6e58b7adca..2a9080bc56f 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -122,7 +122,7 @@ jobs: make tools - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index e7253cc3147..412732e905a 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -134,7 +134,7 @@ jobs: {{end}} - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/test/templates/cluster_endtoend_test_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index 72d32a2da70..260e5b495c1 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -144,7 +144,7 @@ jobs: {{end}} - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index 510db59f6fc..f7b38e5f829 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -139,7 +139,7 @@ jobs: make tools - name: Setup launchable dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && github.base_ref == 'main' run: | # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up pip3 install --user launchable~=1.0 > /dev/null From 965610d213931086cd59030870a552a32bf71809 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 27 Mar 2023 11:16:48 +0200 Subject: [PATCH 068/233] [planner fix] make unknown column an error only for sharded queries (#12704) (#12725) Signed-off-by: Andres Taylor --- .../planbuilder/testdata/from_cases.json | 82 ++++++++++++++++++- .../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 +- 5 files changed, 171 insertions(+), 31 deletions(-) diff --git a/go/vt/vtgate/planbuilder/testdata/from_cases.json b/go/vt/vtgate/planbuilder/testdata/from_cases.json index f47dd91b30b..8315a60e013 100644 --- a/go/vt/vtgate/planbuilder/testdata/from_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/from_cases.json @@ -4588,7 +4588,24 @@ "comment": "verify ',' vs JOIN precedence", "query": "select u1.a from unsharded u1, unsharded u2 join unsharded u3 on u1.a = u2.a", "v3-plan": "VT03019: symbol u1.a not found", - "gen4-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)", @@ -4599,7 +4616,24 @@ "comment": "table names should be case-sensitive", "query": "select unsharded.id from unsharded where Unsharded.val = 1", "v3-plan": "VT03019: symbol Unsharded.val not found", - "gen4-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", @@ -6343,5 +6377,49 @@ "user.user_extra" ] } + }, + { + "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": "VT03019: symbol missing_column not found", + "gen4-plan": "Column 'missing_column' in field list is ambiguous" } ] diff --git a/go/vt/vtgate/planbuilder/testdata/union_cases.json b/go/vt/vtgate/planbuilder/testdata/union_cases.json index 5aba78fcb40..cd78c889706 100644 --- a/go/vt/vtgate/planbuilder/testdata/union_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/union_cases.json @@ -2416,5 +2416,42 @@ "Table": "information_schema.key_column_usage" } } + }, + { + "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 1375e3914ab..33edf05b68f 100644 --- a/go/vt/vtgate/semantics/analyzer.go +++ b/go/vt/vtgate/semantics/analyzer.go @@ -109,7 +109,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 { @@ -260,11 +260,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: NewError(UnsupportedMultiTablesInUpdate)} + return ShardedError{Inner: NewError(UnsupportedMultiTablesInUpdate)} } alias, isAlias := node.TableExprs[0].(*sqlparser.AliasedTableExpr) if !isAlias { - return UnshardedError{Inner: NewError(UnsupportedMultiTablesInUpdate)} + return ShardedError{Inner: NewError(UnsupportedMultiTablesInUpdate)} } _, isDerived := alias.Expr.(*sqlparser.DerivedTable) if isDerived { @@ -357,12 +357,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 c88c295ac68..96bce0b7edf 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: "VT12001: 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: "VT12001: 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 446489928fc..2a1b8c2c0ac 100644 --- a/go/vt/vtgate/semantics/binder.go +++ b/go/vt/vtgate/semantics/binder.go @@ -258,7 +258,7 @@ func (b *binder) resolveColumn(colName *sqlparser.ColName, current *scope, allow } current = current.parent } - return dependency{}, NewError(ColumnNotFound, colName) + return dependency{}, ShardedError{Inner: NewError(ColumnNotFound, colName)} } func (b *binder) resolveColumnInScope(current *scope, expr *sqlparser.ColName, allowMulti bool) (dependencies, error) { From ff0b4ffadf0e0dc04ab2effda43e0d604d3d4e94 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:18:05 +0200 Subject: [PATCH 069/233] [release-16.0] Fix `panic` when executing a prepare statement with over `65,528` parameters (#12614) (#12627) * fix type conversion in query.go for the bitMap size Signed-off-by: Florent Poinsard * enhance the TestHighNumberOfParams test Signed-off-by: Florent Poinsard * fix test comment Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard Co-authored-by: Florent Poinsard --- go/mysql/query.go | 2 +- .../endtoend/vtgate/queries/misc/misc_test.go | 45 +++++++++++++++++++ 2 files changed, 46 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 8115d46a53e..be322667fa0 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -17,10 +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/assert" "github.com/stretchr/testify/require" @@ -202,3 +206,44 @@ func TestOuterJoinWithPredicate(t *testing.T) { mcmp.AssertMatchesNoOrder("select A.id1, B.id2 from t1 as A left join t1 as B on A.id1*10 = B.id2 WHERE B.id2 NOT BETWEEN 20 AND 30", `[[INT64(0) INT64(0)] [INT64(1) INT64(10)] [INT64(4) INT64(40)]]`) } + +// 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 17f95be22019c892b2f07d3811870653d5395cbf 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:24:32 +0200 Subject: [PATCH 070/233] properly escape sequence table names (#12599) 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 8e3e6d9f84d..2faec7a59ff 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 a1bb778f09d606982bd1dd77bf1866b4520af4cf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 13:48:33 +0200 Subject: [PATCH 071/233] [release-16.0] Upgrade the Golang version to `go1.20.2` (#12723) * bump go version to go1.20.2 Signed-off-by: GitHub * Update the golang version to 1.20.2 Signed-off-by: Florent Poinsard --------- Signed-off-by: GitHub Signed-off-by: Florent Poinsard Co-authored-by: frouioui Co-authored-by: Florent Poinsard --- .github/workflows/check_make_vtadmin_authz_testgen.yml | 2 +- .github/workflows/check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr_mysql57.yml | 2 +- .../cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .github/workflows/cluster_endtoend_mysql_server_vault.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_scheduler.yml | 2 +- .../cluster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- ...luster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl.yml | 2 +- .../workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_consul.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_tablegc.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_throttler.yml | 2 +- ...uster_endtoend_tabletmanager_throttler_custom_config.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .../workflows/cluster_endtoend_topo_connection_cache.yml | 2 +- .../cluster_endtoend_vreplication_across_db_versions.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_basic.yml | 2 +- .../workflows/cluster_endtoend_vreplication_cellalias.yml | 2 +- ...ster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .../workflows/cluster_endtoend_vreplication_multicell.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_v2.yml | 2 +- .github/workflows/cluster_endtoend_vstream_failover.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_false.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_true.yml | 2 +- .../cluster_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- ...uster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_general_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_godriver.yml | 2 +- .../workflows/cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .../workflows/cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_reservedconn.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .../workflows/cluster_endtoend_vtgate_schema_tracker.yml | 2 +- .../cluster_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_consul.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_transaction.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_unsharded.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .github/workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 2 +- .github/workflows/docker_test_cluster_10.yml | 2 +- .github/workflows/docker_test_cluster_25.yml | 2 +- .github/workflows/e2e_race.yml | 2 +- .github/workflows/endtoend.yml | 2 +- .github/workflows/local_example.yml | 2 +- .github/workflows/region_example.yml | 2 +- .github/workflows/sonar_analysis.yml | 2 +- .github/workflows/static_checks_etc.yml | 2 +- .github/workflows/unit_race.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 2 +- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 2 +- .../upgrade_downgrade_test_backups_manual_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries.yml | 2 +- ...de_downgrade_test_query_serving_queries_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_schema.yml | 2 +- ...ade_downgrade_test_query_serving_schema_next_release.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 2 +- docker/lite/Dockerfile.ubi7.mysql80 | 2 +- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 2 +- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 2 +- docker/lite/Dockerfile.ubi8.mysql80 | 2 +- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- test.go | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_docker.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/dockerfile.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 126 files changed, 130 insertions(+), 126 deletions(-) diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index dac6d60996e..a7d7c28db35 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -48,7 +48,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 2ff3144ed85..0929576bdd3 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -50,7 +50,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index faed8018a11..45a7f83bf74 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 e892f932a54..94fec84e46d 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 90662c24be0..a5ac442e001 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 f01f5a71fab..eb34ce111b4 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 6295c51db3c..74a8189ed6b 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 403829573a6..ca9cf7e7bc1 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index cc9a718a8f1..63c74feba7b 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index 158f597e4b2..4f5158105fb 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 30312a2a333..c02cfe4b52b 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 aef5ccda039..1417bc5fb7f 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 5c84de93c30..01ba9f47ebd 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 d5e4789eeee..daf60b53783 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 cbf48b97219..eb21a9218dd 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 5dd33132bf5..138ac8185c3 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 158bb3f2af7..6d662c4dfa9 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 35fa69728af..038cca4beba 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 1e492e20e96..e590d549189 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 971ebcfc6bc..8f5eabf58e3 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 ed575841b5b..fd4dfd69a97 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 ee41ac19de9..4a3eb56067d 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 45a2f6efb6b..9373fbd95cc 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 aa09a1c4a8a..51d1838d731 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 ecbc044baca..c40eecc1a7a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 d54554041c0..b92a4d8f45a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 90bee3f4711..29057439659 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 7bd4690aa08..d7cdb2df981 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 ec8cc567052..8890176d5ae 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 8ca716c6f24..1c2dcf0c4c1 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 03adba8d3f8..c9309b91c5a 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 fac289e089c..830aaceb006 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 2184432f10c..9a2304c5bf6 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 84fc2c9ead5..b614d969a02 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 0b335e95033..76214b22b27 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 07712368ac5..0e5a16f28aa 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 3c402c0f86d..64fc3488466 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 ec57945275c..89401d78660 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 2fdd736c8fc..eec34fecf05 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 9fef7d64957..23bc186bbb4 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 2fd6e23ae58..c0b4e84112b 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 ea14624619e..c415821f085 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 176375eda36..f66627a5416 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 27ff940f7e2..9173897b823 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 554b3e1d4cf..a4b051fa3ad 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 f741a5fcc65..d2ba9c7977d 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index 057858377e6..6b6d7c38098 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 b13dc43be98..99240959d43 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 c2687621b8b..e202842e647 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 606296db0c2..38e860c1338 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 8673154b474..c9f2bc24d40 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 1908c55bc1b..46db4da2a6e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 1888a4d88d9..c630eba66ab 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 3509083ba4f..31c4a04c954 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 da279903e3b..f13b8f7a3bd 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 d60a0bdb7bb..83ac25039e9 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 4f198738337..f56c4104921 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 a0a8d213fe1..b1adc8a9b49 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 5987812125d..9f5a887bd9c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 b39da1df2db..36556c21053 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 897b5d01773..c03bcf1876c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 4bea07d4132..59132bca5e1 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 90c6848e2ab..b67b36423dd 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 26555888d23..14c66c34fc3 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 85782763425..9f20a1c432a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 8beb739089d..f64252b6eae 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 39055f9c974..c3026d238b1 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 1a3f364f015..eaaac8451d9 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 29de76c5f18..04dfe9e6775 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 3b0bca9ffac..d0079cfd8d7 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 18063e7cafe..1b7c7c2c58f 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 2a2e5fbcbd9..a5f5674ecc6 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 1708df14340..bc2e390ce6d 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 16c7264a506..c1e2df4e260 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -42,7 +42,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Get base dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 39cd7592fa9..9fbcd4186f0 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Tune the OS run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index 3438b84ef89..df033ad134e 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index ae77594a6bb..32b82f776e6 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 682e658bb72..615d6c6baec 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index aea86fd21e6..4bc81975dd1 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index c1b1cd3a7c2..c11a4558598 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index f86bd2e6a31..3dd3be484a8 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index c28966de09d..56e8bd5d9c0 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19 + go-version: 1.20.2 - name: Tune the OS run: | diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 0395117e2e6..9fb564d2ac6 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -105,7 +105,7 @@ jobs: 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@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 098741d08f2..bc6f1665a32 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -55,7 +55,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 01710b1210d..00e09143f34 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index 2a9080bc56f..079d3ed9a47 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index bde1a3283f7..1aba094fb74 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -83,7 +83,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index d92da4088e0..ce0016b5774 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -86,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 6201d9b49ba..9f65063d732 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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 dc0ad902478..a7ba240af46 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 2d8aceb6ceb..6943b9c84a1 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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 7de07a3892d..ed3f060f79a 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 5b8e3107757..16a857d65b9 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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 18075b62e0f..474aaeaee40 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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 cca38725a37..247d15fe64c 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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 6cc0f1d9882..26b59126e55 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 908be6519f6..42f11e6ccce 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index bbb17c43e99..b8182ae607e 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/Makefile b/Makefile index ace43b44d2a..e9efd5d38dd 100644 --- a/Makefile +++ b/Makefile @@ -275,7 +275,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=14.1 +BOOTSTRAP_VERSION=14.2 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index 64a55711da8..01a37556230 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.20.1 || fail "Go version reported: `go version`. Version 1.20.1+ required. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.20.2 || fail "Go version reported: `go version`. Version 1.20.2+ required. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index ee520efa00a..94ea4728908 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index d05fa944951..98093116e14 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index 8dcc5a909e3..1faed657914 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index 40918d35378..6fb34903460 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index d8a3eda34ac..1987a9f2d95 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -56,4 +56,8 @@ List of changes between bootstrap image versions. ## [14] - 2023-02-21 ### Changes -- Update build to golang 1.20.1 \ No newline at end of file +- Update build to golang 1.20.1 + +## [14.2] - 2023-03-27 +### Changes +- Update build to golang 1.20.2 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 72b1b961ea8..47b5ab320fc 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.20.1-buster +FROM --platform=linux/amd64 golang:1.20.2-buster # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index 061a1becc19..95c133db6e0 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index ad89047606d..444b1015b1d 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index 101ed73b5d9..634b7936a27 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index ec67e256fbb..bda47b8f7d2 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index 9c0ffae8458..f67c1429672 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index d874dcafc27..53ce9612799 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index 83976d9b180..f65da4dbf1a 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index 08f1b700970..bde336f99d3 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index d1cdd87ab53..f30f5fb0af0 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index 0f9d88596c9..4d63f1f44e2 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index ba3fe8ec02d..ce4f78952ed 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index d58ece7222f..ed896df5ad5 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index 436cd705b90..0b83d43c962 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index a2867cf7d4b..9a12a334b12 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/test.go b/test.go index b6ea6f7bf78..9a6586f4f7d 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "14.1", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "14.2", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index 412732e905a..31a7b88338b 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python 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 1292f95cc80..4b2b630d0da 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - 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_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index 260e5b495c1..7bcba132eaf 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -68,7 +68,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index 9e6c17909c0..c3f9540b000 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.1 +ARG bootstrap_version=14.2 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index f7b38e5f829..a6e361cc8f4 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -59,7 +59,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.1 + go-version: 1.20.2 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' From f30690162df2b7a2f918d4b670e1ecbff7559da8 Mon Sep 17 00:00:00 2001 From: Rameez Sajwani Date: Mon, 27 Mar 2023 21:22:09 -0700 Subject: [PATCH 072/233] fix fullstatus test for backward compat (#12685) (#12730) Signed-off-by: Rameez Sajwani --- .../endtoend/reparent/plannedreparent/reparent_test.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/go/test/endtoend/reparent/plannedreparent/reparent_test.go b/go/test/endtoend/reparent/plannedreparent/reparent_test.go index de7e6a0368b..ba8e17eb4d2 100644 --- a/go/test/endtoend/reparent/plannedreparent/reparent_test.go +++ b/go/test/endtoend/reparent/plannedreparent/reparent_test.go @@ -418,7 +418,8 @@ func TestFullStatus(t *testing.T) { primaryStatusString, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("GetFullStatus", primaryTablet.Alias) require.NoError(t, err) primaryStatus := &replicationdatapb.FullStatus{} - err = protojson.Unmarshal([]byte(primaryStatusString), primaryStatus) + opt := protojson.UnmarshalOptions{DiscardUnknown: true} + err = opt.Unmarshal([]byte(primaryStatusString), primaryStatus) require.NoError(t, err) assert.NotEmpty(t, primaryStatus.ServerUuid) assert.NotEmpty(t, primaryStatus.ServerId) @@ -450,7 +451,8 @@ func TestFullStatus(t *testing.T) { replicaStatusString, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("GetFullStatus", replicaTablet.Alias) require.NoError(t, err) replicaStatus := &replicationdatapb.FullStatus{} - err = protojson.Unmarshal([]byte(replicaStatusString), replicaStatus) + opt = protojson.UnmarshalOptions{DiscardUnknown: true} + err = opt.Unmarshal([]byte(replicaStatusString), replicaStatus) require.NoError(t, err) assert.NotEmpty(t, replicaStatus.ServerUuid) assert.NotEmpty(t, replicaStatus.ServerId) @@ -499,7 +501,8 @@ func getFullStatus(t *testing.T, clusterInstance *cluster.LocalProcessCluster, t statusString, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("GetFullStatus", tablet.Alias) require.NoError(t, err) status := &replicationdatapb.FullStatus{} - err = protojson.Unmarshal([]byte(statusString), status) + opt := protojson.UnmarshalOptions{DiscardUnknown: true} + err = opt.Unmarshal([]byte(statusString), status) require.NoError(t, err) return status } From 36431f993c68aa8457e09c197ee29140960e6f75 Mon Sep 17 00:00:00 2001 From: Rameez Sajwani Date: Mon, 27 Mar 2023 21:23:05 -0700 Subject: [PATCH 073/233] Fixing backup tests flakiness (#12655) (#12736) * remove unnecessary vtorc process * Adding vtorc disabling at right place * Adding comments --------- Signed-off-by: Rameez Sajwani --- .../backup/vtctlbackup/backup_utils.go | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/go/test/endtoend/backup/vtctlbackup/backup_utils.go b/go/test/endtoend/backup/vtctlbackup/backup_utils.go index 87e854b7d64..cf264c612cf 100644 --- a/go/test/endtoend/backup/vtctlbackup/backup_utils.go +++ b/go/test/endtoend/backup/vtctlbackup/backup_utils.go @@ -387,6 +387,14 @@ type restoreMethod func(t *testing.T, tablet *cluster.Vttablet) // 13. verify that don't have the data added after the first backup // 14. remove the backups func primaryBackup(t *testing.T) { + // Having the VTOrc in this test causes a lot of flakiness. For example when we delete the tablet `replica2` which + // is the current primary and then try to restore from backup the old primary (`primary.Alias`), but before that sometimes the VTOrc + // promotes the `replica1` to primary right after we delete the replica2 (current primary). + // This can result in unexpected behavior. Therefore, disabling the VTOrc in this test to remove flakiness. + localCluster.DisableVTOrcRecoveries(t) + defer func() { + localCluster.EnableVTOrcRecoveries(t) + }() verifyInitialReplication(t) output, err := localCluster.VtctlclientProcess.ExecuteCommandWithOutput("Backup", primary.Alias) @@ -770,15 +778,9 @@ func terminatedRestore(t *testing.T) { // Args: // tablet_type: 'replica' or 'rdonly'. func vtctlBackup(t *testing.T, tabletType string) { - // Start vtorc before running backups - vtorcProcess := localCluster.NewVTOrcProcess(cluster.VTOrcConfiguration{}) - err := vtorcProcess.Setup() - require.NoError(t, err) - localCluster.VTOrcProcesses = append(localCluster.VTOrcProcesses, vtorcProcess) - // StopReplication on replica1. We verify that the replication works fine later in // verifyInitialReplication. So this will also check that VTOrc is running. - err = localCluster.VtctlclientProcess.ExecuteCommand("StopReplication", replica1.Alias) + err := localCluster.VtctlclientProcess.ExecuteCommand("StopReplication", replica1.Alias) require.Nil(t, err) verifyInitialReplication(t) @@ -797,12 +799,6 @@ func vtctlBackup(t *testing.T, tabletType string) { cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 2) verifyAfterRemovingBackupNoBackupShouldBePresent(t, backups) - - // Stop VTOrc - err = localCluster.VTOrcProcesses[0].TearDown() - localCluster.VTOrcProcesses = nil - require.NoError(t, err) - err = replica2.VttabletProcess.TearDown() require.Nil(t, err) From 306c7d76995033deb62ab172f66007198c8f645c Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Tue, 28 Mar 2023 18:50:25 +0530 Subject: [PATCH 074/233] Flakes: Use new healthy shard check in vreplication e2e tests (#12502) (#12740) * Use new healthy shard check in vreplication e2e tests This is needed because checking that there's a primary tablet for the shard in vtgate's healtcheck is no longer a reliable indicator that the shard has a healthy serving primary, because now a primary needs to initialize its sidecar database and wait for that to replicate via semi-sync before it becomes serving and can proceed to perform normal functions. So this delay could cause test flakiness if you required a healthy shard before continuing with the test. * Try to address unit test race flakes around log size They looked like this: WARNING: DATA RACE Write at 0x000005bf9b60 by goroutine 27141: github.com/spf13/pflag.newUint64Value() /home/runner/go/pkg/mod/github.com/spf13/pflag@v1.0.5/uint64.go:9 +0x5a github.com/spf13/pflag.(*FlagSet).Uint64Var() /home/runner/go/pkg/mod/github.com/spf13/pflag@v1.0.5/uint64.go:45 +0x55 vitess.io/vitess/go/vt/log.RegisterFlags() /home/runner/work/vitess/vitess/go/vt/log/log.go:81 +0x64 vitess.io/vitess/go/vt/servenv.GetFlagSetFor() /home/runner/work/vitess/vitess/go/vt/servenv/servenv.go:347 +0x183 vitess.io/vitess/go/vt/servenv.ParseFlags() /home/runner/work/vitess/vitess/go/vt/servenv/servenv.go:326 +0x49 ... Previous read at 0x000005bf9b60 by goroutine 27136: 1744 github.com/golang/glog.(*syncBuffer).Write() ... And they most often occurred in the wrangler unit tests, which makes sense because it creates a log of loggers. * Revert "Try to address unit test race flakes around log size" This reverts commit 51992b8d8390648f2f22657633aec6f21614b266. * Use external cluster vtctld in TestMigrate * Use subshell vs command output interpolation * Ingnore any config files in mysql alias --------- Signed-off-by: Matt Lord Co-authored-by: Matt Lord --- examples/common/env.sh | 2 +- go/test/endtoend/cluster/cluster_util.go | 48 +++++++++++++ .../endtoend/vreplication/materialize_test.go | 23 ++++--- go/test/endtoend/vreplication/migrate_test.go | 8 ++- .../endtoend/vreplication/performance_test.go | 3 +- .../resharding_workflows_v2_test.go | 23 +++---- .../endtoend/vreplication/time_zone_test.go | 9 +-- go/test/endtoend/vreplication/vdiff2_test.go | 8 ++- .../vreplication/vreplication_test.go | 68 +++++++++++-------- .../vreplication/vschema_load_test.go | 4 +- go/test/endtoend/vreplication/vstream_test.go | 4 +- test/local_example.sh | 6 +- 12 files changed, 138 insertions(+), 68 deletions(-) diff --git a/examples/common/env.sh b/examples/common/env.sh index 3b6a23a26cb..adee0f34d3f 100644 --- a/examples/common/env.sh +++ b/examples/common/env.sh @@ -78,7 +78,7 @@ mkdir -p "${VTDATAROOT}/tmp" # In your own environment you may prefer to use config files, # such as ~/.my.cnf -alias mysql="command mysql -h 127.0.0.1 -P 15306" +alias mysql="command mysql --no-defaults -h 127.0.0.1 -P 15306" alias vtctlclient="command vtctlclient --server localhost:15999 --log_dir ${VTDATAROOT}/tmp --alsologtostderr" alias vtctldclient="command vtctldclient --server localhost:15999" diff --git a/go/test/endtoend/cluster/cluster_util.go b/go/test/endtoend/cluster/cluster_util.go index b7f3e33e716..ea2dd0d7e20 100644 --- a/go/test/endtoend/cluster/cluster_util.go +++ b/go/test/endtoend/cluster/cluster_util.go @@ -26,6 +26,7 @@ import ( "testing" "time" + "github.com/buger/jsonparser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -41,6 +42,8 @@ var ( tmClient = tmc.NewClient() dbCredentialFile string InsertTabletTemplateKsID = `insert into %s (id, msg) values (%d, '%s') /* id:%d */` + defaultOperationTimeout = 60 * time.Second + defeaultRetryDelay = 1 * time.Second ) // Restart restarts vttablet and mysql. @@ -381,3 +384,48 @@ func WaitForTabletSetup(vtctlClientProcess *VtctlClientProcess, expectedTablets return fmt.Errorf("all %d tablet are not in expected state %s", expectedTablets, expectedStatus) } + +// WaitForHealthyShard waits for the given shard info record in the topo +// server to list a tablet (alias and uid) as the primary serving tablet +// for the shard. This is done using "vtctldclient GetShard" and parsing +// its JSON output. All other watchers should then also see this shard +// info status as well. +func WaitForHealthyShard(vtctldclient *VtctldClientProcess, keyspace, shard string) error { + var ( + tmr = time.NewTimer(defaultOperationTimeout) + res string + err error + json []byte + cell string + uid int64 + ) + for { + res, err = vtctldclient.ExecuteCommandWithOutput("GetShard", fmt.Sprintf("%s/%s", keyspace, shard)) + if err != nil { + return err + } + json = []byte(res) + + cell, err = jsonparser.GetString(json, "shard", "primary_alias", "cell") + if err != nil && err != jsonparser.KeyPathNotFoundError { + return err + } + uid, err = jsonparser.GetInt(json, "shard", "primary_alias", "uid") + if err != nil && err != jsonparser.KeyPathNotFoundError { + return err + } + + if cell != "" && uid > 0 { + return nil + } + + select { + case <-tmr.C: + return fmt.Errorf("timed out waiting for the %s/%s shard to become healthy in the topo after %v; last seen status: %s; last seen error: %v", + keyspace, shard, defaultOperationTimeout, res, err) + default: + } + + time.Sleep(defeaultRetryDelay) + } +} diff --git a/go/test/endtoend/vreplication/materialize_test.go b/go/test/endtoend/vreplication/materialize_test.go index 0016a0771dd..a13ec1d0da6 100644 --- a/go/test/endtoend/vreplication/materialize_test.go +++ b/go/test/endtoend/vreplication/materialize_test.go @@ -17,10 +17,11 @@ limitations under the License. package vreplication import ( - "fmt" "testing" "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/test/endtoend/cluster" ) const smSchema = ` @@ -68,6 +69,7 @@ func testShardedMaterialize(t *testing.T) { vc = NewVitessCluster(t, "TestShardedMaterialize", allCells, mainClusterConfig) ks1 := "ks1" ks2 := "ks2" + shard := "0" require.NotNil(t, vc) defaultReplicas = 0 // because of CI resource constraints we can only run this test with primary tablets defer func() { defaultReplicas = 1 }() @@ -78,15 +80,17 @@ func testShardedMaterialize(t *testing.T) { vc.AddKeyspace(t, []*Cell{defaultCell}, ks1, "0", smVSchema, smSchema, defaultReplicas, defaultRdonly, 100, nil) vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", ks1, "0"), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, ks1, shard) + require.NoError(t, err) vc.AddKeyspace(t, []*Cell{defaultCell}, ks2, "0", smVSchema, smSchema, defaultReplicas, defaultRdonly, 200, nil) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", ks2, "0"), 1) + err = cluster.WaitForHealthyShard(vc.VtctldClient, ks2, shard) + require.NoError(t, err) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() verifyClusterHealth(t, vc) - _, err := vtgateConn.ExecuteFetch(initDataQuery, 0, false) + _, err = vtgateConn.ExecuteFetch(initDataQuery, 0, false) require.NoError(t, err) materialize(t, smMaterializeSpec) tab := vc.getPrimaryTablet(t, ks2, "0") @@ -184,6 +188,7 @@ func testMaterialize(t *testing.T) { vc = NewVitessCluster(t, "TestMaterialize", allCells, mainClusterConfig) sourceKs := "source" targetKs := "target" + shard := "0" require.NotNil(t, vc) defaultReplicas = 0 // because of CI resource constraints we can only run this test with primary tablets defer func() { defaultReplicas = 1 }() @@ -194,19 +199,21 @@ func testMaterialize(t *testing.T) { vc.AddKeyspace(t, []*Cell{defaultCell}, sourceKs, "0", smMaterializeVSchemaSource, smMaterializeSchemaSource, defaultReplicas, defaultRdonly, 300, nil) vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", sourceKs, "0"), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, sourceKs, shard) + require.NoError(t, err) vc.AddKeyspace(t, []*Cell{defaultCell}, targetKs, "0", smMaterializeVSchemaTarget, smMaterializeSchemaTarget, defaultReplicas, defaultRdonly, 400, nil) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", targetKs, "0"), 1) + err = cluster.WaitForHealthyShard(vc.VtctldClient, targetKs, shard) + require.NoError(t, err) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() verifyClusterHealth(t, vc) - _, err := vtgateConn.ExecuteFetch(materializeInitDataQuery, 0, false) + _, err = vtgateConn.ExecuteFetch(materializeInitDataQuery, 0, false) require.NoError(t, err) - ks2Primary := vc.getPrimaryTablet(t, targetKs, "0") + ks2Primary := vc.getPrimaryTablet(t, targetKs, shard) _, err = ks2Primary.QueryTablet(customFunc, targetKs, true) require.NoError(t, err) diff --git a/go/test/endtoend/vreplication/migrate_test.go b/go/test/endtoend/vreplication/migrate_test.go index 18745aea4cd..0c83658cee8 100644 --- a/go/test/endtoend/vreplication/migrate_test.go +++ b/go/test/endtoend/vreplication/migrate_test.go @@ -23,6 +23,7 @@ import ( "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/test/endtoend/cluster" ) func insertInitialDataIntoExternalCluster(t *testing.T, conn *mysql.Conn) { @@ -55,9 +56,10 @@ func TestMigrate(t *testing.T) { defaultCell = vc.Cells[defaultCellName] vc.AddKeyspace(t, []*Cell{defaultCell}, "product", "0", initialProductVSchema, initialProductSchema, defaultReplicas, defaultRdonly, 100, nil) + err := cluster.WaitForHealthyShard(vc.VtctldClient, "product", "0") + require.NoError(t, err) vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 1) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() @@ -76,12 +78,12 @@ func TestMigrate(t *testing.T) { extVtgate := extCell2.Vtgates[0] require.NotNil(t, extVtgate) - extVtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "rating", "0"), 1) + err = cluster.WaitForHealthyShard(extVc.VtctldClient, "rating", "0") + require.NoError(t, err) verifyClusterHealth(t, extVc) extVtgateConn := getConnection(t, extVc.ClusterConfig.hostname, extVc.ClusterConfig.vtgateMySQLPort) insertInitialDataIntoExternalCluster(t, extVtgateConn) - var err error var output, expected string ksWorkflow := "product.e1" diff --git a/go/test/endtoend/vreplication/performance_test.go b/go/test/endtoend/vreplication/performance_test.go index 1cd0d46bc3b..ce47e027f2d 100644 --- a/go/test/endtoend/vreplication/performance_test.go +++ b/go/test/endtoend/vreplication/performance_test.go @@ -63,7 +63,8 @@ create table customer(cid int, name varbinary(128), meta json default null, typ vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, "product", "0") + require.NoError(t, err) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() diff --git a/go/test/endtoend/vreplication/resharding_workflows_v2_test.go b/go/test/endtoend/vreplication/resharding_workflows_v2_test.go index d095477fc7f..db7633e18d2 100644 --- a/go/test/endtoend/vreplication/resharding_workflows_v2_test.go +++ b/go/test/endtoend/vreplication/resharding_workflows_v2_test.go @@ -570,7 +570,8 @@ func setupCluster(t *testing.T) *VitessCluster { vtgate = zone1.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, "product", "0") + require.NoError(t, err) vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "product", "0"), 2) vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", "product", "0"), 1) @@ -590,12 +591,10 @@ func setupCustomerKeyspace(t *testing.T) { customerVSchema, customerSchema, defaultReplicas, defaultRdonly, 200, nil); err != nil { t.Fatal(err) } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "customer", "-80"), 1); err != nil { - t.Fatal(err) - } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "customer", "80-"), 1); err != nil { - t.Fatal(err) - } + err := cluster.WaitForHealthyShard(vc.VtctldClient, "customer", "-80") + require.NoError(t, err) + err = cluster.WaitForHealthyShard(vc.VtctldClient, "customer", "80-") + require.NoError(t, err) if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "customer", "-80"), 2); err != nil { t.Fatal(err) } @@ -623,9 +622,8 @@ func setupCustomer2Keyspace(t *testing.T) { t.Fatal(err) } for _, c2shard := range c2shards { - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", c2keyspace, c2shard), 1); err != nil { - t.Fatal(err) - } + err := cluster.WaitForHealthyShard(vc.VtctldClient, c2keyspace, c2shard) + require.NoError(t, err) if defaultReplicas > 0 { if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", c2keyspace, c2shard), defaultReplicas); err != nil { t.Fatal(err) @@ -758,9 +756,8 @@ func createAdditionalCustomerShards(t *testing.T, shards string) { arrTargetShardNames := strings.Split(shards, ",") for _, shardName := range arrTargetShardNames { - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", ksName, shardName), 1); err != nil { - require.NoError(t, err) - } + err := cluster.WaitForHealthyShard(vc.VtctldClient, ksName, shardName) + require.NoError(t, err) if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", ksName, shardName), 2); err != nil { require.NoError(t, err) } diff --git a/go/test/endtoend/vreplication/time_zone_test.go b/go/test/endtoend/vreplication/time_zone_test.go index b10cd55e048..f5d57eac9df 100644 --- a/go/test/endtoend/vreplication/time_zone_test.go +++ b/go/test/endtoend/vreplication/time_zone_test.go @@ -36,6 +36,7 @@ func TestMoveTablesTZ(t *testing.T) { workflow := "tz" sourceKs := "product" targetKs := "customer" + shard := "0" ksWorkflow := fmt.Sprintf("%s.%s", targetKs, workflow) ksReverseWorkflow := fmt.Sprintf("%s.%s_reverse", sourceKs, workflow) @@ -51,7 +52,8 @@ func TestMoveTablesTZ(t *testing.T) { vtgate = cell1.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, sourceKs, shard) + require.NoError(t, err) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() @@ -87,9 +89,8 @@ func TestMoveTablesTZ(t *testing.T) { if _, err := vc.AddKeyspace(t, cells, targetKs, "0", customerVSchema, customerSchema, defaultReplicas, defaultRdonly, 200, targetKsOpts); err != nil { t.Fatal(err) } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "customer", "0"), 1); err != nil { - t.Fatal(err) - } + err = cluster.WaitForHealthyShard(vc.VtctldClient, targetKs, shard) + require.NoError(t, err) defaultCell := vc.Cells["zone1"] custKs := vc.Cells[defaultCell.Name].Keyspaces[targetKs] diff --git a/go/test/endtoend/vreplication/vdiff2_test.go b/go/test/endtoend/vreplication/vdiff2_test.go index c20fc435b84..06eddf95c9b 100644 --- a/go/test/endtoend/vreplication/vdiff2_test.go +++ b/go/test/endtoend/vreplication/vdiff2_test.go @@ -23,6 +23,8 @@ import ( "time" "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/test/endtoend/cluster" ) type testCase struct { @@ -121,7 +123,7 @@ func TestVDiff2(t *testing.T) { vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) for _, shard := range sourceShards { - require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", sourceKs, shard), 1)) + require.NoError(t, cluster.WaitForHealthyShard(vc.VtctldClient, sourceKs, shard)) } vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) @@ -139,7 +141,7 @@ func TestVDiff2(t *testing.T) { _, err := vc.AddKeyspace(t, cells, targetKs, strings.Join(targetShards, ","), customerVSchema, customerSchema, 0, 0, 200, targetKsOpts) require.NoError(t, err) for _, shard := range targetShards { - require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", targetKs, shard), 1)) + require.NoError(t, cluster.WaitForHealthyShard(vc.VtctldClient, targetKs, shard)) } for _, tc := range testCases { @@ -155,7 +157,7 @@ func testWorkflow(t *testing.T, vc *VitessCluster, tc *testCase, cells []*Cell) tks := vc.Cells[cells[0].Name].Keyspaces[tc.targetKs] require.NoError(t, vc.AddShards(t, cells, tks, tc.targetShards, 0, 0, tc.tabletBaseID, targetKsOpts)) for _, shard := range arrTargetShards { - require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", tc.targetKs, shard), 1)) + require.NoError(t, cluster.WaitForHealthyShard(vc.VtctldClient, tc.targetKs, shard)) } } ksWorkflow := fmt.Sprintf("%s.%s", tc.targetKs, tc.workflow) diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go index 4858dbbc749..91f5410545c 100644 --- a/go/test/endtoend/vreplication/vreplication_test.go +++ b/go/test/endtoend/vreplication/vreplication_test.go @@ -137,8 +137,10 @@ func TestVReplicationDDLHandling(t *testing.T) { } vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", sourceKs, shard), 1) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", targetKs, shard), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, sourceKs, shard) + require.NoError(t, err) + err = cluster.WaitForHealthyShard(vc.VtctldClient, targetKs, shard) + require.NoError(t, err) verifyClusterHealth(t, vc) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) @@ -148,7 +150,7 @@ func TestVReplicationDDLHandling(t *testing.T) { insertInitialData(t) - _, err := vtgateConn.ExecuteFetch(fmt.Sprintf("use %s", sourceKs), 1, false) + _, err = vtgateConn.ExecuteFetch(fmt.Sprintf("use %s", sourceKs), 1, false) require.NoError(t, err) addColDDL := fmt.Sprintf("alter table %s add column %s varchar(64)", table, newColumn) @@ -231,8 +233,10 @@ func TestVreplicationCopyThrottling(t *testing.T) { } vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", sourceKs, shard), 1) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", targetKs, shard), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, sourceKs, shard) + require.NoError(t, err) + err = cluster.WaitForHealthyShard(vc.VtctldClient, targetKs, shard) + require.NoError(t, err) // Confirm that the initial copy table phase does not proceed until the source tablet(s) // have an InnoDB History List length that is less than specified in the tablet's config. @@ -290,7 +294,8 @@ func testVreplicationWorkflows(t *testing.T, minimal bool) { vc.AddKeyspace(t, []*Cell{defaultCell}, "product", "0", initialProductVSchema, initialProductSchema, defaultReplicas, defaultRdonly, 100, sourceKsOpts) vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, "product", "0") + require.NoError(t, err) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() @@ -360,17 +365,20 @@ func TestMultiCellVreplicationWorkflow(t *testing.T) { require.NotNil(t, vc) defaultCellName := "zone1" defaultCell = vc.Cells[defaultCellName] + keyspace := "product" + shard := "0" defer vc.TearDown(t) cell1 := vc.Cells["zone1"] cell2 := vc.Cells["zone2"] - vc.AddKeyspace(t, []*Cell{cell1, cell2}, "product", "0", initialProductVSchema, initialProductSchema, defaultReplicas, defaultRdonly, 100, sourceKsOpts) + vc.AddKeyspace(t, []*Cell{cell1, cell2}, keyspace, shard, initialProductVSchema, initialProductSchema, defaultReplicas, defaultRdonly, 100, sourceKsOpts) vtgate = cell1.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 1) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "product", "0"), 2) + err := cluster.WaitForHealthyShard(vc.VtctldClient, keyspace, shard) + require.NoError(t, err) + vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspace, shard), 2) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() @@ -405,8 +413,10 @@ func TestVStreamFlushBinlog(t *testing.T) { } vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", sourceKs, shard), 1) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", targetKs, shard), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, sourceKs, shard) + require.NoError(t, err) + err = cluster.WaitForHealthyShard(vc.VtctldClient, targetKs, shard) + require.NoError(t, err) verifyClusterHealth(t, vc) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) @@ -551,12 +561,14 @@ func TestCellAliasVreplicationWorkflow(t *testing.T) { allCellNames = "zone1,zone2" defaultCellName := "zone1" defaultCell = vc.Cells[defaultCellName] + keyspace := "product" + shard := "0" defer vc.TearDown(t) cell1 := vc.Cells["zone1"] cell2 := vc.Cells["zone2"] - vc.AddKeyspace(t, []*Cell{cell1, cell2}, "product", "0", initialProductVSchema, initialProductSchema, defaultReplicas, defaultRdonly, 100, sourceKsOpts) + vc.AddKeyspace(t, []*Cell{cell1, cell2}, keyspace, shard, initialProductVSchema, initialProductSchema, defaultReplicas, defaultRdonly, 100, sourceKsOpts) // Add cell alias containing only zone2 result, err := vc.VtctlClient.ExecuteCommandWithOutput("AddCellsAlias", "--", "--cells", "zone2", "alias") @@ -564,8 +576,9 @@ func TestCellAliasVreplicationWorkflow(t *testing.T) { vtgate = cell1.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 1) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "product", "0"), 2) + err = cluster.WaitForHealthyShard(vc.VtctldClient, keyspace, shard) + require.NoError(t, err) + vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspace, shard), 2) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() @@ -573,7 +586,7 @@ func TestCellAliasVreplicationWorkflow(t *testing.T) { insertInitialData(t) t.Run("VStreamFrom", func(t *testing.T) { - testVStreamFrom(t, "product", 2) + testVStreamFrom(t, keyspace, 2) }) shardCustomer(t, true, []*Cell{cell1, cell2}, "alias", false) } @@ -698,12 +711,10 @@ func shardCustomer(t *testing.T, testReverse bool, cells []*Cell, sourceCellOrAl if _, err := vc.AddKeyspace(t, cells, "customer", "-80,80-", customerVSchema, customerSchema, defaultReplicas, defaultRdonly, 200, targetKsOpts); err != nil { t.Fatal(err) } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "customer", "-80"), 1); err != nil { - t.Fatal(err) - } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "customer", "80-"), 1); err != nil { - t.Fatal(err) - } + err := cluster.WaitForHealthyShard(vc.VtctldClient, targetKs, "-80") + require.NoError(t, err) + err = cluster.WaitForHealthyShard(vc.VtctldClient, targetKs, "80-") + require.NoError(t, err) // Assume we are operating on first cell defaultCell := cells[0] @@ -971,9 +982,8 @@ func reshard(t *testing.T, ksName string, tableName string, workflow string, sou arrTargetShardNames := strings.Split(targetShards, ",") for _, shardName := range arrTargetShardNames { - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", ksName, shardName), 1); err != nil { - t.Fatal(err) - } + err := cluster.WaitForHealthyShard(vc.VtctldClient, ksName, shardName) + require.NoError(t, err) } workflowType := "Reshard" if err := vc.VtctlClient.ExecuteCommand(workflowType, "--", "--source_shards="+sourceShards, "--target_shards="+targetShards, @@ -1063,12 +1073,10 @@ func shardMerchant(t *testing.T) { if _, err := vc.AddKeyspace(t, []*Cell{defaultCell}, merchantKeyspace, "-80,80-", merchantVSchema, "", defaultReplicas, defaultRdonly, 400, targetKsOpts); err != nil { t.Fatal(err) } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", merchantKeyspace, "-80"), 1); err != nil { - t.Fatal(err) - } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", merchantKeyspace, "80-"), 1); err != nil { - t.Fatal(err) - } + err := cluster.WaitForHealthyShard(vc.VtctldClient, merchantKeyspace, "-80") + require.NoError(t, err) + err = cluster.WaitForHealthyShard(vc.VtctldClient, merchantKeyspace, "80-") + require.NoError(t, err) moveTablesAction(t, "Create", cell, workflow, sourceKs, targetKs, tables) merchantKs := vc.Cells[defaultCell.Name].Keyspaces[merchantKeyspace] merchantTab1 := merchantKs.Shards["-80"].Tablets["zone1-400"].Vttablet diff --git a/go/test/endtoend/vreplication/vschema_load_test.go b/go/test/endtoend/vreplication/vschema_load_test.go index 731679e1eba..5d20d7f2d32 100644 --- a/go/test/endtoend/vreplication/vschema_load_test.go +++ b/go/test/endtoend/vreplication/vschema_load_test.go @@ -26,6 +26,7 @@ import ( "github.com/stretchr/testify/require" + "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/vt/log" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -52,7 +53,8 @@ func TestVSchemaChangesUnderLoad(t *testing.T) { vc.AddKeyspace(t, []*Cell{defaultCell}, "product", "0", initialProductVSchema, initialProductSchema, 1, 0, 100, sourceKsOpts) vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, "product", "0") + require.NoError(t, err) vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "product", "0"), 1) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() diff --git a/go/test/endtoend/vreplication/vstream_test.go b/go/test/endtoend/vreplication/vstream_test.go index c596ed084f7..d81faa5e26f 100644 --- a/go/test/endtoend/vreplication/vstream_test.go +++ b/go/test/endtoend/vreplication/vstream_test.go @@ -27,6 +27,7 @@ import ( "github.com/stretchr/testify/require" + "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/vt/log" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -245,7 +246,8 @@ func testVStreamStopOnReshardFlag(t *testing.T, stopOnReshard bool, baseTabletID vc.AddKeyspace(t, []*Cell{defaultCell}, "unsharded", "0", vschemaUnsharded, schemaUnsharded, defaultReplicas, defaultRdonly, baseTabletID+100, nil) vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "unsharded", "0"), 1) + err := cluster.WaitForHealthyShard(vc.VtctldClient, "unsharded", "0") + require.NoError(t, err) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() diff --git a/test/local_example.sh b/test/local_example.sh index e71855f7960..792c20d4e09 100755 --- a/test/local_example.sh +++ b/test/local_example.sh @@ -38,7 +38,7 @@ mysql --table < ../common/select_commerce_data.sql for shard in "customer/0"; do while true; do - if $(mysql "$shard" -e 'show tables' &>/dev/null); then + if (mysql "$shard" -e 'show tables' &>/dev/null); then break fi echo -e "waiting for shard: $shard ..." @@ -62,7 +62,7 @@ mysql --table < ../common/select_customer0_data.sql ./205_clean_commerce.sh # We expect this to fail as the keyspace is now gone. -$(mysql --table < ../common/select_commerce_data.sql &>/dev/null || true) +(mysql --table < ../common/select_commerce_data.sql &>/dev/null || true) ./301_customer_sharded.sh ./302_new_shards.sh @@ -71,7 +71,7 @@ $(mysql --table < ../common/select_commerce_data.sql &>/dev/null || true) # TODO: Eliminate this race in the examples' scripts for shard in "customer/-80" "customer/80-"; do while true; do - if $(mysql "$shard" -e 'show tables' &>/dev/null); then + if (mysql "$shard" -e 'show tables' &>/dev/null); then break fi echo -e "waiting for shard: $shard ..." From bb6e0dabe292df216f8783766a9dfbb0dc5f14e1 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 28 Mar 2023 17:51:06 +0200 Subject: [PATCH 075/233] planner: fix predicate simplifier (#12650) (#12715) * planner: fix predicate simplifier * predicate rewriting: add debug logging * add debug logging to make the code easier to understand * address review feedback * Update go/vt/vtgate/planbuilder/predicate_rewrite_test.go Nicer panic message --------- Signed-off-by: Andres Taylor Signed-off-by: Andres Taylor Signed-off-by: Florent Poinsard Co-authored-by: Andres Taylor --- go/vt/sqlparser/predicate_rewriting.go | 261 ++++++++++++++------ go/vt/sqlparser/predicate_rewriting_test.go | 11 +- 2 files changed, 191 insertions(+), 81 deletions(-) diff --git a/go/vt/sqlparser/predicate_rewriting.go b/go/vt/sqlparser/predicate_rewriting.go index eb772191a13..0348f95f115 100644 --- a/go/vt/sqlparser/predicate_rewriting.go +++ b/go/vt/sqlparser/predicate_rewriting.go @@ -16,41 +16,47 @@ limitations under the License. package sqlparser -const ( - Changed RewriteState = true - NoChange RewriteState = false +import ( + "vitess.io/vitess/go/vt/log" ) -type RewriteState bool - // RewritePredicate walks the input AST and rewrites any boolean logic into a simpler form // This simpler form is CNF plus logic for extracting predicates from OR, plus logic for turning ORs into IN // Note: In order to re-plan, we need to empty the accumulated metadata in the AST, // so ColName.Metadata will be nil:ed out as part of this rewrite func RewritePredicate(ast SQLNode) SQLNode { for { - finishedRewrite := true - ast = SafeRewrite(ast, nil, func(cursor *Cursor) bool { - if e, isExpr := cursor.node.(Expr); isExpr { - rewritten, state := simplifyExpression(e) - if state == Changed { - finishedRewrite = false - cursor.Replace(rewritten) - } + printExpr(ast) + exprChanged := false + stopOnChange := func(SQLNode, SQLNode) bool { + return !exprChanged + } + ast = SafeRewrite(ast, stopOnChange, func(cursor *Cursor) bool { + e, isExpr := cursor.node.(Expr) + if !isExpr { + return true } + + rewritten, state := simplifyExpression(e) + if ch, isChange := state.(changed); isChange { + printRule(ch.rule, ch.exprMatched) + exprChanged = true + cursor.Replace(rewritten) + } + if col, isCol := cursor.node.(*ColName); isCol { col.Metadata = nil } - return true + return !exprChanged }) - if finishedRewrite { + if !exprChanged { return ast } } } -func simplifyExpression(expr Expr) (Expr, RewriteState) { +func simplifyExpression(expr Expr) (Expr, rewriteState) { switch expr := expr.(type) { case *NotExpr: return simplifyNot(expr) @@ -61,24 +67,22 @@ func simplifyExpression(expr Expr) (Expr, RewriteState) { case *AndExpr: return simplifyAnd(expr) } - return expr, NoChange + return expr, noChange{} } -func simplifyNot(expr *NotExpr) (Expr, RewriteState) { +func simplifyNot(expr *NotExpr) (Expr, rewriteState) { switch child := expr.Expr.(type) { case *NotExpr: - // NOT NOT A => A - return child.Expr, Changed + return child.Expr, + newChange("NOT NOT A => A", f(expr)) case *OrExpr: - // DeMorgan Rewriter - // NOT (A OR B) => NOT A AND NOT B - return &AndExpr{Right: &NotExpr{Expr: child.Right}, Left: &NotExpr{Expr: child.Left}}, Changed + return &AndExpr{Right: &NotExpr{Expr: child.Right}, Left: &NotExpr{Expr: child.Left}}, + newChange("NOT (A OR B) => NOT A AND NOT B", f(expr)) case *AndExpr: - // DeMorgan Rewriter - // NOT (A AND B) => NOT A OR NOT B - return &OrExpr{Right: &NotExpr{Expr: child.Right}, Left: &NotExpr{Expr: child.Left}}, Changed + return &OrExpr{Right: &NotExpr{Expr: child.Right}, Left: &NotExpr{Expr: child.Left}}, + newChange("NOT (A AND B) => NOT A OR NOT B", f(expr)) } - return expr, NoChange + return expr, noChange{} } // ExtractINFromOR will add additional predicated to an OR. @@ -104,16 +108,16 @@ func ExtractINFromOR(expr *OrExpr) []Expr { continue } in, state := tryTurningOrIntoIn(l, r) - if state == Changed { + if state.changed() { ins = append(ins, in) } } } - return ins + return uniquefy(ins) } -func simplifyOr(expr *OrExpr) (Expr, RewriteState) { +func simplifyOr(expr *OrExpr) (Expr, rewriteState) { or := expr // first we search for ANDs and see how they can be simplified @@ -121,42 +125,47 @@ func simplifyOr(expr *OrExpr) (Expr, RewriteState) { rand, rok := or.Right.(*AndExpr) switch { case lok && rok: + // (<> AND <>) OR (<> AND <>) var a, b, c Expr + var change changed switch { - // (A and B) or (A and C) => A AND (B OR C) case Equals.Expr(land.Left, rand.Left): + change = newChange("(A and B) or (A and C) => A AND (B OR C)", f(expr)) a, b, c = land.Left, land.Right, rand.Right - // (A and B) or (C and A) => A AND (B OR C) case Equals.Expr(land.Left, rand.Right): + change = newChange("(A and B) or (C and A) => A AND (B OR C)", f(expr)) a, b, c = land.Left, land.Right, rand.Left - // (B and A) or (A and C) => A AND (B OR C) case Equals.Expr(land.Right, rand.Left): + change = newChange("(B and A) or (A and C) => A AND (B OR C)", f(expr)) a, b, c = land.Right, land.Left, rand.Right - // (B and A) or (C and A) => A AND (B OR C) case Equals.Expr(land.Right, rand.Right): + change = newChange("(B and A) or (C and A) => A AND (B OR C)", f(expr)) a, b, c = land.Right, land.Left, rand.Left default: - return expr, NoChange + return expr, noChange{} } - return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, Changed + return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, change case lok: + // (<> AND <>) OR <> // Simplification - // (A AND B) OR A => A if Equals.Expr(or.Right, land.Left) || Equals.Expr(or.Right, land.Right) { - return or.Right, Changed + return or.Right, newChange("(A AND B) OR A => A", f(expr)) } // Distribution Law - // (A AND B) OR C => (A OR C) AND (B OR C) - return &AndExpr{Left: &OrExpr{Left: land.Left, Right: or.Right}, Right: &OrExpr{Left: land.Right, Right: or.Right}}, Changed + return &AndExpr{Left: &OrExpr{Left: land.Left, Right: or.Right}, Right: &OrExpr{Left: land.Right, Right: or.Right}}, + newChange("(A AND B) OR C => (A OR C) AND (B OR C)", f(expr)) case rok: + // <> OR (<> AND <>) // Simplification - // A OR (A AND B) => A if Equals.Expr(or.Left, rand.Left) || Equals.Expr(or.Left, rand.Right) { - return or.Left, Changed + return or.Left, newChange("A OR (A AND B) => A", f(expr)) } // Distribution Law - // C OR (A AND B) => (C OR A) AND (C OR B) - return &AndExpr{Left: &OrExpr{Left: or.Left, Right: rand.Left}, Right: &OrExpr{Left: or.Left, Right: rand.Right}}, Changed + return &AndExpr{ + Left: &OrExpr{Left: or.Left, Right: rand.Left}, + Right: &OrExpr{Left: or.Left, Right: rand.Right}, + }, + newChange("C OR (A AND B) => (C OR A) AND (C OR B)", f(expr)) } // next, we want to try to turn multiple ORs into an IN when possible @@ -164,8 +173,8 @@ func simplifyOr(expr *OrExpr) (Expr, RewriteState) { rgtCmp, rok := or.Right.(*ComparisonExpr) if lok && rok { newExpr, rewritten := tryTurningOrIntoIn(lftCmp, rgtCmp) - if rewritten { - return newExpr, Changed + if rewritten.changed() { + return newExpr, rewritten } } @@ -173,46 +182,54 @@ func simplifyOr(expr *OrExpr) (Expr, RewriteState) { return distinctOr(expr) } -func tryTurningOrIntoIn(l, r *ComparisonExpr) (Expr, RewriteState) { +func tryTurningOrIntoIn(l, r *ComparisonExpr) (Expr, rewriteState) { // looks for A = X OR A = Y and turns them into A IN (X, Y) col, ok := l.Left.(*ColName) if !ok || !Equals.Expr(col, r.Left) { - return nil, NoChange + return nil, noChange{} } var tuple ValTuple - + var ruleStr string switch l.Operator { case EqualOp: tuple = ValTuple{l.Right} + ruleStr = "A = <>" case InOp: lft, ok := l.Right.(ValTuple) if !ok { - return nil, NoChange + return nil, noChange{} } tuple = lft + ruleStr = "A IN (<>, <>)" default: - return nil, NoChange + return nil, noChange{} } + ruleStr += " OR " + switch r.Operator { case EqualOp: tuple = append(tuple, r.Right) + ruleStr += "A = <>" case InOp: lft, ok := r.Right.(ValTuple) if !ok { - return nil, NoChange + return nil, noChange{} } tuple = append(tuple, lft...) + ruleStr += "A IN (<>, <>)" default: - return nil, NoChange + return nil, noChange{} } + ruleStr += " => A IN (<>, <>)" + return &ComparisonExpr{ Operator: InOp, Left: col, Right: uniquefy(tuple), - }, Changed + }, newChange(ruleStr, f(&OrExpr{Left: l, Right: r})) } func uniquefy(tuple ValTuple) (output ValTuple) { @@ -228,37 +245,45 @@ outer: return } -func simplifyXor(expr *XorExpr) (Expr, RewriteState) { +func simplifyXor(expr *XorExpr) (Expr, rewriteState) { // DeMorgan Rewriter - // (A XOR B) => (A OR B) AND NOT (A AND B) - return &AndExpr{Left: &OrExpr{Left: expr.Left, Right: expr.Right}, Right: &NotExpr{Expr: &AndExpr{Left: expr.Left, Right: expr.Right}}}, Changed + return &AndExpr{ + Left: &OrExpr{Left: expr.Left, Right: expr.Right}, + Right: &NotExpr{Expr: &AndExpr{Left: expr.Left, Right: expr.Right}}, + }, newChange("(A XOR B) => (A OR B) AND NOT (A AND B)", f(expr)) } -func simplifyAnd(expr *AndExpr) (Expr, RewriteState) { +func simplifyAnd(expr *AndExpr) (Expr, rewriteState) { res, rewritten := distinctAnd(expr) - if rewritten { + if rewritten.changed() { return res, rewritten } and := expr if or, ok := and.Left.(*OrExpr); ok { // Simplification - // (A OR B) AND A => A - if Equals.Expr(or.Left, and.Right) || Equals.Expr(or.Right, and.Right) { - return and.Right, Changed + + if Equals.Expr(or.Left, and.Right) { + return and.Right, newChange("(A OR B) AND A => A", f(expr)) + } + if Equals.Expr(or.Right, and.Right) { + return and.Right, newChange("(A OR B) AND B => B", f(expr)) } } if or, ok := and.Right.(*OrExpr); ok { // Simplification - // A OR (A AND B) => A - if Equals.Expr(or.Left, and.Left) || Equals.Expr(or.Right, and.Left) { - return or.Left, Changed + if Equals.Expr(or.Left, and.Left) { + return and.Left, newChange("A AND (A OR B) => A", f(expr)) + } + if Equals.Expr(or.Right, and.Left) { + return and.Left, newChange("A AND (B OR A) => A", f(expr)) } } - return expr, NoChange + return expr, noChange{} } -func distinctOr(in *OrExpr) (Expr, RewriteState) { +func distinctOr(in *OrExpr) (Expr, rewriteState) { + var skipped []*OrExpr todo := []*OrExpr{in} var leaves []Expr for len(todo) > 0 { @@ -284,13 +309,16 @@ outer1: leaves = leaves[1:] for _, alreadyIn := range predicates { if Equals.Expr(alreadyIn, curr) { + if log.V(0) { + skipped = append(skipped, &OrExpr{Left: alreadyIn, Right: curr}) + } continue outer1 } } predicates = append(predicates, curr) } if original == len(predicates) { - return in, NoChange + return in, noChange{} } var result Expr for i, curr := range predicates { @@ -300,42 +328,58 @@ outer1: } result = &OrExpr{Left: result, Right: curr} } - return result, Changed + + return result, newChange("A OR A => A", func() Expr { + var result Expr + for _, orExpr := range skipped { + if result == nil { + result = orExpr + continue + } + + result = &OrExpr{ + Left: result, + Right: orExpr, + } + } + return result + }) } -func distinctAnd(in *AndExpr) (Expr, RewriteState) { +func distinctAnd(in *AndExpr) (Expr, rewriteState) { + var skipped []*AndExpr todo := []*AndExpr{in} var leaves []Expr for len(todo) > 0 { curr := todo[0] todo = todo[1:] - addAnd := func(in Expr) { - and, ok := in.(*AndExpr) - if ok { + addExpr := func(in Expr) { + if and, ok := in.(*AndExpr); ok { todo = append(todo, and) } else { leaves = append(leaves, in) } } - addAnd(curr.Left) - addAnd(curr.Right) + addExpr(curr.Left) + addExpr(curr.Right) } original := len(leaves) var predicates []Expr outer1: - for len(leaves) > 0 { - curr := leaves[0] - leaves = leaves[1:] + for _, curr := range leaves { for _, alreadyIn := range predicates { if Equals.Expr(alreadyIn, curr) { + if log.V(0) { + skipped = append(skipped, &AndExpr{Left: alreadyIn, Right: curr}) + } continue outer1 } } predicates = append(predicates, curr) } if original == len(predicates) { - return in, NoChange + return in, noChange{} } var result Expr for i, curr := range predicates { @@ -345,5 +389,62 @@ outer1: } result = &AndExpr{Left: result, Right: curr} } - return result, Changed + return AndExpressions(leaves...), newChange("A AND A => A", func() Expr { + var result Expr + for _, andExpr := range skipped { + if result == nil { + result = andExpr + continue + } + + result = &AndExpr{ + Left: result, + Right: andExpr, + } + } + return result + }) +} + +type ( + rewriteState interface { + changed() bool + } + noChange struct{} + + // changed makes it possible to make sure we have a rule string for each change we do in the expression tree + changed struct { + rule string + + // ExprMatched is a function here so building of this expression can be paid only when we are debug logging + exprMatched func() Expr + } +) + +func (noChange) changed() bool { return false } +func (changed) changed() bool { return true } + +// f returns a function that returns the expression. It's short by design, so it interferes minimally +// used for logging +func f(e Expr) func() Expr { + return func() Expr { return e } +} + +func printRule(rule string, expr func() Expr) { + if log.V(10) { + log.Infof("Rule: %s ON %s", rule, String(expr())) + } +} + +func printExpr(expr SQLNode) { + if log.V(10) { + log.Infof("Current: %s", String(expr)) + } +} + +func newChange(rule string, exprMatched func() Expr) changed { + return changed{ + rule: rule, + exprMatched: exprMatched, + } } diff --git a/go/vt/sqlparser/predicate_rewriting_test.go b/go/vt/sqlparser/predicate_rewriting_test.go index 1c86dec61a2..34e23597894 100644 --- a/go/vt/sqlparser/predicate_rewriting_test.go +++ b/go/vt/sqlparser/predicate_rewriting_test.go @@ -92,7 +92,7 @@ func TestSimplifyExpression(in *testing.T) { require.NoError(t, err) expr, didRewrite := simplifyExpression(expr) - assert.True(t, didRewrite == Changed) + assert.True(t, didRewrite.changed()) assert.Equal(t, tc.expected, String(expr)) }) } @@ -114,12 +114,21 @@ func TestRewritePredicate(in *testing.T) { }, { in: "(A and B) OR (A and C)", expected: "A and (B or C)", + }, { + in: "(A and B) OR (C and A)", + expected: "A and (B or C)", + }, { + in: "(B and A) OR (A and C)", + expected: "A and (B or C)", }, { in: "(A and B) or (A and C) or (A and D)", expected: "A and (B or C or D)", }, { in: "(a=1 or a IN (1,2)) or (a = 2 or a = 3)", expected: "a in (1, 2, 3)", + }, { + in: "A and (B or A)", + expected: "A", }} for _, tc := range tests { From e979cecda1b77afe2a7562196c7a4282f6fe3e60 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 17:51:44 +0200 Subject: [PATCH 076/233] [release-16.0] Use a left join to make sure that tables with tablespace=innodb_system are included in the schema (#12672) (#12735) * 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 ad23854d374..407c14e34b0 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -363,7 +363,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 d81faa5e26f..44fe7edaa1c 100644 --- a/go/test/endtoend/vreplication/vstream_test.go +++ b/go/test/endtoend/vreplication/vstream_test.go @@ -189,7 +189,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 befca3383bbc678060cc212a88e5259836e2f469 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 10:09:04 +0530 Subject: [PATCH 077/233] [release-16.0] Reset the current lag when closing the replication lag reader. (#12683) (#12741) * Reset the current lag when closing the replication lag reader. Signed-off-by: Johan Stenberg * Fix tests. Signed-off-by: Johan Stenberg --------- Signed-off-by: Johan Stenberg Co-authored-by: Johan Stenberg --- .../tabletserver/repltracker/reader.go | 3 ++ .../tabletserver/repltracker/reader_test.go | 51 +++++++++++++++++-- .../tabletserver/repltracker/writer_test.go | 23 +++++---- 3 files changed, 61 insertions(+), 16 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 07ae3186877..733580f450d 100644 --- a/go/vt/vttablet/tabletserver/repltracker/writer_test.go +++ b/go/vt/vttablet/tabletserver/repltracker/writer_test.go @@ -30,18 +30,12 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" ) -var ( - now = time.Now() - mockNowFunc = func() time.Time { - return now - } -) - 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{}) @@ -58,7 +52,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() @@ -68,7 +63,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 @@ -79,7 +74,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 7b2de23734106d2b342af44c3586fee66534e526 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Wed, 29 Mar 2023 07:31:56 +0200 Subject: [PATCH 078/233] [release-16.0] Port two flaky test fixes #12603 and #12546 (#12745) * Flakes: Address Common Unit Test Races (#12546) * Deflake unit race tests Signed-off-by: Matt Lord * Try to address glog.MaxSize race Signed-off-by: Matt Lord * Test w/o using literal copy of glog.MaxSize value in CI Signed-off-by: Matt Lord * Make the dialer names truly unique Signed-off-by: Matt Lord --------- Signed-off-by: Matt Lord * Use atomic.Bool for fakesqldb behavior flags (#12603) Signed-off-by: Matt Lord Signed-off-by: Max Englander Co-authored-by: Matt Lord --------- Signed-off-by: Matt Lord Signed-off-by: Max Englander Co-authored-by: Matt Lord Co-authored-by: Max Englander --- go/mysql/fakesqldb/server.go | 55 +++++++++++------------ go/vt/log/log.go | 33 +++++++++++++- go/vt/vtctl/vdiff2_test.go | 4 +- go/vt/vtctl/vdiff_env_test.go | 31 +++++++------ go/vt/vttablet/tabletserver/bench_test.go | 4 +- go/vt/wrangler/vdiff_env_test.go | 32 +++++++------ go/vt/wrangler/vdiff_test.go | 10 ++--- go/vt/wrangler/vexec_test.go | 8 ++-- go/vt/wrangler/wrangler_env_test.go | 52 +++++++++++---------- 9 files changed, 125 insertions(+), 104 deletions(-) diff --git a/go/mysql/fakesqldb/server.go b/go/mysql/fakesqldb/server.go index 5b00b2c2e01..c1e699fa0d7 100644 --- a/go/mysql/fakesqldb/server.go +++ b/go/mysql/fakesqldb/server.go @@ -25,6 +25,7 @@ import ( "regexp" "strings" "sync" + "sync/atomic" "testing" "time" @@ -67,7 +68,7 @@ type DB struct { acceptWG sync.WaitGroup // orderMatters is set when the query order matters. - orderMatters bool + orderMatters atomic.Bool // Fields set at runtime. @@ -77,16 +78,16 @@ type DB struct { // Use SetName() to change. name string // isConnFail trigger a panic in the connection handler. - isConnFail bool + isConnFail atomic.Bool // connDelay causes a sleep in the connection handler connDelay time.Duration // shouldClose, if true, tells ComQuery() to close the connection when // processing the next query. This will trigger a MySQL client error with // errno 2013 ("server lost"). - shouldClose bool - // AllowAll: if set to true, ComQuery returns an empty result + shouldClose atomic.Bool + // allowAll: if set to true, ComQuery returns an empty result // for all queries. This flag is used for benchmarking. - AllowAll bool + allowAll atomic.Bool // Handler: interface that allows a caller to override the query handling // implementation. By default it points to the DB itself @@ -122,7 +123,7 @@ type DB struct { // if fakesqldb is asked to serve queries or query patterns that it has not been explicitly told about it will // error out by default. However if you set this flag then any unmatched query results in an empty result - neverFail bool + neverFail atomic.Bool } // QueryHandler is the interface used by the DB to simulate executed queries @@ -216,12 +217,8 @@ func (db *DB) SetName(name string) *DB { } // OrderMatters sets the orderMatters flag. -func (db *DB) OrderMatters() *DB { - db.mu.Lock() - defer db.mu.Unlock() - - db.orderMatters = true - return db +func (db *DB) OrderMatters() { + db.orderMatters.Store(true) } // Close closes the Listener and waits for it to stop accepting. @@ -309,7 +306,7 @@ func (db *DB) NewConnection(c *mysql.Conn) { db.mu.Lock() defer db.mu.Unlock() - if db.isConnFail { + if db.isConnFail.Load() { panic(fmt.Errorf("simulating a connection failure")) } @@ -346,11 +343,11 @@ func (db *DB) WarningCount(c *mysql.Conn) uint16 { // HandleQuery is the default implementation of the QueryHandler interface func (db *DB) HandleQuery(c *mysql.Conn, query string, callback func(*sqltypes.Result) error) error { - if db.AllowAll { + if db.allowAll.Load() { return callback(&sqltypes.Result{}) } - if db.orderMatters { + if db.orderMatters.Load() { result, err := db.comQueryOrdered(query) if err != nil { return err @@ -363,7 +360,7 @@ func (db *DB) HandleQuery(c *mysql.Conn, query string, callback func(*sqltypes.R db.queryCalled[key]++ db.querylog = append(db.querylog, key) // Check if we should close the connection and provoke errno 2013. - if db.shouldClose { + if db.shouldClose.Load() { c.Close() //log error @@ -412,7 +409,7 @@ func (db *DB) HandleQuery(c *mysql.Conn, query string, callback func(*sqltypes.R } } - if db.neverFail { + if db.neverFail.Load() { return callback(&sqltypes.Result{}) } // Nothing matched. @@ -450,7 +447,7 @@ func (db *DB) comQueryOrdered(query string) (*sqltypes.Result, error) { index := db.expectedExecuteFetchIndex if index >= len(db.expectedExecuteFetch) { - if db.neverFail { + if db.neverFail.Load() { return &sqltypes.Result{}, nil } db.t.Errorf("%v: got unexpected out of bound fetch: %v >= %v", db.name, index, len(db.expectedExecuteFetch)) @@ -465,7 +462,7 @@ func (db *DB) comQueryOrdered(query string) (*sqltypes.Result, error) { if strings.HasSuffix(expected, "*") { if !strings.HasPrefix(query, expected[0:len(expected)-1]) { - if db.neverFail { + if db.neverFail.Load() { return &sqltypes.Result{}, nil } db.t.Errorf("%v: got unexpected query start (index=%v): %v != %v", db.name, index, query, expected) @@ -473,7 +470,7 @@ func (db *DB) comQueryOrdered(query string) (*sqltypes.Result, error) { } } else { if query != expected { - if db.neverFail { + if db.neverFail.Load() { return &sqltypes.Result{}, nil } db.t.Errorf("%v: got unexpected query (index=%v): %v != %v", db.name, index, query, expected) @@ -629,16 +626,12 @@ func (db *DB) ResetQueryLog() { // EnableConnFail makes connection to this fake DB fail. func (db *DB) EnableConnFail() { - db.mu.Lock() - defer db.mu.Unlock() - db.isConnFail = true + db.isConnFail.Store(true) } // DisableConnFail makes connection to this fake DB success. func (db *DB) DisableConnFail() { - db.mu.Lock() - defer db.mu.Unlock() - db.isConnFail = false + db.isConnFail.Store(false) } // SetConnDelay delays connections to this fake DB for the given duration @@ -650,9 +643,7 @@ func (db *DB) SetConnDelay(d time.Duration) { // EnableShouldClose closes the connection when processing the next query. func (db *DB) EnableShouldClose() { - db.mu.Lock() - defer db.mu.Unlock() - db.shouldClose = true + db.shouldClose.Store(true) } // @@ -757,8 +748,12 @@ func (db *DB) VerifyAllExecutedOrFail() { } } +func (db *DB) SetAllowAll(allowAll bool) { + db.allowAll.Store(allowAll) +} + func (db *DB) SetNeverFail(neverFail bool) { - db.neverFail = neverFail + db.neverFail.Store(neverFail) } func (db *DB) MockQueriesForTable(table string, result *sqltypes.Result) { diff --git a/go/vt/log/log.go b/go/vt/log/log.go index 339b80fef02..79be1da464c 100644 --- a/go/vt/log/log.go +++ b/go/vt/log/log.go @@ -22,6 +22,10 @@ limitations under the License. package log import ( + "fmt" + "strconv" + "sync/atomic" + "github.com/golang/glog" "github.com/spf13/pflag" ) @@ -78,5 +82,32 @@ var ( // calls this function, or call this function directly before parsing // command-line arguments. func RegisterFlags(fs *pflag.FlagSet) { - fs.Uint64Var(&glog.MaxSize, "log_rotate_max_size", glog.MaxSize, "size in bytes at which logs are rotated (glog.MaxSize)") + flagVal := logRotateMaxSize{ + val: fmt.Sprintf("%d", atomic.LoadUint64(&glog.MaxSize)), + } + fs.Var(&flagVal, "log_rotate_max_size", "size in bytes at which logs are rotated (glog.MaxSize)") +} + +// logRotateMaxSize implements pflag.Value and is used to +// try and provide thread-safe access to glog.MaxSize. +type logRotateMaxSize struct { + val string +} + +func (lrms *logRotateMaxSize) Set(s string) error { + maxSize, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return err + } + atomic.StoreUint64(&glog.MaxSize, maxSize) + lrms.val = s + return nil +} + +func (lrms *logRotateMaxSize) String() string { + return lrms.val +} + +func (lrms *logRotateMaxSize) Type() string { + return "uint64" } diff --git a/go/vt/vtctl/vdiff2_test.go b/go/vt/vtctl/vdiff2_test.go index d2aedf6625a..368f21eb93b 100644 --- a/go/vt/vtctl/vdiff2_test.go +++ b/go/vt/vtctl/vdiff2_test.go @@ -35,7 +35,7 @@ var ( ) func TestVDiff2Unsharded(t *testing.T) { - env := newTestVDiffEnv([]string{"0"}, []string{"0"}, "", nil) + env := newTestVDiffEnv(t, []string{"0"}, []string{"0"}, "", nil) defer env.close() UUID := uuid.New().String() @@ -275,7 +275,7 @@ func TestVDiff2Unsharded(t *testing.T) { } func TestVDiff2Sharded(t *testing.T) { - env := newTestVDiffEnv([]string{"-40", "40-"}, []string{"-80", "80-"}, "", map[string]string{ + env := newTestVDiffEnv(t, []string{"-40", "40-"}, []string{"-80", "80-"}, "", map[string]string{ "-80": "MySQL56/0e45e704-7cb9-11ed-a1eb-0242ac120002:1-890", "80-": "MySQL56/1497ddb0-7cb9-11ed-a1eb-0242ac120002:1-891", }) diff --git a/go/vt/vtctl/vdiff_env_test.go b/go/vt/vtctl/vdiff_env_test.go index 3de307cb2cf..5fb854284ae 100644 --- a/go/vt/vtctl/vdiff_env_test.go +++ b/go/vt/vtctl/vdiff_env_test.go @@ -19,7 +19,9 @@ package vtctl import ( "context" "fmt" + "math/rand" "sync" + "testing" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/grpcclient" @@ -64,25 +66,10 @@ type testVDiffEnv struct { tablets map[int]*testVDiffTablet } -// vdiffEnv has to be a global for RegisterDialer to work. -var vdiffEnv *testVDiffEnv - -func init() { - tabletconn.RegisterDialer("VDiffTest", func(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (queryservice.QueryService, error) { - vdiffEnv.mu.Lock() - defer vdiffEnv.mu.Unlock() - if qs, ok := vdiffEnv.tablets[int(tablet.Alias.Uid)]; ok { - return qs, nil - } - return nil, fmt.Errorf("tablet %d not found", tablet.Alias.Uid) - }) -} - //---------------------------------------------- // testVDiffEnv -func newTestVDiffEnv(sourceShards, targetShards []string, query string, positions map[string]string) *testVDiffEnv { - tabletconntest.SetProtocol("go.vt.vtctl.vdiff_env_test", "VDiffTest") +func newTestVDiffEnv(t testing.TB, sourceShards, targetShards []string, query string, positions map[string]string) *testVDiffEnv { env := &testVDiffEnv{ workflow: "vdiffTest", tablets: make(map[int]*testVDiffTablet), @@ -94,6 +81,18 @@ func newTestVDiffEnv(sourceShards, targetShards []string, query string, position } env.wr = wrangler.NewTestWrangler(env.cmdlog, env.topoServ, env.tmc) + // Generate a unique dialer name. + dialerName := fmt.Sprintf("VDiffTest-%s-%d", t.Name(), rand.Intn(1000000000)) + tabletconn.RegisterDialer(dialerName, func(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (queryservice.QueryService, error) { + env.mu.Lock() + defer env.mu.Unlock() + if qs, ok := env.tablets[int(tablet.Alias.Uid)]; ok { + return qs, nil + } + return nil, fmt.Errorf("tablet %d not found", tablet.Alias.Uid) + }) + tabletconntest.SetProtocol("go.vt.vtctl.vdiff_env_test", dialerName) + tabletID := 100 for _, shard := range sourceShards { _ = env.addTablet(tabletID, "source", shard, topodatapb.TabletType_PRIMARY) diff --git a/go/vt/vttablet/tabletserver/bench_test.go b/go/vt/vttablet/tabletserver/bench_test.go index 06d7abe391b..270e98019ec 100644 --- a/go/vt/vttablet/tabletserver/bench_test.go +++ b/go/vt/vttablet/tabletserver/bench_test.go @@ -68,7 +68,7 @@ func BenchmarkExecuteVarBinary(b *testing.B) { } target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} - db.AllowAll = true + db.SetAllowAll(true) for i := 0; i < b.N; i++ { if _, err := tsv.Execute(context.Background(), &target, benchQuery, bv, 0, 0, nil); err != nil { panic(err) @@ -93,7 +93,7 @@ func BenchmarkExecuteExpression(b *testing.B) { } target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} - db.AllowAll = true + db.SetAllowAll(true) for i := 0; i < b.N; i++ { if _, err := tsv.Execute(context.Background(), &target, benchQuery, bv, 0, 0, nil); err != nil { panic(err) diff --git a/go/vt/wrangler/vdiff_env_test.go b/go/vt/wrangler/vdiff_env_test.go index 0e13ba8207e..1c28708b520 100644 --- a/go/vt/wrangler/vdiff_env_test.go +++ b/go/vt/wrangler/vdiff_env_test.go @@ -19,7 +19,9 @@ package wrangler import ( "context" "fmt" + "math/rand" "sync" + "testing" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/grpcclient" @@ -62,25 +64,10 @@ type testVDiffEnv struct { tablets map[int]*testVDiffTablet } -// vdiffEnv has to be a global for RegisterDialer to work. -var vdiffEnv *testVDiffEnv - -func init() { - tabletconn.RegisterDialer("VDiffTest", func(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (queryservice.QueryService, error) { - vdiffEnv.mu.Lock() - defer vdiffEnv.mu.Unlock() - if qs, ok := vdiffEnv.tablets[int(tablet.Alias.Uid)]; ok { - return qs, nil - } - return nil, fmt.Errorf("tablet %d not found", tablet.Alias.Uid) - }) -} - //---------------------------------------------- // testVDiffEnv -func newTestVDiffEnv(sourceShards, targetShards []string, query string, positions map[string]string) *testVDiffEnv { - tabletconntest.SetProtocol("go.vt.wrangler.vdiff_env_test", "VDiffTest") +func newTestVDiffEnv(t testing.TB, sourceShards, targetShards []string, query string, positions map[string]string) *testVDiffEnv { env := &testVDiffEnv{ workflow: "vdiffTest", tablets: make(map[int]*testVDiffTablet), @@ -91,6 +78,18 @@ func newTestVDiffEnv(sourceShards, targetShards []string, query string, position } env.wr = New(logutil.NewConsoleLogger(), env.topoServ, env.tmc) + // Generate a unique dialer name. + dialerName := fmt.Sprintf("VDiffTest-%s-%d", t.Name(), rand.Intn(1000000000)) + tabletconn.RegisterDialer(dialerName, func(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (queryservice.QueryService, error) { + env.mu.Lock() + defer env.mu.Unlock() + if qs, ok := env.tablets[int(tablet.Alias.Uid)]; ok { + return qs, nil + } + return nil, fmt.Errorf("tablet %d not found", tablet.Alias.Uid) + }) + tabletconntest.SetProtocol("go.vt.wrangler.vdiff_env_test", dialerName) + tabletID := 100 for _, shard := range sourceShards { _ = env.addTablet(tabletID, "source", shard, topodatapb.TabletType_PRIMARY) @@ -167,7 +166,6 @@ func newTestVDiffEnv(sourceShards, targetShards []string, query string, position tabletID += 10 } - vdiffEnv = env return env } diff --git a/go/vt/wrangler/vdiff_test.go b/go/vt/wrangler/vdiff_test.go index 5c3e11947f1..a410f567d62 100644 --- a/go/vt/wrangler/vdiff_test.go +++ b/go/vt/wrangler/vdiff_test.go @@ -490,7 +490,7 @@ func TestVDiffPlanFailure(t *testing.T) { } func TestVDiffUnsharded(t *testing.T) { - env := newTestVDiffEnv([]string{"0"}, []string{"0"}, "", nil) + env := newTestVDiffEnv(t, []string{"0"}, []string{"0"}, "", nil) defer env.close() schm := &tabletmanagerdatapb.SchemaDefinition{ @@ -767,7 +767,7 @@ func TestVDiffUnsharded(t *testing.T) { func TestVDiffSharded(t *testing.T) { // Also test that highest position ""MariaDB/5-456-892" will be used // if lower positions are found. - env := newTestVDiffEnv([]string{"-40", "40-"}, []string{"-80", "80-"}, "", map[string]string{ + env := newTestVDiffEnv(t, []string{"-40", "40-"}, []string{"-80", "80-"}, "", map[string]string{ "-40-80": "MariaDB/5-456-890", "40-80-": "MariaDB/5-456-891", }) @@ -838,7 +838,7 @@ func TestVDiffSharded(t *testing.T) { } func TestVDiffAggregates(t *testing.T) { - env := newTestVDiffEnv([]string{"-40", "40-"}, []string{"-80", "80-"}, "select c1, count(*) c2, sum(c3) c3 from t group by c1", nil) + env := newTestVDiffEnv(t, []string{"-40", "40-"}, []string{"-80", "80-"}, "select c1, count(*) c2, sum(c3) c3 from t group by c1", nil) defer env.close() schm := &tabletmanagerdatapb.SchemaDefinition{ @@ -905,7 +905,7 @@ func TestVDiffAggregates(t *testing.T) { } func TestVDiffDefaults(t *testing.T) { - env := newTestVDiffEnv([]string{"0"}, []string{"0"}, "", nil) + env := newTestVDiffEnv(t, []string{"0"}, []string{"0"}, "", nil) defer env.close() schm := &tabletmanagerdatapb.SchemaDefinition{ @@ -958,7 +958,7 @@ func TestVDiffDefaults(t *testing.T) { } func TestVDiffReplicationWait(t *testing.T) { - env := newTestVDiffEnv([]string{"0"}, []string{"0"}, "", nil) + env := newTestVDiffEnv(t, []string{"0"}, []string{"0"}, "", nil) defer env.close() schm := &tabletmanagerdatapb.SchemaDefinition{ diff --git a/go/vt/wrangler/vexec_test.go b/go/vt/wrangler/vexec_test.go index 21a30b89f7d..499a8d77581 100644 --- a/go/vt/wrangler/vexec_test.go +++ b/go/vt/wrangler/vexec_test.go @@ -36,7 +36,7 @@ func TestVExec(t *testing.T) { workflow := "wrWorkflow" keyspace := "target" query := "update _vt.vreplication set state = 'Running'" - env := newWranglerTestEnv([]string{"0"}, []string{"-80", "80-"}, "", nil, time.Now().Unix()) + env := newWranglerTestEnv(t, []string{"0"}, []string{"-80", "80-"}, "", nil, time.Now().Unix()) defer env.close() var logger = logutil.NewMemoryLogger() wr := New(logger, env.topoServ, env.tmc) @@ -180,7 +180,7 @@ func TestWorkflowListStreams(t *testing.T) { ctx := context.Background() workflow := "wrWorkflow" keyspace := "target" - env := newWranglerTestEnv([]string{"0"}, []string{"-80", "80-"}, "", nil, 1234) + env := newWranglerTestEnv(t, []string{"0"}, []string{"-80", "80-"}, "", nil, 1234) defer env.close() logger := logutil.NewMemoryLogger() wr := New(logger, env.topoServ, env.tmc) @@ -353,7 +353,7 @@ func TestWorkflowListAll(t *testing.T) { ctx := context.Background() keyspace := "target" workflow := "wrWorkflow" - env := newWranglerTestEnv([]string{"0"}, []string{"-80", "80-"}, "", nil, 0) + env := newWranglerTestEnv(t, []string{"0"}, []string{"-80", "80-"}, "", nil, 0) defer env.close() logger := logutil.NewMemoryLogger() wr := New(logger, env.topoServ, env.tmc) @@ -373,7 +373,7 @@ func TestVExecValidations(t *testing.T) { workflow := "wf" keyspace := "ks" query := "" - env := newWranglerTestEnv([]string{"0"}, []string{"-80", "80-"}, "", nil, 0) + env := newWranglerTestEnv(t, []string{"0"}, []string{"-80", "80-"}, "", nil, 0) defer env.close() wr := New(logutil.NewConsoleLogger(), env.topoServ, env.tmc) diff --git a/go/vt/wrangler/wrangler_env_test.go b/go/vt/wrangler/wrangler_env_test.go index 4f5bb64268d..c6479d83151 100644 --- a/go/vt/wrangler/wrangler_env_test.go +++ b/go/vt/wrangler/wrangler_env_test.go @@ -19,7 +19,9 @@ package wrangler import ( "context" "fmt" + "math/rand" "sync" + "testing" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/grpcclient" @@ -53,39 +55,35 @@ type testWranglerEnv struct { tabletType topodatapb.TabletType tmc *testWranglerTMClient mu sync.Mutex - tablets map[int]*testWranglerTablet -} - -// wranglerEnv has to be a global for RegisterDialer to work. -var wranglerEnv *testWranglerEnv - -func init() { - tabletconn.RegisterDialer("WranglerTest", func(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (queryservice.QueryService, error) { - wranglerEnv.mu.Lock() - defer wranglerEnv.mu.Unlock() - if qs, ok := wranglerEnv.tablets[int(tablet.Alias.Uid)]; ok { - return qs, nil - } - // some tests don't require the query service. Earlier we were returning an error for such cases but the tablet picker - // now logs a warning and spams the logs. Hence we return a fake service instead - return newFakeTestWranglerTablet(), nil - }) } //---------------------------------------------- // testWranglerEnv -func newWranglerTestEnv(sourceShards, targetShards []string, query string, positions map[string]string, timeUpdated int64) *testWranglerEnv { - tabletconntest.SetProtocol("go.vt.wrangler.vdiff_env_test", "WranglerTest") +func newWranglerTestEnv(t testing.TB, sourceShards, targetShards []string, query string, positions map[string]string, timeUpdated int64) *testWranglerEnv { env := &testWranglerEnv{ workflow: "wrWorkflow", - tablets: make(map[int]*testWranglerTablet), topoServ: memorytopo.NewServer("zone1"), cell: "zone1", tabletType: topodatapb.TabletType_REPLICA, tmc: newTestWranglerTMClient(), } env.wr = New(logutil.NewConsoleLogger(), env.topoServ, env.tmc) + env.tmc.tablets = make(map[int]*testWranglerTablet) + + // Generate a unique dialer name. + dialerName := fmt.Sprintf("WranglerTest-%s-%d", t.Name(), rand.Intn(1000000000)) + tabletconn.RegisterDialer(dialerName, func(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (queryservice.QueryService, error) { + env.mu.Lock() + defer env.mu.Unlock() + if qs, ok := env.tmc.tablets[int(tablet.Alias.Uid)]; ok { + return qs, nil + } + // some tests don't require the query service. Earlier we were returning an error for such cases but the tablet picker + // now logs a warning and spams the logs. Hence we return a fake service instead + return newFakeTestWranglerTablet(), nil + }) + tabletconntest.SetProtocol("go.vt.wrangler.wrangler_env_test", dialerName) tabletID := 100 for _, shard := range sourceShards { @@ -198,17 +196,16 @@ func newWranglerTestEnv(sourceShards, targetShards []string, query string, posit "wrWorkflow", "wrWorkflow2", ) env.tmc.setVRResults(primary.tablet, "select distinct workflow from _vt.vreplication where db_name = 'vt_target2'", result) - wranglerEnv = env return env } func (env *testWranglerEnv) close() { env.mu.Lock() defer env.mu.Unlock() - for _, t := range env.tablets { + for _, t := range env.tmc.tablets { env.topoServ.DeleteTablet(context.Background(), t.tablet.Alias) } - env.tablets = nil + env.tmc.tablets = nil } func newFakeTestWranglerTablet() *testWranglerTablet { @@ -245,7 +242,7 @@ func (env *testWranglerEnv) addTablet(id int, keyspace, shard string, tabletType "test": int32(id), }, } - env.tablets[id] = newTestWranglerTablet(tablet) + env.tmc.tablets[id] = newTestWranglerTablet(tablet) if err := env.wr.TopoServer().InitTablet(context.Background(), tablet, false /* allowPrimaryOverride */, true /* createShardAndKeyspace */, false /* allowUpdate */); err != nil { panic(err) } @@ -258,8 +255,8 @@ func (env *testWranglerEnv) addTablet(id int, keyspace, shard string, tabletType panic(err) } } - env.tablets[id].queryResults = make(map[string]*querypb.QueryResult) - return env.tablets[id] + env.tmc.tablets[id].queryResults = make(map[string]*querypb.QueryResult) + return env.tmc.tablets[id] } //---------------------------------------------- @@ -296,6 +293,7 @@ func (tvt *testWranglerTablet) StreamHealth(ctx context.Context, callback func(* type testWranglerTMClient struct { tmclient.TabletManagerClient + tablets map[int]*testWranglerTablet schema *tabletmanagerdatapb.SchemaDefinition vrQueries map[int]map[string]*querypb.QueryResult waitpos map[int]string @@ -334,7 +332,7 @@ func (tmc *testWranglerTMClient) VReplicationExec(ctx context.Context, tablet *t } func (tmc *testWranglerTMClient) ExecuteFetchAsApp(ctx context.Context, tablet *topodatapb.Tablet, usePool bool, req *tabletmanagerdatapb.ExecuteFetchAsAppRequest) (*querypb.QueryResult, error) { - t := wranglerEnv.tablets[int(tablet.Alias.Uid)] + t := tmc.tablets[int(tablet.Alias.Uid)] t.gotQueries = append(t.gotQueries, string(req.Query)) result, ok := t.queryResults[string(req.Query)] if !ok { From 859dfb464ada7d28de2a778d4044c9c2a4aa661e Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 29 Mar 2023 08:52:49 +0200 Subject: [PATCH 079/233] vschema ddl: add grammar to accept qualified tables (#12577) (#12748) Signed-off-by: Hormoz Kheradmand Signed-off-by: Florent Poinsard Co-authored-by: Hormoz Kheradmand --- go/vt/sqlparser/sql.go | 12205 ++++++++++---------- go/vt/sqlparser/sql.y | 6 +- go/vt/vtgate/executor_vschema_ddl_test.go | 12 + 3 files changed, 6146 insertions(+), 6077 deletions(-) diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 8aac4bca374..8bb9199121d 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -1381,19 +1381,19 @@ var yyExca = [...]int{ 135, 165, 176, 165, 345, 165, - -2, 519, + -2, 520, -1, 58, - 36, 766, - 239, 766, - 250, 766, - 285, 780, - 286, 780, - -2, 768, + 36, 767, + 239, 767, + 250, 767, + 285, 781, + 286, 781, + -2, 769, -1, 63, - 241, 804, - -2, 802, + 241, 805, + -2, 803, -1, 118, - 238, 1456, + 238, 1457, -2, 131, -1, 120, 1, 158, @@ -1402,42 +1402,42 @@ var yyExca = [...]int{ -1, 131, 136, 405, 244, 405, - -2, 508, + -2, 509, -1, 150, 135, 165, 176, 165, 345, 165, - -2, 528, + -2, 529, -1, 810, - 87, 1473, - -2, 1327, - -1, 811, 87, 1474, - 221, 1478, -2, 1328, + -1, 811, + 87, 1475, + 221, 1479, + -2, 1329, -1, 812, - 221, 1477, + 221, 1478, -2, 40, -1, 892, - 60, 878, - -2, 893, + 60, 879, + -2, 894, -1, 978, 249, 41, 254, 41, -2, 416, -1, 1063, - 1, 576, - 665, 576, + 1, 577, + 665, 577, -2, 165, -1, 1362, - 221, 1478, - -2, 1328, + 221, 1479, + -2, 1329, -1, 1510, - 60, 879, - -2, 898, - -1, 1511, 60, 880, -2, 899, + -1, 1511, + 60, 881, + -2, 900, -1, 1562, 135, 165, 176, 165, @@ -1446,17 +1446,17 @@ var yyExca = [...]int{ -1, 1643, 136, 405, 244, 405, - -2, 508, + -2, 509, -1, 1652, 249, 42, 254, 42, -2, 417, -1, 2011, - 221, 1482, - -2, 1476, + 221, 1483, + -2, 1477, -1, 2012, - 221, 1478, - -2, 1474, + 221, 1479, + -2, 1475, -1, 2112, 135, 165, 176, 165, @@ -1468,461 +1468,461 @@ var yyExca = [...]int{ -1, 2486, 78, 96, 88, 96, - -2, 957, + -2, 958, -1, 2555, - 640, 692, - -2, 666, + 640, 693, + -2, 667, -1, 2722, - 50, 1424, - -2, 1418, + 50, 1425, + -2, 1419, -1, 3375, - 640, 692, - -2, 680, - -1, 3463, - 90, 624, - 95, 624, - 105, 624, - 178, 624, - 179, 624, - 180, 624, - 181, 624, - 182, 624, - 183, 624, - 184, 624, - 185, 624, - 186, 624, - 187, 624, - 188, 624, - 189, 624, - 190, 624, - 191, 624, - 192, 624, - 193, 624, - 194, 624, - 195, 624, - 196, 624, - 197, 624, - 198, 624, - 199, 624, - 200, 624, - 201, 624, - 202, 624, - 203, 624, - 204, 624, - 205, 624, - 206, 624, - 207, 624, - 208, 624, - 209, 624, - 210, 624, - 211, 624, - 212, 624, - 213, 624, - 214, 624, - 215, 624, - 216, 624, - 217, 624, - 218, 624, - 219, 624, - -2, 1835, + 640, 693, + -2, 681, + -1, 3464, + 90, 625, + 95, 625, + 105, 625, + 178, 625, + 179, 625, + 180, 625, + 181, 625, + 182, 625, + 183, 625, + 184, 625, + 185, 625, + 186, 625, + 187, 625, + 188, 625, + 189, 625, + 190, 625, + 191, 625, + 192, 625, + 193, 625, + 194, 625, + 195, 625, + 196, 625, + 197, 625, + 198, 625, + 199, 625, + 200, 625, + 201, 625, + 202, 625, + 203, 625, + 204, 625, + 205, 625, + 206, 625, + 207, 625, + 208, 625, + 209, 625, + 210, 625, + 211, 625, + 212, 625, + 213, 625, + 214, 625, + 215, 625, + 216, 625, + 217, 625, + 218, 625, + 219, 625, + -2, 1836, } const yyPrivate = 57344 -const yyLast = 47187 +const yyLast = 47659 var yyAct = [...]int{ - 1518, 3534, 3123, 3124, 814, 821, 3122, 3356, 3545, 813, - 684, 3440, 3503, 3461, 3504, 3093, 2950, 1565, 1878, 3406, - 2109, 2060, 3429, 2872, 2774, 2781, 2040, 3340, 3288, 2832, - 2823, 2837, 2834, 2833, 2831, 2836, 2835, 3338, 3080, 885, - 1824, 2738, 776, 5, 3328, 3152, 2789, 2420, 2042, 2852, - 663, 2681, 2735, 2183, 666, 2386, 2736, 3157, 2459, 2851, - 2739, 2989, 2616, 2064, 774, 2983, 694, 3009, 2854, 2080, - 1525, 1127, 2733, 2723, 2446, 2002, 2975, 775, 1075, 664, - 2171, 2146, 2520, 662, 2151, 2878, 2083, 1621, 2600, 940, - 2522, 2521, 2552, 2471, 159, 2214, 2097, 2084, 1668, 2438, - 2422, 1999, 39, 1973, 41, 1874, 2085, 2452, 1129, 1512, - 909, 1893, 908, 145, 2592, 780, 1104, 1832, 40, 2170, - 2192, 2153, 2072, 2231, 2513, 1650, 1010, 968, 973, 1554, - 2488, 1534, 2087, 1374, 676, 986, 1492, 96, 659, 887, - 1851, 1897, 1302, 1657, 2007, 947, 1287, 2168, 1749, 781, - 944, 100, 979, 948, 2142, 974, 975, 1771, 1767, 2143, - 1553, 926, 976, 671, 928, 1539, 899, 1358, 1334, 1969, - 1823, 1125, 896, 1118, 1776, 81, 1616, 1642, 103, 128, - 101, 95, 129, 1059, 921, 897, 894, 653, 895, 102, - 80, 670, 1382, 89, 3365, 1378, 2545, 889, 163, 893, - 123, 94, 121, 122, 2065, 3535, 2185, 2186, 2187, 3391, - 3081, 2820, 2185, 2575, 2574, 2229, 2543, 1734, 911, 916, - 920, 3073, 3487, 3036, 830, 831, 832, 91, 632, 130, - 91, 91, 2608, 902, 2609, 3392, 3387, 3386, 1839, 1972, - 1838, 638, 1837, 912, 941, 1015, 918, 918, 1836, 124, - 1854, 2037, 2038, 3127, 1835, 1834, 1807, 654, 656, 1298, - 657, 2274, 1488, 598, 2842, 2008, 1303, 2418, 990, 966, - 886, 3482, 888, 3441, 1012, 2719, 935, 2448, 903, 2565, - 2685, 638, 1319, 2, 830, 831, 832, 1029, 1030, 1031, - 1023, 1034, 1035, 1036, 1037, 989, 910, 1040, 1041, 1042, - 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, - 1053, 1054, 1055, 1056, 1016, 1019, 1020, 936, 1303, 124, - 2840, 964, 2842, 963, 962, 632, 107, 108, 109, 965, - 112, 3127, 2218, 118, 658, 2839, 187, 1906, 3387, 593, - 3126, 3507, 3555, 957, 952, 2777, 2846, 3491, 3447, 2955, - 651, 652, 3489, 3502, 3525, 934, 778, 779, 2954, 2568, - 881, 882, 883, 884, 91, 3341, 892, 629, 1032, 2387, - 1844, 2216, 3490, 2897, 1313, 3284, 2217, 3488, 2840, 3283, - 1014, 3086, 82, 2162, 3087, 84, 1013, 124, 1519, 3516, - 2778, 3294, 2283, 3485, 923, 924, 82, 82, 3105, 632, - 1289, 3094, 3430, 632, 2846, 3437, 2156, 2211, 3447, 3293, - 186, 3104, 1883, 3370, 2780, 614, 3466, 1316, 3126, 1317, - 1318, 934, 778, 779, 2917, 1631, 1313, 2497, 612, 1555, - 2496, 1556, 2775, 2498, 125, 2419, 147, 82, 633, 2582, - 2583, 2771, 2772, 2104, 2105, 2068, 3170, 168, 2770, 2791, - 2792, 2103, 1816, 1817, 2607, 2280, 2776, 2281, 2843, 2039, - 91, 2462, 2591, 1094, 961, 632, 1068, 1069, 609, 3471, - 879, 1299, 1099, 1100, 91, 91, 878, 624, 158, 3357, - 1309, 2509, 632, 1301, 146, 1082, 2463, 3469, 1122, 2782, - 1083, 2546, 619, 2650, 1095, 1082, 3475, 3476, 1071, 1288, - 1083, 2986, 622, 165, 2791, 2792, 166, 2905, 1081, 2903, - 1080, 3470, 2122, 2121, 1335, 91, 2843, 632, 2275, 2276, - 2278, 2277, 959, 1088, 2874, 134, 135, 157, 156, 185, - 3508, 1058, 1309, 2455, 2456, 633, 2894, 1336, 1337, 1338, - 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, 2272, 1819, - 1815, 3509, 646, 2155, 650, 1551, 644, 2790, 1033, 2244, - 2240, 2242, 2243, 2241, 2245, 2246, 2879, 2593, 599, 2793, - 601, 615, 1496, 635, 1101, 634, 605, 632, 603, 607, - 616, 608, 2553, 602, 1102, 613, 1096, 2193, 604, 617, - 618, 621, 625, 626, 627, 623, 620, 2237, 611, 636, - 2578, 1121, 3483, 1111, 3537, 1113, 2867, 1750, 1755, 633, - 1724, 2232, 2790, 633, 2868, 1089, 2875, 1115, 3316, 2068, - 3317, 1097, 1098, 2684, 2793, 1120, 1103, 1064, 151, 132, - 154, 139, 131, 2595, 152, 153, 3075, 2066, 2067, 956, - 3074, 169, 958, 1110, 1112, 927, 2255, 960, 1039, 1038, - 175, 140, 2238, 2252, 1725, 2253, 1726, 2254, 2651, 2236, - 2876, 2234, 3268, 186, 2196, 143, 141, 136, 137, 138, - 142, 937, 931, 929, 3131, 633, 3071, 133, 1078, 2081, - 1084, 1085, 1086, 1087, 1062, 2779, 144, 125, 970, 999, - 1008, 1007, 633, 969, 997, 1635, 186, 970, 1006, 1005, - 168, 2235, 1499, 1004, 1123, 1124, 1003, 1002, 1001, 996, - 1009, 1308, 1305, 1306, 1307, 1312, 1314, 1311, 1349, 1310, - 125, 3364, 1360, 2544, 1349, 2793, 945, 633, 3443, 1304, - 945, 982, 967, 168, 943, 1116, 1370, 937, 931, 929, - 961, 1092, 953, 2502, 3556, 2281, 3514, 1108, 2599, 955, - 954, 1109, 1352, 1353, 1354, 1355, 165, 945, 1656, 166, - 3442, 1114, 1366, 1308, 1305, 1306, 1307, 1312, 1314, 1311, - 981, 1310, 1280, 827, 160, 2580, 827, 827, 2215, 1552, - 1768, 1304, 185, 2547, 2169, 1107, 2511, 633, 3443, 165, - 3070, 922, 166, 2596, 2423, 2425, 3549, 2987, 959, 1320, - 2222, 2221, 1281, 1282, 2612, 2567, 1764, 1290, 1018, 637, - 2295, 2066, 2067, 1356, 981, 185, 2159, 1026, 1017, 2813, - 3442, 1758, 85, 1756, 1757, 2577, 1759, 1760, 1375, 988, - 630, 1736, 1735, 1737, 1738, 1739, 1000, 3034, 3035, 961, - 1057, 998, 1629, 1628, 3125, 631, 3103, 1627, 988, 2566, - 2563, 1765, 155, 1297, 1625, 1025, 2160, 597, 592, 120, - 2783, 2844, 2845, 2158, 2787, 2590, 1655, 2213, 2589, 1350, - 1351, 2786, 3353, 1754, 2848, 3023, 2453, 3005, 1079, 988, - 2282, 2939, 2493, 930, 90, 2895, 2458, 2395, 1886, 1380, - 1384, 1381, 1543, 1451, 169, 1520, 1522, 2161, 90, 90, - 1073, 2110, 1349, 175, 1061, 2788, 1346, 2157, 2769, 2602, - 2784, 1105, 2602, 148, 2601, 2785, 149, 2601, 905, 2844, - 2845, 1119, 3125, 960, 3378, 1777, 3474, 169, 1503, 1487, - 1077, 987, 2848, 115, 1907, 1011, 175, 1070, 1067, 90, - 3066, 2999, 1486, 2233, 1091, 1828, 161, 2636, 1908, 930, - 987, 1761, 1557, 173, 1898, 1093, 981, 984, 985, 2536, - 945, 2424, 1317, 1318, 978, 982, 988, 1898, 3517, 2312, - 3473, 2205, 1318, 3166, 3041, 1457, 1458, 1459, 1460, 1461, - 3040, 987, 2200, 2617, 1665, 977, 991, 981, 1664, 1654, - 2210, 993, 2208, 1487, 181, 994, 992, 999, 1500, 997, - 1504, 3557, 1502, 3510, 100, 116, 1506, 1060, 3024, 3551, - 2209, 1493, 889, 1480, 988, 3547, 995, 901, 3548, 1744, - 3546, 1751, 960, 1752, 2205, 3276, 1753, 160, 3100, 1505, - 3101, 103, 1662, 101, 3408, 3275, 3346, 162, 167, 164, - 170, 171, 172, 174, 176, 177, 178, 179, 1063, 2287, - 2288, 2289, 1535, 180, 182, 183, 184, 3266, 1106, 1697, - 160, 2212, 1700, 2207, 1702, 1490, 1648, 2619, 987, 1742, - 1024, 3116, 1778, 1076, 1021, 1319, 1521, 1905, 886, 3409, - 1501, 3347, 3115, 1743, 1524, 3048, 1641, 888, 3558, 1623, - 3047, 1719, 1632, 1633, 1634, 1670, 2004, 1671, 2004, 1673, - 1675, 3037, 2001, 1679, 1681, 1683, 1685, 1687, 1548, 1549, - 1701, 2003, 1660, 830, 831, 832, 987, 1846, 1848, 1849, - 1658, 1658, 981, 984, 985, 825, 945, 1519, 988, 1659, - 978, 982, 1731, 1741, 1903, 1624, 2821, 2629, 2628, 2627, - 2809, 1847, 2621, 1904, 2625, 2518, 2620, 2517, 2618, 1638, - 2516, 1639, 2165, 2623, 1637, 1651, 1745, 1729, 2871, 1709, - 1710, 1335, 2622, 2611, 1728, 1715, 1716, 1781, 1341, 1342, - 1344, 1343, 1345, 1346, 1785, 1507, 1787, 1788, 1789, 1790, - 2624, 2626, 1773, 1794, 1336, 1337, 1338, 1339, 1340, 1341, - 1342, 1344, 1343, 1345, 1346, 1806, 1730, 1779, 1780, 161, - 1727, 1717, 1284, 1711, 1708, 1707, 173, 1856, 1706, 1677, - 1316, 1784, 1317, 1318, 3031, 638, 1775, 638, 1791, 1792, - 1793, 1857, 1347, 1348, 1855, 1551, 1335, 2500, 638, 1769, - 987, 1705, 161, 2181, 2180, 991, 981, 2179, 2178, 173, - 993, 1630, 2177, 2176, 994, 992, 1335, 181, 2351, 1336, - 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, - 2444, 3536, 124, 1319, 964, 1783, 963, 962, 3511, 1336, - 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, - 181, 3498, 1519, 1315, 1519, 2998, 1804, 2444, 3436, 1805, + 1518, 821, 3537, 3123, 3548, 3122, 813, 3356, 3441, 814, + 3124, 3505, 3462, 684, 3506, 2950, 3093, 1565, 1878, 3406, + 1771, 2060, 1129, 2872, 3429, 2040, 2774, 2781, 3340, 3288, + 2832, 3338, 2837, 2834, 2833, 2831, 2836, 2835, 1824, 2823, + 2735, 5, 3080, 2738, 2109, 781, 885, 3328, 3152, 2183, + 2420, 2459, 2386, 2851, 2681, 666, 2739, 2736, 2989, 2042, + 1525, 3157, 2852, 775, 774, 694, 2789, 2064, 663, 2983, + 2616, 2080, 3009, 2854, 2733, 2446, 2723, 2002, 2975, 2171, + 2552, 1075, 2146, 2471, 2520, 2878, 2600, 1621, 2151, 940, + 2214, 2521, 159, 2522, 2083, 1127, 2097, 664, 2452, 2438, + 662, 1999, 1972, 2084, 41, 39, 2422, 1874, 1973, 1893, + 2592, 2085, 1104, 2192, 1650, 1832, 145, 908, 2170, 2072, + 2231, 2153, 2513, 973, 968, 1554, 986, 2488, 1534, 1668, + 1374, 2087, 96, 909, 1492, 887, 676, 1512, 1851, 1897, + 1302, 1657, 1287, 947, 944, 976, 1767, 979, 2168, 776, + 1749, 2142, 2143, 1553, 974, 948, 671, 1010, 975, 926, + 1539, 899, 659, 928, 1358, 1334, 1823, 896, 1969, 95, + 81, 1125, 780, 103, 100, 40, 101, 1118, 1776, 163, + 1616, 2065, 123, 121, 1642, 128, 122, 897, 895, 894, + 129, 1059, 921, 102, 80, 653, 670, 2007, 1378, 1382, + 3365, 2545, 94, 3538, 3081, 2, 89, 2185, 2186, 2187, + 2185, 2820, 3391, 2575, 2574, 2229, 2543, 916, 920, 3073, + 1734, 1488, 632, 3489, 2608, 3036, 2609, 3387, 902, 91, + 124, 91, 638, 1839, 3127, 1838, 130, 1837, 3392, 941, + 598, 91, 1836, 1015, 2037, 2038, 1835, 1834, 107, 108, + 109, 1303, 112, 1807, 889, 118, 893, 3386, 187, 990, + 1854, 593, 656, 966, 657, 654, 903, 912, 3483, 935, + 918, 918, 651, 652, 886, 911, 888, 2274, 989, 1298, + 3127, 1023, 881, 882, 883, 884, 2418, 2719, 892, 1303, + 2842, 1519, 2565, 658, 936, 2008, 3509, 1016, 1019, 1020, + 124, 1906, 2448, 964, 963, 1012, 965, 962, 952, 910, + 957, 2685, 830, 831, 832, 3558, 923, 924, 1029, 1030, + 1031, 3126, 1034, 1035, 1036, 1037, 1319, 186, 1040, 1041, + 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, + 1052, 1053, 1054, 1055, 1056, 1032, 2840, 934, 778, 779, + 3493, 125, 3472, 147, 830, 831, 832, 3504, 3387, 1313, + 2218, 3442, 3528, 2955, 168, 3491, 2954, 3126, 124, 2842, + 3470, 2216, 2846, 2568, 3341, 3492, 2387, 1844, 2897, 3476, + 3477, 3284, 2839, 3283, 2162, 1014, 3086, 2791, 2792, 3087, + 3490, 632, 1013, 3519, 3471, 158, 632, 1313, 3294, 3487, + 3105, 146, 1289, 186, 2217, 82, 3094, 2156, 82, 3430, + 82, 91, 3438, 2211, 2548, 3370, 82, 2283, 3293, 84, + 165, 1883, 3467, 166, 3104, 2840, 2917, 125, 1631, 147, + 2582, 2583, 633, 1111, 2462, 1113, 3448, 1555, 2068, 1556, + 168, 2419, 134, 135, 157, 156, 185, 2497, 2771, 2772, + 2496, 2846, 2039, 2498, 3170, 961, 2770, 1068, 1069, 2463, + 2607, 1316, 1062, 1317, 1318, 1309, 2104, 2105, 1301, 1816, + 1817, 158, 2280, 1110, 1112, 2591, 2103, 146, 3448, 934, + 778, 779, 2281, 91, 2843, 3510, 91, 1094, 91, 1071, + 879, 1299, 1122, 878, 91, 2790, 165, 956, 1058, 166, + 958, 1288, 2546, 1309, 3357, 1082, 3511, 2793, 1099, 1100, + 1083, 1082, 1095, 959, 2509, 2986, 1083, 1088, 1644, 1645, + 157, 156, 185, 632, 1081, 2650, 1080, 2122, 2121, 2455, + 2456, 2905, 2874, 632, 2275, 2276, 2278, 2277, 2903, 632, + 646, 2272, 1815, 1819, 650, 151, 132, 154, 139, 131, + 1551, 152, 153, 644, 2155, 2879, 2593, 2578, 169, 1496, + 2232, 2193, 3316, 2843, 3317, 2553, 3540, 175, 140, 1750, + 2867, 927, 632, 1115, 1033, 1097, 1098, 1108, 2868, 1120, + 1103, 1109, 143, 141, 136, 137, 138, 142, 2252, 1724, + 2253, 1114, 2254, 1064, 133, 2595, 3075, 3074, 961, 3484, + 953, 633, 2237, 144, 1096, 1121, 633, 955, 954, 1089, + 1101, 2255, 1039, 1038, 2068, 1107, 2236, 961, 1057, 2876, + 1102, 151, 1646, 154, 2875, 1643, 2234, 152, 153, 186, + 2066, 2067, 3268, 1725, 169, 1726, 3071, 999, 960, 988, + 969, 997, 2196, 175, 970, 1335, 2244, 2240, 2242, 2243, + 2241, 2245, 2246, 125, 2684, 3131, 959, 2238, 2235, 2081, + 970, 1755, 1499, 937, 931, 929, 168, 2894, 1336, 1337, + 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, 1008, + 1007, 1078, 1061, 1084, 1085, 1086, 1087, 1006, 1005, 2793, + 2651, 160, 1004, 186, 1003, 1002, 1308, 1305, 1306, 1307, + 1312, 1314, 1311, 1001, 1310, 996, 1349, 1123, 1124, 2502, + 1635, 1009, 1349, 945, 1304, 945, 3559, 125, 982, 943, + 2281, 3516, 165, 1656, 945, 166, 967, 3364, 2544, 3552, + 168, 1116, 981, 633, 1308, 1305, 1306, 1307, 1312, 1314, + 1311, 987, 1310, 633, 1768, 922, 991, 981, 185, 633, + 3070, 993, 1304, 2599, 1370, 994, 992, 2596, 1018, 2423, + 2425, 1025, 2222, 1280, 981, 2169, 2580, 160, 1017, 155, + 1352, 1353, 1354, 1355, 1552, 827, 995, 827, 2215, 2511, + 1366, 960, 633, 2221, 1000, 1060, 165, 827, 998, 166, + 1764, 1092, 2612, 1290, 2547, 937, 931, 929, 2295, 1026, + 960, 2813, 1281, 1282, 2577, 1629, 2066, 2067, 1628, 3475, + 2563, 2987, 185, 988, 1627, 1356, 3444, 2159, 2567, 1765, + 1625, 597, 592, 1320, 2590, 3125, 2213, 2589, 988, 1360, + 148, 1655, 3485, 149, 1736, 1735, 1737, 1738, 1739, 3034, + 3035, 1350, 1351, 3353, 3023, 155, 3005, 1754, 3443, 2493, + 2458, 2395, 1375, 3474, 1886, 1543, 85, 2160, 3444, 3103, + 169, 1451, 2566, 161, 2158, 1073, 120, 2453, 2110, 175, + 173, 3125, 988, 1297, 1758, 930, 1756, 1757, 1349, 1759, + 1760, 1346, 2769, 905, 2602, 1907, 1119, 2844, 2845, 2601, + 3443, 3378, 1380, 1011, 1381, 1520, 1522, 1384, 2161, 1908, + 2848, 1077, 1067, 1079, 1070, 2282, 148, 90, 2157, 149, + 90, 181, 90, 1105, 1777, 987, 115, 2602, 90, 3066, + 2999, 2636, 2601, 2233, 169, 2939, 2424, 1828, 1761, 1557, + 987, 1898, 1487, 175, 2536, 1503, 981, 984, 985, 161, + 945, 3520, 3166, 1319, 978, 982, 173, 1898, 3550, 2312, + 1318, 3551, 3041, 3549, 162, 167, 164, 170, 171, 172, + 174, 176, 177, 178, 179, 977, 2844, 2845, 1319, 3040, + 180, 182, 183, 184, 987, 2200, 1024, 1317, 1318, 2848, + 1021, 1665, 1457, 1458, 1459, 1460, 1461, 181, 116, 1664, + 2210, 1654, 988, 160, 1091, 1751, 1487, 1752, 1856, 1486, + 1753, 2208, 999, 1500, 997, 1093, 2205, 930, 3560, 3408, + 1493, 3512, 1857, 1347, 1348, 1855, 2895, 2205, 1480, 3024, + 2212, 901, 3346, 1504, 1744, 1505, 103, 100, 1905, 101, 162, 167, 164, 170, 171, 172, 174, 176, 177, 178, - 179, 2444, 3416, 2444, 3412, 1519, 180, 182, 183, 184, - 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, - 1335, 3373, 2294, 162, 167, 164, 170, 171, 172, 174, - 176, 177, 178, 179, 1947, 1528, 3399, 1519, 1319, 180, - 182, 183, 184, 1336, 1337, 1338, 1339, 1340, 1341, 1342, - 1344, 1343, 1345, 1346, 3372, 3350, 1881, 1881, 1319, 3349, - 1879, 1879, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, - 1882, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1321, 3348, - 1901, 1529, 3271, 1859, 1902, 1861, 1862, 1863, 1864, 1865, - 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1316, 3255, - 1317, 1318, 1360, 106, 97, 3254, 1850, 2638, 3165, 40, - 2349, 99, 40, 1860, 105, 98, 104, 3163, 1965, 1899, - 1315, 1519, 3297, 1939, 1928, 1929, 1930, 1931, 1941, 1932, - 1933, 1934, 1946, 1942, 1935, 1936, 1943, 1944, 1945, 1937, - 1938, 1940, 3521, 1519, 3084, 3363, 1997, 97, 3279, 1519, - 3366, 1812, 1813, 3112, 1840, 1841, 1842, 1843, 98, 2444, - 3267, 91, 1485, 1484, 1961, 1853, 81, 1829, 1483, 81, - 1519, 2026, 1487, 1316, 3045, 1317, 1318, 3084, 1519, 3302, - 1852, 2444, 3082, 3301, 1519, 1486, 3030, 2880, 1520, 2033, - 2205, 1519, 3259, 1316, 1319, 1317, 1318, 3003, 1519, 3258, - 1858, 2360, 1519, 1887, 1888, 2877, 2812, 2811, 1890, 2527, - 918, 918, 1895, 1519, 2802, 2801, 1900, 2514, 2073, 2074, - 2799, 2800, 2057, 2009, 1482, 2000, 2227, 1885, 2226, 1913, - 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 2797, - 2798, 2797, 2796, 1948, 1949, 1950, 1951, 1952, 1953, 1955, - 1319, 1960, 2063, 1962, 1963, 1964, 2045, 1966, 1967, 1968, - 2011, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, - 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, - 1993, 1994, 1995, 1996, 1808, 1998, 2119, 2005, 2006, 918, - 1774, 918, 918, 918, 918, 918, 1319, 100, 2014, 2015, - 1740, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2010, - 2027, 2028, 2029, 2030, 2031, 2009, 2050, 100, 2051, 2468, - 1519, 2440, 2056, 1732, 2166, 1319, 101, 2281, 2576, 1316, - 99, 1317, 1318, 1722, 3519, 1519, 99, 1892, 1894, 1718, - 2128, 2129, 2130, 2131, 1620, 2557, 101, 1714, 918, 2550, - 2551, 1319, 2011, 2114, 2444, 2443, 1319, 2113, 2123, 902, - 2124, 2125, 2126, 2127, 2091, 2044, 1713, 2095, 1712, 2032, - 2069, 2070, 2305, 1519, 1959, 1530, 2134, 2135, 2136, 2137, - 3453, 1519, 1319, 2489, 1970, 1316, 1117, 1317, 1318, 1519, - 2058, 3092, 2117, 2309, 2305, 2467, 2108, 2148, 2554, 2194, - 2154, 2078, 1884, 1519, 1620, 1619, 2076, 1563, 1562, 3451, - 1519, 2532, 2100, 2101, 935, 2099, 1319, 2734, 2013, 2116, - 2115, 2016, 2017, 2118, 1909, 1910, 1911, 1912, 2998, 1319, - 1315, 1316, 2764, 1317, 1318, 3449, 1519, 2191, 1923, 1319, - 3325, 1519, 2281, 105, 2164, 3000, 2490, 3404, 2206, 2460, - 2468, 3377, 2034, 2824, 2444, 936, 2492, 2150, 1970, 1319, - 1316, 2468, 1317, 1318, 2524, 2959, 2308, 2149, 2145, 2138, - 2140, 2141, 2799, 2167, 2163, 2055, 2707, 2102, 2175, 2305, - 2199, 2339, 990, 2202, 2460, 2203, 1316, 2489, 1317, 1318, - 2219, 1316, 1658, 1317, 1318, 1319, 2360, 2336, 2335, 2198, - 2201, 1519, 2149, 1319, 2197, 1335, 2205, 1319, 1331, 989, - 1332, 2223, 1315, 3323, 1519, 2224, 2225, 1316, 3049, 1317, - 1318, 2468, 2220, 3018, 1333, 1347, 1348, 1330, 1336, 1337, - 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, 1336, + 179, 1846, 1848, 1849, 1076, 2209, 180, 182, 183, 184, + 1319, 1742, 3524, 1519, 3409, 1063, 2207, 160, 3554, 1502, + 1106, 1778, 3276, 1506, 1521, 1847, 1648, 3347, 3100, 889, + 3101, 3275, 2339, 1490, 1319, 3266, 1535, 2004, 1316, 3116, + 1317, 1318, 886, 3115, 1319, 2309, 1524, 2638, 1743, 1641, + 3048, 888, 3047, 1501, 987, 3561, 1773, 1507, 3037, 991, + 981, 1660, 1719, 1316, 993, 1317, 1318, 1319, 994, 992, + 1701, 1658, 1658, 1623, 2821, 1741, 1548, 1549, 988, 2287, + 2288, 2289, 1335, 1632, 1633, 1634, 1670, 1659, 1671, 2809, + 1673, 1675, 2518, 1319, 1679, 1681, 1683, 1685, 1687, 1662, + 830, 831, 832, 1624, 2351, 1336, 1337, 1338, 1339, 1340, + 1341, 1342, 1344, 1343, 1345, 1346, 1638, 1639, 2308, 1651, + 1519, 2517, 1637, 1630, 2516, 161, 1697, 1903, 3297, 1700, + 1781, 1702, 173, 1731, 2165, 1745, 1904, 1785, 1319, 1787, + 1788, 1789, 1790, 1729, 1728, 1316, 1794, 1317, 1318, 1727, + 1709, 1710, 1519, 1779, 1780, 1717, 1715, 1716, 1806, 1341, + 1342, 1344, 1343, 1345, 1346, 1947, 1711, 1784, 1705, 1316, + 1708, 1317, 1318, 181, 1791, 1792, 1793, 1769, 3514, 1316, + 987, 1317, 1318, 1707, 1319, 2871, 981, 984, 985, 161, + 945, 1706, 1677, 638, 978, 982, 173, 1730, 3031, 638, + 1775, 1284, 1316, 124, 1317, 1318, 964, 963, 2073, 2074, + 962, 2500, 638, 2181, 2180, 1551, 162, 167, 164, 170, + 171, 172, 174, 176, 177, 178, 179, 97, 1316, 1783, + 1317, 1318, 180, 182, 183, 184, 3513, 181, 98, 2617, + 2179, 2178, 1319, 2177, 2176, 1528, 1804, 2444, 3539, 1319, + 3500, 1519, 1519, 1805, 1939, 1928, 1929, 1930, 1931, 1941, + 1932, 1933, 1934, 1946, 1942, 1935, 1936, 1943, 1944, 1945, + 1937, 1938, 1940, 1316, 3373, 1317, 1318, 1335, 1319, 2611, + 162, 167, 164, 170, 171, 172, 174, 176, 177, 178, + 179, 1529, 3372, 1519, 1315, 1519, 180, 182, 183, 184, + 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, + 1346, 2004, 1881, 1881, 3350, 2001, 1319, 1879, 1879, 1316, + 3349, 1317, 1318, 2619, 2003, 3348, 1335, 3361, 3366, 1331, + 1882, 1332, 2349, 3522, 1519, 2912, 1852, 3271, 825, 3255, + 1901, 3254, 1315, 1519, 1902, 1333, 1347, 1348, 1330, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, - 2490, 1316, 2205, 1317, 1318, 2188, 2998, 2071, 2265, 2266, - 2281, 1523, 2035, 2268, 1316, 2230, 1317, 1318, 1884, 3050, - 3051, 3052, 2269, 1830, 1316, 1814, 1317, 1318, 1763, 3320, - 1519, 1550, 972, 1693, 1319, 891, 2298, 3306, 1519, 971, - 2303, 2974, 1519, 2306, 1316, 2307, 1317, 1318, 3479, 3419, - 2314, 3290, 1526, 3256, 2316, 2317, 2318, 2291, 3177, 2293, - 3065, 3062, 3043, 2922, 2324, 2325, 2326, 2327, 2328, 2329, - 2330, 2331, 2332, 2333, 2258, 1319, 2921, 2297, 1622, 2147, - 1316, 2869, 1317, 1318, 1694, 1695, 1696, 2292, 1316, 1319, - 1317, 1318, 1316, 2826, 1317, 1318, 2822, 2558, 2144, 2139, - 2340, 2341, 2342, 2343, 2344, 2133, 2346, 2132, 2299, 1747, - 2348, 2271, 1319, 91, 2353, 2354, 1653, 2355, 2967, 1519, - 2358, 1649, 2359, 2279, 1319, 1618, 2362, 117, 1062, 2523, - 2366, 2873, 1319, 3291, 2371, 2372, 2373, 2374, 1319, 2162, - 1853, 2048, 3053, 2912, 1319, 2011, 2290, 2385, 1319, 2388, - 2389, 3531, 1319, 3010, 3011, 1852, 1319, 2391, 2393, 2964, - 1519, 1319, 3381, 3529, 2396, 2397, 2398, 2399, 2400, 1316, - 1319, 1317, 1318, 2962, 1519, 2407, 2408, 2524, 2409, 3505, - 3385, 2412, 2414, 2057, 1810, 2416, 3311, 2313, 2311, 3054, - 3055, 3056, 3013, 1319, 2010, 2428, 2927, 1519, 2320, 2321, - 2322, 2323, 1881, 2818, 2347, 3016, 1879, 2817, 2816, 1519, - 1316, 1527, 1317, 1318, 2734, 2429, 2910, 1519, 2537, 2259, - 2756, 3015, 2415, 1519, 1316, 2757, 1317, 1318, 2413, 1519, - 1319, 2753, 2392, 1519, 2754, 2302, 2375, 1519, 2345, 2755, - 2367, 1519, 2427, 1375, 2752, 2301, 1811, 1316, 1532, 1317, - 1318, 3292, 2054, 1319, 1689, 3512, 3147, 2062, 3146, 1316, - 1319, 1317, 1318, 3004, 2712, 2711, 1319, 1316, 3345, 1317, - 1318, 2464, 2430, 1316, 2432, 1317, 1318, 2445, 1519, 1316, - 1319, 1317, 1318, 1316, 1319, 1317, 1318, 1316, 1319, 1317, - 1318, 1316, 1319, 1317, 1318, 3156, 1316, 3158, 1317, 1318, - 2994, 1690, 1691, 1692, 2721, 1316, 3145, 1317, 1318, 2991, - 2507, 1762, 1319, 877, 1531, 2795, 2441, 2990, 1493, 2319, - 2724, 2726, 2417, 1319, 1283, 2454, 2483, 2528, 1316, 2727, - 1317, 1318, 2758, 906, 2477, 2478, 2334, 2969, 2510, 2512, - 1907, 907, 1487, 2437, 2442, 3361, 40, 1319, 1028, 1027, - 2888, 3263, 2523, 2457, 1908, 2482, 2605, 2503, 2484, 2564, - 1535, 2549, 2487, 1319, 2965, 1316, 125, 1317, 1318, 3067, - 1319, 2996, 2937, 97, 97, 99, 2933, 2491, 2976, 3543, - 99, 2814, 2494, 2154, 98, 98, 2073, 2074, 1316, 2501, - 1317, 1318, 2262, 2504, 2573, 1316, 2919, 1317, 1318, 3458, - 3362, 1316, 811, 1317, 1318, 3286, 2794, 2918, 2515, 2481, - 1319, 2059, 914, 915, 2571, 1316, 2251, 1317, 1318, 1316, - 2250, 1317, 1318, 1316, 2525, 1317, 1318, 1316, 1319, 1317, - 1318, 2915, 2526, 1319, 2249, 2248, 2247, 2529, 2530, 2533, - 2285, 2534, 2538, 2539, 2540, 1319, 104, 1316, 2519, 1317, - 1318, 1319, 1641, 106, 2411, 3333, 191, 3332, 1316, 191, - 1317, 1318, 643, 2570, 105, 1319, 104, 649, 3314, 3164, - 2640, 2641, 2642, 2643, 2644, 1319, 2559, 2560, 191, 2710, - 3162, 105, 1316, 3161, 1317, 1318, 3154, 2709, 3063, 2649, - 2569, 106, 1319, 191, 2410, 2995, 2993, 2615, 1316, 2827, - 1317, 1318, 105, 3153, 104, 1316, 2189, 1317, 1318, 1636, - 106, 106, 2406, 99, 2630, 2594, 913, 2405, 649, 191, - 649, 105, 105, 104, 2645, 2614, 2597, 2984, 2613, 2404, - 2460, 2603, 99, 3135, 2604, 2403, 2473, 2476, 2477, 2478, - 2474, 2440, 2475, 2479, 1319, 1316, 2652, 1317, 1318, 2402, - 3533, 3532, 1827, 2337, 2046, 10, 1544, 1536, 2631, 2401, - 110, 111, 3532, 1316, 3533, 1317, 1318, 2633, 1316, 3351, - 1317, 1318, 1519, 3029, 904, 2610, 2390, 3, 1825, 93, - 1316, 9, 1317, 1318, 1826, 1, 1316, 8, 1317, 1318, - 1286, 1517, 1513, 2688, 918, 2686, 1285, 2634, 2635, 3033, - 1316, 2637, 1317, 1318, 2639, 2654, 1514, 3468, 610, 2036, - 1316, 1491, 1317, 1318, 2660, 3506, 2743, 2691, 2000, 3464, - 2000, 1319, 3465, 1733, 2646, 2647, 2648, 1316, 2384, 1317, - 1318, 2052, 2053, 1516, 2761, 1515, 2653, 1723, 3095, 2655, - 2656, 2657, 2687, 1971, 2689, 2658, 2659, 2714, 3287, 1974, - 2661, 2830, 2195, 2663, 3061, 2737, 2665, 2666, 2667, 2668, - 2737, 2152, 980, 2763, 2669, 1974, 1974, 1974, 1974, 1974, - 2746, 150, 2702, 2111, 2112, 2706, 3432, 2715, 114, 1316, - 2691, 1317, 1318, 918, 938, 113, 983, 2713, 1090, 2690, - 2692, 2693, 2694, 2695, 2696, 2697, 2190, 3085, 2508, 2698, - 2699, 2716, 2700, 2120, 2701, 2383, 2091, 2728, 2729, 2703, - 2704, 2705, 1569, 1567, 1568, 2745, 2747, 2632, 894, 2750, - 895, 1566, 2731, 2759, 1571, 2765, 2748, 2749, 2766, 2751, - 2850, 893, 1570, 1319, 2091, 2091, 2091, 2091, 2091, 2767, - 2896, 2338, 2938, 100, 1818, 645, 2829, 2773, 2480, 2732, - 639, 188, 1773, 1319, 2091, 2300, 1316, 2091, 1317, 1318, - 1558, 2890, 2805, 2740, 2806, 2804, 2670, 2671, 2672, 2673, - 2674, 1537, 101, 2951, 2762, 1319, 2662, 1022, 2664, 600, - 2858, 2907, 2908, 2909, 2803, 2911, 2913, 2228, 2154, 606, - 2828, 1319, 2849, 2857, 2675, 2676, 2677, 2678, 1367, 2920, - 2807, 2808, 1319, 1809, 2924, 2925, 2926, 2928, 2929, 2930, - 2931, 2708, 2864, 2932, 1319, 2934, 2935, 2936, 2495, 1319, + 3165, 1859, 3018, 1861, 1862, 1863, 1864, 1865, 1866, 1867, + 1868, 1869, 1870, 1871, 1872, 1873, 3163, 1316, 1965, 1317, + 1318, 97, 3112, 1850, 1316, 3302, 1317, 1318, 99, 2444, + 3437, 1860, 98, 2629, 2628, 2627, 1485, 1484, 2621, 1483, + 2625, 1519, 2620, 3045, 2618, 3030, 1997, 2444, 3416, 2623, + 2880, 1812, 1813, 1316, 2877, 1317, 1318, 106, 2622, 2444, + 3412, 81, 2812, 1829, 81, 2811, 40, 1853, 105, 40, + 104, 2026, 2010, 2527, 2011, 1487, 2624, 2626, 1840, 1841, + 1842, 1843, 1961, 3399, 1519, 3084, 3363, 1519, 1520, 2033, + 2514, 1316, 1482, 1317, 1318, 3279, 1519, 1858, 1336, 1337, + 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, 1360, + 2227, 2000, 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, + 1345, 1346, 2057, 2226, 1885, 2063, 1899, 1887, 1888, 2444, + 3267, 3301, 1890, 2045, 918, 918, 1895, 1808, 1519, 3259, + 1900, 1774, 1486, 3084, 1519, 2444, 3082, 2009, 2205, 1519, + 3003, 1519, 3258, 1913, 1914, 1915, 1916, 1917, 1918, 1919, + 1920, 1921, 1922, 1740, 2078, 1732, 2011, 1948, 1949, 1950, + 1951, 1952, 1953, 1955, 1722, 1960, 1718, 1962, 1963, 1964, + 1714, 1966, 1967, 1968, 1713, 1974, 1975, 1976, 1977, 1978, + 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, + 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1712, 1998, + 2119, 2005, 2006, 918, 1530, 918, 918, 918, 918, 918, + 100, 2050, 101, 2051, 2166, 2018, 2019, 2020, 2021, 2022, + 2023, 2024, 2025, 1959, 2027, 2028, 2029, 2030, 2031, 2009, + 100, 99, 101, 1970, 2128, 2129, 2130, 2131, 1117, 1319, + 2056, 2014, 2015, 2114, 902, 2113, 3092, 2032, 2123, 2554, + 2124, 2125, 2126, 2127, 2044, 2095, 2532, 1892, 1894, 2360, + 1519, 2118, 918, 2802, 2801, 2460, 2134, 2135, 2136, 2137, + 2799, 2800, 2797, 2798, 2998, 2058, 1315, 2117, 1909, 1910, + 1911, 1912, 2797, 2796, 2069, 2070, 2468, 1519, 2148, 2154, + 1519, 2076, 1923, 2281, 2576, 2489, 2101, 935, 1620, 2557, + 2100, 2034, 2194, 2460, 2099, 2550, 2551, 1970, 2116, 3000, + 2108, 2091, 2115, 1339, 1340, 1341, 1342, 1344, 1343, 1345, + 1346, 828, 936, 2004, 3263, 2440, 829, 2191, 2489, 2444, + 2443, 2164, 2305, 1519, 1319, 105, 1880, 2468, 2013, 2206, + 99, 2016, 2017, 1323, 1324, 1325, 1326, 1327, 1328, 1329, + 1321, 2149, 2138, 2140, 2141, 2145, 2300, 2764, 2490, 2199, + 1884, 1519, 2202, 990, 2203, 2167, 2163, 2281, 2492, 2175, + 2734, 2150, 3404, 1658, 1316, 2998, 1317, 1318, 1620, 1619, + 2219, 2998, 989, 1319, 1563, 1562, 2149, 2198, 2201, 2197, + 1319, 2490, 3377, 2444, 1319, 2055, 2468, 2205, 2305, 1319, + 2467, 2281, 2959, 2223, 1315, 2220, 3049, 2224, 2225, 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, 865, + 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, + 876, 2265, 2266, 2230, 2799, 2468, 2268, 3050, 3051, 3052, + 2707, 2102, 2824, 2305, 1319, 2269, 2360, 3454, 1519, 1316, + 2336, 1317, 1318, 2335, 3452, 1519, 2298, 2205, 3450, 1519, + 2303, 2188, 1319, 2306, 3067, 2307, 2071, 1523, 2035, 1884, + 2314, 1852, 1830, 2347, 2316, 2317, 2318, 2010, 1814, 2011, + 1763, 1550, 2258, 972, 2324, 2325, 2326, 2327, 2328, 2329, + 2330, 2331, 2332, 2333, 971, 2291, 891, 2293, 1316, 91, + 1317, 1318, 3480, 3419, 3290, 1316, 2777, 1317, 1318, 1316, + 1526, 1317, 1318, 3256, 1316, 3177, 1317, 1318, 3065, 3062, + 2340, 2341, 2342, 2343, 2344, 2292, 2346, 2271, 3325, 1519, + 2348, 3043, 2922, 2921, 2353, 2354, 1622, 2355, 1693, 2147, + 2358, 2279, 2359, 2869, 2826, 2524, 2362, 1519, 2822, 2558, + 2366, 2778, 2299, 1319, 2371, 2372, 2373, 2374, 2144, 2139, + 2133, 2523, 1853, 2132, 2290, 1747, 1653, 2385, 1319, 2388, + 2389, 1649, 1319, 1618, 91, 2780, 117, 2391, 2393, 1316, + 3053, 1317, 1318, 1062, 2396, 2397, 2398, 2399, 2400, 1694, + 1695, 1696, 2873, 2775, 3291, 2407, 2408, 1316, 2409, 1317, + 1318, 2412, 2414, 2057, 2297, 2416, 2311, 2162, 1319, 2524, + 2791, 2792, 2048, 1319, 3534, 2428, 3532, 2776, 1881, 106, + 3507, 1689, 3385, 1879, 3010, 3011, 3016, 3054, 3055, 3056, + 105, 2313, 104, 1810, 1335, 2429, 2294, 3323, 1519, 1319, + 3311, 99, 2320, 2321, 2322, 2323, 2302, 1319, 3013, 2818, + 2782, 1335, 3320, 1519, 1319, 2345, 2301, 1336, 1337, 1338, + 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, 1690, 1691, + 1692, 2817, 1319, 2427, 1336, 1337, 1338, 1339, 1340, 1341, + 1342, 1344, 1343, 1345, 1346, 2816, 3015, 1375, 1316, 2464, + 1317, 1318, 3306, 1519, 2430, 1811, 2432, 2969, 2319, 2734, + 1519, 2445, 1319, 1316, 2537, 1317, 1318, 1316, 2259, 1317, + 1318, 3147, 1319, 3146, 2756, 2334, 1319, 2054, 2790, 2757, + 2754, 2753, 2752, 2974, 1519, 2755, 3381, 1517, 1513, 1319, + 2793, 2967, 1519, 3292, 2062, 1319, 2454, 1493, 2964, 1519, + 2417, 1527, 1514, 1316, 3004, 1317, 1318, 2712, 1316, 2711, + 1317, 1318, 2991, 3156, 2483, 3345, 2962, 1519, 2437, 3158, + 2990, 3145, 2510, 2512, 2441, 1487, 2442, 2052, 2053, 1516, + 2457, 1515, 2994, 2721, 1316, 2503, 1317, 1318, 1762, 877, + 2487, 2549, 1316, 2795, 1317, 1318, 2927, 1519, 2507, 1316, + 1319, 1317, 1318, 2528, 2491, 1319, 2910, 1519, 2494, 1028, + 2415, 1519, 2154, 1027, 1535, 97, 2501, 1316, 2504, 1317, + 1318, 1319, 99, 2413, 1519, 2888, 98, 1319, 2523, 2392, + 1519, 906, 811, 40, 1319, 2758, 2515, 2477, 2478, 907, + 2605, 1319, 2482, 1283, 1907, 2484, 1319, 1316, 2573, 1317, + 1318, 2996, 1532, 2564, 2525, 99, 2779, 1316, 1908, 1317, + 1318, 1316, 1319, 1317, 1318, 125, 2533, 97, 2534, 1319, + 3546, 2538, 2539, 2540, 1316, 2814, 1317, 1318, 98, 1319, + 1316, 2570, 1317, 1318, 2965, 1641, 191, 2073, 2074, 191, + 2519, 2262, 643, 2526, 3459, 2559, 2560, 649, 2529, 2530, + 2640, 2641, 2642, 2643, 2644, 2375, 1519, 3362, 191, 3286, + 2794, 2367, 1519, 2569, 2481, 2724, 2726, 2059, 1531, 2649, + 914, 915, 2251, 191, 2727, 2937, 2710, 2250, 2249, 2248, + 2933, 1319, 2247, 2976, 2709, 1316, 2285, 1317, 1318, 104, + 1316, 2594, 1317, 1318, 3333, 2615, 2919, 105, 649, 191, + 649, 2571, 2630, 2918, 2597, 106, 1316, 2603, 1317, 1318, + 2604, 2645, 1316, 2915, 1317, 1318, 105, 3153, 104, 1316, + 3332, 1317, 1318, 2614, 106, 2613, 1316, 99, 1317, 1318, + 3314, 1316, 3164, 1317, 1318, 105, 2984, 104, 3162, 1319, + 2631, 3161, 3154, 3063, 2995, 2633, 2993, 1316, 2827, 1317, + 1318, 2189, 1636, 1319, 1316, 3135, 1317, 1318, 106, 913, + 2460, 3536, 3535, 3, 1316, 2411, 1317, 1318, 2440, 105, + 2652, 2337, 2686, 2046, 1544, 1536, 2688, 110, 111, 2610, + 3535, 2783, 3536, 3351, 2000, 2787, 2000, 2654, 3029, 904, + 1827, 1825, 2786, 10, 9, 93, 2743, 1826, 918, 2660, + 8, 2634, 2635, 1, 1286, 2637, 1285, 3033, 2639, 2670, + 2671, 2672, 2673, 2674, 2761, 3469, 1316, 610, 1317, 1318, + 2714, 2691, 2687, 2410, 2689, 2036, 2788, 1491, 2646, 2647, + 2648, 2784, 3508, 3465, 3466, 1733, 2785, 2406, 2746, 2740, + 2653, 1723, 2763, 2655, 2656, 2657, 1773, 3095, 1971, 2658, + 2659, 3287, 2830, 1974, 2661, 2195, 2632, 2663, 2702, 3061, + 2665, 2666, 2667, 2668, 2152, 2715, 980, 2713, 2669, 1974, + 1974, 1974, 1974, 1974, 1316, 150, 1317, 1318, 2728, 2729, + 2703, 2704, 2705, 2111, 2691, 2112, 2706, 918, 1316, 3432, + 1317, 1318, 114, 2759, 2692, 2693, 2694, 2695, 2696, 2697, + 895, 894, 2747, 2698, 2699, 2750, 2700, 2731, 2701, 2716, + 2850, 2748, 2749, 2765, 2751, 2662, 2766, 2664, 938, 2767, + 113, 983, 2690, 1090, 2190, 2773, 2745, 3085, 2508, 2120, + 1569, 1567, 1568, 2675, 2676, 2677, 2678, 1566, 1571, 1570, + 2804, 2890, 2737, 2091, 2806, 2805, 100, 2737, 101, 2896, + 2338, 2938, 1818, 2732, 645, 2480, 639, 188, 1558, 2857, + 2858, 2907, 2908, 2909, 1319, 2911, 2913, 2154, 893, 1319, + 2828, 2091, 2091, 2091, 2091, 2091, 2849, 1537, 2762, 2920, + 2864, 1319, 2951, 1022, 2924, 2925, 2926, 2928, 2929, 2930, + 2931, 2091, 600, 2932, 2091, 2934, 2935, 2936, 1319, 2803, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, - 2881, 2884, 2886, 2887, 1319, 2825, 2883, 2382, 2956, 933, - 925, 2960, 2892, 2961, 2963, 2891, 2966, 2968, 2047, 2970, - 2971, 2972, 2973, 2901, 2431, 2898, 2899, 2979, 2900, 2381, - 932, 2902, 3264, 2904, 2742, 2906, 2988, 2720, 1316, 1319, - 1317, 1318, 2722, 2447, 2725, 2380, 2718, 3344, 3155, 3417, - 2505, 1319, 1533, 2958, 2310, 1896, 2379, 2953, 1316, 1319, - 1317, 1318, 3001, 3002, 2957, 1357, 3006, 2088, 2378, 3130, - 1319, 1845, 668, 2377, 1319, 667, 665, 2433, 2461, 1322, - 1316, 815, 1317, 1318, 2421, 1545, 2472, 2470, 2376, 2469, - 2260, 2096, 2982, 3012, 1319, 3008, 1316, 2914, 1317, 1318, - 3460, 2977, 2978, 2980, 2090, 2086, 2439, 1316, 1319, 1317, - 1318, 2923, 766, 2985, 765, 677, 2992, 669, 661, 1316, - 764, 1317, 1318, 2370, 1316, 3007, 1317, 1318, 2997, 1319, - 763, 3026, 2856, 3444, 2579, 2369, 2870, 1319, 3014, 1316, - 2581, 1317, 1318, 2368, 3021, 3022, 2506, 2866, 1300, 1509, - 655, 3017, 951, 3019, 2365, 2893, 3368, 2284, 2364, 2916, - 1508, 1926, 2858, 1319, 3027, 191, 3028, 191, 3068, 3069, - 191, 3020, 3083, 1319, 1316, 2857, 1317, 1318, 2363, 1927, - 3044, 1319, 3046, 3375, 3089, 3090, 1316, 2838, 1317, 1318, - 3079, 2819, 2361, 1319, 1316, 2555, 1317, 1318, 2182, 66, - 2091, 649, 44, 649, 649, 1316, 3339, 1317, 1318, 1316, - 3405, 1317, 1318, 2357, 3102, 762, 759, 3106, 3132, 3133, - 3134, 2356, 2682, 649, 191, 2683, 3388, 3389, 758, 1316, - 3390, 1317, 1318, 1954, 3038, 3039, 1296, 1293, 3481, 1820, - 92, 35, 34, 1316, 3117, 1317, 1318, 2352, 33, 32, - 31, 25, 1362, 24, 23, 22, 3091, 2350, 21, 3121, - 28, 20, 19, 18, 1316, 2315, 1317, 1318, 2841, 3501, - 3542, 3129, 1316, 119, 1317, 1318, 53, 2304, 50, 3136, - 48, 3064, 127, 3107, 126, 51, 47, 3072, 1065, 45, - 30, 3076, 3077, 3078, 29, 17, 16, 15, 1316, 14, - 1317, 1318, 13, 12, 11, 7, 6, 38, 1316, 37, - 1317, 1318, 1517, 1513, 3088, 27, 1316, 36, 1317, 1318, - 26, 4, 3128, 2542, 2184, 0, 3150, 1514, 1316, 0, - 1317, 1318, 2473, 2476, 2477, 2478, 2474, 0, 2475, 2479, - 0, 0, 3010, 3011, 1881, 0, 0, 0, 1879, 3111, - 0, 0, 1510, 1511, 1516, 0, 1515, 3179, 0, 0, - 0, 2737, 0, 3171, 0, 3159, 3173, 3175, 3151, 3108, - 3160, 3109, 0, 0, 3110, 3167, 0, 3113, 3114, 0, - 0, 3169, 0, 0, 0, 0, 3118, 0, 0, 0, - 0, 0, 0, 0, 1362, 0, 3120, 0, 3180, 3181, - 3278, 0, 0, 0, 3183, 0, 0, 3265, 0, 3285, - 0, 0, 0, 0, 0, 0, 0, 0, 3137, 0, - 0, 3138, 0, 3139, 3140, 0, 3141, 0, 3142, 3295, - 3296, 0, 3298, 3143, 3299, 3300, 0, 3262, 40, 3303, - 3304, 3305, 3261, 3307, 3310, 3308, 3309, 3277, 3260, 3281, - 0, 191, 0, 1881, 3282, 649, 649, 1879, 3168, 3319, - 3321, 3322, 3324, 3326, 3327, 3329, 3312, 0, 0, 3176, - 2740, 191, 3178, 0, 2740, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3182, 0, 3289, 0, 0, 0, - 3313, 649, 0, 0, 191, 0, 0, 0, 0, 0, - 0, 0, 3257, 3359, 3315, 0, 649, 0, 3318, 0, - 0, 0, 191, 3334, 3335, 0, 3119, 3337, 3336, 3355, - 3272, 3273, 3274, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3352, 0, 0, 0, 0, 0, 0, 0, - 3358, 3269, 0, 0, 0, 0, 0, 0, 0, 649, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2881, 2807, 2808, 2884, 2883, 2886, 2887, 2228, 2956, 1319, + 606, 2960, 1367, 2961, 2963, 1319, 2966, 2968, 1809, 2970, + 2971, 2972, 2973, 2829, 2901, 2898, 2899, 2979, 2900, 2825, + 2892, 2902, 2891, 2904, 2708, 2906, 2495, 933, 2405, 925, + 1319, 2047, 2431, 2404, 932, 1319, 3264, 2742, 2988, 2720, + 1319, 2722, 2447, 2725, 2953, 2403, 1319, 2718, 3344, 3155, + 3417, 2957, 3001, 3002, 2505, 1533, 3006, 2958, 2310, 1896, + 1319, 1357, 2402, 2088, 1319, 3130, 2473, 2476, 2477, 2478, + 2474, 1845, 2475, 2479, 668, 2982, 3010, 3011, 667, 1316, + 1319, 1317, 1318, 2401, 1316, 665, 1317, 1318, 2433, 2390, + 2461, 1322, 815, 2977, 2978, 2980, 1316, 2421, 1317, 1318, + 1545, 2472, 1319, 2470, 2985, 2469, 1319, 2260, 3007, 2992, + 2096, 2914, 3012, 1316, 2384, 1317, 1318, 3008, 3461, 2383, + 2997, 2090, 1319, 2086, 2382, 2923, 2439, 3021, 3022, 766, + 2381, 3017, 765, 3014, 1316, 1319, 1317, 1318, 677, 669, + 1316, 1319, 1317, 1318, 2380, 3019, 1319, 661, 2379, 764, + 763, 2857, 2858, 3027, 1319, 191, 3026, 191, 3068, 3069, + 191, 3028, 3083, 2856, 2378, 1316, 1319, 1317, 1318, 3020, + 1316, 3445, 1317, 1318, 3044, 1316, 3046, 1317, 1318, 3089, + 3090, 1316, 2579, 1317, 1318, 2870, 2377, 1319, 2581, 2506, + 2376, 649, 2866, 649, 649, 1316, 1319, 1317, 1318, 1316, + 1300, 1317, 1318, 1319, 3102, 1509, 2370, 3106, 655, 951, + 2893, 3368, 2284, 649, 191, 1316, 2916, 1317, 1318, 2369, + 2473, 2476, 2477, 2478, 2474, 2368, 2475, 2479, 1508, 1926, + 2365, 1927, 3375, 1319, 3117, 2838, 3091, 1316, 2364, 1317, + 1318, 1316, 1362, 1317, 1318, 3079, 2819, 2091, 2555, 3121, + 2363, 2182, 66, 44, 3339, 3038, 3039, 1316, 3405, 1317, + 1318, 3129, 762, 759, 3132, 3133, 1319, 3134, 2682, 3136, + 1316, 2361, 1317, 1318, 2683, 3388, 1316, 3107, 1317, 1318, + 2357, 1316, 3389, 1317, 1318, 758, 3390, 2356, 1954, 1316, + 1296, 1317, 1318, 1293, 3482, 3064, 1820, 92, 35, 34, + 33, 1316, 32, 1317, 1318, 31, 25, 24, 3072, 23, + 22, 21, 3076, 3077, 3078, 3150, 28, 2352, 20, 19, + 3128, 18, 1316, 2841, 1317, 1318, 3503, 3545, 3088, 1319, + 1881, 1316, 119, 1317, 1318, 1879, 53, 50, 1316, 48, + 1317, 1318, 127, 126, 3111, 51, 47, 3179, 1065, 45, + 2350, 3171, 30, 29, 17, 16, 2740, 3160, 3173, 3159, + 2740, 15, 3151, 14, 3175, 13, 3167, 3169, 1316, 12, + 1317, 1318, 11, 7, 1517, 1513, 6, 38, 37, 27, + 36, 3180, 3181, 3108, 1362, 3109, 26, 4, 3110, 1514, + 3278, 3113, 3114, 1319, 2542, 3183, 2184, 3265, 0, 3285, + 3118, 1316, 0, 1317, 1318, 0, 0, 0, 0, 0, + 3120, 0, 0, 2315, 1510, 1511, 1516, 0, 1515, 3295, + 3296, 0, 3298, 3262, 3299, 3300, 3261, 3269, 3260, 3303, + 3304, 3305, 3137, 3307, 3310, 3138, 3308, 3139, 3140, 1881, + 3141, 191, 3142, 3309, 1879, 649, 649, 3143, 3277, 3319, + 3321, 3322, 3324, 3326, 3327, 3329, 3312, 3282, 2737, 3281, + 0, 191, 0, 0, 1316, 3119, 1317, 1318, 0, 0, + 0, 0, 3168, 0, 0, 0, 0, 2304, 0, 0, + 0, 649, 0, 3176, 191, 40, 3178, 3313, 0, 0, + 0, 0, 0, 3359, 0, 0, 649, 3315, 3182, 0, + 3289, 3318, 191, 0, 0, 0, 3334, 3335, 0, 3355, + 3337, 3336, 0, 0, 0, 0, 3257, 0, 0, 0, + 0, 0, 0, 0, 3352, 0, 2740, 0, 1316, 0, + 1317, 1318, 0, 0, 0, 0, 0, 3358, 0, 649, + 0, 3272, 3273, 3274, 0, 0, 0, 0, 0, 0, 0, 0, 1362, 0, 0, 0, 0, 0, 649, 649, 0, 649, 0, 649, 649, 0, 649, 649, 649, 649, 649, 649, 0, 0, 0, 0, 0, 0, 0, 1362, 0, 0, 1362, 649, 1362, 191, 0, 0, 3360, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3354, 0, - 0, 0, 3342, 0, 0, 191, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3354, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, 3384, - 191, 0, 3379, 0, 0, 0, 0, 0, 3374, 0, - 2740, 3371, 0, 0, 649, 0, 191, 3376, 0, 3400, - 0, 0, 0, 0, 0, 3401, 3402, 0, 0, 0, + 191, 0, 3379, 0, 3367, 0, 3342, 0, 0, 0, + 0, 0, 3374, 0, 649, 3376, 191, 0, 0, 3400, + 0, 0, 3371, 0, 0, 3401, 3402, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 3413, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 649, 0, 3499, - 0, 3394, 0, 0, 3395, 3403, 0, 0, 0, 1586, - 0, 0, 0, 3438, 3439, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2737, 3445, 3420, 3448, 3450, 3452, - 0, 3446, 40, 3418, 3410, 3423, 3431, 3428, 3425, 3424, - 3422, 3427, 3426, 0, 0, 0, 0, 3343, 3367, 0, - 0, 0, 3480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3456, 0, 0, 0, 3382, 0, 0, 0, - 3459, 3477, 3467, 3472, 0, 0, 3445, 0, 0, 3289, - 3433, 0, 3446, 3486, 0, 0, 0, 0, 0, 3396, - 3484, 3497, 3397, 0, 3398, 0, 0, 0, 0, 826, - 0, 3415, 83, 0, 0, 0, 0, 3495, 40, 0, - 3500, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3518, 3520, 3522, 0, 0, 1370, 0, - 3515, 3513, 0, 0, 0, 0, 0, 1881, 0, 0, - 0, 1879, 3524, 3523, 0, 0, 0, 3530, 3528, 0, - 3527, 3526, 3445, 1574, 3541, 0, 0, 0, 3446, 3538, - 0, 0, 649, 649, 0, 3544, 0, 0, 3552, 0, - 3553, 3554, 3550, 0, 0, 649, 0, 0, 0, 0, - 0, 890, 0, 83, 191, 0, 0, 0, 3478, 0, - 0, 1881, 3561, 3562, 3309, 1879, 3560, 0, 0, 3383, - 0, 0, 890, 0, 3559, 0, 0, 3393, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 950, 3492, 0, - 3493, 0, 3494, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 649, 0, 0, 0, 0, 1587, 0, 0, - 0, 0, 1362, 0, 0, 0, 0, 0, 0, 0, + 191, 191, 191, 191, 191, 191, 191, 649, 3394, 3403, + 0, 3395, 0, 0, 0, 0, 3343, 0, 0, 0, + 0, 0, 0, 3439, 3440, 0, 0, 0, 0, 0, + 0, 0, 3410, 0, 0, 0, 0, 3449, 3451, 3453, + 3446, 3418, 0, 0, 3447, 3420, 3423, 3431, 3428, 3425, + 3424, 3422, 3427, 3426, 0, 0, 0, 0, 0, 0, + 0, 0, 3481, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3457, 0, 0, 0, 0, 0, 3460, + 0, 0, 0, 3478, 3468, 3473, 0, 0, 0, 0, + 0, 3488, 3446, 0, 0, 0, 3447, 0, 0, 40, + 3382, 3486, 3499, 0, 0, 0, 0, 0, 0, 826, + 0, 0, 83, 3289, 3434, 0, 3415, 0, 3497, 0, + 0, 3502, 0, 3396, 0, 0, 3397, 0, 3398, 0, + 0, 0, 0, 0, 0, 3521, 3523, 3525, 0, 0, + 0, 2737, 3515, 3518, 0, 1881, 3517, 0, 1773, 0, + 1879, 0, 0, 3527, 3526, 0, 0, 1370, 3533, 0, + 3531, 0, 3530, 0, 0, 0, 0, 3544, 3383, 3541, + 3446, 0, 649, 649, 3447, 40, 3393, 0, 3547, 0, + 0, 3553, 3555, 3556, 3557, 649, 0, 3529, 0, 0, + 638, 890, 0, 83, 191, 0, 0, 0, 0, 0, + 1881, 0, 0, 0, 0, 1879, 3564, 3565, 3563, 0, + 0, 0, 890, 0, 3309, 0, 0, 3562, 0, 0, + 0, 0, 3479, 0, 0, 0, 0, 950, 0, 0, + 0, 0, 0, 0, 632, 0, 0, 0, 0, 0, + 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1362, 3494, 0, 3495, 0, 3496, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 1362, + 0, 0, 0, 0, 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 649, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 649, 649, 0, 0, 3539, 0, - 3540, 0, 0, 0, 0, 0, 0, 0, 0, 1600, - 1603, 1604, 1605, 1606, 1607, 1608, 0, 1609, 1610, 1612, - 1613, 1611, 1614, 1615, 1588, 1589, 1590, 1591, 1572, 1573, - 1601, 0, 1575, 0, 1576, 1577, 1578, 1579, 1580, 1581, - 1582, 1583, 1584, 0, 2012, 1585, 1592, 1593, 1594, 1595, - 0, 1596, 1597, 1598, 1599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 614, 3542, 0, 3543, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 612, 0, 0, + 0, 0, 0, 0, 2012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, - 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 191, 0, 0, 649, + 0, 0, 0, 0, 0, 0, 0, 609, 0, 0, + 0, 0, 0, 0, 0, 0, 624, 191, 0, 0, + 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 622, 0, 0, 0, 0, 191, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 649, 0, 0, 2012, 191, 0, 191, - 0, 191, 191, 0, 0, 0, 0, 0, 0, 0, + 0, 191, 191, 0, 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, - 0, 0, 0, 82, 42, 43, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 0, 0, 0, 46, 73, 74, - 0, 71, 75, 0, 0, 1602, 0, 0, 0, 0, - 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 599, 0, 601, + 615, 0, 635, 0, 634, 605, 0, 603, 607, 616, + 608, 0, 602, 0, 613, 0, 0, 604, 617, 618, + 621, 625, 626, 627, 623, 620, 0, 611, 636, 0, 0, 186, 0, 649, 0, 0, 0, 0, 0, 0, - 0, 0, 2548, 0, 0, 0, 0, 0, 0, 59, + 0, 0, 1640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 147, 0, 0, - 649, 91, 0, 0, 0, 0, 649, 0, 168, 0, + 649, 0, 0, 0, 0, 0, 649, 0, 168, 0, 0, 0, 0, 0, 0, 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, @@ -1935,17 +1935,17 @@ var yyAct = [...]int{ 191, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 0, 0, 191, 0, 191, 0, 0, 0, 0, 0, 0, 191, - 0, 0, 0, 0, 0, 0, 191, 0, 0, 49, - 52, 55, 54, 57, 0, 70, 0, 0, 79, 76, + 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 58, 87, 86, 0, 0, 68, 69, 56, - 0, 0, 0, 0, 0, 77, 78, 0, 0, 151, - 1646, 154, 0, 1643, 0, 152, 153, 0, 1126, 0, + 0, 649, 0, 0, 0, 0, 0, 0, 637, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, + 1646, 154, 0, 1643, 0, 152, 153, 0, 1126, 630, 1126, 1126, 169, 0, 0, 0, 0, 0, 0, 0, - 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, - 62, 63, 64, 65, 0, 0, 0, 1362, 0, 2012, + 0, 175, 0, 0, 631, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1362, 0, 2012, 0, 0, 0, 0, 0, 0, 0, 0, 890, 1359, 1364, 1365, 0, 1368, 0, 1369, 1371, 1372, 1373, 0, 1376, 1377, 1379, 1379, 0, 1379, 1383, 1383, 1385, 1386, @@ -1958,13 +1958,13 @@ var yyAct = [...]int{ 1447, 1448, 1449, 0, 0, 160, 0, 1450, 0, 1452, 1453, 1454, 1455, 1456, 0, 0, 0, 0, 0, 0, 0, 0, 1383, 1383, 1383, 1383, 1383, 0, 0, 0, - 0, 0, 0, 85, 0, 0, 1462, 1463, 1464, 1465, + 0, 0, 0, 0, 0, 0, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 191, 1489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 649, 0, - 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 191, 0, 0, 1495, 0, 0, 0, 0, 0, 890, 0, 0, 0, @@ -1975,7 +1975,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 173, 649, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 810, 191, 0, - 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 181, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2015,9 +2015,9 @@ var yyAct = [...]int{ 0, 0, 0, 649, 0, 0, 1362, 0, 0, 0, 0, 649, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 191, 0, 0, 0, 782, 0, 695, 786, 697, 783, - 784, 0, 693, 696, 785, 0, 0, 0, 0, 191, - 0, 0, 191, 0, 0, 0, 0, 0, 0, 1586, + 191, 0, 0, 0, 782, 3501, 695, 786, 697, 783, + 784, 0, 693, 696, 785, 1586, 0, 0, 0, 191, + 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 714, 715, 3200, 3204, 3205, 3206, 3217, 3218, 3219, 3227, 3229, 747, 3228, 3230, 3231, 3232, 3235, 3236, 3237, 3238, @@ -2029,174 +2029,174 @@ var yyAct = [...]int{ 0, 0, 0, 794, 793, 0, 795, 761, 760, 0, 0, 789, 790, 0, 791, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1574, 0, 0, 0, 0, 0, 0, + 0, 82, 42, 43, 84, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1574, + 0, 88, 0, 0, 0, 46, 73, 74, 0, 71, + 75, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 191, 2089, 3246, - 3247, 3248, 3249, 3250, 3251, 3252, 3253, 0, 186, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1640, - 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, - 0, 0, 125, 0, 147, 0, 648, 1279, 648, 648, - 0, 0, 0, 0, 0, 168, 191, 0, 0, 191, - 191, 191, 0, 0, 0, 0, 0, 0, 648, 649, - 649, 0, 0, 0, 0, 0, 0, 1587, 0, 0, - 950, 0, 0, 0, 0, 0, 158, 0, 0, 0, - 0, 0, 146, 0, 0, 0, 0, 1361, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 165, 0, 950, 166, 0, 649, 649, 649, 649, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1644, 1645, 157, 156, 185, 0, 1600, - 1603, 1604, 1605, 1606, 1607, 1608, 0, 1609, 1610, 1612, - 1613, 1611, 1614, 1615, 1588, 1589, 1590, 1591, 1572, 1573, - 1601, 0, 1575, 0, 1576, 1577, 1578, 1579, 1580, 1581, - 1582, 1583, 1584, 0, 0, 1585, 1592, 1593, 1594, 1595, - 0, 1596, 1597, 1598, 1599, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1494, 0, 0, 0, 0, 0, 0, 0, + 3247, 3248, 3249, 3250, 3251, 3252, 3253, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, + 0, 0, 0, 0, 0, 0, 191, 0, 0, 91, + 0, 0, 0, 0, 0, 0, 648, 1279, 648, 648, + 0, 0, 0, 0, 0, 0, 191, 0, 0, 191, + 191, 191, 0, 1587, 0, 0, 0, 0, 648, 649, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 950, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 151, 1646, 154, 1361, - 1643, 1362, 152, 153, 0, 0, 649, 0, 649, 169, - 0, 0, 0, 0, 0, 0, 0, 0, 175, 595, + 0, 0, 0, 950, 0, 0, 649, 649, 649, 649, + 0, 0, 0, 0, 0, 1600, 1603, 1604, 1605, 1606, + 1607, 1608, 0, 1609, 1610, 1612, 1613, 1611, 1614, 1615, + 1588, 1589, 1590, 1591, 1572, 1573, 1601, 0, 1575, 0, + 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 0, + 0, 1585, 1592, 1593, 1594, 1595, 0, 1596, 1597, 1598, + 1599, 0, 0, 0, 0, 0, 0, 49, 52, 55, + 54, 57, 0, 70, 0, 0, 79, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 880, 0, + 0, 0, 1494, 0, 0, 0, 0, 0, 0, 0, + 58, 87, 86, 0, 0, 68, 69, 56, 0, 0, + 0, 0, 191, 77, 78, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1361, + 0, 1362, 0, 0, 0, 0, 649, 0, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 595, + 0, 0, 0, 0, 0, 60, 61, 0, 62, 63, + 64, 65, 0, 0, 0, 0, 0, 0, 880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 648, 0, 0, 2286, 0, 0, 0, 649, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 946, - 0, 191, 0, 0, 649, 1602, 0, 0, 0, 0, + 0, 1602, 0, 0, 0, 0, 0, 0, 0, 946, + 0, 191, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 649, 0, 0, 0, 0, 0, 2296, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1626, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 160, 0, 0, 0, 0, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 649, 649, 0, 648, 0, 1652, 0, 0, 0, - 0, 0, 0, 0, 1661, 0, 0, 1361, 1663, 0, + 0, 85, 0, 0, 1661, 0, 0, 1361, 1663, 0, 0, 1666, 1667, 648, 648, 0, 648, 0, 648, 648, 649, 648, 648, 648, 648, 648, 648, 0, 0, 0, 0, 0, 0, 0, 1361, 1698, 1699, 1361, 648, 1361, 0, 1704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 155, 0, 0, 0, 0, 0, 0, 0, 0, 2394, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 768, + 0, 0, 0, 90, 0, 0, 0, 0, 0, 2394, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1766, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 2426, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 191, 0, 767, 0, 890, - 0, 148, 0, 0, 149, 0, 0, 0, 0, 0, - 0, 0, 648, 649, 191, 0, 0, 0, 0, 0, - 2465, 2466, 0, 0, 0, 0, 0, 0, 0, 2089, - 0, 0, 890, 2485, 161, 0, 0, 0, 0, 0, - 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 189, 0, 191, 596, 0, 0, 890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 647, 0, 649, 0, 0, 0, 0, 0, + 0, 0, 648, 649, 191, 596, 0, 0, 0, 0, + 2465, 2466, 0, 0, 0, 0, 0, 0, 0, 2089, + 900, 0, 890, 2485, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 919, 919, 67, + 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, + 0, 0, 0, 0, 649, 0, 1586, 0, 0, 0, 0, 0, 0, 0, 1362, 0, 649, 0, 0, 0, - 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 649, 649, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 942, 0, 949, 0, 0, 0, 0, - 0, 0, 649, 0, 0, 162, 167, 164, 170, 171, - 172, 174, 176, 177, 178, 179, 191, 649, 0, 0, - 0, 180, 182, 183, 184, 0, 2562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 649, 2012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 648, 648, 0, - 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, + 0, 0, 0, 0, 0, 0, 191, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 2562, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 648, 648, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 649, 0, 0, 0, 0, 191, 0, + 1574, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 649, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1361, 0, 0, 0, 0, 0, 0, 0, 0, 1889, 0, 648, 0, 0, 0, 0, 0, 1361, 1066, 0, 1072, 0, 0, 1074, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, + 0, 0, 0, 0, 1587, 0, 0, 0, 0, 648, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2679, 0, 0, 0, 0, 0, 0, 1292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2089, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, - 0, 0, 0, 2741, 0, 83, 0, 0, 2089, 2089, + 0, 0, 0, 0, 0, 0, 1600, 1603, 1604, 1605, + 1606, 1607, 1608, 0, 1609, 1610, 1612, 1613, 1611, 1614, + 1615, 1588, 1589, 1590, 1591, 1572, 1573, 1601, 0, 1575, + 2089, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, + 0, 0, 1585, 1592, 1593, 1594, 1595, 648, 1596, 1597, + 1598, 1599, 0, 2741, 0, 83, 0, 0, 2089, 2089, 2089, 2089, 2089, 0, 0, 0, 0, 0, 0, 0, - 0, 768, 0, 0, 648, 0, 0, 0, 2089, 0, + 0, 0, 0, 0, 648, 0, 0, 0, 2089, 0, 0, 2089, 0, 0, 0, 0, 0, 0, 648, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 189, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2847, 0, 596, 0, 0, - 0, 0, 0, 0, 0, 2855, 0, 0, 0, 0, - 0, 0, 900, 0, 0, 0, 0, 0, 648, 0, - 0, 0, 0, 0, 0, 2172, 2173, 2174, 0, 919, - 919, 0, 0, 0, 0, 0, 0, 0, 596, 0, - 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, - 0, 648, 1661, 0, 0, 1661, 0, 1661, 91, 0, - 0, 828, 0, 2204, 0, 816, 829, 830, 831, 832, - 817, 0, 0, 818, 819, 0, 820, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 825, 833, 834, 0, 0, 0, 0, 0, 648, 0, + 0, 0, 0, 0, 0, 2847, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2855, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, + 0, 0, 0, 0, 0, 2172, 2173, 2174, 0, 0, + 0, 0, 596, 0, 596, 0, 0, 596, 0, 0, + 0, 0, 1602, 0, 0, 648, 0, 0, 0, 0, + 0, 648, 1661, 0, 0, 1661, 0, 1661, 0, 0, + 0, 91, 0, 2204, 828, 0, 0, 0, 816, 829, + 830, 831, 832, 817, 0, 0, 818, 819, 0, 820, + 0, 0, 0, 0, 767, 0, 0, 0, 0, 0, + 0, 596, 0, 825, 833, 834, 0, 0, 648, 0, 0, 0, 0, 648, 1547, 0, 0, 648, 648, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1363, + 0, 0, 1564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1564, 0, 0, 0, 1128, 0, 1128, 1128, - 0, 0, 0, 0, 0, 0, 0, 2859, 2860, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1291, 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, 865, - 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, - 876, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2089, 1703, 0, 0, 0, 0, + 2859, 2860, 0, 0, 0, 0, 0, 0, 0, 647, + 0, 0, 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, 865, 866, 867, 868, 869, 870, 871, 872, + 873, 874, 875, 876, 0, 0, 0, 0, 0, 0, + 942, 0, 949, 0, 2089, 1703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 3025, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, - 828, 0, 2861, 0, 816, 829, 830, 831, 832, 817, - 1748, 0, 818, 819, 0, 820, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 825, - 833, 834, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2861, 0, 0, 0, 0, + 1748, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1782, 0, 0, 0, 0, 0, 0, 1786, 0, 0, 1361, 0, 648, 0, 0, 0, 0, 0, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2859, 2860, 0, 2862, - 2863, 0, 0, 0, 0, 0, 0, 0, 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, 865, 866, - 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2862, 2863, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1497, 1498, 0, 0, 0, 0, 0, 0, 0, 0, - 782, 0, 0, 786, 0, 783, 784, 0, 0, 0, - 785, 2861, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3144, 1541, 3148, 3149, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 900, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1559, 0, 0, 0, 0, 0, 0, 0, 0, - 2741, 0, 83, 0, 2741, 0, 0, 0, 0, 0, - 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 942, 0, 0, 0, 2862, 2863, - 0, 0, 0, 0, 1833, 0, 0, 0, 0, 0, - 0, 0, 0, 1669, 1669, 0, 1669, 0, 1669, 1669, - 0, 1678, 1669, 1669, 1669, 1669, 1669, 0, 2499, 0, - 0, 3270, 0, 0, 596, 0, 596, 0, 942, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 782, 0, 0, 786, 0, 783, 784, + 0, 0, 0, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3144, 0, 3148, 3149, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2741, 0, 83, 0, 2741, 0, 0, 0, 0, 0, + 0, 0, 648, 0, 0, 0, 1363, 0, 0, 1363, + 0, 1363, 596, 648, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1720, 0, 1833, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2499, 0, + 0, 3270, 0, 1772, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, + 0, 0, 0, 0, 0, 1795, 1796, 596, 596, 596, + 596, 596, 596, 596, 0, 0, 0, 0, 0, 0, + 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1746, 0, 0, 0, 0, 0, 0, - 648, 0, 0, 0, 0, 0, 0, 0, 0, 1770, - 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 1661, 1661, - 0, 1363, 0, 648, 0, 0, 0, 0, 0, 0, - 2741, 0, 1128, 0, 0, 0, 0, 0, 0, 1361, + 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, + 2741, 0, 0, 0, 0, 0, 0, 0, 0, 1361, 2572, 0, 0, 0, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, @@ -2206,379 +2206,294 @@ var yyAct = [...]int{ 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 3369, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2075, + 0, 0, 0, 1128, 0, 1128, 1128, 0, 0, 2075, 0, 0, 0, 0, 0, 0, 83, 2079, 0, 2082, - 0, 0, 1833, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1363, 0, 0, 0, 648, 0, 0, + 0, 0, 1833, 0, 0, 1291, 0, 0, 0, 0, + 0, 596, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1128, 1128, 0, - 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, - 1821, 0, 0, 648, 0, 0, 0, 3414, 0, 0, - 596, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 900, 0, 0, 0, 648, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, + 0, 0, 0, 648, 0, 0, 0, 3414, 0, 1363, + 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, + 0, 919, 919, 0, 0, 0, 1363, 0, 0, 0, + 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 648, 596, 0, 0, 0, 1875, 0, 0, + 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, - 1361, 596, 0, 648, 648, 1361, 0, 0, 1891, 0, + 1361, 0, 0, 648, 648, 1361, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 919, 1772, 919, 919, 919, 919, 919, 0, 0, 3498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3496, 1924, - 1925, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2810, 0, 0, 0, - 1833, 0, 0, 0, 0, 0, 0, 2239, 1363, 0, - 0, 1363, 0, 1363, 596, 0, 2256, 2257, 648, 1128, + 1833, 0, 0, 0, 1720, 0, 0, 2239, 0, 0, + 0, 0, 0, 0, 0, 0, 2256, 2257, 648, 919, 2261, 1361, 0, 0, 0, 0, 648, 0, 0, 2264, - 0, 0, 0, 0, 1720, 0, 2267, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 0, 900, 0, 0, 2267, 1497, 1498, 0, + 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, + 0, 0, 0, 1772, 596, 0, 596, 0, 596, 2098, + 0, 0, 2270, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1541, 0, 0, 0, 2889, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1559, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2270, 0, 0, 1772, 0, 2049, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2889, 0, 0, - 0, 596, 0, 0, 0, 0, 0, 0, 596, 0, - 0, 0, 0, 0, 2061, 0, 0, 1795, 1796, 596, - 596, 596, 596, 596, 596, 596, 0, 0, 1541, 0, - 0, 1128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, + 1669, 1669, 0, 1669, 0, 1669, 1669, 0, 1678, 1669, + 1669, 1669, 1669, 1669, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 949, 0, + 1746, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 828, 0, - 2004, 0, 0, 829, 0, 942, 0, 0, 0, 0, - 0, 949, 0, 1880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3032, 0, 0, 0, 0, 0, 0, 596, 0, 0, + 828, 0, 0, 0, 596, 829, 0, 0, 0, 1128, + 0, 0, 0, 596, 596, 1880, 0, 596, 0, 2263, + 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, + 0, 0, 0, 596, 648, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3032, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 942, 0, - 0, 0, 0, 1875, 0, 0, 0, 1875, 1875, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 596, 648, 648, 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, 865, 866, 867, 868, - 869, 870, 871, 872, 873, 874, 875, 876, 0, 0, - 0, 648, 648, 648, 648, 0, 0, 2486, 0, 0, - 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 919, 919, 0, 0, 0, 1363, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 648, 648, 648, 648, 0, 0, 2486, 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, 865, 866, + 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, + 0, 0, 0, 0, 1363, 0, 1772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2535, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1128, 1128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 919, 1772, 919, 919, 919, 919, 919, 0, - 0, 0, 0, 0, 1128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1361, 0, 0, 0, - 0, 648, 0, 648, 0, 0, 0, 828, 0, 0, - 0, 0, 829, 0, 0, 0, 1720, 2584, 2585, 2586, - 2587, 2588, 1880, 0, 0, 0, 0, 0, 0, 0, - 0, 919, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1833, 2598, 0, 0, 900, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, - 0, 0, 0, 648, 2606, 1772, 596, 0, 596, 0, - 596, 2098, 0, 0, 0, 0, 0, 0, 0, 648, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 648, 0, 0, 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, 865, 866, 867, 868, 869, - 870, 871, 872, 873, 874, 875, 876, 0, 0, 0, - 0, 0, 648, 0, 0, 0, 648, 648, 0, 0, - 0, 0, 2434, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2449, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 648, 0, 648, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2584, 2585, 2586, + 2587, 2588, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1875, 0, 0, 0, 0, 0, + 0, 1833, 2598, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1891, 0, 0, 0, 0, + 0, 0, 0, 648, 2606, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 596, 0, 0, 0, 648, + 0, 0, 0, 1720, 0, 0, 1924, 1925, 0, 0, + 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 0, 0, 596, 0, 1128, 0, 0, 0, + 0, 0, 648, 0, 0, 0, 648, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, + 0, 0, 0, 0, 2049, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, + 0, 2061, 0, 0, 0, 2541, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1541, 0, 0, 1128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 942, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, - 2531, 0, 0, 0, 0, 0, 0, 0, 0, 596, - 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, - 0, 0, 0, 0, 0, 596, 596, 2061, 648, 596, - 0, 2263, 0, 0, 2556, 0, 0, 0, 596, 0, - 0, 0, 0, 2561, 0, 596, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2815, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 596, 0, 0, 0, 0, 0, 0, 0, 648, - 0, 0, 0, 0, 0, 0, 2853, 0, 0, 1361, + 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 596, 596, 596, 596, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 596, + 0, 0, 0, 0, 0, 949, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2815, 596, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 942, 0, 0, 0, 0, 0, 949, 648, + 0, 0, 0, 0, 0, 919, 2853, 0, 0, 1361, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 2865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 648, 0, 0, 2882, - 0, 0, 2885, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, - 1875, 0, 0, 0, 0, 0, 1363, 0, 1772, 0, + 0, 0, 2885, 0, 0, 942, 0, 0, 0, 0, + 1875, 0, 0, 0, 1875, 1875, 0, 648, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1875, 0, 0, - 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, - 0, 0, 0, 0, 0, 2680, 0, 0, 0, 0, - 0, 2981, 0, 1128, 648, 0, 648, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, + 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2981, 0, 0, 0, 0, 648, 0, 648, 0, + 0, 0, 1363, 2273, 0, 0, 0, 1363, 596, 596, + 596, 596, 596, 0, 0, 0, 0, 0, 0, 0, + 2760, 0, 0, 0, 0, 0, 1720, 0, 596, 0, + 0, 596, 2768, 1772, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, + 0, 0, 828, 0, 0, 0, 816, 829, 830, 831, + 832, 817, 0, 0, 818, 819, 0, 820, 0, 0, + 0, 1128, 0, 0, 0, 0, 3042, 596, 0, 0, + 0, 825, 833, 834, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1363, 0, 0, 3057, 0, 0, 3058, + 3059, 3060, 0, 596, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2859, 2860, + 0, 0, 0, 0, 0, 0, 596, 0, 0, 596, + 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, + 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, + 875, 876, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2861, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2434, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, + 2449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2717, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1128, 596, 0, 0, - 0, 0, 0, 2744, 1669, 1720, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3042, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3057, 0, 0, 3058, - 3059, 3060, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 596, 0, 0, 0, 0, 596, 0, 0, 0, + 2862, 2863, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 942, 0, - 0, 0, 0, 0, 0, 0, 2061, 0, 0, 0, + 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2531, 0, 0, + 0, 0, 0, 596, 0, 0, 596, 596, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2061, 0, 0, 0, 0, 0, + 0, 2556, 0, 0, 0, 0, 0, 0, 0, 0, + 2561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 596, 0, 0, 0, 0, 0, 0, 2541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1363, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 596, 596, 596, 596, - 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2952, 0, 0, - 596, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 919, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1875, 0, 0, 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2680, 0, 3380, 0, 0, 0, 0, 0, + 1128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 919, 0, 0, 0, - 0, 0, 0, 0, 2061, 2061, 0, 0, 0, 0, + 0, 1669, 0, 0, 0, 0, 0, 0, 1720, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1128, 0, 0, 0, 0, 0, 0, + 2744, 1669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, - 0, 3096, 3097, 3098, 3099, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1363, 0, 0, 0, 0, 1363, - 596, 596, 596, 596, 596, 0, 0, 0, 0, 0, - 0, 0, 2760, 0, 0, 0, 0, 0, 1720, 0, - 596, 0, 0, 596, 2768, 1772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3380, 1363, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, - 0, 3172, 0, 3174, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 942, 0, 0, 0, 0, + 0, 0, 0, 2061, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1720, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2061, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1128, 0, 0, 0, 0, 0, 0, 0, + 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3330, 0, 0, 0, 3330, 3330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2061, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 596, 0, 0, 596, 596, - 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2061, 2061, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3096, 3097, + 3098, 3099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1128, 1128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3454, 0, 0, - 0, 1720, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3462, 0, 0, 0, 0, 0, 0, 0, - 1363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2952, 0, 3462, 0, 0, 0, - 1720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3172, 0, + 3174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3280, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 383, 0, 0, 0, 1262, 1247, 502, 0, 1190, 1265, - 1159, 1178, 1275, 1181, 1184, 1226, 1138, 1204, 402, 1175, - 1131, 1163, 1133, 1170, 1134, 1161, 1192, 260, 1158, 1249, - 1208, 1264, 353, 257, 1140, 1164, 416, 1180, 198, 1228, - 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, - 372, 414, 492, 408, 1271, 357, 1214, 0, 481, 387, - 0, 0, 0, 1194, 1253, 1202, 1240, 1189, 1227, 1148, - 1213, 1266, 1176, 1223, 1267, 312, 240, 314, 197, 399, - 482, 276, 0, 0, 1720, 0, 3434, 638, 0, 0, - 0, 0, 3435, 0, 0, 0, 0, 230, 0, 0, - 237, 0, 0, 596, 338, 347, 346, 327, 328, 330, - 332, 337, 344, 350, 1172, 1220, 1261, 1173, 1222, 255, - 310, 262, 254, 507, 1272, 1252, 1137, 1201, 1260, 0, - 0, 221, 1263, 1196, 0, 1225, 0, 1278, 1132, 1216, - 0, 1135, 1139, 1274, 1256, 1167, 265, 0, 0, 0, - 0, 0, 0, 0, 1193, 1203, 1237, 1241, 1187, 0, - 0, 0, 0, 1363, 0, 0, 1165, 0, 1212, 0, - 0, 0, 1144, 1136, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1191, 0, 0, 0, - 0, 1147, 0, 1166, 1238, 1720, 1130, 287, 1141, 388, - 247, 0, 438, 1245, 1255, 1188, 549, 1259, 1186, 1185, - 1232, 1145, 1251, 1179, 352, 1143, 319, 193, 217, 0, - 1177, 398, 446, 458, 1250, 1162, 1171, 245, 1169, 456, - 412, 527, 225, 274, 443, 418, 454, 426, 277, 1211, - 1230, 455, 359, 512, 436, 524, 550, 551, 253, 392, - 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, - 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, - 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, - 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, - 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, - 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, - 212, 1142, 542, 394, 511, 520, 381, 370, 211, 518, - 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, - 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, - 483, 532, 572, 226, 227, 229, 1157, 269, 273, 281, - 284, 292, 293, 302, 354, 405, 432, 428, 437, 1246, - 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, - 561, 564, 562, 393, 300, 479, 322, 360, 1235, 1277, - 411, 457, 232, 529, 480, 1152, 1156, 1150, 1217, 1151, - 1206, 1207, 1153, 1268, 1269, 1270, 573, 574, 575, 576, - 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, - 587, 588, 589, 590, 0, 1239, 1146, 0, 1154, 1155, - 1248, 1257, 1258, 591, 371, 470, 526, 324, 336, 339, - 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, - 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, - 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, - 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, - 321, 366, 435, 1210, 192, 213, 355, 1273, 439, 278, - 569, 539, 534, 199, 215, 1149, 252, 1160, 1168, 0, - 1174, 1182, 1183, 1195, 1197, 1198, 1199, 1200, 1218, 1219, - 1221, 1229, 1231, 1234, 1236, 1243, 1254, 1276, 194, 195, - 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, - 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, - 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, - 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, - 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, - 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, - 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, - 553, 521, 565, 547, 424, 365, 1209, 1215, 368, 271, - 294, 309, 1224, 538, 486, 219, 451, 280, 243, 1242, - 1244, 204, 238, 222, 249, 264, 267, 313, 378, 386, - 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, - 495, 497, 382, 256, 419, 1205, 1233, 363, 503, 504, - 305, 383, 0, 0, 0, 1262, 1247, 502, 0, 1190, - 1265, 1159, 1178, 1275, 1181, 1184, 1226, 1138, 1204, 402, - 1175, 1131, 1163, 1133, 1170, 1134, 1161, 1192, 260, 1158, - 1249, 1208, 1264, 353, 257, 1140, 1164, 416, 1180, 198, - 1228, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 1271, 357, 1214, 0, 481, - 387, 0, 0, 0, 1194, 1253, 1202, 1240, 1189, 1227, - 1148, 1213, 1266, 1176, 1223, 1267, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 190, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 1172, 1220, 1261, 1173, 1222, - 255, 310, 262, 254, 507, 1272, 1252, 1137, 1201, 1260, - 0, 0, 221, 1263, 1196, 0, 1225, 0, 1278, 1132, - 1216, 0, 1135, 1139, 1274, 1256, 1167, 265, 0, 0, - 0, 0, 0, 0, 0, 1193, 1203, 1237, 1241, 1187, - 0, 0, 0, 0, 0, 2769, 0, 1165, 0, 1212, - 0, 0, 0, 1144, 1136, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3330, + 0, 0, 0, 3330, 3330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1191, 0, 0, - 0, 0, 1147, 0, 1166, 1238, 0, 1130, 287, 1141, - 388, 247, 0, 438, 1245, 1255, 1188, 549, 1259, 1186, - 1185, 1232, 1145, 1251, 1179, 352, 1143, 319, 193, 217, - 0, 1177, 398, 446, 458, 1250, 1162, 1171, 245, 1169, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 1211, 1230, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 1142, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 1157, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 1246, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 1235, - 1277, 411, 457, 232, 529, 480, 1152, 1156, 1150, 1217, - 1151, 1206, 1207, 1153, 1268, 1269, 1270, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 1239, 1146, 0, 1154, - 1155, 1248, 1257, 1258, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 1210, 192, 213, 355, 1273, 439, - 278, 569, 539, 534, 199, 215, 1149, 252, 1160, 1168, - 0, 1174, 1182, 1183, 1195, 1197, 1198, 1199, 1200, 1218, - 1219, 1221, 1229, 1231, 1234, 1236, 1243, 1254, 1276, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 1209, 1215, 368, - 271, 294, 309, 1224, 538, 486, 219, 451, 280, 243, - 1242, 1244, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 1205, 1233, 363, 503, - 504, 305, 383, 0, 0, 0, 1262, 1247, 502, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2061, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2061, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3407, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3411, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1128, 1128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3455, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3463, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3407, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2061, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 383, 2952, 0, 3463, 1262, 1247, 502, 0, 1190, 1265, 1159, 1178, 1275, 1181, 1184, 1226, 1138, 1204, 402, 1175, 1131, 1163, 1133, 1170, 1134, 1161, 1192, 260, 1158, 1249, 1208, 1264, 353, 257, 1140, 1164, 416, 1180, @@ -2586,15 +2501,15 @@ var yyAct = [...]int{ 242, 306, 372, 414, 492, 408, 1271, 357, 1214, 0, 481, 387, 0, 0, 0, 1194, 1253, 1202, 1240, 1189, 1227, 1148, 1213, 1266, 1176, 1223, 1267, 312, 240, 314, - 197, 399, 482, 276, 0, 0, 0, 0, 0, 638, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, + 197, 399, 482, 276, 0, 0, 0, 0, 3435, 812, + 0, 0, 0, 0, 3436, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 1172, 1220, 1261, 1173, 1222, 255, 310, 262, 254, 507, 1272, 1252, 1137, 1201, 1260, 0, 0, 221, 1263, 1196, 0, 1225, 0, 1278, 1132, 1216, 0, 1135, 1139, 1274, 1256, 1167, 265, 0, 0, 0, 0, 0, 0, 0, 1193, 1203, 1237, 1241, - 1187, 0, 0, 0, 0, 0, 2730, 0, 1165, 0, + 1187, 0, 0, 0, 0, 0, 0, 0, 1165, 0, 1212, 0, 0, 0, 1144, 1136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2653,14 +2568,14 @@ var yyAct = [...]int{ 0, 481, 387, 0, 0, 0, 1194, 1253, 1202, 1240, 1189, 1227, 1148, 1213, 1266, 1176, 1223, 1267, 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 1172, 1220, 1261, 1173, 1222, 255, 310, 262, 254, 507, 1272, 1252, 1137, 1201, 1260, 0, 0, 221, 1263, 1196, 0, 1225, 0, 1278, 1132, 1216, 0, 1135, 1139, 1274, 1256, 1167, 265, 0, 0, 0, 0, 0, 0, 0, 1193, 1203, 1237, - 1241, 1187, 0, 0, 0, 0, 0, 2077, 0, 1165, + 1241, 1187, 0, 0, 0, 0, 0, 2769, 0, 1165, 0, 1212, 0, 0, 0, 1144, 1136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2718,7 +2633,7 @@ var yyAct = [...]int{ 263, 259, 242, 306, 372, 414, 492, 408, 1271, 357, 1214, 0, 481, 387, 0, 0, 0, 1194, 1253, 1202, 1240, 1189, 1227, 1148, 1213, 1266, 1176, 1223, 1267, 312, - 240, 314, 197, 399, 482, 276, 0, 91, 0, 0, + 240, 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 1172, 1220, @@ -2726,7 +2641,7 @@ var yyAct = [...]int{ 1137, 1201, 1260, 0, 0, 221, 1263, 1196, 0, 1225, 0, 1278, 1132, 1216, 0, 1135, 1139, 1274, 1256, 1167, 265, 0, 0, 0, 0, 0, 0, 0, 1193, 1203, - 1237, 1241, 1187, 0, 0, 0, 0, 0, 0, 0, + 1237, 1241, 1187, 0, 0, 0, 0, 0, 2730, 0, 1165, 0, 1212, 0, 0, 0, 1144, 1136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2785,14 +2700,14 @@ var yyAct = [...]int{ 357, 1214, 0, 481, 387, 0, 0, 0, 1194, 1253, 1202, 1240, 1189, 1227, 1148, 1213, 1266, 1176, 1223, 1267, 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, - 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 1172, 1220, 1261, 1173, 1222, 255, 310, 262, 254, 507, 1272, 1252, 1137, 1201, 1260, 0, 0, 221, 1263, 1196, 0, 1225, 0, 1278, 1132, 1216, 0, 1135, 1139, 1274, 1256, 1167, 265, 0, 0, 0, 0, 0, 0, 0, 1193, - 1203, 1237, 1241, 1187, 0, 0, 0, 0, 0, 0, + 1203, 1237, 1241, 1187, 0, 0, 0, 0, 0, 2077, 0, 1165, 0, 1212, 0, 0, 0, 1144, 1136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2850,8 +2765,8 @@ var yyAct = [...]int{ 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, 1271, 357, 1214, 0, 481, 387, 0, 0, 0, 1194, 1253, 1202, 1240, 1189, 1227, 1148, 1213, 1266, 1176, 1223, - 1267, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 812, 0, 0, 0, 0, 0, 0, + 1267, 312, 240, 314, 197, 399, 482, 276, 0, 91, + 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 1172, 1220, 1261, 1173, 1222, 255, 310, 262, 254, 507, @@ -2975,688 +2890,99 @@ var yyAct = [...]int{ 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, 1205, 1233, 363, 503, 504, 305, 383, 0, - 0, 0, 0, 0, 502, 0, 691, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 678, 0, 0, 0, 260, 683, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 0, 0, 1262, 1247, 502, 0, 1190, 1265, 1159, 1178, + 1275, 1181, 1184, 1226, 1138, 1204, 402, 1175, 1131, 1163, + 1133, 1170, 1134, 1161, 1192, 260, 1158, 1249, 1208, 1264, + 353, 257, 1140, 1164, 416, 1180, 198, 1228, 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 690, 357, 0, 0, 481, 387, 0, 0, - 0, 0, 0, 686, 687, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 91, 0, 0, 828, 812, 778, 779, 816, 829, - 830, 831, 832, 817, 0, 230, 818, 819, 237, 820, - 0, 777, 718, 720, 719, 737, 738, 739, 740, 741, - 742, 743, 716, 825, 833, 834, 0, 255, 310, 262, - 254, 507, 0, 0, 1956, 1957, 1958, 0, 0, 221, - 0, 0, 0, 0, 0, 0, 0, 660, 675, 0, - 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 672, 673, 0, 0, 0, 0, 772, 0, 674, 0, - 0, 682, 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, 865, 866, 867, 868, 869, 870, 871, 872, - 873, 874, 875, 876, 685, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 771, 0, 0, 549, 0, 0, 769, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 822, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 492, 408, 1271, 357, 1214, 0, 481, 387, 0, 0, + 0, 1194, 1253, 1202, 1240, 1189, 1227, 1148, 1213, 1266, + 1176, 1223, 1267, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 1172, 1220, 1261, 1173, 1222, 255, 310, 262, + 254, 507, 1272, 1252, 1137, 1201, 1260, 0, 0, 221, + 1263, 1196, 0, 1225, 0, 1278, 1132, 1216, 0, 1135, + 1139, 1274, 1256, 1167, 265, 0, 0, 0, 0, 0, + 0, 0, 1193, 1203, 1237, 1241, 1187, 0, 0, 0, + 0, 0, 0, 0, 1165, 0, 1212, 0, 0, 0, + 1144, 1136, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1191, 0, 0, 0, 0, 1147, + 0, 1166, 1238, 0, 1130, 287, 1141, 388, 247, 0, + 438, 1245, 1255, 1188, 549, 1259, 1186, 1185, 1232, 1145, + 1251, 1179, 352, 1143, 319, 193, 217, 0, 1177, 398, + 446, 458, 1250, 1162, 1171, 245, 1169, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 1211, 1230, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 823, 824, 246, 571, 724, 543, 212, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 1142, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 732, 733, 270, 296, 433, 362, 434, 295, 297, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 572, 226, 227, 229, 1157, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 1246, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 782, 770, 695, 786, 697, 783, 784, - 692, 693, 696, 785, 573, 574, 575, 576, 577, 578, + 562, 393, 300, 479, 322, 360, 1235, 1277, 411, 457, + 232, 529, 480, 1152, 1156, 1150, 1217, 1151, 1206, 1207, + 1153, 1268, 1269, 1270, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 773, 681, 680, 0, 688, 0, 714, - 715, 717, 721, 722, 723, 734, 735, 736, 744, 746, - 747, 745, 748, 749, 750, 753, 754, 755, 756, 751, - 752, 757, 698, 702, 699, 700, 701, 713, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 796, 797, - 798, 799, 800, 801, 727, 731, 730, 728, 729, 725, - 726, 679, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 787, 252, 788, 0, 0, 792, 0, - 0, 0, 794, 793, 0, 795, 761, 760, 0, 0, - 789, 790, 0, 791, 0, 0, 194, 195, 202, 214, + 589, 590, 0, 1239, 1146, 0, 1154, 1155, 1248, 1257, + 1258, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 1210, 192, 213, 355, 1273, 439, 278, 569, 539, + 534, 199, 215, 1149, 252, 1160, 1168, 0, 1174, 1182, + 1183, 1195, 1197, 1198, 1199, 1200, 1218, 1219, 1221, 1229, + 1231, 1234, 1236, 1243, 1254, 1276, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 802, 803, - 804, 805, 806, 807, 808, 809, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 827, 0, 204, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 1209, 1215, 368, 271, 294, 309, + 1224, 538, 486, 219, 451, 280, 243, 1242, 1244, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, - 0, 691, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 678, 0, 0, 0, - 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 690, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 686, 687, - 0, 0, 0, 0, 0, 0, 2106, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 91, 0, 0, 828, - 812, 778, 779, 816, 829, 830, 831, 832, 817, 0, - 230, 818, 819, 237, 820, 0, 777, 718, 720, 719, - 737, 738, 739, 740, 741, 742, 743, 716, 825, 833, - 834, 2107, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 660, 675, 0, 689, 0, 0, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 672, 673, 0, 0, 0, - 0, 772, 0, 674, 0, 0, 682, 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, 865, 866, 867, - 868, 869, 870, 871, 872, 873, 874, 875, 876, 685, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 771, 0, 0, 549, - 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 822, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 823, 824, 246, - 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 732, 733, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 782, 770, - 695, 786, 697, 783, 784, 692, 693, 696, 785, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 773, 681, - 680, 0, 688, 0, 714, 715, 717, 721, 722, 723, - 734, 735, 736, 744, 746, 747, 745, 748, 749, 750, - 753, 754, 755, 756, 751, 752, 757, 698, 702, 699, - 700, 701, 713, 703, 704, 705, 706, 707, 708, 709, - 710, 711, 712, 796, 797, 798, 799, 800, 801, 727, - 731, 730, 728, 729, 725, 726, 679, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 787, 252, - 788, 0, 0, 792, 0, 0, 0, 794, 793, 0, - 795, 761, 760, 0, 0, 789, 790, 0, 791, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 802, 803, 804, 805, 806, 807, 808, - 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 0, 383, - 363, 503, 504, 305, 82, 502, 0, 691, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, - 0, 0, 678, 0, 0, 0, 260, 683, 0, 0, - 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, - 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, - 414, 492, 408, 690, 357, 0, 0, 481, 387, 0, - 0, 0, 0, 0, 686, 687, 0, 0, 0, 0, - 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, - 276, 0, 91, 0, 0, 828, 812, 778, 779, 816, - 829, 830, 831, 832, 817, 0, 230, 818, 819, 237, - 820, 0, 777, 718, 720, 719, 737, 738, 739, 740, - 741, 742, 743, 716, 825, 833, 834, 0, 255, 310, - 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, - 221, 0, 0, 0, 0, 0, 0, 0, 660, 675, - 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 672, 673, 0, 0, 0, 0, 772, 0, 674, - 0, 0, 682, 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, 865, 866, 867, 868, 869, 870, 871, - 872, 873, 874, 875, 876, 685, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, - 0, 438, 771, 0, 0, 549, 0, 0, 769, 0, - 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, - 398, 446, 458, 0, 0, 0, 822, 0, 456, 412, - 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, - 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, - 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, - 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, - 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, - 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, - 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, - 0, 248, 401, 823, 824, 246, 571, 724, 543, 212, - 0, 542, 394, 511, 520, 381, 370, 211, 518, 379, - 369, 323, 732, 733, 270, 296, 433, 362, 434, 295, - 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, - 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, - 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, - 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, - 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, - 457, 232, 529, 480, 782, 770, 695, 786, 697, 783, - 784, 692, 693, 696, 785, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 0, 773, 681, 680, 0, 688, 0, - 714, 715, 717, 721, 722, 723, 734, 735, 736, 744, - 746, 747, 745, 748, 749, 750, 753, 754, 755, 756, - 751, 752, 757, 698, 702, 699, 700, 701, 713, 703, - 704, 705, 706, 707, 708, 709, 710, 711, 712, 796, - 797, 798, 799, 800, 801, 727, 731, 730, 728, 729, - 725, 726, 679, 192, 213, 355, 90, 439, 278, 569, - 539, 534, 199, 215, 787, 252, 788, 0, 0, 792, - 0, 0, 0, 794, 793, 0, 795, 761, 760, 0, - 0, 789, 790, 0, 791, 0, 0, 194, 195, 202, - 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, - 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, - 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, - 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, - 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, - 484, 485, 490, 513, 515, 528, 546, 552, 465, 802, - 803, 804, 805, 806, 807, 808, 809, 289, 523, 553, - 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, - 309, 0, 538, 486, 219, 451, 280, 243, 827, 0, - 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, - 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, - 497, 382, 256, 419, 383, 0, 363, 503, 504, 305, - 502, 0, 691, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 402, 0, 0, 0, 0, 678, 0, 0, - 0, 260, 683, 0, 0, 0, 353, 257, 0, 0, - 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, - 263, 259, 242, 306, 372, 414, 492, 408, 690, 357, - 0, 0, 481, 387, 0, 0, 0, 0, 0, 686, - 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, - 240, 314, 197, 399, 482, 276, 0, 91, 0, 0, - 828, 812, 778, 779, 816, 829, 830, 831, 832, 817, - 0, 230, 818, 819, 237, 820, 0, 777, 718, 720, - 719, 737, 738, 739, 740, 741, 742, 743, 716, 825, - 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, - 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, - 0, 0, 0, 660, 675, 0, 689, 0, 0, 0, - 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 672, 673, 0, 0, - 0, 0, 772, 0, 674, 0, 0, 682, 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, 865, 866, - 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, - 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 287, 0, 388, 247, 0, 438, 771, 0, 0, - 549, 0, 0, 769, 0, 0, 0, 0, 352, 0, - 319, 193, 217, 0, 0, 398, 446, 458, 0, 0, - 0, 822, 0, 456, 412, 527, 225, 274, 443, 418, - 454, 426, 277, 3421, 0, 455, 359, 512, 436, 524, - 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, - 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, - 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, - 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, - 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, - 0, 442, 258, 283, 0, 0, 248, 401, 823, 824, - 246, 571, 724, 543, 212, 0, 542, 394, 511, 520, - 381, 370, 211, 518, 379, 369, 323, 732, 733, 270, - 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, - 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, - 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, - 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, - 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, - 322, 360, 0, 0, 411, 457, 232, 529, 480, 782, - 770, 695, 786, 697, 783, 784, 692, 693, 696, 785, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 0, 773, - 681, 680, 0, 688, 0, 714, 715, 717, 721, 722, - 723, 734, 735, 736, 744, 746, 747, 745, 748, 749, - 750, 753, 754, 755, 756, 751, 752, 757, 698, 702, - 699, 700, 701, 713, 703, 704, 705, 706, 707, 708, - 709, 710, 711, 712, 796, 797, 798, 799, 800, 801, - 727, 731, 730, 728, 729, 725, 726, 679, 192, 213, - 355, 0, 439, 278, 569, 539, 534, 199, 215, 787, - 252, 788, 0, 0, 792, 0, 0, 0, 794, 793, - 0, 795, 761, 760, 0, 0, 789, 790, 0, 791, - 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, - 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, - 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, - 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, - 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, - 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, - 528, 546, 552, 465, 802, 803, 804, 805, 806, 807, - 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, - 0, 0, 368, 271, 294, 309, 0, 538, 486, 219, - 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, - 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, - 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, - 0, 363, 503, 504, 305, 502, 0, 691, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, - 0, 0, 678, 0, 0, 0, 260, 683, 0, 0, - 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, - 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, - 414, 492, 408, 690, 357, 0, 0, 481, 387, 0, - 0, 0, 0, 0, 686, 687, 0, 0, 0, 0, - 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, - 276, 0, 91, 0, 1519, 828, 812, 778, 779, 816, - 829, 830, 831, 832, 817, 0, 230, 818, 819, 237, - 820, 0, 777, 718, 720, 719, 737, 738, 739, 740, - 741, 742, 743, 716, 825, 833, 834, 0, 255, 310, - 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, - 221, 0, 0, 0, 0, 0, 0, 0, 660, 675, - 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 672, 673, 0, 0, 0, 0, 772, 0, 674, - 0, 0, 682, 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, 865, 866, 867, 868, 869, 870, 871, - 872, 873, 874, 875, 876, 685, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, - 0, 438, 771, 0, 0, 549, 0, 0, 769, 0, - 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, - 398, 446, 458, 0, 0, 0, 822, 0, 456, 412, - 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, - 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, - 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, - 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, - 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, - 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, - 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, - 0, 248, 401, 823, 824, 246, 571, 724, 543, 212, - 0, 542, 394, 511, 520, 381, 370, 211, 518, 379, - 369, 323, 732, 733, 270, 296, 433, 362, 434, 295, - 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, - 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, - 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, - 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, - 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, - 457, 232, 529, 480, 782, 770, 695, 786, 697, 783, - 784, 692, 693, 696, 785, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 0, 773, 681, 680, 0, 688, 0, - 714, 715, 717, 721, 722, 723, 734, 735, 736, 744, - 746, 747, 745, 748, 749, 750, 753, 754, 755, 756, - 751, 752, 757, 698, 702, 699, 700, 701, 713, 703, - 704, 705, 706, 707, 708, 709, 710, 711, 712, 796, - 797, 798, 799, 800, 801, 727, 731, 730, 728, 729, - 725, 726, 679, 192, 213, 355, 0, 439, 278, 569, - 539, 534, 199, 215, 787, 252, 788, 0, 0, 792, - 0, 0, 0, 794, 793, 0, 795, 761, 760, 0, - 0, 789, 790, 0, 791, 0, 0, 194, 195, 202, - 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, - 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, - 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, - 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, - 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, - 484, 485, 490, 513, 515, 528, 546, 552, 465, 802, - 803, 804, 805, 806, 807, 808, 809, 289, 523, 553, - 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, - 309, 0, 538, 486, 219, 451, 280, 243, 827, 0, - 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, - 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, - 497, 382, 256, 419, 383, 0, 363, 503, 504, 305, - 502, 0, 691, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 402, 0, 0, 0, 0, 678, 0, 0, - 0, 260, 683, 0, 0, 0, 353, 257, 0, 0, - 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, - 263, 259, 242, 306, 372, 414, 492, 408, 690, 357, - 0, 0, 481, 387, 0, 0, 0, 0, 0, 686, - 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, - 240, 314, 197, 399, 482, 276, 0, 91, 0, 0, - 828, 812, 778, 779, 816, 829, 830, 831, 832, 817, - 0, 230, 818, 819, 237, 820, 0, 777, 718, 720, - 719, 737, 738, 739, 740, 741, 742, 743, 716, 825, - 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, - 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, - 0, 0, 0, 660, 675, 0, 689, 0, 0, 0, - 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 672, 673, 917, 0, - 0, 0, 772, 0, 674, 0, 0, 682, 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, 865, 866, - 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, - 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 287, 0, 388, 247, 0, 438, 771, 0, 0, - 549, 0, 0, 769, 0, 0, 0, 0, 352, 0, - 319, 193, 217, 0, 0, 398, 446, 458, 0, 0, - 0, 822, 0, 456, 412, 527, 225, 274, 443, 418, - 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, - 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, - 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, - 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, - 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, - 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, - 0, 442, 258, 283, 0, 0, 248, 401, 823, 824, - 246, 571, 724, 543, 212, 0, 542, 394, 511, 520, - 381, 370, 211, 518, 379, 369, 323, 732, 733, 270, - 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, - 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, - 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, - 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, - 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, - 322, 360, 0, 0, 411, 457, 232, 529, 480, 782, - 770, 695, 786, 697, 783, 784, 692, 693, 696, 785, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 0, 773, - 681, 680, 0, 688, 0, 714, 715, 717, 721, 722, - 723, 734, 735, 736, 744, 746, 747, 745, 748, 749, - 750, 753, 754, 755, 756, 751, 752, 757, 698, 702, - 699, 700, 701, 713, 703, 704, 705, 706, 707, 708, - 709, 710, 711, 712, 796, 797, 798, 799, 800, 801, - 727, 731, 730, 728, 729, 725, 726, 679, 192, 213, - 355, 0, 439, 278, 569, 539, 534, 199, 215, 787, - 252, 788, 0, 0, 792, 0, 0, 0, 794, 793, - 0, 795, 761, 760, 0, 0, 789, 790, 0, 791, - 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, - 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, - 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, - 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, - 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, - 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, - 528, 546, 552, 465, 802, 803, 804, 805, 806, 807, - 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, - 0, 0, 368, 271, 294, 309, 0, 538, 486, 219, - 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, - 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, - 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, - 0, 363, 503, 504, 305, 502, 0, 691, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, - 0, 0, 678, 0, 0, 0, 260, 683, 0, 0, - 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, - 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, - 414, 492, 408, 690, 357, 0, 0, 481, 387, 0, - 0, 0, 0, 0, 686, 687, 0, 0, 0, 0, - 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, - 276, 0, 91, 0, 0, 828, 812, 778, 779, 816, - 829, 830, 831, 832, 817, 0, 230, 818, 819, 237, - 820, 0, 777, 718, 720, 719, 737, 738, 739, 740, - 741, 742, 743, 716, 825, 833, 834, 0, 255, 310, - 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, - 221, 0, 0, 0, 0, 0, 0, 0, 660, 675, - 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 672, 673, 0, 0, 0, 0, 772, 0, 674, - 0, 0, 682, 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, 865, 866, 867, 868, 869, 870, 871, - 872, 873, 874, 875, 876, 685, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, - 0, 438, 771, 0, 0, 549, 0, 0, 769, 0, - 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, - 398, 446, 458, 0, 0, 0, 822, 0, 456, 412, - 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, - 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, - 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, - 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, - 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, - 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, - 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, - 0, 248, 401, 823, 824, 246, 571, 724, 543, 212, - 0, 542, 394, 511, 520, 381, 370, 211, 518, 379, - 369, 323, 732, 733, 270, 296, 433, 362, 434, 295, - 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, - 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, - 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, - 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, - 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, - 457, 232, 529, 480, 782, 770, 695, 786, 697, 783, - 784, 692, 693, 696, 785, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 0, 773, 681, 680, 0, 688, 0, - 714, 715, 717, 721, 722, 723, 734, 735, 736, 744, - 746, 747, 745, 748, 749, 750, 753, 754, 755, 756, - 751, 752, 757, 698, 702, 699, 700, 701, 713, 703, - 704, 705, 706, 707, 708, 709, 710, 711, 712, 796, - 797, 798, 799, 800, 801, 727, 731, 730, 728, 729, - 725, 726, 679, 192, 213, 355, 0, 439, 278, 569, - 539, 534, 199, 215, 787, 252, 788, 0, 0, 792, - 0, 0, 0, 794, 793, 0, 795, 761, 760, 0, - 0, 789, 790, 0, 791, 0, 0, 194, 195, 202, - 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, - 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, - 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, - 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, - 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, - 484, 485, 490, 513, 515, 528, 546, 552, 465, 802, - 803, 804, 805, 806, 807, 808, 809, 289, 523, 553, - 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, - 309, 0, 538, 486, 219, 451, 280, 243, 827, 0, - 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, - 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, - 497, 382, 256, 419, 383, 0, 363, 503, 504, 305, - 502, 0, 691, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 402, 0, 0, 0, 0, 678, 0, 0, - 0, 260, 683, 0, 0, 0, 353, 257, 0, 0, - 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, - 263, 259, 242, 306, 372, 414, 492, 408, 690, 357, - 0, 0, 481, 387, 0, 0, 0, 0, 0, 686, - 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, - 240, 314, 197, 399, 482, 276, 0, 91, 0, 0, - 828, 812, 778, 779, 816, 829, 830, 831, 832, 817, - 0, 230, 818, 819, 237, 820, 0, 777, 718, 720, - 719, 737, 738, 739, 740, 741, 742, 743, 716, 825, - 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, - 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, - 0, 0, 0, 0, 675, 0, 689, 0, 0, 0, - 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 672, 673, 0, 0, - 0, 0, 772, 0, 674, 0, 0, 682, 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, 865, 866, - 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, - 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 287, 0, 388, 247, 0, 438, 771, 0, 0, - 549, 0, 0, 769, 0, 0, 0, 0, 352, 0, - 319, 193, 217, 0, 0, 398, 446, 458, 0, 0, - 0, 822, 0, 456, 412, 527, 225, 274, 443, 418, - 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, - 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, - 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, - 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, - 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, - 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, - 0, 442, 258, 283, 0, 0, 248, 401, 823, 824, - 246, 571, 724, 543, 212, 0, 542, 394, 511, 520, - 381, 370, 211, 518, 379, 369, 323, 732, 733, 270, - 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, - 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, - 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, - 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, - 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, - 322, 360, 0, 0, 411, 457, 232, 529, 480, 782, - 770, 695, 786, 697, 783, 784, 692, 693, 696, 785, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 0, 773, - 681, 680, 0, 688, 0, 714, 715, 717, 721, 722, - 723, 734, 735, 736, 744, 746, 747, 745, 748, 749, - 750, 753, 754, 755, 756, 751, 752, 757, 698, 702, - 699, 700, 701, 713, 703, 704, 705, 706, 707, 708, - 709, 710, 711, 712, 796, 797, 798, 799, 800, 801, - 727, 731, 730, 728, 729, 725, 726, 679, 192, 213, - 355, 0, 439, 278, 569, 539, 534, 199, 215, 787, - 252, 788, 0, 0, 792, 0, 0, 0, 794, 793, - 0, 795, 761, 760, 0, 0, 789, 790, 0, 791, - 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, - 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, - 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, - 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, - 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, - 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, - 528, 546, 552, 465, 802, 803, 804, 805, 806, 807, - 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, - 0, 0, 368, 271, 294, 309, 0, 538, 486, 219, - 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, - 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, - 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, - 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, - 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, - 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, + 382, 256, 419, 1205, 1233, 363, 503, 504, 305, 383, + 0, 0, 0, 1262, 1247, 502, 0, 1190, 1265, 1159, + 1178, 1275, 1181, 1184, 1226, 1138, 1204, 402, 1175, 1131, + 1163, 1133, 1170, 1134, 1161, 1192, 260, 1158, 1249, 1208, + 1264, 353, 257, 1140, 1164, 416, 1180, 198, 1228, 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, - 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, - 276, 0, 0, 0, 0, 0, 638, 0, 0, 0, + 414, 492, 408, 1271, 357, 1214, 0, 481, 387, 0, + 0, 0, 1194, 1253, 1202, 1240, 1189, 1227, 1148, 1213, + 1266, 1176, 1223, 1267, 312, 240, 314, 197, 399, 482, + 276, 0, 0, 0, 0, 0, 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, - 337, 344, 350, 0, 0, 0, 0, 0, 255, 310, - 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, - 221, 0, 0, 0, 0, 1335, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1336, 1337, - 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, - 0, 438, 0, 0, 0, 549, 0, 0, 0, 0, - 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, - 398, 446, 458, 0, 0, 0, 245, 0, 456, 412, - 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, - 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, - 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, - 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, - 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, - 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, - 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, - 0, 248, 401, 516, 517, 246, 571, 220, 543, 212, - 0, 542, 394, 511, 520, 381, 370, 211, 518, 379, - 369, 323, 342, 343, 270, 296, 433, 362, 434, 295, - 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, - 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, - 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, - 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, - 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, - 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 591, 371, 470, 526, 324, 336, 339, 329, - 348, 0, 349, 325, 326, 331, 333, 334, 335, 340, - 341, 345, 351, 241, 203, 377, 385, 505, 301, 208, - 209, 210, 498, 499, 500, 501, 540, 541, 545, 447, - 448, 449, 450, 282, 535, 298, 453, 452, 320, 321, - 366, 435, 0, 192, 213, 355, 0, 439, 278, 569, - 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 194, 195, 202, - 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, - 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, - 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, - 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, - 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, - 484, 485, 490, 513, 515, 528, 546, 552, 465, 290, - 291, 430, 431, 303, 304, 566, 567, 289, 523, 553, - 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, - 309, 0, 538, 486, 219, 451, 280, 243, 0, 0, - 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, - 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, - 497, 382, 256, 419, 383, 0, 363, 503, 504, 305, - 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 260, 0, 0, 0, 0, 353, 257, 0, 0, - 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, - 263, 259, 242, 306, 372, 414, 492, 408, 0, 357, - 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, - 240, 314, 197, 399, 482, 276, 0, 0, 0, 0, - 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, - 346, 327, 328, 330, 332, 337, 344, 350, 0, 0, - 0, 0, 0, 255, 310, 262, 254, 507, 0, 0, - 0, 0, 0, 0, 0, 221, 0, 988, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 287, 0, 388, 247, 0, 438, 0, 0, 987, - 549, 0, 0, 0, 0, 0, 984, 985, 352, 945, - 319, 193, 217, 978, 982, 398, 446, 458, 0, 0, - 0, 245, 0, 456, 412, 527, 225, 274, 443, 418, - 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, - 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, - 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, - 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, - 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, - 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, - 0, 442, 258, 283, 0, 0, 248, 401, 516, 517, - 246, 571, 220, 543, 212, 0, 542, 394, 511, 520, - 381, 370, 211, 518, 379, 369, 323, 342, 343, 270, - 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, - 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, - 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, - 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, - 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, - 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 591, 371, 470, - 526, 324, 336, 339, 329, 348, 0, 349, 325, 326, - 331, 333, 334, 335, 340, 341, 345, 351, 241, 203, - 377, 385, 505, 301, 208, 209, 210, 498, 499, 500, - 501, 540, 541, 545, 447, 448, 449, 450, 282, 535, - 298, 453, 452, 320, 321, 366, 435, 0, 192, 213, - 355, 0, 439, 278, 569, 539, 534, 199, 215, 0, - 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, - 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, - 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, - 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, - 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, - 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, - 528, 546, 552, 465, 290, 291, 430, 431, 303, 304, - 566, 567, 289, 523, 553, 521, 565, 547, 424, 365, - 0, 0, 368, 271, 294, 309, 0, 538, 486, 219, - 451, 280, 243, 0, 0, 204, 238, 222, 249, 264, - 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, - 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, - 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, - 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, - 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, - 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, - 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, - 276, 0, 0, 0, 0, 1482, 812, 0, 0, 1479, - 0, 0, 0, 0, 1477, 0, 230, 1478, 1476, 237, - 1481, 0, 777, 338, 347, 346, 327, 328, 330, 332, - 337, 344, 350, 0, 0, 0, 0, 0, 255, 310, - 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, - 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, - 0, 438, 0, 0, 0, 549, 0, 0, 0, 0, - 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, - 398, 446, 458, 0, 0, 0, 245, 0, 456, 412, - 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, + 337, 344, 350, 1172, 1220, 1261, 1173, 1222, 255, 310, + 262, 254, 507, 1272, 1252, 1137, 1201, 1260, 0, 0, + 221, 1263, 1196, 0, 1225, 0, 1278, 1132, 1216, 0, + 1135, 1139, 1274, 1256, 1167, 265, 0, 0, 0, 0, + 0, 0, 0, 1193, 1203, 1237, 1241, 1187, 0, 0, + 0, 0, 0, 0, 0, 1165, 0, 1212, 0, 0, + 0, 1144, 1136, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1191, 0, 0, 0, 0, + 1147, 0, 1166, 1238, 0, 1130, 287, 1141, 388, 247, + 0, 438, 1245, 1255, 1188, 549, 1259, 1186, 1185, 1232, + 1145, 1251, 1179, 352, 1143, 319, 193, 217, 0, 1177, + 398, 446, 458, 1250, 1162, 1171, 245, 1169, 456, 412, + 527, 225, 274, 443, 418, 454, 426, 277, 1211, 1230, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, @@ -3664,26 +2990,26 @@ var yyAct = [...]int{ 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, 212, - 0, 542, 394, 511, 520, 381, 370, 211, 518, 379, + 1142, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, - 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, - 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, + 532, 572, 226, 227, 229, 1157, 269, 273, 281, 284, + 292, 293, 302, 354, 405, 432, 428, 437, 1246, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, - 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, - 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 573, 574, 575, 576, 577, + 564, 562, 393, 300, 479, 322, 360, 1235, 1277, 411, + 457, 232, 529, 480, 1152, 1156, 1150, 1217, 1151, 1206, + 1207, 1153, 1268, 1269, 1270, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 591, 371, 470, 526, 324, 336, 339, 329, + 588, 589, 590, 0, 1239, 1146, 0, 1154, 1155, 1248, + 1257, 1258, 591, 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, 321, - 366, 435, 0, 192, 213, 355, 0, 439, 278, 569, - 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 194, 195, 202, + 366, 435, 1210, 192, 213, 355, 1273, 439, 278, 569, + 539, 534, 199, 215, 1149, 252, 1160, 1168, 0, 1174, + 1182, 1183, 1195, 1197, 1198, 1199, 1200, 1218, 1219, 1221, + 1229, 1231, 1234, 1236, 1243, 1254, 1276, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, @@ -3691,102 +3017,37 @@ var yyAct = [...]int{ 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, 553, - 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, - 309, 0, 538, 486, 219, 451, 280, 243, 0, 0, + 521, 565, 547, 424, 365, 1209, 1215, 368, 271, 294, + 309, 1224, 538, 486, 219, 451, 280, 243, 1242, 1244, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, - 497, 382, 256, 419, 0, 383, 363, 503, 504, 305, - 82, 502, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, - 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, - 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, - 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, - 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 312, 240, 314, 197, 399, 482, 276, 0, 91, 0, - 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, - 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, - 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, - 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, - 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, - 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, - 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, - 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, - 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, - 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, - 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, - 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, - 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, - 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, - 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, - 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, - 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, - 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, - 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, - 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, - 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, - 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, - 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, - 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, - 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, - 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, - 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, - 213, 355, 90, 439, 278, 569, 539, 534, 199, 215, - 0, 252, 0, 0, 0, 0, 0, 0, 2093, 0, - 0, 2092, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, - 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, - 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, - 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, - 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, - 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, - 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, - 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, - 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, - 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, - 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, - 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, - 1538, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 497, 382, 256, 419, 1205, 1233, 363, 503, 504, 305, + 383, 0, 0, 0, 0, 0, 502, 0, 691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, - 0, 0, 1540, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 0, 678, 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, - 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 372, 414, 492, 408, 690, 357, 0, 0, 481, 387, + 0, 0, 0, 0, 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, - 482, 276, 0, 0, 0, 0, 1542, 638, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, - 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, - 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, - 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, - 0, 221, 0, 0, 0, 1316, 0, 1317, 1318, 0, - 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 482, 276, 0, 91, 0, 0, 828, 812, 778, 779, + 816, 829, 830, 831, 832, 817, 0, 230, 818, 819, + 237, 820, 0, 777, 718, 720, 719, 737, 738, 739, + 740, 741, 742, 743, 716, 825, 833, 834, 0, 255, + 310, 262, 254, 507, 0, 0, 1956, 1957, 1958, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 660, + 675, 0, 689, 0, 0, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 672, 673, 0, 0, 0, 0, 772, 0, + 674, 0, 0, 682, 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, 865, 866, 867, 868, 869, 870, + 871, 872, 873, 874, 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, - 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 247, 0, 438, 771, 0, 0, 549, 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, - 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 0, 398, 446, 458, 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, @@ -3794,130 +3055,261 @@ var yyAct = [...]int{ 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, - 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 0, 0, 248, 401, 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, - 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 379, 369, 323, 732, 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, - 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 411, 457, 232, 529, 480, 782, 770, 695, 786, 697, + 783, 784, 692, 693, 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, - 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, - 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, - 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, - 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, - 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, - 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, - 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 587, 588, 589, 590, 0, 773, 681, 680, 0, 688, + 0, 714, 715, 717, 721, 722, 723, 734, 735, 736, + 744, 746, 747, 745, 748, 749, 750, 753, 754, 755, + 756, 751, 752, 757, 698, 702, 699, 700, 701, 713, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 796, 797, 798, 799, 800, 801, 727, 731, 730, 728, + 729, 725, 726, 679, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 787, 252, 788, 0, 0, + 792, 0, 0, 0, 794, 793, 0, 795, 761, 760, + 0, 0, 789, 790, 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, - 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 802, 803, 804, 805, 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, - 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, - 495, 497, 382, 256, 419, 0, 383, 363, 503, 504, - 305, 82, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 691, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 678, 0, + 0, 0, 260, 683, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 690, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, + 686, 687, 0, 0, 0, 0, 0, 0, 2106, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 91, 0, + 0, 828, 812, 778, 779, 816, 829, 830, 831, 832, + 817, 0, 230, 818, 819, 237, 820, 0, 777, 718, + 720, 719, 737, 738, 739, 740, 741, 742, 743, 716, + 825, 833, 834, 2107, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, + 0, 0, 0, 0, 660, 675, 0, 689, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 672, 673, 0, + 0, 0, 0, 772, 0, 674, 0, 0, 682, 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, 865, + 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, + 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 771, 0, + 0, 549, 0, 0, 769, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 822, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 823, + 824, 246, 571, 724, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 732, 733, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, + 782, 770, 695, 786, 697, 783, 784, 692, 693, 696, + 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 773, 681, 680, 0, 688, 0, 714, 715, 717, 721, + 722, 723, 734, 735, 736, 744, 746, 747, 745, 748, + 749, 750, 753, 754, 755, 756, 751, 752, 757, 698, + 702, 699, 700, 701, 713, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 796, 797, 798, 799, 800, + 801, 727, 731, 730, 728, 729, 725, 726, 679, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 787, 252, 788, 0, 0, 792, 0, 0, 0, 794, + 793, 0, 795, 761, 760, 0, 0, 789, 790, 0, + 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 802, 803, 804, 805, 806, + 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 827, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 0, 383, 363, 503, 504, 305, 82, 502, 0, 691, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, + 0, 0, 0, 0, 678, 0, 0, 0, 260, 683, + 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, + 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, + 306, 372, 414, 492, 408, 690, 357, 0, 0, 481, + 387, 0, 0, 0, 0, 0, 686, 687, 0, 0, + 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, + 399, 482, 276, 0, 91, 0, 0, 828, 812, 778, + 779, 816, 829, 830, 831, 832, 817, 0, 230, 818, + 819, 237, 820, 0, 777, 718, 720, 719, 737, 738, + 739, 740, 741, 742, 743, 716, 825, 833, 834, 0, + 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, + 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, + 660, 675, 0, 689, 0, 0, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 672, 673, 0, 0, 0, 0, 772, + 0, 674, 0, 0, 682, 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, 865, 866, 867, 868, 869, + 870, 871, 872, 873, 874, 875, 876, 685, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, + 388, 247, 0, 438, 771, 0, 0, 549, 0, 0, + 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, + 0, 0, 398, 446, 458, 0, 0, 0, 822, 0, + 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, + 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, + 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, + 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, + 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, + 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, + 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, + 283, 0, 0, 248, 401, 823, 824, 246, 571, 724, + 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, + 518, 379, 369, 323, 732, 733, 270, 296, 433, 362, + 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, + 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, + 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, + 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, + 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, + 0, 411, 457, 232, 529, 480, 782, 770, 695, 786, + 697, 783, 784, 692, 693, 696, 785, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 0, 773, 681, 680, 0, + 688, 0, 714, 715, 717, 721, 722, 723, 734, 735, + 736, 744, 746, 747, 745, 748, 749, 750, 753, 754, + 755, 756, 751, 752, 757, 698, 702, 699, 700, 701, + 713, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 796, 797, 798, 799, 800, 801, 727, 731, 730, + 728, 729, 725, 726, 679, 192, 213, 355, 90, 439, + 278, 569, 539, 534, 199, 215, 787, 252, 788, 0, + 0, 792, 0, 0, 0, 794, 793, 0, 795, 761, + 760, 0, 0, 789, 790, 0, 791, 0, 0, 194, + 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, + 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, + 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, + 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, + 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, + 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, + 465, 802, 803, 804, 805, 806, 807, 808, 809, 289, + 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, + 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, + 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, + 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, + 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, + 504, 305, 502, 0, 691, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 402, 0, 0, 0, 0, 678, + 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, + 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, + 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, + 690, 357, 0, 0, 481, 387, 0, 0, 0, 0, + 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, 0, 91, - 0, 1519, 0, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, + 0, 0, 828, 812, 778, 779, 816, 829, 830, 831, + 832, 817, 0, 230, 818, 819, 237, 820, 0, 777, + 718, 720, 719, 737, 738, 739, 740, 741, 742, 743, + 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 660, 675, 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 672, 673, + 0, 0, 0, 0, 772, 0, 674, 0, 0, 682, + 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, + 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, + 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 287, 0, 388, 247, 0, 438, 771, + 0, 0, 549, 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, + 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, + 443, 418, 454, 426, 277, 3421, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, + 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, + 511, 520, 381, 370, 211, 518, 379, 369, 323, 732, + 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, + 480, 782, 770, 695, 786, 697, 783, 784, 692, 693, + 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 90, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, + 0, 773, 681, 680, 0, 688, 0, 714, 715, 717, + 721, 722, 723, 734, 735, 736, 744, 746, 747, 745, + 748, 749, 750, 753, 754, 755, 756, 751, 752, 757, + 698, 702, 699, 700, 701, 713, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 796, 797, 798, 799, + 800, 801, 727, 731, 730, 728, 729, 725, 726, 679, + 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, + 215, 787, 252, 788, 0, 0, 792, 0, 0, 0, + 794, 793, 0, 795, 761, 760, 0, 0, 789, 790, + 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, + 513, 515, 528, 546, 552, 465, 802, 803, 804, 805, + 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, + 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, + 419, 383, 0, 363, 503, 504, 305, 502, 0, 691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, + 0, 0, 0, 0, 678, 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 306, 372, 414, 492, 408, 690, 357, 0, 0, 481, + 387, 0, 0, 0, 0, 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 91, 0, 0, 0, 190, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, + 399, 482, 276, 0, 91, 0, 1519, 828, 812, 778, + 779, 816, 829, 830, 831, 832, 817, 0, 230, 818, + 819, 237, 820, 0, 777, 718, 720, 719, 737, 738, + 739, 740, 741, 742, 743, 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 675, 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 672, 673, 0, 0, 0, 0, 772, + 0, 674, 0, 0, 682, 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, 865, 866, 867, 868, 869, + 870, 871, 872, 873, 874, 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, + 388, 247, 0, 438, 771, 0, 0, 549, 0, 0, + 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, + 0, 0, 398, 446, 458, 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, @@ -3925,130 +3317,130 @@ var yyAct = [...]int{ 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, + 283, 0, 0, 248, 401, 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, + 518, 379, 369, 323, 732, 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, + 0, 411, 457, 232, 529, 480, 782, 770, 695, 786, + 697, 783, 784, 692, 693, 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, - 0, 0, 0, 0, 2093, 0, 0, 2092, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, + 586, 587, 588, 589, 590, 0, 773, 681, 680, 0, + 688, 0, 714, 715, 717, 721, 722, 723, 734, 735, + 736, 744, 746, 747, 745, 748, 749, 750, 753, 754, + 755, 756, 751, 752, 757, 698, 702, 699, 700, 701, + 713, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 796, 797, 798, 799, 800, 801, 727, 731, 730, + 728, 729, 725, 726, 679, 192, 213, 355, 0, 439, + 278, 569, 539, 534, 199, 215, 787, 252, 788, 0, + 0, 792, 0, 0, 0, 794, 793, 0, 795, 761, + 760, 0, 0, 789, 790, 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, + 465, 802, 803, 804, 805, 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, + 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 2043, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, + 504, 305, 502, 0, 691, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 402, 0, 0, 0, 0, 678, + 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 1721, 190, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, + 690, 357, 0, 0, 481, 387, 0, 0, 0, 0, + 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, + 0, 312, 240, 314, 197, 399, 482, 276, 0, 91, + 0, 0, 828, 812, 778, 779, 816, 829, 830, 831, + 832, 817, 0, 230, 818, 819, 237, 820, 0, 777, + 718, 720, 719, 737, 738, 739, 740, 741, 742, 743, + 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 660, 675, 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 672, 673, + 917, 0, 0, 0, 772, 0, 674, 0, 0, 682, + 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, + 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, + 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 287, 0, 388, 247, 0, 438, 771, + 0, 0, 549, 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 2041, 455, 359, 512, + 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, + 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, + 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, + 511, 520, 381, 370, 211, 518, 379, 369, 323, 732, + 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, + 480, 782, 770, 695, 786, 697, 783, 784, 692, 693, + 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, + 0, 773, 681, 680, 0, 688, 0, 714, 715, 717, + 721, 722, 723, 734, 735, 736, 744, 746, 747, 745, + 748, 749, 750, 753, 754, 755, 756, 751, 752, 757, + 698, 702, 699, 700, 701, 713, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 796, 797, 798, 799, + 800, 801, 727, 731, 730, 728, 729, 725, 726, 679, 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, + 215, 787, 252, 788, 0, 0, 792, 0, 0, 0, + 794, 793, 0, 795, 761, 760, 0, 0, 789, 790, + 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, + 513, 515, 528, 546, 552, 465, 802, 803, 804, 805, + 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, + 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, + 419, 383, 0, 363, 503, 504, 305, 502, 0, 691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, + 0, 0, 0, 0, 678, 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 306, 372, 414, 492, 408, 690, 357, 0, 0, 481, + 387, 0, 0, 0, 0, 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, + 399, 482, 276, 0, 91, 0, 0, 828, 812, 778, + 779, 816, 829, 830, 831, 832, 817, 0, 230, 818, + 819, 237, 820, 0, 777, 718, 720, 719, 737, 738, + 739, 740, 741, 742, 743, 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 939, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 675, 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 672, 673, 0, 0, 0, 0, 772, + 0, 674, 0, 0, 682, 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, 865, 866, 867, 868, 869, + 870, 871, 872, 873, 874, 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 945, 319, 193, 217, - 943, 0, 398, 446, 458, 0, 0, 0, 245, 0, + 388, 247, 0, 438, 771, 0, 0, 549, 0, 0, + 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, + 0, 0, 398, 446, 458, 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, @@ -4056,65 +3448,65 @@ var yyAct = [...]int{ 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, + 283, 0, 0, 248, 401, 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, + 518, 379, 369, 323, 732, 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, + 0, 411, 457, 232, 529, 480, 782, 770, 695, 786, + 697, 783, 784, 692, 693, 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, + 586, 587, 588, 589, 590, 0, 773, 681, 680, 0, + 688, 0, 714, 715, 717, 721, 722, 723, 734, 735, + 736, 744, 746, 747, 745, 748, 749, 750, 753, 754, + 755, 756, 751, 752, 757, 698, 702, 699, 700, 701, + 713, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 796, 797, 798, 799, 800, 801, 727, 731, 730, + 728, 729, 725, 726, 679, 192, 213, 355, 0, 439, + 278, 569, 539, 534, 199, 215, 787, 252, 788, 0, + 0, 792, 0, 0, 0, 794, 793, 0, 795, 761, + 760, 0, 0, 789, 790, 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, + 465, 802, 803, 804, 805, 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, + 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 2043, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, + 504, 305, 502, 0, 691, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 402, 0, 0, 0, 0, 678, + 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 1721, 190, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, + 690, 357, 0, 0, 481, 387, 0, 0, 0, 0, + 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, + 0, 312, 240, 314, 197, 399, 482, 276, 0, 91, + 0, 0, 828, 812, 778, 779, 816, 829, 830, 831, + 832, 817, 0, 230, 818, 819, 237, 820, 0, 777, + 718, 720, 719, 737, 738, 739, 740, 741, 742, 743, + 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 675, 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 672, 673, + 0, 0, 0, 0, 772, 0, 674, 0, 0, 682, + 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, + 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, + 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 287, 0, 388, 247, 0, 438, 771, + 0, 0, 549, 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, + 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, @@ -4122,36 +3514,36 @@ var yyAct = [...]int{ 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, + 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, + 511, 520, 381, 370, 211, 518, 379, 369, 323, 732, + 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, + 480, 782, 770, 695, 786, 697, 783, 784, 692, 693, + 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, + 0, 773, 681, 680, 0, 688, 0, 714, 715, 717, + 721, 722, 723, 734, 735, 736, 744, 746, 747, 745, + 748, 749, 750, 753, 754, 755, 756, 751, 752, 757, + 698, 702, 699, 700, 701, 713, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 796, 797, 798, 799, + 800, 801, 727, 731, 730, 728, 729, 725, 726, 679, 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, + 215, 787, 252, 788, 0, 0, 792, 0, 0, 0, + 794, 793, 0, 795, 761, 760, 0, 0, 789, 790, + 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, + 513, 515, 528, 546, 552, 465, 802, 803, 804, 805, + 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, + 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, @@ -4162,23 +3554,23 @@ var yyAct = [...]int{ 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 1519, 0, 638, 0, + 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 221, 0, 0, 0, 0, 1335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, + 1346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 3331, 0, 0, 0, 352, 0, 319, 193, 217, + 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, @@ -4228,23 +3620,23 @@ var yyAct = [...]int{ 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 1876, 638, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 221, 0, 988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1877, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, + 0, 987, 549, 0, 0, 0, 0, 0, 984, 985, + 352, 945, 319, 193, 217, 978, 982, 398, 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, @@ -4293,16 +3685,16 @@ var yyAct = [...]int{ 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 2450, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, + 399, 482, 276, 0, 0, 0, 0, 1482, 812, 0, + 0, 1479, 0, 0, 0, 0, 1477, 0, 230, 1478, + 1476, 237, 1481, 0, 777, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2451, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4350,22 +3742,22 @@ var yyAct = [...]int{ 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, + 494, 495, 497, 382, 256, 419, 0, 383, 363, 503, + 504, 305, 82, 502, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, + 0, 0, 0, 0, 260, 0, 0, 0, 0, 353, + 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, + 361, 510, 272, 263, 259, 242, 306, 372, 414, 492, + 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 638, 0, 0, 0, 0, 2435, 0, - 0, 0, 0, 230, 0, 0, 237, 2436, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, + 0, 0, 312, 240, 314, 197, 399, 482, 276, 0, + 91, 0, 0, 0, 190, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, + 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, + 350, 0, 0, 0, 0, 0, 255, 310, 262, 254, + 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4373,130 +3765,130 @@ 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, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 287, 0, 388, 247, 0, 438, + 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, + 0, 352, 0, 319, 193, 217, 0, 0, 398, 446, + 458, 0, 0, 0, 245, 0, 456, 412, 527, 225, + 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, + 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, + 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, + 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, + 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, + 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, + 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, + 401, 516, 517, 246, 571, 220, 543, 212, 0, 542, + 394, 511, 520, 381, 370, 211, 518, 379, 369, 323, + 342, 343, 270, 296, 433, 362, 434, 295, 297, 390, + 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, + 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, + 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, + 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, + 393, 300, 479, 322, 360, 0, 0, 411, 457, 232, + 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 591, 371, 470, 526, 324, 336, 339, 329, 348, 0, + 349, 325, 326, 331, 333, 334, 335, 340, 341, 345, + 351, 241, 203, 377, 385, 505, 301, 208, 209, 210, + 498, 499, 500, 501, 540, 541, 545, 447, 448, 449, + 450, 282, 535, 298, 453, 452, 320, 321, 366, 435, + 0, 192, 213, 355, 90, 439, 278, 569, 539, 534, + 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, + 2093, 0, 0, 2092, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 194, 195, 202, 214, 224, + 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, + 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, + 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, + 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, + 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, + 490, 513, 515, 528, 546, 552, 465, 290, 291, 430, + 431, 303, 304, 566, 567, 289, 523, 553, 521, 565, + 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, + 538, 486, 219, 451, 280, 243, 0, 0, 204, 238, + 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, + 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, + 256, 419, 1538, 0, 363, 503, 504, 305, 502, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 402, 0, 0, 0, 1540, 0, 0, 0, 0, 260, + 0, 0, 0, 0, 353, 257, 0, 0, 416, 0, + 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, + 242, 306, 372, 414, 492, 408, 0, 357, 0, 0, + 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, + 197, 399, 482, 276, 0, 0, 0, 0, 1542, 638, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, + 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, + 328, 330, 332, 337, 344, 350, 0, 0, 0, 0, + 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, + 0, 0, 0, 221, 0, 0, 0, 1316, 0, 1317, + 1318, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 1561, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 1560, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, + 0, 388, 247, 0, 438, 0, 0, 0, 549, 0, + 0, 0, 0, 0, 0, 0, 352, 0, 319, 193, + 217, 0, 0, 398, 446, 458, 0, 0, 0, 245, + 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, + 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, + 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, + 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, + 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, + 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, + 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, + 258, 283, 0, 0, 248, 401, 516, 517, 246, 571, + 220, 543, 212, 0, 542, 394, 511, 520, 381, 370, + 211, 518, 379, 369, 323, 342, 343, 270, 296, 433, + 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, + 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, + 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, + 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, + 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, + 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 591, 371, 470, 526, 324, + 336, 339, 329, 348, 0, 349, 325, 326, 331, 333, + 334, 335, 340, 341, 345, 351, 241, 203, 377, 385, + 505, 301, 208, 209, 210, 498, 499, 500, 501, 540, + 541, 545, 447, 448, 449, 450, 282, 535, 298, 453, + 452, 320, 321, 366, 435, 0, 192, 213, 355, 0, + 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, + 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, + 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, + 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, + 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, + 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, + 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, + 552, 465, 290, 291, 430, 431, 303, 304, 566, 567, + 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, + 368, 271, 294, 309, 0, 538, 486, 219, 451, 280, + 243, 0, 0, 204, 238, 222, 249, 264, 267, 313, + 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, + 493, 494, 495, 497, 382, 256, 419, 0, 383, 363, + 503, 504, 305, 82, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 640, 641, 642, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 91, 0, 1519, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4504,195 +3896,130 @@ 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, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 90, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 3455, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 91, 0, 0, 0, + 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 1721, 190, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 2093, 0, 0, 2092, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 2043, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 1721, 190, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4700,392 +4027,1112 @@ 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, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 3331, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 2041, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 91, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 945, 319, + 193, 217, 943, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 2043, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 1721, 190, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 1519, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 3331, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 1876, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1877, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 2450, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2451, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 2435, 0, 0, 0, 0, 230, 0, 0, 237, 2436, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 1561, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 1560, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 640, 641, 642, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 3456, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 2094, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 190, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 1721, 190, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 1542, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 3331, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 91, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 2094, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 1542, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 190, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 1831, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 1822, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 1831, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 1822, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 1688, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 1688, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5093,261 +5140,262 @@ 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, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 1686, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 1686, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 1684, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 1684, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 1682, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 1682, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 1680, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 1680, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5355,327 +5403,326 @@ 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, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 1676, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 1676, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 1674, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 1674, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 1672, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 1672, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 1647, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 1647, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 1546, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 1546, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5683,64 +5730,64 @@ 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, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 91, 0, 0, 0, 812, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 91, 0, 0, 0, + 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5748,327 +5795,327 @@ 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, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1295, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 1294, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 190, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1295, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 1294, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 898, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 898, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 594, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 594, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 3463, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 3464, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6076,64 +6123,64 @@ 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, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 812, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, + 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, + 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, + 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, + 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6141,138 +6188,138 @@ 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, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, + 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, + 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, + 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, + 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, + 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, + 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, + 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, + 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, + 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, + 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, + 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, + 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, + 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, + 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, + 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, + 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, + 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, + 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, + 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, + 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, + 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, + 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, + 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, + 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, + 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, + 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, + 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 0, 0, 363, 503, 504, 305, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, + 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, + 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, + 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, + 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, + 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, + 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, + 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, + 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, + 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, + 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, + 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, + 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, + 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, + 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, + 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, + 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, + 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, + 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, + 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, + 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, + 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, + 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, + 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, + 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, + 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, + 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, + 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, + 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, + 382, 256, 419, 0, 0, 363, 503, 504, 305, } var yyPact = [...]int{ - -1000, -1000, 3814, -1000, -464, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 4962, -1000, -463, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2200, - 2352, -1000, -1000, -1000, -1000, 2397, -1000, 846, 1890, -1000, - 2184, 402, -1000, 46522, 620, -1000, 43902, 619, 190, 29492, - -1000, 241, -1000, 232, 45212, 236, -1000, -1000, -1000, -1000, - -361, 18355, 2118, 82, 76, 46522, -1000, -1000, -1000, -1000, - 2353, 1876, -1000, 387, -1000, -1000, -1000, -1000, -1000, -1000, - 43247, -1000, 917, -1000, -1000, 2195, 2201, 2411, 756, 2140, - -1000, 2275, 1876, -1000, 18355, 2346, 2238, 17700, 17700, 549, - -1000, -1000, 330, -1000, -1000, 24907, 46522, 32112, 503, -1000, - 2184, -1000, -1000, -1000, 93, -1000, 423, 1801, -1000, 1794, - -1000, 711, 742, 435, 567, 562, 434, 433, 432, 429, - 425, 424, 417, 416, 441, -1000, 784, 784, -129, -135, - 688, 569, 525, 525, 829, 576, 2163, 2162, -1000, -1000, - 784, 784, 784, 382, 784, 784, 784, 784, 367, 366, - 784, 784, 784, 784, 784, 784, 784, 784, 784, 784, - 784, 784, 784, 784, 784, 784, 784, 602, 2184, 343, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2212, + 2367, -1000, -1000, -1000, -1000, 2434, -1000, 829, 1919, -1000, + 2253, 319, -1000, 46994, 584, -1000, 44374, 583, 3459, 29964, + -1000, 238, -1000, 220, 45684, 226, -1000, -1000, -1000, -1000, + -357, 18827, 2164, 99, 96, 46994, -1000, -1000, -1000, -1000, + 2420, 1917, -1000, 399, -1000, -1000, -1000, -1000, -1000, -1000, + 43719, -1000, 921, -1000, -1000, 2245, 2264, 2446, 721, 2208, + -1000, 2338, 1917, -1000, 18827, 2409, 2316, 18172, 18172, 503, + -1000, -1000, 256, -1000, -1000, 25379, 46994, 32584, 361, -1000, + 2253, -1000, -1000, -1000, 87, -1000, 370, 1836, -1000, 1825, + -1000, 691, 502, 431, 514, 510, 429, 421, 420, 418, + 414, 413, 406, 405, 442, -1000, 742, 742, -123, -130, + 685, 519, 487, 487, 735, 558, 2197, 2193, -1000, -1000, + 742, 742, 742, 398, 742, 742, 742, 742, 331, 330, + 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, + 742, 742, 742, 742, 742, 742, 742, 380, 2253, 309, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -6313,60 +6360,60 @@ 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, 46522, 227, 46522, -1000, 679, 46522, 914, 914, - 116, 914, 914, 914, 914, 238, 705, 69, -1000, 209, - 336, 187, 341, 896, 365, -1000, -1000, 331, 896, 1596, - -1000, 762, 340, 207, -1000, 914, 914, -1000, 11780, 150, - 11780, 11780, -1000, 2141, -1000, -1000, -1000, -1000, -1000, 1110, - -1000, -1000, -1000, -1000, -12, 566, -1000, -1000, -1000, -1000, - 45212, 42592, 235, -1000, -1000, 89, -1000, -1000, 1642, 1071, - 18355, 1220, -1000, 1665, 726, -1000, -1000, -1000, -1000, -1000, - 646, -1000, 19010, 19010, 19010, 19010, -1000, -1000, 1374, 41937, - 1374, 1374, 19010, 1374, -1000, 19010, 1374, 1374, 1374, 18355, - 1374, 1374, 1374, 1374, -1000, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, -1000, -1000, -1000, -1000, 1374, 672, 1374, - 1374, 1374, 1374, 1374, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1374, 1374, 1374, 1374, 1374, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, + -1000, -1000, 46994, 218, 46994, -1000, 644, 46994, 885, 885, + 132, 885, 885, 885, 885, 232, 755, 93, -1000, 227, + 290, 223, 295, 898, 195, -1000, -1000, 287, 898, 1558, + -1000, 727, 294, 211, -1000, 885, 885, -1000, 12252, 141, + 12252, 12252, -1000, 2230, -1000, -1000, -1000, -1000, -1000, 1149, + -1000, -1000, -1000, -1000, -10, 552, -1000, -1000, -1000, -1000, + 45684, 43064, 255, -1000, -1000, 74, -1000, -1000, 1598, 1174, + 18827, 1602, -1000, 1226, 702, -1000, -1000, -1000, -1000, -1000, + 618, -1000, 19482, 19482, 19482, 19482, -1000, -1000, 1842, 42409, + 1842, 1842, 19482, 1842, -1000, 19482, 1842, 1842, 1842, 18827, + 1842, 1842, 1842, 1842, -1000, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, -1000, -1000, -1000, -1000, 1842, 640, 1842, + 1842, 1842, 1842, 1842, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1842, 1842, 1842, 1842, 1842, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 20975, 1378, 1373, 1372, -1000, 15735, 1374, -1000, -1000, + -1000, 21447, 1349, 1347, 1346, -1000, 16207, 1842, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 46522, -1000, - 1374, 270, 45212, 45212, 431, 2275, 1876, -1000, 2353, 2295, - 387, -1000, 2968, 2333, 1381, 1216, 1876, 1773, 46522, -1000, - 1815, -1000, -1000, -1000, -1000, 1999, 1291, 1585, -1000, -1000, - -1000, -1000, 2076, 18355, -1000, -1000, 2392, -1000, 22286, 671, - 2391, 41282, -1000, 549, 549, 1793, 464, 19, -1000, -1000, - -1000, -1000, 801, 28837, -1000, -1000, -1000, -1000, 1619, 46522, - -1000, -1000, 4826, 1126, -1000, 1888, -1000, 1616, -1000, 1841, - 18355, 1896, 616, 1126, 608, 604, 603, -1000, -24, -1000, - -1000, -1000, -1000, -1000, -1000, 784, 784, 784, -1000, 426, - 2339, 402, 5020, -1000, -1000, -1000, 40627, 1884, 1126, -1000, - 1879, -1000, 852, 622, 692, 692, 1126, -1000, -1000, 45867, - 1126, 851, 847, 1126, 1126, 45212, 45212, -1000, 39972, -1000, - 39317, 38662, 1113, 45212, 38007, 37352, 36697, 36042, 35387, -1000, - 2072, -1000, 1851, -1000, -1000, -1000, 45867, 1126, 1126, 45867, - 45212, 45867, 46522, 1126, -1000, -1000, 347, -1000, -1000, 1112, - 1109, 1108, 784, 784, 1107, 1578, 1576, 1557, 784, 784, - 1105, 1549, 30802, 1543, 355, 1104, 1068, 1061, 1100, 1533, - 185, 1510, 1037, 987, 1060, 45212, 1872, 46522, -1000, 318, - 796, 518, 800, 2184, 2116, 1790, 565, 613, 1126, 537, - 537, 45212, -1000, 13763, -1000, -1000, 1500, 18355, -1000, 910, - 896, 896, -1000, -1000, -1000, -1000, -1000, -1000, 914, 46522, - 910, -1000, -1000, -1000, 896, 914, 46522, 914, 914, 914, - 914, 896, 896, 896, 914, 46522, 46522, 46522, 46522, 46522, - 46522, 46522, 46522, 46522, 11780, 762, 914, -366, -1000, 1494, - -1000, -1000, 2019, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 46994, -1000, + 1842, 257, 45684, 45684, 391, 2338, 1917, -1000, 2420, 2386, + 399, -1000, 3040, 2041, 1398, 1203, 1917, 1809, 46994, -1000, + 1853, -1000, -1000, -1000, -1000, 2109, 1241, 1524, -1000, -1000, + -1000, -1000, 2250, 18827, -1000, -1000, 2430, -1000, 22758, 634, + 2429, 41754, -1000, 503, 503, 1823, 459, 27, -1000, -1000, + -1000, -1000, 778, 29309, -1000, -1000, -1000, -1000, 1706, 46994, + -1000, -1000, 5563, 1142, -1000, 1916, -1000, 1700, -1000, 1879, + 18827, 1931, 582, 1142, 575, 569, 566, -1000, -21, -1000, + -1000, -1000, -1000, -1000, -1000, 742, 742, 742, -1000, 441, + 2402, 319, 3863, -1000, -1000, -1000, 41099, 1914, 1142, -1000, + 1909, -1000, 854, 587, 676, 676, 1142, -1000, -1000, 46339, + 1142, 852, 844, 1142, 1142, 45684, 45684, -1000, 40444, -1000, + 39789, 39134, 1136, 45684, 38479, 37824, 37169, 36514, 35859, -1000, + 2019, -1000, 1936, -1000, -1000, -1000, 46339, 1142, 1142, 46339, + 45684, 46339, 46994, 1142, -1000, -1000, 404, -1000, -1000, 1135, + 1127, 1114, 742, 742, 1110, 1518, 1494, 1490, 742, 742, + 1099, 1486, 31274, 1484, 334, 1093, 1088, 1087, 1141, 1475, + 188, 1473, 1019, 992, 1079, 45684, 1908, 46994, -1000, 280, + 770, 571, 777, 2253, 2163, 1822, 549, 581, 1142, 501, + 501, 45684, -1000, 12913, -1000, -1000, 1451, 18827, -1000, 899, + 898, 898, -1000, -1000, -1000, -1000, -1000, -1000, 885, 46994, + 899, -1000, -1000, -1000, 898, 885, 46994, 885, 885, 885, + 885, 898, 898, 898, 885, 46994, 46994, 46994, 46994, 46994, + 46994, 46994, 46994, 46994, 12252, 727, 885, -369, -1000, 1447, + -1000, -1000, 2048, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -6381,284 +6428,284 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 11780, - 11780, -1000, -1000, -1000, -1000, -1000, 1787, -1000, 229, 39, - 231, -1000, 34732, 373, 794, -1000, 373, -1000, -1000, -1000, - 1785, 34077, -1000, -367, -368, -374, -380, -1000, -1000, -1000, - -382, -384, -1000, -1000, -1000, 18355, 18355, 18355, 18355, -164, - -1000, 998, 19010, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 144, 1062, 19010, 19010, 19010, 19010, 19010, 19010, 19010, 19010, - 19010, 19010, 19010, 19010, 19010, 19010, 19010, -1000, -1000, 26872, - 7347, 7347, 726, 726, 726, 726, -1000, -96, 1780, 45867, - -1000, -1000, -1000, 667, 18355, 18355, 726, -1000, 1126, 15735, - 19665, 17700, 17700, 18355, 807, 1071, 45867, 18355, -1000, 1216, - -1000, -1000, -1000, 1038, -1000, 909, 2165, 2165, 2165, 2165, - 18355, 18355, 18355, 18355, 18355, 18355, 18355, 18355, 18355, 18355, - 2165, 45212, 45212, 993, 18355, 18355, 18355, 18355, 18355, 18355, - 14424, 18355, 18355, 19010, 18355, 18355, 18355, 1216, 18355, 18355, - 18355, 18355, 18355, 18355, 18355, 18355, 18355, 18355, 18355, 18355, - 18355, 18355, 18355, 18355, 18355, 18355, 18355, 18355, 18355, 18355, - 18355, 18355, 18355, 18355, 18355, 1216, 18355, 1006, 18355, 18355, - 17700, 13102, 17700, 17700, 17700, 17700, 17700, -1000, -1000, -1000, - -1000, -1000, 18355, 18355, 18355, 18355, 18355, 18355, 18355, 18355, - 1216, 18355, 18355, 18355, 18355, 18355, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1395, 1424, 1195, 18355, - -1000, 1774, -1000, -161, 24252, 18355, 1466, 2389, 1913, 45212, - -1000, -1000, -1000, 2275, -1000, 2275, 1395, 2417, 2042, 17700, - -1000, -1000, 2417, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1600, -1000, 46522, 1773, 2235, 45212, 2044, 1462, 442, - -1000, 18355, 18355, 1769, -1000, 1490, 46522, -1000, -164, -1000, - 33422, -1000, -1000, 11119, 46522, 405, 46522, -1000, 23597, 32767, - 264, -1000, 19, 1689, -1000, 40, 30, 15079, 725, -1000, - -1000, -1000, 688, 20320, 1634, 725, 138, -1000, -1000, -1000, - 1841, -1000, 1841, 1841, 1841, 1841, 442, 442, 442, 442, - -1000, -1000, -1000, -1000, -1000, 1870, 1868, -1000, 1841, 1841, - 1841, 1841, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1862, - 1862, 1862, 1861, 1861, 1842, 1842, 508, -1000, 18355, 305, - 32112, 2208, 1056, 1712, 318, 541, 1911, 1126, 1126, 1126, - 541, -1000, 1152, 1147, 1143, -1000, -453, 1767, -1000, -1000, - 2336, -1000, -1000, 877, 872, 870, 991, 45212, 288, 390, - -1000, 477, -1000, 32112, 1126, 845, 692, 1126, -1000, 1126, - -1000, -1000, -1000, -1000, -1000, 1126, -1000, -1000, 1764, -1000, - 1718, 936, 865, 883, 863, 1764, -1000, -1000, -104, 1764, - -1000, 1764, -1000, 1764, -1000, 1764, -1000, 1764, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 834, 228, -226, - 45212, 288, 560, -1000, 559, 26872, -1000, -1000, -1000, 26872, - 26872, -1000, -1000, -1000, -1000, 1438, 1436, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 12252, + 12252, -1000, -1000, -1000, -1000, -1000, 1820, -1000, 221, 56, + 225, -1000, 35204, 407, 776, -1000, 407, -1000, -1000, -1000, + 1814, 34549, -1000, -375, -376, -380, -385, -1000, -1000, -1000, + -387, -389, -1000, -1000, -1000, 18827, 18827, 18827, 18827, -157, + -1000, 922, 19482, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 154, 853, 19482, 19482, 19482, 19482, 19482, 19482, 19482, 19482, + 19482, 19482, 19482, 19482, 19482, 19482, 19482, -1000, -1000, 27344, + 7130, 7130, 702, 702, 702, 702, -1000, -87, 1811, 46339, + -1000, -1000, -1000, 633, 18827, 18827, 702, -1000, 1142, 16207, + 20137, 18172, 18172, 18827, 784, 1174, 46339, 18827, -1000, 1203, + -1000, -1000, -1000, 1071, -1000, 860, 2239, 2239, 2239, 2239, + 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, + 2239, 45684, 45684, 864, 18827, 18827, 18827, 18827, 18827, 18827, + 14896, 18827, 18827, 19482, 18827, 18827, 18827, 1203, 18827, 18827, + 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, + 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, + 18827, 18827, 18827, 18827, 18827, 1203, 18827, 1259, 18827, 18827, + 18172, 14235, 18172, 18172, 18172, 18172, 18172, -1000, -1000, -1000, + -1000, -1000, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, + 1203, 18827, 18827, 18827, 18827, 18827, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1449, 1244, 1246, 18827, + -1000, 1810, -1000, -168, 24724, 18827, 1443, 2428, 1964, 45684, + -1000, -1000, -1000, 2338, -1000, 2338, 1449, 2133, 2087, 18172, + -1000, -1000, 2133, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1611, -1000, 46994, 1809, 2311, 45684, 2101, 1435, 437, + -1000, 18827, 18827, 1808, -1000, 1220, 46994, -1000, -157, -1000, + 33894, -1000, -1000, 11591, 46994, 385, 46994, -1000, 24069, 33239, + 388, -1000, 27, 1783, -1000, 65, 53, 15551, 692, -1000, + -1000, -1000, 685, 20792, 1582, 692, 153, -1000, -1000, -1000, + 1879, -1000, 1879, 1879, 1879, 1879, 437, 437, 437, 437, + -1000, -1000, -1000, -1000, -1000, 1906, 1903, -1000, 1879, 1879, + 1879, 1879, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1902, + 1902, 1902, 1901, 1901, 1882, 1882, 475, -1000, 18827, 306, + 32584, 2279, 1078, 1103, 280, 522, 1959, 1142, 1142, 1142, + 522, -1000, 1193, 1190, 1163, -1000, -452, 1803, -1000, -1000, + 2401, -1000, -1000, 981, 877, 875, 855, 45684, 262, 368, + -1000, 464, -1000, 32584, 1142, 838, 676, 1142, -1000, 1142, + -1000, -1000, -1000, -1000, -1000, 1142, -1000, -1000, 1799, -1000, + 1719, 929, 874, 918, 863, 1799, -1000, -1000, -98, 1799, + -1000, 1799, -1000, 1799, -1000, 1799, -1000, 1799, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 793, 228, -198, + 45684, 262, 542, -1000, 521, 27344, -1000, -1000, -1000, 27344, + 27344, -1000, -1000, -1000, -1000, 1433, 1420, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -440, 46522, -1000, 320, - 792, 381, 421, 359, 46522, 256, 2262, 2261, 2260, 2246, - 2242, 361, 364, 46522, 46522, 537, 1992, 46522, 2215, 46522, - -1000, -1000, -1000, -1000, -1000, 1071, 46522, -1000, -1000, 914, - 914, -1000, -1000, 46522, 914, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 914, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 46522, - -1000, -1000, -1000, -1000, -12, 226, -1000, -1000, 45212, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -95, -1000, - 141, 43, 369, -1000, -1000, -1000, -1000, -1000, 2267, -1000, - 1071, 821, 830, -1000, 1374, -1000, -1000, 930, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 144, 19010, 19010, 19010, 1180, - 548, 1106, 1676, 1146, 1196, 1196, 1000, 1000, 733, 733, - 733, 733, 733, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1434, -1000, 1374, 45867, 1614, 13102, 2579, 2007, 1216, - 2869, -1000, 1584, -1000, 1584, 1678, 820, -1000, 18355, 1216, - 2857, -1000, -1000, 1216, 1216, 1216, 18355, -1000, -1000, 18355, - 18355, 18355, 18355, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - 1712, 1712, 1712, 18355, 1710, 1709, 2388, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -440, 46994, -1000, 269, + 772, 346, 378, 364, 46994, 343, 2328, 2325, 2324, 2323, + 2318, 296, 329, 46994, 46994, 501, 2061, 46994, 2284, 46994, + -1000, -1000, -1000, -1000, -1000, 1174, 46994, -1000, -1000, 885, + 885, -1000, -1000, 46994, 885, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 885, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 46994, + -1000, -1000, -1000, -1000, -10, 219, -1000, -1000, 45684, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -79, -1000, + 112, 60, 394, -1000, -1000, -1000, -1000, -1000, 2333, -1000, + 1174, 836, 808, -1000, 1842, -1000, -1000, 1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 154, 19482, 19482, 19482, 1924, + 536, 1941, 1335, 1348, 1557, 1557, 1031, 1031, 708, 708, + 708, 708, 708, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1402, -1000, 1842, 46339, 1682, 14235, 1740, 1998, 1203, + 3079, -1000, 1654, -1000, 1654, 1070, 800, -1000, 18827, 1203, + 3015, -1000, -1000, 1203, 1203, 1203, 18827, -1000, -1000, 18827, + 18827, 18827, 18827, 1103, 1103, 1103, 1103, 1103, 1103, 1103, + 1103, 1103, 1103, 18827, 1795, 1792, 2426, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1755, 1712, - 1712, 1712, 1712, 1712, 18355, 2039, -1000, -1000, -1000, 1332, - 2849, 1086, 2839, 1712, 1712, -1000, 1712, 2813, 2805, 1216, - 1642, 1216, 1708, -1000, 2784, 1712, 2770, 2750, 2746, 2002, - 2735, 2727, 2715, 1712, 1712, 1712, 1998, 2680, 2665, 2660, - 2648, 2637, 2621, 2599, 2467, 2390, 1712, -166, 1712, 1216, - -1000, -1000, -1000, -1000, -1000, 2338, 1994, 1216, 1691, 1374, - 666, -1000, -1000, 1584, 1216, 1216, 1584, 1584, 2321, 2311, - 2297, 2291, 2279, 2274, 1712, 1712, -1000, 1712, 2256, 2216, - 1990, 1984, 1216, -1000, 1195, 46522, -1000, -352, -1000, 22, - 719, 1374, -1000, 30802, 1216, -1000, 7078, -1000, 1004, -1000, - -1000, -1000, -1000, -1000, 28182, 1606, 2417, -1000, -1000, 1374, - 1566, -1000, -1000, 442, 106, 27527, 699, 699, 164, 1071, - 1071, 18355, -1000, -1000, -1000, -1000, -1000, -1000, 665, 2364, - 428, 1374, -1000, 1662, 2319, -1000, -1000, -1000, 2233, 21631, - -1000, -1000, 1374, 1374, 46522, 1772, 1668, -1000, 661, -1000, - 1134, 1689, 19, 15, -1000, -1000, -1000, -1000, 1071, -1000, - 1137, 414, 655, -1000, 481, -1000, -1000, -1000, -1000, 2119, - 105, -1000, -1000, -1000, 268, 442, -1000, -1000, -1000, -1000, - -1000, -1000, 1427, 1427, -1000, -1000, -1000, -1000, -1000, 1054, - -1000, -1000, -1000, -1000, 1051, -1000, -1000, 1049, -1000, -1000, - 2209, 1945, 305, -1000, -1000, 784, 1419, -1000, -1000, 2137, - 784, 784, 45212, -1000, -1000, 1622, 2208, 320, 46522, 816, - 1991, -1000, 1911, 1911, 1911, 46522, -1000, -1000, -1000, -1000, - -1000, -1000, -442, 59, 404, -1000, -1000, -1000, 3863, 45212, - 1561, -1000, 282, -1000, 1609, -1000, 45212, -1000, 1556, 1860, - 1126, 1126, -1000, -1000, -1000, 45212, 1374, -1000, -1000, -1000, - -1000, 612, 2177, 247, -1000, -1000, -191, -1000, -1000, 288, - 282, 45867, 1126, 725, -1000, -1000, -1000, -1000, -1000, -443, - 1539, 585, 302, 349, 46522, 46522, 46522, 46522, 46522, 638, - -1000, -1000, 60, -1000, -1000, 257, -1000, -1000, -1000, -1000, - 257, -1000, -1000, -1000, -1000, 350, 552, -1000, 46522, 46522, - 660, -1000, -1000, -1000, 896, -1000, -1000, 896, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1046, 1103, + 1103, 1103, 1103, 1103, 18827, 1888, -1000, -1000, -1000, 1294, + 2952, 982, 2919, 1103, 1103, -1000, 1103, 2889, 2882, 1203, + 1598, 1203, 1788, -1000, 2873, 1103, 2852, 2840, 2832, 2243, + 2827, 2821, 2808, 1103, 1103, 1103, 2237, 2792, 2788, 2766, + 2750, 2746, 2732, 2726, 2721, 2716, 1103, -159, 1103, 1203, + -1000, -1000, -1000, -1000, -1000, 2691, 2161, 1203, 1785, 1842, + 630, -1000, -1000, 1654, 1203, 1203, 1654, 1654, 2685, 2664, + 2647, 2635, 2630, 2419, 1103, 1103, -1000, 1103, 2405, 2347, + 2155, 2142, 1203, -1000, 1246, 46994, -1000, -333, -1000, 28, + 684, 1842, -1000, 31274, 1203, -1000, 1641, -1000, 985, -1000, + -1000, -1000, -1000, -1000, 28654, 1720, 2133, -1000, -1000, 1842, + 1651, -1000, -1000, 437, 126, 27999, 690, 690, 160, 1174, + 1174, 18827, -1000, -1000, -1000, -1000, -1000, -1000, 629, 2414, + 401, 1842, -1000, 1777, 2843, -1000, -1000, -1000, 2308, 22103, + -1000, -1000, 1842, 1842, 46994, 1723, 1690, -1000, 628, -1000, + 1164, 1783, 27, 35, -1000, -1000, -1000, -1000, 1174, -1000, + 1161, 386, 621, -1000, 466, -1000, -1000, -1000, -1000, 2177, + 138, -1000, -1000, -1000, 261, 437, -1000, -1000, -1000, -1000, + -1000, -1000, 1400, 1400, -1000, -1000, -1000, -1000, -1000, 1068, + -1000, -1000, -1000, -1000, 1065, -1000, -1000, 1036, -1000, -1000, + 2221, 1957, 306, -1000, -1000, 742, 1383, -1000, -1000, 2183, + 742, 742, 45684, -1000, -1000, 1577, 2279, 269, 46994, 791, + 2057, -1000, 1959, 1959, 1959, 46994, -1000, -1000, -1000, -1000, + -1000, -1000, -442, 64, 415, -1000, -1000, -1000, 395, 45684, + 1627, -1000, 265, -1000, 1570, -1000, 45684, -1000, 1620, 1892, + 1142, 1142, -1000, -1000, -1000, 45684, 1842, -1000, -1000, -1000, + -1000, 572, 2241, 260, -1000, -1000, -177, -1000, -1000, 262, + 265, 46339, 1142, 692, -1000, -1000, -1000, -1000, -1000, -443, + 1615, 564, 259, 340, 46994, 46994, 46994, 46994, 46994, 597, + -1000, -1000, 73, -1000, -1000, 246, -1000, -1000, -1000, -1000, + 246, -1000, -1000, -1000, -1000, 312, 516, -1000, 46994, 46994, + 665, -1000, -1000, -1000, 898, -1000, -1000, 898, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 2172, 46522, 42, -399, -1000, -395, 18355, -1000, -1000, -1000, - -1000, 1021, 542, 1106, 19010, 19010, 19010, -1000, -1000, -1000, - 806, 806, 26872, -1000, 18355, 17700, -1000, -1000, 18355, 18355, - 797, -1000, 18355, 1259, -1000, 18355, -1000, -1000, -1000, 1195, - 1712, 1712, 1712, 1712, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1724, 18355, 18355, 18355, 1216, 316, - -1000, -1000, -1000, -1000, -1000, 2381, -1000, 18355, -1000, 26872, - 18355, 18355, 18355, -1000, -1000, -1000, 18355, 18355, -1000, -1000, - 18355, 18355, -1000, 18355, 18355, 18355, -1000, 18355, 18355, 18355, - 18355, -1000, -1000, -1000, -1000, 18355, 18355, 18355, 18355, 18355, - 18355, 18355, 18355, 18355, 18355, -1000, -1000, 32112, 38, -166, - 1006, 38, 1006, -1000, 17700, 12441, -1000, -1000, -1000, -1000, - -1000, 18355, 18355, 18355, 18355, 18355, 18355, -1000, -1000, -1000, - 18355, 18355, -1000, 18355, -1000, 18355, -1000, -1000, -1000, -1000, - -1000, 719, -1000, 692, 692, 692, 45212, -1000, -1000, -1000, - -1000, 1688, -1000, 2314, -1000, 2057, 2056, 2376, 2364, -1000, - 23597, 2417, -1000, -1000, 45212, -337, -1000, 2107, 2122, 699, - 699, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 10458, 2275, - 18355, 1987, 45867, 143, -1000, 22942, 45212, 45867, 23597, 23597, - 23597, 23597, 23597, -1000, 2027, 2014, -1000, 2017, 2003, 2115, - 46522, -1000, 1395, 1531, -1000, 18355, 25562, 1654, 23597, -1000, - -1000, 23597, 46522, 9797, -1000, -1000, 36, 25, -1000, -1000, - -1000, -1000, 688, -1000, -1000, 313, 2230, 2123, -1000, -1000, - -1000, -1000, -1000, 1453, -1000, 1451, 1684, 1432, 1426, 228, - -1000, 1682, 2168, 784, 784, -1000, 1044, -1000, 1126, 1417, - 1416, -1000, -1000, -1000, 579, -1000, 2204, 46522, 1981, 1980, - 1976, -1000, -451, 1040, 1859, 1671, 18355, 1856, 2329, 1666, - 45212, -1000, -1000, 45867, -1000, 277, -1000, 305, 45212, -1000, - -1000, -1000, 390, 46522, -1000, 6170, -1000, -1000, -1000, 282, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 46522, 317, -1000, - 1844, 1066, -1000, -1000, 1903, -1000, -1000, -1000, -1000, 244, - 380, 1415, 255, 1397, 255, -1000, 46522, 657, 1945, 46522, - -1000, -1000, -1000, 914, 914, -1000, -1000, 2166, -1000, 1126, - 1712, 19010, 19010, -1000, 726, 374, -144, 1841, 1841, -1000, - 1841, 1842, -1000, 1841, 181, 1841, 179, 1841, -1000, -1000, - 1216, 1216, 1195, -1000, 1978, 1970, -1000, 1071, 18355, 2193, - -1000, -1000, -1000, -1000, -1000, -30, 2169, 2158, 1712, -1000, - 1839, 1826, 18355, 1712, 1216, 1958, 1712, 1712, 1712, 1712, - -1000, 1071, 1195, 2138, 1195, 1712, 1712, 2134, 278, 1712, - 1413, 1413, 1413, 1413, 1413, 1195, 1195, 1195, 1195, 45212, - -1000, -166, -1000, -1000, -209, -218, -1000, 1216, -166, 1677, - 1216, -1000, 1935, 1921, 2126, 1880, 1712, 2099, 1712, 1712, - 1712, 1803, -1000, 2205, 2205, 2205, 1402, 1004, 46522, -1000, - -1000, -1000, -1000, 2364, 2360, 1673, -1000, -1000, 106, 449, - -1000, 2111, 2122, -1000, 2326, 2100, 2325, -1000, -1000, -1000, - -1000, -1000, 1071, -1000, 2190, 1640, -1000, 790, 1657, -1000, - -1000, 17045, 1409, 2055, 656, 1402, 1768, 2319, 1926, 1965, - 2945, -1000, -1000, -1000, -1000, 2004, -1000, 1988, -1000, -1000, - 1815, -1000, 1735, 405, 23597, 1733, 1733, -1000, 654, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 889, 6001, 2410, -1000, - 1396, -1000, 1124, 191, 1005, -1000, -1000, 784, 784, -1000, - 843, 837, -1000, 46522, 1825, -1000, 442, 1384, 442, 994, - -1000, -1000, 989, -1000, -1000, -1000, -1000, 1786, 1960, -1000, - -1000, -1000, -1000, 46522, -1000, -1000, 46522, 46522, 46522, 1824, - 2318, -1000, 18355, 1823, 789, 2130, 45212, 45212, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 514, - 784, -419, 358, 354, 784, 784, 784, -452, -1000, -1000, - 1393, 1389, -1000, -130, -1000, 18355, -1000, -1000, -1000, 1017, - 1017, 1378, 1373, 1372, -1000, 1815, -1000, -1000, -1000, 1602, - -1000, -1000, -110, 45212, 45212, 45212, 45212, -1000, -1000, 932, + 2226, 46994, 48, -407, -1000, -403, 18827, -1000, -1000, -1000, + -1000, 1177, 530, 1941, 19482, 19482, 19482, -1000, -1000, -1000, + 1102, 1102, 27344, -1000, 18827, 18172, -1000, -1000, 18827, 18827, + 771, -1000, 18827, 939, -1000, 18827, -1000, -1000, -1000, 1246, + 1103, 1103, 1103, 1103, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1726, 18827, 18827, 18827, 1203, 348, + -1000, -1000, -1000, -1000, -1000, 2425, -1000, 18827, -1000, 27344, + 18827, 18827, 18827, -1000, -1000, -1000, 18827, 18827, -1000, -1000, + 18827, 18827, -1000, 18827, 18827, 18827, -1000, 18827, 18827, 18827, + 18827, -1000, -1000, -1000, -1000, 18827, 18827, 18827, 18827, 18827, + 18827, 18827, 18827, 18827, 18827, -1000, -1000, 32584, 69, -159, + 1259, 69, 1259, -1000, 18172, 13574, -1000, -1000, -1000, -1000, + -1000, 18827, 18827, 18827, 18827, 18827, 18827, -1000, -1000, -1000, + 18827, 18827, -1000, 18827, -1000, 18827, -1000, -1000, -1000, -1000, + -1000, 684, -1000, 676, 676, 676, 45684, -1000, -1000, -1000, + -1000, 1782, -1000, 2331, -1000, 2121, 2119, 2423, 2414, -1000, + 24069, 2133, -1000, -1000, 45684, -325, -1000, 2156, 2287, 690, + 690, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 10930, 2338, + 18827, 2052, 46339, 144, -1000, 23414, 45684, 46339, 24069, 24069, + 24069, 24069, 24069, -1000, 2085, 2084, -1000, 2083, 2077, 2188, + 46994, -1000, 1449, 1608, -1000, 18827, 26034, 1689, 24069, -1000, + -1000, 24069, 46994, 10269, -1000, -1000, 44, 32, -1000, -1000, + -1000, -1000, 685, -1000, -1000, 1904, 2304, 2171, -1000, -1000, + -1000, -1000, -1000, 1604, -1000, 1594, 1776, 1592, 1585, 228, + -1000, 1893, 2214, 742, 742, -1000, 1033, -1000, 1142, 1375, + 1372, -1000, -1000, -1000, 561, -1000, 2268, 46994, 2038, 2024, + 2002, -1000, -451, 1018, 1891, 1790, 18827, 1887, 2398, 1715, + 45684, -1000, -1000, 46339, -1000, 324, -1000, 306, 45684, -1000, + -1000, -1000, 368, 46994, -1000, 7892, -1000, -1000, -1000, 265, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 46994, 281, -1000, + 1886, 1133, -1000, -1000, 1944, -1000, -1000, -1000, -1000, 252, + 339, 1364, 244, 1360, 244, -1000, 46994, 632, 1957, 46994, + -1000, -1000, -1000, 885, 885, -1000, -1000, 2211, -1000, 1142, + 1103, 19482, 19482, -1000, 702, 505, -139, 1879, 1879, -1000, + 1879, 1882, -1000, 1879, 210, 1879, 203, 1879, -1000, -1000, + 1203, 1203, 1246, -1000, 2138, 1352, -1000, 1174, 18827, 2295, + -1000, -1000, -1000, -1000, -1000, -28, 2285, 2278, 1103, -1000, + 1876, 1875, 18827, 1103, 1203, 2128, 1103, 1103, 1103, 1103, + -1000, 1174, 1246, 2262, 1246, 1103, 1103, 2257, 322, 1103, + 1581, 1581, 1581, 1581, 1581, 1246, 1246, 1246, 1246, 45684, + -1000, -159, -1000, -1000, -201, -204, -1000, 1203, -159, 1724, + 1203, -1000, 2098, 2080, 2216, 2073, 1103, 2039, 1103, 1103, + 1103, 2065, -1000, 2330, 2330, 2330, 1460, 985, 46994, -1000, + -1000, -1000, -1000, 2414, 2389, 1718, -1000, -1000, 126, 463, + -1000, 2134, 2287, -1000, 2396, 2152, 2394, -1000, -1000, -1000, + -1000, -1000, 1174, -1000, 2240, 1703, -1000, 769, 1631, -1000, + -1000, 17517, 1462, 2116, 625, 1460, 1697, 2843, 1977, 2001, + 2689, -1000, -1000, -1000, -1000, 2049, -1000, 1989, -1000, -1000, + 1853, -1000, 1314, 385, 24069, 1659, 1659, -1000, 623, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 900, 6004, 2445, -1000, + 1355, -1000, 1148, 193, 1002, -1000, -1000, 742, 742, -1000, + 832, 815, -1000, 46994, 1874, -1000, 437, 1353, 437, 996, + -1000, -1000, 994, -1000, -1000, -1000, -1000, 1784, 1978, -1000, + -1000, -1000, -1000, 46994, -1000, -1000, 46994, 46994, 46994, 1862, + 2393, -1000, 18827, 1861, 768, 1805, 45684, 45684, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 474, + 742, -421, 315, 314, 742, 742, 742, -458, -1000, -1000, + 1457, 1455, -1000, -125, -1000, 18827, -1000, -1000, -1000, 1044, + 1044, 1349, 1347, 1346, -1000, 1853, -1000, -1000, -1000, 1567, + -1000, -1000, -105, 45684, 45684, 45684, 45684, -1000, -1000, 972, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 726, 1216, 337, -114, 1216, -1000, -1000, 442, + -1000, -1000, 702, 1203, 350, -112, 1203, -1000, -1000, 437, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 18355, -1000, 18355, -1000, 1071, 18355, 2275, 1363, 18355, 18355, - -1000, 986, 975, 1712, -1000, -1000, -1000, 18355, -1000, -1000, - -1000, -1000, -1000, 18355, -1000, -1000, -1000, 18355, 299, 806, + 18827, -1000, 18827, -1000, 1174, 18827, 2338, 1332, 18827, 18827, + -1000, 987, 983, 1103, -1000, -1000, -1000, 18827, -1000, -1000, + -1000, -1000, -1000, 18827, -1000, -1000, -1000, 18827, 202, 1102, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1216, 400, -1000, -1000, -1000, -1000, 2368, -1000, 1216, 18355, - -1000, -1000, 18355, -1000, 18355, 18355, -1000, 18355, -1000, 18355, - -1000, -1000, -1000, -1000, 18355, 1374, 2089, 1374, 1374, 25562, - -1000, -1000, 2360, 2335, 2316, 2091, 2094, 2094, 2111, -1000, - 2313, 2310, -1000, 1327, 2299, 1318, 836, -1000, 45867, 18355, - 143, -1000, 388, 45212, 143, 45212, -1000, 2312, -1000, -1000, - 18355, 1821, -1000, 18355, -1000, -1000, -1000, -1000, 7347, 2364, - 1733, -1000, -1000, 740, -1000, 18355, -1000, -1000, -1000, 4415, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1315, 1309, - -1000, -1000, 1816, 18355, -1000, -1000, -1000, 1410, 1403, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1815, -1000, -1000, - -1000, -1000, 390, -447, 2112, 45212, 961, -1000, 1371, 1666, - 385, 143, 1292, 784, 784, 784, 939, 929, 30802, 1360, - -1000, 45212, 469, -1000, 390, -1000, -136, -140, 1712, -1000, - -1000, 2229, -1000, -1000, 12441, -1000, -1000, 1814, 1905, -1000, - -1000, -1000, -1000, 2038, -101, -122, -1000, -1000, 1712, 1712, - 1334, 1216, -1000, 1712, 1712, 1394, 1390, -1000, 1712, 1195, - 1799, -1000, 299, 1216, 1959, -1000, -1000, 7347, -1000, -1000, - 2312, 2298, 38, -1000, -1000, 319, 38, 1071, 1791, 1712, - 1725, 1652, 1712, 1712, 26217, -1000, 2287, 2285, 31457, 31457, - 719, 2335, -176, 18355, 18355, 2063, 959, -1000, -1000, -1000, - -1000, 1289, 1269, -1000, 1265, -1000, 2406, -1000, 1071, -1000, - 143, -1000, 651, 1657, -1000, 2275, 1071, 45212, 1071, 100, - 2312, -1000, 1712, -1000, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, -1000, -1000, 45212, 2106, -1000, -1000, - 2224, 1356, 57, -1000, 1361, 1666, -1000, -1000, 140, -1000, - 18355, -1000, 30802, 1264, 1231, -1000, -1000, -1000, -1000, -452, - -1000, -1000, -1000, -1000, -1000, -1000, 387, 1663, -1000, 773, - 45212, 46522, -1000, 1949, -1000, -1000, -1000, 18355, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 18355, -1000, 1216, 1953, - -1000, -285, -1000, -425, 18355, -166, -1000, -1000, -166, -1000, - 18355, -1000, -1000, 18355, -1000, 18355, -1000, -1000, 1248, -1000, - -1000, -1000, -1000, -1000, 1248, 1248, -1000, -176, -1000, 1659, - -1000, 45212, 1071, 1642, -1000, 957, -1000, -1000, -1000, -1000, - -1000, 45867, 1657, 45212, -1000, 1215, 1216, 1374, 2275, -1000, - 1213, -1000, 387, -1000, 1812, 1671, -1000, -1000, -1000, 16390, - -1000, -1000, -1000, -1000, -1000, 219, -109, 12441, 9136, 1199, - -1000, -106, 1712, 1195, -1000, -387, -1000, -1000, -1000, -1000, - 128, -1000, -1000, 1642, -1000, -1000, 1647, 1621, 1592, 30147, - -1000, -1000, -1000, -1000, -176, -1000, -1000, 2223, -1000, -1000, - 1197, -1000, -1000, 25562, 44557, -1000, -91, 368, -109, 18355, - 1811, 1216, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -17, -1000, -1000, -1000, -1000, -1000, 1903, -119, -1000, -1000, - -1000, 188, -411, -201, -206, -1000, -1000, 19010, -1000, 18355, - -1000, 18355, -1000, 18355, -1000, -1000, -1000, 45212, 1374, -1000, - 1193, -1000, 3346, -222, 1952, -1000, -44, -1000, -1000, -1000, - 884, 1178, -1000, -1000, -1000, -1000, -1000, -1000, 2016, 45212, - -1000, 497, -1000, -1000, -110, -124, 826, -1000, -1000, -1000, - -1000, -1000, 1546, 1354, 1712, -1000, 45212, -1000, 44557, -217, - 725, 7347, -1000, 1936, 1924, 2387, -1000, -1000, -1000, -1000, - -1000, -1000, -458, 1172, 314, -1000, -1000, 188, -1000, 18355, - -1000, 18355, -1000, 1216, -1000, -1000, 2202, 100, -1000, 2401, - -1000, 2398, 763, 763, -1000, 913, -458, -1000, -1000, 1712, - 1712, -1000, -233, -1000, -1000, -1000, -1000, -1000, 493, 969, - -1000, -1000, -1000, -1000, -1000, 7347, -1000, -1000, -1000, 221, - 221, -1000, -1000, + 1203, 381, -1000, -1000, -1000, -1000, 2410, -1000, 1203, 18827, + -1000, -1000, 18827, -1000, 18827, 18827, -1000, 18827, -1000, 18827, + -1000, -1000, -1000, -1000, 18827, 1842, 2124, 1842, 1842, 26034, + -1000, -1000, 2389, 2369, 2392, 2129, 2136, 2136, 2134, -1000, + 2391, 2388, -1000, 1326, 2382, 1310, 805, -1000, 46339, 18827, + 144, -1000, 396, 45684, 144, 45684, -1000, 2348, -1000, -1000, + 18827, 1858, -1000, 18827, -1000, -1000, -1000, -1000, 7130, 2414, + 1659, -1000, -1000, 714, -1000, 18827, -1000, -1000, -1000, 4415, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1291, 1289, + -1000, -1000, 1856, 18827, -1000, -1000, -1000, 1463, 1450, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1853, -1000, -1000, + -1000, -1000, 368, -449, 1645, 45684, 979, -1000, 1441, 1715, + 355, 144, 1287, 742, 742, 742, 975, 966, 31274, 1407, + -1000, 45684, 433, -1000, 368, -1000, -132, -134, 1103, -1000, + -1000, 2303, -1000, -1000, 13574, -1000, -1000, 1847, 1946, -1000, + -1000, -1000, -1000, 2100, -92, -115, -1000, -1000, 1103, 1103, + 1080, 1203, -1000, 1103, 1103, 1442, 1336, -1000, 1103, 1246, + 2034, -1000, 202, 1203, 1993, -1000, -1000, 7130, -1000, -1000, + 2348, 2380, 69, -1000, -1000, 263, 69, 1174, 1994, 1103, + 1979, 1870, 1103, 1103, 26689, -1000, 2370, 2344, 31929, 31929, + 684, 2369, -167, 18827, 18827, 2130, 945, -1000, -1000, -1000, + -1000, 1275, 1270, -1000, 1264, -1000, 2440, -1000, 1174, -1000, + 144, -1000, 622, 1631, -1000, 2338, 1174, 45684, 1174, 125, + 2348, -1000, 1103, -1000, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, -1000, -1000, 45684, 1278, -1000, -1000, + 2301, 1397, 63, -1000, 1279, 1715, -1000, -1000, 142, -1000, + 18827, -1000, 31274, 1242, 1224, -1000, -1000, -1000, -1000, -458, + -1000, -1000, -1000, -1000, -1000, -1000, 399, 1714, -1000, 740, + 45684, 46994, -1000, 2093, -1000, -1000, -1000, 18827, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 18827, -1000, 1203, 1975, + -1000, -265, -1000, -422, 18827, -159, -1000, -1000, -159, -1000, + 18827, -1000, -1000, 18827, -1000, 18827, -1000, -1000, 1395, -1000, + -1000, -1000, -1000, -1000, 1395, 1395, -1000, -167, -1000, 1694, + -1000, 45684, 1174, 1598, -1000, 932, -1000, -1000, -1000, -1000, + -1000, 46339, 1631, 45684, -1000, 1371, 1203, 1842, 2338, -1000, + 1359, -1000, 399, -1000, 1846, 1790, -1000, -1000, -1000, 16862, + -1000, -1000, -1000, -1000, -1000, 245, -102, 13574, 9608, 1341, + -1000, -99, 1103, 1246, -1000, -396, -1000, -1000, -1000, -1000, + 216, -1000, -1000, 1598, -1000, -1000, 1800, 1796, 1789, 30619, + -1000, -1000, -1000, -1000, -167, -1000, -1000, 2288, -1000, -1000, + 1596, -1000, -1000, 26034, 45029, -1000, -85, 251, -102, 18827, + 1845, 1203, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -20, -1000, -1000, 611, -1000, -1000, -1000, 1944, -113, -1000, + -1000, -1000, 258, -410, -188, -203, -1000, -1000, 19482, -1000, + 18827, -1000, 18827, -1000, 18827, -1000, -1000, -1000, 45684, 1842, + -1000, 1202, -1000, 4812, -218, 1973, -1000, -89, -1000, -1000, + -1000, 892, 1186, -1000, -1000, -1000, -1000, -1000, -1000, 1129, + 45684, -1000, 472, -1000, -1000, 12913, -105, -120, 799, -1000, + -1000, -1000, -1000, -1000, 1285, 964, 1103, -1000, 45684, -1000, + 45029, -209, 692, 7130, -1000, 1969, 1967, 2418, -1000, -1000, + -1000, -1000, -1000, -1000, -460, 1199, 276, -1000, -1000, -1000, + 258, -1000, 18827, -1000, 18827, -1000, 1203, -1000, -1000, 2263, + 125, -1000, 2439, -1000, 2436, 696, 696, -1000, 962, -460, + -1000, -1000, 1103, 1103, -1000, -260, -1000, -1000, -1000, -1000, + -1000, 465, 976, -1000, -1000, -1000, -1000, -1000, 7130, -1000, + -1000, -1000, 248, 248, -1000, -1000, } var yyPgo = [...]int{ - 0, 3004, 3003, 30, 1, 36, 35, 3001, 115, 102, - 190, 40, 193, 104, 3000, 170, 2997, 2995, 2989, 2987, - 2986, 2985, 2434, 2428, 2402, 2984, 2983, 2982, 2979, 2977, - 2976, 2975, 2974, 2970, 2969, 172, 166, 185, 2968, 2966, - 2965, 113, 177, 91, 90, 182, 2964, 2962, 82, 2960, - 2958, 2956, 203, 202, 200, 859, 2953, 198, 120, 53, - 2950, 2949, 2948, 2943, 2942, 2941, 2940, 2938, 2935, 2934, - 2933, 2931, 2930, 2929, 2928, 2922, 2921, 283, 2920, 2919, - 22, 2918, 88, 2917, 2916, 2913, 2910, 2908, 11, 2907, - 2906, 16, 55, 2905, 2902, 51, 2900, 2899, 2898, 2896, - 2895, 19, 2890, 27, 2886, 37, 2882, 2879, 127, 2878, - 2875, 2871, 38, 2870, 2867, 2863, 2859, 2841, 2840, 2839, - 142, 2837, 2836, 2835, 337, 189, 2832, 2830, 265, 144, - 111, 2829, 2828, 109, 183, 2827, 123, 2826, 2820, 2816, - 148, 2814, 138, 2813, 2812, 68, 77, 2811, 50, 2810, - 2800, 10, 79, 64, 4, 9, 18, 2798, 2797, 66, - 83, 2795, 101, 2794, 2792, 99, 86, 2786, 97, 106, - 2785, 2784, 13, 7, 2780, 2, 6, 3, 67, 2775, - 2773, 117, 2771, 2770, 2769, 93, 2767, 2766, 5212, 2765, - 96, 132, 100, 76, 2764, 47, 58, 2761, 2759, 2758, - 2757, 2756, 54, 2755, 2752, 2751, 140, 262, 169, 2749, - 41, 149, 60, 134, 2747, 42, 92, 191, 167, 2745, - 2735, 141, 133, 2734, 2733, 65, 45, 39, 2732, 139, - 131, 122, 112, 110, 137, 2730, 2729, 57, 74, 2728, - 2727, 2726, 2724, 168, 2723, 2722, 73, 2717, 61, 2716, - 181, 2714, 21, 70, 2712, 44, 163, 2710, 75, 2704, - 2698, 69, 98, 72, 52, 2690, 160, 164, 129, 204, - 2689, 2668, 56, 2661, 2653, 2648, 184, 277, 2639, 2637, - 78, 173, 158, 147, 95, 2634, 344, 2629, 2627, 108, - 2252, 5527, 2623, 71, 165, 2621, 2610, 5951, 157, 48, - 26, 2601, 116, 2600, 2598, 2595, 2594, 187, 171, 105, - 161, 62, 2592, 2591, 2590, 17, 2582, 2574, 2571, 2564, - 2563, 2562, 87, 34, 33, 32, 192, 63, 20, 107, - 159, 154, 81, 2553, 2548, 2547, 124, 89, 2546, 156, - 155, 128, 135, 2538, 174, 143, 125, 2536, 126, 31, - 2535, 2534, 2528, 2526, 94, 2524, 2523, 2521, 2512, 153, - 145, 121, 80, 2511, 84, 119, 152, 150, 59, 2504, - 49, 2502, 2501, 29, 179, 28, 2498, 15, 103, 239, - 2493, 4427, 176, 2488, 23, 343, 162, 2487, 2473, 8, - 12, 14, 2472, 2469, 2465, 2461, 136, 2459, 2458, 2457, - 2449, 25, 46, 24, 5, 114, 85, 2446, 2440, 146, - 2435, 2429, 3469, 0, 130, 2427, 195, + 0, 3086, 3084, 39, 2, 37, 36, 3077, 172, 105, + 194, 38, 206, 104, 3076, 166, 3070, 3069, 3068, 3067, + 3066, 3063, 2467, 2461, 2460, 3062, 3059, 3055, 3053, 3051, + 3045, 3044, 3043, 3042, 3039, 167, 161, 187, 3038, 3036, + 3035, 116, 184, 91, 93, 190, 3033, 3032, 84, 3029, + 3027, 3026, 186, 183, 182, 866, 3022, 179, 113, 49, + 3017, 3016, 3013, 3011, 3009, 3008, 3006, 3001, 3000, 2999, + 2997, 2996, 2995, 2992, 2990, 2989, 2988, 205, 2987, 2986, + 24, 2984, 86, 2983, 2980, 2978, 2976, 2975, 8, 2972, + 2965, 15, 52, 2964, 2958, 54, 2957, 2955, 2954, 2953, + 2952, 19, 2948, 28, 2944, 31, 2943, 2942, 124, 2941, + 2938, 2936, 42, 2935, 2925, 2922, 2921, 2919, 2918, 2906, + 140, 2902, 2901, 2900, 301, 193, 2899, 2898, 295, 197, + 109, 2895, 2890, 137, 191, 2882, 120, 2879, 2878, 2875, + 150, 2872, 162, 2861, 2853, 73, 63, 2846, 68, 2840, + 2839, 13, 97, 64, 9, 6, 18, 2837, 2829, 65, + 100, 2828, 101, 2822, 2819, 99, 94, 2816, 103, 111, + 2813, 2811, 12, 7, 2808, 3, 5, 10, 72, 2807, + 2802, 115, 2800, 2797, 2795, 83, 2793, 2791, 5212, 2790, + 96, 131, 106, 78, 2787, 50, 51, 2782, 2781, 2780, + 2778, 2775, 55, 2768, 2764, 2761, 138, 221, 168, 2755, + 43, 45, 56, 136, 2753, 149, 80, 196, 164, 2751, + 2749, 139, 130, 2748, 2747, 69, 48, 46, 2745, 135, + 128, 119, 117, 133, 132, 2744, 2740, 61, 75, 2739, + 2738, 2737, 2733, 165, 2732, 2731, 76, 2729, 58, 2728, + 169, 2727, 21, 60, 2726, 47, 156, 2724, 77, 2722, + 2721, 71, 129, 74, 40, 2719, 153, 163, 125, 181, + 2717, 2716, 57, 2714, 2698, 2692, 192, 302, 2690, 2687, + 81, 177, 146, 148, 90, 2669, 308, 2662, 2653, 22, + 2252, 6114, 2652, 95, 160, 2647, 2628, 5469, 20, 59, + 25, 2627, 112, 2626, 2625, 2624, 2622, 195, 171, 107, + 159, 70, 2621, 2620, 2619, 17, 2609, 2608, 2607, 2602, + 2601, 2600, 87, 35, 34, 33, 199, 67, 44, 98, + 152, 151, 82, 2599, 2598, 2597, 122, 89, 2594, 158, + 154, 123, 126, 2593, 178, 141, 114, 2591, 157, 32, + 2590, 2588, 2562, 2559, 92, 2555, 2553, 2545, 2536, 155, + 143, 121, 79, 2534, 88, 118, 147, 144, 53, 2529, + 62, 2525, 2522, 30, 185, 29, 2521, 16, 108, 102, + 2518, 4427, 180, 2517, 23, 310, 145, 2511, 2505, 4, + 11, 14, 2504, 2503, 2502, 2497, 134, 2495, 2487, 2485, + 2477, 27, 66, 26, 1, 110, 85, 2476, 2474, 142, + 2473, 2465, 3469, 0, 127, 2433, 198, } -//line sql.y:7982 +//line sql.y:7986 type yySymType struct { union any empty struct{} @@ -7388,70 +7435,70 @@ var yyR1 = [...]int{ 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 279, 279, 279, 388, 388, 388, 388, - 388, 388, 387, 387, 387, 353, 353, 353, 386, 386, - 58, 58, 216, 216, 405, 405, 406, 406, 406, 46, - 46, 46, 46, 46, 46, 45, 45, 45, 41, 41, + 388, 388, 387, 387, 387, 353, 353, 353, 353, 386, + 386, 58, 58, 216, 216, 405, 405, 406, 406, 406, + 46, 46, 46, 46, 46, 46, 45, 45, 45, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, - 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 47, 47, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 108, - 108, 109, 109, 109, 109, 111, 111, 111, 369, 369, - 59, 59, 3, 3, 171, 173, 174, 174, 172, 172, - 172, 172, 172, 172, 61, 61, 60, 60, 176, 175, - 177, 177, 177, 1, 1, 2, 2, 4, 4, 374, + 108, 108, 109, 109, 109, 109, 111, 111, 111, 369, + 369, 59, 59, 3, 3, 171, 173, 174, 174, 172, + 172, 172, 172, 172, 172, 61, 61, 60, 60, 176, + 175, 177, 177, 177, 1, 1, 2, 2, 4, 4, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, - 374, 335, 335, 335, 368, 368, 370, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 114, 113, 113, - 112, 115, 115, 115, 115, 115, 115, 115, 115, 372, - 372, 372, 62, 62, 373, 323, 324, 325, 5, 6, - 349, 371, 122, 122, 29, 38, 38, 30, 30, 30, - 30, 31, 31, 63, 64, 64, 64, 64, 64, 64, + 374, 374, 335, 335, 335, 368, 368, 370, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 114, 113, + 113, 112, 115, 115, 115, 115, 115, 115, 115, 115, + 372, 372, 372, 62, 62, 373, 323, 324, 325, 5, + 6, 349, 371, 122, 122, 29, 38, 38, 30, 30, + 30, 30, 31, 31, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 278, 278, 287, 287, - 277, 277, 302, 302, 302, 280, 280, 280, 281, 281, - 398, 398, 398, 274, 274, 65, 65, 65, 303, 303, - 303, 303, 67, 67, 407, 407, 408, 408, 409, 409, - 409, 68, 69, 69, 305, 305, 306, 306, 70, 71, - 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, - 84, 107, 107, 107, 15, 15, 15, 15, 79, 79, - 79, 14, 14, 17, 66, 66, 73, 395, 395, 396, - 397, 397, 397, 397, 74, 76, 32, 32, 32, 32, - 32, 32, 132, 132, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 127, 127, 127, 121, - 121, 415, 77, 78, 78, 125, 125, 125, 118, 118, - 118, 124, 124, 124, 16, 16, 18, 260, 260, 19, - 19, 129, 129, 131, 131, 131, 131, 131, 133, 133, - 133, 133, 133, 133, 133, 128, 128, 130, 130, 130, - 130, 295, 295, 295, 294, 294, 165, 165, 167, 166, - 166, 168, 168, 169, 169, 169, 169, 214, 214, 191, - 191, 253, 253, 254, 254, 252, 252, 259, 259, 255, - 255, 255, 255, 262, 262, 170, 170, 170, 170, 178, - 178, 179, 179, 180, 180, 304, 304, 300, 300, 300, - 299, 299, 184, 184, 184, 186, 185, 185, 185, 185, - 187, 187, 189, 189, 188, 188, 190, 195, 195, 194, - 194, 192, 192, 192, 192, 193, 193, 193, 193, 196, - 196, 142, 142, 142, 142, 142, 142, 142, 157, 157, - 157, 157, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 243, 243, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 152, 152, + 64, 64, 64, 64, 64, 64, 64, 278, 278, 287, + 287, 277, 277, 302, 302, 302, 280, 280, 280, 281, + 281, 398, 398, 398, 274, 274, 65, 65, 65, 303, + 303, 303, 303, 67, 67, 407, 407, 408, 408, 409, + 409, 409, 68, 69, 69, 305, 305, 306, 306, 70, + 71, 83, 83, 83, 83, 83, 83, 83, 84, 84, + 84, 84, 107, 107, 107, 15, 15, 15, 15, 79, + 79, 79, 14, 14, 17, 66, 66, 73, 395, 395, + 396, 397, 397, 397, 397, 74, 76, 32, 32, 32, + 32, 32, 32, 132, 132, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 127, 127, 127, + 121, 121, 415, 77, 78, 78, 125, 125, 125, 118, + 118, 118, 124, 124, 124, 16, 16, 18, 260, 260, + 19, 19, 129, 129, 131, 131, 131, 131, 131, 133, + 133, 133, 133, 133, 133, 133, 128, 128, 130, 130, + 130, 130, 295, 295, 295, 294, 294, 165, 165, 167, + 166, 166, 168, 168, 169, 169, 169, 169, 214, 214, + 191, 191, 253, 253, 254, 254, 252, 252, 259, 259, + 255, 255, 255, 255, 262, 262, 170, 170, 170, 170, + 178, 178, 179, 179, 180, 180, 304, 304, 300, 300, + 300, 299, 299, 184, 184, 184, 186, 185, 185, 185, + 185, 187, 187, 189, 189, 188, 188, 190, 195, 195, + 194, 194, 192, 192, 192, 192, 193, 193, 193, 193, + 196, 196, 142, 142, 142, 142, 142, 142, 142, 157, + 157, 157, 157, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 243, 243, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, - 152, 152, 152, 151, 219, 219, 218, 218, 85, 85, - 85, 86, 86, 87, 87, 87, 87, 87, 88, 88, - 88, 88, 88, 143, 143, 90, 90, 89, 89, 209, - 209, 292, 292, 91, 92, 92, 95, 95, 94, 93, - 93, 99, 99, 96, 96, 98, 98, 97, 100, 100, - 101, 102, 102, 275, 275, 197, 197, 205, 205, 205, - 205, 198, 198, 198, 198, 198, 198, 198, 206, 206, - 206, 213, 207, 207, 203, 203, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 202, 202, 202, 202, + 152, 152, 152, 152, 151, 219, 219, 218, 218, 85, + 85, 85, 86, 86, 87, 87, 87, 87, 87, 88, + 88, 88, 88, 88, 143, 143, 90, 90, 89, 89, + 209, 209, 292, 292, 91, 92, 92, 95, 95, 94, + 93, 93, 99, 99, 96, 96, 98, 98, 97, 100, + 100, 101, 102, 102, 275, 275, 197, 197, 205, 205, + 205, 205, 198, 198, 198, 198, 198, 198, 198, 206, + 206, 206, 213, 207, 207, 203, 203, 201, 201, 201, + 201, 201, 201, 201, 201, 201, 201, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, @@ -7460,33 +7507,33 @@ var yyR1 = [...]int{ 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 162, 162, 162, 162, 224, 224, 149, 149, + 202, 202, 202, 162, 162, 162, 162, 224, 224, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 150, 150, 163, 163, 163, 163, 164, - 164, 164, 164, 164, 164, 164, 312, 312, 117, 117, + 149, 149, 149, 149, 150, 150, 163, 163, 163, 163, + 164, 164, 164, 164, 164, 164, 164, 312, 312, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 416, - 416, 326, 326, 326, 326, 204, 204, 204, 204, 204, - 123, 123, 123, 123, 123, 309, 309, 309, 313, 313, - 313, 311, 311, 311, 311, 311, 311, 311, 311, 311, - 311, 311, 311, 311, 311, 311, 314, 314, 222, 222, - 119, 119, 220, 220, 221, 223, 223, 215, 215, 215, - 215, 217, 217, 200, 200, 200, 225, 225, 226, 226, - 103, 104, 104, 105, 105, 227, 227, 229, 228, 228, - 230, 231, 231, 231, 232, 232, 233, 233, 233, 48, - 48, 48, 48, 48, 43, 43, 43, 43, 44, 44, - 44, 44, 134, 134, 134, 134, 136, 136, 135, 135, - 80, 80, 81, 81, 81, 140, 140, 141, 141, 141, - 138, 138, 139, 139, 250, 250, 234, 234, 234, 241, - 241, 241, 237, 237, 239, 239, 239, 240, 240, 240, - 238, 247, 247, 249, 249, 248, 248, 244, 244, 245, - 245, 246, 246, 246, 242, 242, 199, 199, 199, 199, - 199, 251, 251, 251, 251, 263, 263, 210, 210, 212, - 212, 211, 211, 161, 264, 264, 272, 269, 269, 270, - 270, 296, 296, 296, 273, 273, 286, 286, 282, 282, - 283, 283, 276, 276, 288, 288, 288, 75, 208, 208, - 365, 365, 362, 291, 291, 293, 293, 297, 297, 301, - 301, 298, 298, 289, 289, 289, 289, 289, 289, 289, + 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 416, 416, 326, 326, 326, 326, 204, 204, 204, 204, + 204, 123, 123, 123, 123, 123, 309, 309, 309, 313, + 313, 313, 311, 311, 311, 311, 311, 311, 311, 311, + 311, 311, 311, 311, 311, 311, 311, 314, 314, 222, + 222, 119, 119, 220, 220, 221, 223, 223, 215, 215, + 215, 215, 217, 217, 200, 200, 200, 225, 225, 226, + 226, 103, 104, 104, 105, 105, 227, 227, 229, 228, + 228, 230, 231, 231, 231, 232, 232, 233, 233, 233, + 48, 48, 48, 48, 48, 43, 43, 43, 43, 44, + 44, 44, 44, 134, 134, 134, 134, 136, 136, 135, + 135, 80, 80, 81, 81, 81, 140, 140, 141, 141, + 141, 138, 138, 139, 139, 250, 250, 234, 234, 234, + 241, 241, 241, 237, 237, 239, 239, 239, 240, 240, + 240, 238, 247, 247, 249, 249, 248, 248, 244, 244, + 245, 245, 246, 246, 246, 242, 242, 199, 199, 199, + 199, 199, 251, 251, 251, 251, 263, 263, 210, 210, + 212, 212, 211, 211, 161, 264, 264, 272, 269, 269, + 270, 270, 296, 296, 296, 273, 273, 286, 286, 282, + 282, 283, 283, 276, 276, 288, 288, 288, 75, 208, + 208, 365, 365, 362, 291, 291, 293, 293, 297, 297, + 301, 301, 298, 298, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, @@ -7501,7 +7548,7 @@ var yyR1 = [...]int{ 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 290, 290, 290, 290, 290, 290, 290, 290, + 289, 289, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, @@ -7541,7 +7588,7 @@ var yyR1 = [...]int{ 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 412, 413, 307, 308, 308, 308, + 290, 290, 290, 412, 413, 307, 308, 308, 308, } var yyR2 = [...]int{ @@ -7595,106 +7642,105 @@ var yyR2 = [...]int{ 3, 4, 4, 3, 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, 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, 3, 0, 1, 1, 3, 3, 2, - 2, 1, 1, 5, 0, 1, 0, 1, 2, 3, - 0, 3, 3, 3, 3, 3, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 1, 4, 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, 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, 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, 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, 3, 0, 1, 1, 3, 3, + 2, 2, 1, 1, 5, 0, 1, 0, 1, 2, + 3, 0, 3, 3, 3, 3, 3, 1, 0, 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, 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, 4, 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, 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, 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, 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, 1, 1, @@ -7748,7 +7794,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, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 1, } var yyChk = [...]int{ @@ -8095,342 +8142,342 @@ var yyChk = [...]int{ -413, -413, -413, -105, 88, -102, -101, -291, 77, 122, -264, -291, 89, -413, -412, -232, 89, -236, -11, 87, -3, 273, -323, -373, -324, -325, -5, -6, -349, -80, - 511, -375, -353, -293, 90, 96, 89, 511, -413, -413, - -88, 145, 632, 600, -143, -154, -151, 220, -413, 88, - -413, 88, -413, 88, -291, 244, -103, 88, 26, -300, - -174, -172, -291, 564, -393, -392, 507, -403, -399, 119, - 143, 101, -401, 602, 558, 128, 129, -80, -142, 87, - -413, -81, 288, 619, -384, 512, -88, 633, 578, 553, - 578, 553, -142, -142, -142, -101, -412, -413, 88, 23, - -315, -61, 575, -390, -391, 77, -394, 385, 574, 595, - 119, 90, 89, -252, 249, -377, 513, 142, -413, 88, - -413, 88, -413, -91, -172, 571, -328, -156, -391, 77, - -390, 77, 14, 13, -4, 663, 89, 290, -88, -142, - -142, -413, -60, 27, -173, -389, 257, 252, 255, 33, - -389, 96, -4, -413, -413, 575, 251, 32, 119, -156, - -176, -175, -175, + 511, -375, -353, -297, -293, 90, 96, 89, 511, -413, + -413, -88, 145, 632, 600, -143, -154, -151, 220, -413, + 88, -413, 88, -413, 88, -291, 244, -103, 88, 26, + -300, -174, -172, -291, 564, -393, -392, 507, -403, -399, + 119, 143, 101, -401, 602, 558, 128, 129, -80, -142, + 87, -413, -81, 288, 619, 221, -384, 512, -88, 633, + 578, 553, 578, 553, -142, -142, -142, -101, -412, -413, + 88, 23, -315, -61, 575, -390, -391, 77, -394, 385, + 574, 595, 119, 90, 89, -252, 249, -298, -377, 513, + 142, -413, 88, -413, 88, -413, -91, -172, 571, -328, + -156, -391, 77, -390, 77, 14, 13, -4, 663, 89, + 290, -88, -142, -142, -413, -60, 27, -173, -389, 257, + 252, 255, 33, -389, 96, -4, -413, -413, 575, 251, + 32, 119, -156, -176, -175, -175, } var yyDef = [...]int{ - 871, -2, -2, 873, 2, 4, 5, 6, 7, 8, + 872, -2, -2, 874, 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, 37, 70, - 72, 73, 871, 871, 871, 0, 871, 0, 0, 871, - -2, -2, 871, 1479, 0, 871, 0, 0, -2, 786, - 792, 0, 801, -2, 0, 0, 871, 871, 2034, 2034, - 866, 0, 0, 0, 0, 0, 871, 871, 871, 871, - 1345, 50, 871, 0, 85, 86, 821, 822, 823, 65, - 0, 2032, 872, 1, 3, 71, 75, 0, 0, 0, - 58, 1354, 0, 78, 0, 0, 875, 0, 0, 1462, - 871, 871, 0, 126, 127, 0, 0, 0, -2, 130, - -2, 159, 160, 161, 0, 166, 599, 522, 574, 520, - 559, -2, 508, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 525, 398, 398, 0, 0, - -2, 508, 508, 508, 1464, 0, 0, 0, 556, 460, + 72, 73, 872, 872, 872, 0, 872, 0, 0, 872, + -2, -2, 872, 1480, 0, 872, 0, 0, -2, 787, + 793, 0, 802, -2, 0, 0, 872, 872, 2035, 2035, + 867, 0, 0, 0, 0, 0, 872, 872, 872, 872, + 1346, 50, 872, 0, 85, 86, 822, 823, 824, 65, + 0, 2033, 873, 1, 3, 71, 75, 0, 0, 0, + 58, 1355, 0, 78, 0, 0, 876, 0, 0, 1463, + 872, 872, 0, 126, 127, 0, 0, 0, -2, 130, + -2, 159, 160, 161, 0, 166, 600, 523, 575, 521, + 560, -2, 509, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 526, 398, 398, 0, 0, + -2, 509, 509, 509, 1465, 0, 0, 0, 557, 460, 398, 398, 398, 0, 398, 398, 398, 398, 0, 0, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, - 398, 398, 398, 398, 398, 398, 398, 1372, 165, 1480, - 1477, 1478, 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, 2007, 2008, 2009, - 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, - 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, - 2030, 2031, 0, 1456, 0, 712, 974, 0, 775, 775, - 0, 775, 775, 775, 775, 0, 0, 0, 724, 0, - 0, 0, 0, 772, 0, 740, 741, 0, 772, 0, - 747, 778, 0, 0, 753, 775, 775, 756, 2035, 0, - 2035, 2035, 1447, 0, 769, 767, 781, 782, 40, 785, - 788, 789, 790, 791, 794, 0, 805, 808, 1473, 1474, - 0, 810, 817, 834, 835, 0, 867, 868, 45, 1122, - 0, 996, 1001, 1012, 1027, 1028, 1029, 1030, 1031, 1033, - 1034, 1035, 0, 0, 0, 0, 1040, 1041, 0, 0, - 0, 0, 0, 1103, 1049, 0, 0, 0, 0, 1318, - 0, 0, 1279, 1279, 1137, 1279, 1281, 1281, 1681, 1817, - 1825, 1945, 1643, 1648, 1649, 1650, 1938, 1939, 1940, 1941, - 1980, 1981, 1985, 1741, 0, 0, 0, 2031, 1778, 1786, - 1787, 1811, 1910, 1966, 1660, 1806, 1875, 1738, 1760, 1761, - 1892, 1893, 1782, 1783, 1764, 1776, 1779, 1767, 1768, 1770, - 1772, 1777, 1784, 1790, 1769, 1789, 1788, 0, 1765, 1766, - 1771, 1781, 1785, 1773, 1774, 1775, 1780, 1791, 0, 0, - 0, 0, 0, 1218, 1219, 1220, 1221, 0, 0, 0, - 0, 0, 0, 0, 290, 291, 1331, 1332, 43, 44, - 1121, 1443, 1281, 1281, 1281, 1281, 1281, 1063, 1064, 1065, - 1066, 1067, 1091, 1092, 1098, 1099, 1887, 1888, 1889, 1890, - 1722, 1975, 1730, 1731, 1870, 1871, 1743, 1744, 2006, 2007, + 398, 398, 398, 398, 398, 398, 398, 1373, 165, 1481, + 1478, 1479, 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, 2007, 2008, 2009, 2010, + 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, + 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, + 2031, 2032, 0, 1457, 0, 713, 975, 0, 776, 776, + 0, 776, 776, 776, 776, 0, 0, 0, 725, 0, + 0, 0, 0, 773, 0, 741, 742, 0, 773, 0, + 748, 779, 0, 0, 754, 776, 776, 757, 2036, 0, + 2036, 2036, 1448, 0, 770, 768, 782, 783, 40, 786, + 789, 790, 791, 792, 795, 0, 806, 809, 1474, 1475, + 0, 811, 818, 835, 836, 0, 868, 869, 45, 1123, + 0, 997, 1002, 1013, 1028, 1029, 1030, 1031, 1032, 1034, + 1035, 1036, 0, 0, 0, 0, 1041, 1042, 0, 0, + 0, 0, 0, 1104, 1050, 0, 0, 0, 0, 1319, + 0, 0, 1280, 1280, 1138, 1280, 1282, 1282, 1682, 1818, + 1826, 1946, 1644, 1649, 1650, 1651, 1939, 1940, 1941, 1942, + 1981, 1982, 1986, 1742, 0, 0, 0, 2032, 1779, 1787, + 1788, 1812, 1911, 1967, 1661, 1807, 1876, 1739, 1761, 1762, + 1893, 1894, 1783, 1784, 1765, 1777, 1780, 1768, 1769, 1771, + 1773, 1778, 1785, 1791, 1770, 1790, 1789, 0, 1766, 1767, + 1772, 1782, 1786, 1774, 1775, 1776, 1781, 1792, 0, 0, + 0, 0, 0, 1219, 1220, 1221, 1222, 0, 0, 0, + 0, 0, 0, 0, 290, 291, 1332, 1333, 43, 44, + 1122, 1444, 1282, 1282, 1282, 1282, 1282, 1064, 1065, 1066, + 1067, 1068, 1092, 1093, 1099, 1100, 1888, 1889, 1890, 1891, + 1723, 1976, 1731, 1732, 1871, 1872, 1744, 1745, 2007, 2008, -2, -2, -2, 231, 232, 233, 234, 235, 236, 237, - 238, 0, 1685, 1956, 1957, 227, 0, 0, 295, 296, - 292, 293, 294, 1105, 1106, 248, 249, 250, 251, 252, + 238, 0, 1686, 1957, 1958, 227, 0, 0, 295, 296, + 292, 293, 294, 1106, 1107, 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, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 2034, 0, 844, - 0, 0, 0, 0, 0, 1354, 0, 1346, 1345, 63, - 0, 871, -2, 0, 0, 0, 0, 47, 0, 52, - 931, 874, 77, 76, 1394, 0, 0, 0, 59, 1355, - 67, 69, 1356, 0, 876, 877, 0, 907, 911, 0, - 0, 0, 1463, 1462, 1462, 102, 0, 0, 103, 123, - 124, 125, 0, 0, 109, 110, 1449, 1450, 0, 0, + 283, 284, 285, 286, 287, 288, 289, 2035, 0, 845, + 0, 0, 0, 0, 0, 1355, 0, 1347, 1346, 63, + 0, 872, -2, 0, 0, 0, 0, 47, 0, 52, + 932, 875, 77, 76, 1395, 0, 0, 0, 59, 1356, + 67, 69, 1357, 0, 877, 878, 0, 908, 912, 0, + 0, 0, 1464, 1463, 1463, 102, 0, 0, 103, 123, + 124, 125, 0, 0, 109, 110, 1450, 1451, 0, 0, 177, 178, 0, 41, 425, 0, 173, 0, 418, 357, - 0, 1372, 0, 0, 0, 0, 0, 871, 0, 1457, - 154, 155, 162, 163, 164, 398, 398, 398, 571, 0, - 0, 165, 165, 529, 530, 531, 0, 0, -2, 423, - 0, 509, 0, 0, 412, 412, 416, 414, 415, 0, - 0, 0, 0, 0, 0, 0, 0, 548, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, - 0, 399, 0, 569, 570, 461, 0, 0, 0, 0, - 0, 0, 0, 0, 1465, 1466, 0, 546, 547, 0, + 0, 1373, 0, 0, 0, 0, 0, 872, 0, 1458, + 154, 155, 162, 163, 164, 398, 398, 398, 572, 0, + 0, 165, 165, 530, 531, 532, 0, 0, -2, 423, + 0, 510, 0, 0, 412, 412, 416, 414, 415, 0, + 0, 0, 0, 0, 0, 0, 0, 549, 0, 550, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, + 0, 399, 0, 570, 571, 461, 0, 0, 0, 0, + 0, 0, 0, 0, 1466, 1467, 0, 547, 548, 0, 0, 0, 398, 398, 0, 0, 0, 0, 398, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 153, 1385, - 0, 0, 0, -2, 0, 704, 0, 0, 0, 1458, - 1458, 0, 711, 0, 713, 714, 0, 0, 715, 0, - 772, 772, 770, 771, 717, 718, 719, 720, 775, 0, - 0, 407, 408, 409, 772, 775, 0, 775, 775, 775, - 775, 772, 772, 772, 775, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2035, 778, 775, 0, 748, 0, - 749, 750, 751, 754, 755, 757, 2036, 2037, 1475, 1476, - 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, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, - 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 2035, - 2035, 761, 765, 1448, 787, 793, 795, 796, 0, 0, - 806, 809, 828, 49, 1729, 816, 49, 818, 819, 820, - 846, 847, 852, 0, 0, 0, 0, 858, 859, 860, - 0, 0, 863, 864, 865, 0, 0, 0, 0, 0, - 994, 0, 0, 1111, 1112, 1113, 1114, 1115, 1116, 1117, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 0, - 0, 0, 1036, 1037, 1038, 1039, 1042, 0, 1054, 0, - 1056, 1327, -2, 0, 0, 0, 1047, 1048, 0, 0, - 0, 0, 0, 0, 0, 1319, 0, 0, 1135, 0, - 1136, 1138, 1139, 0, 1140, 881, 881, 881, 881, 881, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 881, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1468, 141, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 891, 0, 0, 891, 891, 0, 0, 220, 221, 222, + 0, 0, 0, 0, 0, 0, 0, 0, 153, 1386, + 0, 0, 0, -2, 0, 705, 0, 0, 0, 1459, + 1459, 0, 712, 0, 714, 715, 0, 0, 716, 0, + 773, 773, 771, 772, 718, 719, 720, 721, 776, 0, + 0, 407, 408, 409, 773, 776, 0, 776, 776, 776, + 776, 773, 773, 773, 776, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2036, 779, 776, 0, 749, 0, + 750, 751, 752, 755, 756, 758, 2037, 2038, 1476, 1477, + 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, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, + 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 2036, + 2036, 762, 766, 1449, 788, 794, 796, 797, 0, 0, + 807, 810, 829, 49, 1730, 817, 49, 819, 820, 821, + 847, 848, 853, 0, 0, 0, 0, 859, 860, 861, + 0, 0, 864, 865, 866, 0, 0, 0, 0, 0, + 995, 0, 0, 1112, 1113, 1114, 1115, 1116, 1117, 1118, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1014, 1015, 0, + 0, 0, 1037, 1038, 1039, 1040, 1043, 0, 1055, 0, + 1057, 1328, -2, 0, 0, 0, 1048, 1049, 0, 0, + 0, 0, 0, 0, 0, 1320, 0, 0, 1136, 0, + 1137, 1139, 1140, 0, 1141, 882, 882, 882, 882, 882, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 882, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1469, 141, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 892, 0, 0, 892, 892, 0, 0, 220, 221, 222, 223, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, - 243, 244, 297, 245, 246, 247, 1121, 0, 0, 0, - 46, 836, 837, 0, 957, 1468, 0, 0, 887, 0, - 57, 66, 68, 1354, 61, 1354, 0, 893, 0, 0, - -2, -2, 894, 900, 901, 902, 903, 904, 54, 2033, + 243, 244, 297, 245, 246, 247, 1122, 0, 0, 0, + 46, 837, 838, 0, 958, 1469, 0, 0, 888, 0, + 57, 66, 68, 1355, 61, 1355, 0, 894, 0, 0, + -2, -2, 895, 901, 902, 903, 904, 905, 54, 2034, 55, 0, 74, 0, 48, 0, 0, 0, 0, 371, - 1397, 0, 0, 1347, 1348, 1351, 0, 908, 1823, 912, - 0, 914, 915, 0, 0, 100, 0, 973, 0, 0, - 0, 111, 0, 113, 114, 0, 0, 0, 382, 1451, - 1452, 1453, -2, 405, 0, 382, 366, 305, 306, 307, + 1398, 0, 0, 1348, 1349, 1352, 0, 909, 1824, 913, + 0, 915, 916, 0, 0, 100, 0, 974, 0, 0, + 0, 111, 0, 113, 114, 0, 0, 0, 382, 1452, + 1453, 1454, -2, 405, 0, 382, 366, 305, 306, 307, 357, 309, 357, 357, 357, 357, 371, 371, 371, 371, 340, 341, 342, 343, 344, 0, 0, 326, 357, 357, 357, 357, 347, 348, 349, 350, 351, 352, 353, 354, 310, 311, 312, 313, 314, 315, 316, 317, 318, 359, 359, 359, 359, 359, 363, 363, 0, 42, 0, 386, - 0, 1351, 0, 0, 1385, 1460, 1470, 0, 0, 0, - 1460, 132, 0, 0, 0, 572, 610, 523, 560, 573, - 0, 526, 527, -2, 0, 0, 508, 0, 510, 0, + 0, 1352, 0, 0, 1386, 1461, 1471, 0, 0, 0, + 1461, 132, 0, 0, 0, 573, 611, 524, 561, 574, + 0, 527, 528, -2, 0, 0, 509, 0, 511, 0, 406, 0, -2, 0, 416, 0, 412, 416, 413, 416, - 404, 417, 550, 551, 552, 0, 554, 555, 640, 943, - 0, 0, 0, 0, 0, 646, 647, 648, 0, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 659, 561, - 562, 563, 564, 565, 566, 567, 568, 0, 0, 0, - 0, 510, 0, 557, 0, 0, 462, 463, 464, 0, + 404, 417, 551, 552, 553, 0, 555, 556, 641, 944, + 0, 0, 0, 0, 0, 647, 648, 649, 0, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 562, + 563, 564, 565, 566, 567, 568, 569, 0, 0, 0, + 0, 511, 0, 558, 0, 0, 462, 463, 464, 0, 0, 467, 468, 469, 470, 0, 0, 473, 474, 475, - 960, 961, 476, 477, 502, 503, 504, 478, 479, 480, + 961, 962, 476, 477, 502, 503, 504, 478, 479, 480, 481, 482, 483, 484, 496, 497, 498, 499, 500, 501, - 485, 486, 487, 488, 489, 490, 493, 0, 147, 1376, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1458, 0, 0, 0, 0, - 890, 975, 1481, 1482, 776, 777, 0, 410, 411, 775, - 775, 721, 762, 0, 775, 725, 763, 726, 728, 727, - 729, 742, 743, 775, 732, 773, 774, 733, 734, 735, - 736, 737, 738, 739, 758, 744, 745, 746, 779, 0, - 783, 784, 759, 760, 0, 0, 799, 800, 0, 807, - 831, 829, 830, 832, 824, 825, 826, 827, 0, 833, - 0, 0, 849, 96, 854, 855, 856, 857, 869, 862, - 1123, 991, 992, 993, 0, 995, 998, 0, 1107, 1109, - 1000, 1002, 1118, 1119, 1120, 0, 0, 0, 0, 0, - 1006, 1010, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, - 1023, 1024, 1025, 1026, 1032, 1295, 1296, 1297, 1051, 298, - 299, 0, 1052, 0, 0, 0, 0, 0, 0, 0, - 1122, 1053, 0, 905, 0, 0, 1325, 1322, 0, 0, - 0, 1280, 1282, 0, 0, 0, 0, 882, 883, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1258, 1259, 1260, - 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, - 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1298, 0, - 0, 0, 0, 0, 1318, 0, 1058, 1059, 1060, 0, - 0, 0, 0, 0, 0, 1178, 0, 0, 0, 0, - 1469, 0, 142, 143, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1222, 1223, 1224, 1225, 39, 0, 0, 0, 892, 1329, + 485, 486, 487, 488, 489, 490, 493, 0, 147, 1377, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1459, 0, 0, 0, 0, + 891, 976, 1482, 1483, 777, 778, 0, 410, 411, 776, + 776, 722, 763, 0, 776, 726, 764, 727, 729, 728, + 730, 743, 744, 776, 733, 774, 775, 734, 735, 736, + 737, 738, 739, 740, 759, 745, 746, 747, 780, 0, + 784, 785, 760, 761, 0, 0, 800, 801, 0, 808, + 832, 830, 831, 833, 825, 826, 827, 828, 0, 834, + 0, 0, 850, 96, 855, 856, 857, 858, 870, 863, + 1124, 992, 993, 994, 0, 996, 999, 0, 1108, 1110, + 1001, 1003, 1119, 1120, 1121, 0, 0, 0, 0, 0, + 1007, 1011, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 1027, 1033, 1296, 1297, 1298, 1052, 298, + 299, 0, 1053, 0, 0, 0, 0, 0, 0, 0, + 1123, 1054, 0, 906, 0, 0, 1326, 1323, 0, 0, + 0, 1281, 1283, 0, 0, 0, 0, 883, 884, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1259, 1260, 1261, + 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, + 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1299, 0, + 0, 0, 0, 0, 1319, 0, 1059, 1060, 1061, 0, + 0, 0, 0, 0, 0, 1179, 0, 0, 0, 0, + 1470, 0, 142, 143, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1223, 1224, 1225, 1226, 39, 0, 0, 0, 893, 1330, 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1247, 0, 0, 0, - 0, 0, 0, 1441, 0, 0, 839, 840, 842, 0, - 977, 0, 958, 0, 0, 845, 0, 886, 0, 889, - 60, 62, 898, 899, 0, 916, 895, 56, 51, 0, - 0, 935, 1395, 371, 1417, 0, 380, 380, 377, 1357, - 1358, 0, 1350, 1352, 1353, 79, 913, 909, 0, 989, - 0, 0, 972, 0, 919, 921, 922, 923, 955, 0, - 926, 927, 0, 0, 0, 0, 0, 98, 974, 104, + 0, 0, 0, 0, 0, 0, 1248, 0, 0, 0, + 0, 0, 0, 1442, 0, 0, 840, 841, 843, 0, + 978, 0, 959, 0, 0, 846, 0, 887, 0, 890, + 60, 62, 899, 900, 0, 917, 896, 56, 51, 0, + 0, 936, 1396, 371, 1418, 0, 380, 380, 377, 1358, + 1359, 0, 1351, 1353, 1354, 79, 914, 910, 0, 990, + 0, 0, 973, 0, 920, 922, 923, 924, 956, 0, + 927, 928, 0, 0, 0, 0, 0, 98, 975, 104, 0, 112, 0, 0, 117, 118, 105, 106, 107, 108, - 0, 599, -2, 457, 179, 181, 182, 183, 174, -2, + 0, 600, -2, 457, 179, 181, 182, 183, 174, -2, 369, 367, 368, 308, 371, 371, 334, 335, 336, 337, 338, 339, 0, 0, 327, 328, 329, 330, 319, 0, 320, 321, 322, 361, 0, 323, 324, 0, 325, 424, - 0, 1359, 387, 388, 390, 398, 0, 393, 394, 0, - 398, 398, 0, 419, 420, 0, 1351, 1376, 0, 0, - 0, 1471, 1470, 1470, 1470, 0, 167, 168, 169, 170, - 171, 172, 635, 0, 0, 611, 633, 634, 165, 0, - 0, 175, 512, 511, 0, 667, 0, 422, 0, 0, - 416, 416, 401, 402, 553, 0, 0, 642, 643, 644, - 645, 0, 0, 0, 539, 451, 0, 540, 541, 510, - 512, 0, 0, 382, 465, 466, 471, 472, 491, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 586, 587, 588, 591, 593, 514, 597, 590, 592, 594, - 514, 598, 1373, 1374, 1375, 0, 0, 705, 0, 0, - 448, 94, 1459, 710, 772, 731, 764, 772, 723, 730, - 752, 797, 798, 803, 811, 812, 813, 814, 815, 853, - 0, 0, 0, 0, 861, 0, 0, 999, 1108, 1110, - 1003, 0, 1007, 1011, 0, 0, 0, 1057, 1055, 1329, - 0, 0, 0, 1104, 0, 0, 1126, 1127, 0, 0, - 0, 1323, 0, 0, 1133, 0, 1283, 1284, 1141, 0, - 0, 0, 0, 0, 1147, 1148, 1149, 1150, 1151, 1152, - 1153, 1154, 1155, 1156, 1345, 0, 0, 0, 0, 0, - 1162, 1163, 1164, 1165, 1166, 0, 1168, 0, 1169, 0, - 0, 0, 0, 1176, 1177, 1179, 0, 0, 1182, 1183, - 0, 0, 1184, 0, 0, 0, 1188, 0, 0, 0, - 0, 1197, 1198, 1199, 1200, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1211, 1212, 0, 1086, 0, - 0, 1086, 0, 1124, 891, 0, 1285, 1286, 1287, 1288, - 1289, 0, 0, 0, 0, 0, 0, 1245, 1246, 1248, - 0, 0, 1251, 0, 1253, 0, 1442, 838, 841, 843, - 929, 978, 979, 0, 0, 0, 0, 959, 1467, 884, - 885, 888, 937, 0, 1333, 0, 0, 916, 989, 917, - 0, 896, 53, 932, 0, 1399, 1398, 1411, 1424, 380, - 380, 374, 375, 381, 376, 378, 379, 1349, 0, 1354, - 0, 1435, 0, 0, 1427, 0, 0, 0, 0, 0, - 0, 0, 0, 962, 0, 0, 965, 0, 0, 0, - 0, 956, 927, 0, 928, 0, -2, 0, 0, 92, + 0, 1360, 387, 388, 390, 398, 0, 393, 394, 0, + 398, 398, 0, 419, 420, 0, 1352, 1377, 0, 0, + 0, 1472, 1471, 1471, 1471, 0, 167, 168, 169, 170, + 171, 172, 636, 0, 0, 612, 634, 635, 165, 0, + 0, 175, 513, 512, 0, 668, 0, 422, 0, 0, + 416, 416, 401, 402, 554, 0, 0, 643, 644, 645, + 646, 0, 0, 0, 540, 451, 0, 541, 542, 511, + 513, 0, 0, 382, 465, 466, 471, 472, 491, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 587, 588, 589, 592, 594, 515, 598, 591, 593, 595, + 515, 599, 1374, 1375, 1376, 0, 0, 706, 0, 0, + 448, 94, 1460, 711, 773, 732, 765, 773, 724, 731, + 753, 798, 799, 804, 812, 813, 814, 815, 816, 854, + 0, 0, 0, 0, 862, 0, 0, 1000, 1109, 1111, + 1004, 0, 1008, 1012, 0, 0, 0, 1058, 1056, 1330, + 0, 0, 0, 1105, 0, 0, 1127, 1128, 0, 0, + 0, 1324, 0, 0, 1134, 0, 1284, 1285, 1142, 0, + 0, 0, 0, 0, 1148, 1149, 1150, 1151, 1152, 1153, + 1154, 1155, 1156, 1157, 1346, 0, 0, 0, 0, 0, + 1163, 1164, 1165, 1166, 1167, 0, 1169, 0, 1170, 0, + 0, 0, 0, 1177, 1178, 1180, 0, 0, 1183, 1184, + 0, 0, 1185, 0, 0, 0, 1189, 0, 0, 0, + 0, 1198, 1199, 1200, 1201, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1212, 1213, 0, 1087, 0, + 0, 1087, 0, 1125, 892, 0, 1286, 1287, 1288, 1289, + 1290, 0, 0, 0, 0, 0, 0, 1246, 1247, 1249, + 0, 0, 1252, 0, 1254, 0, 1443, 839, 842, 844, + 930, 979, 980, 0, 0, 0, 0, 960, 1468, 885, + 886, 889, 938, 0, 1334, 0, 0, 917, 990, 918, + 0, 897, 53, 933, 0, 1400, 1399, 1412, 1425, 380, + 380, 374, 375, 381, 376, 378, 379, 1350, 0, 1355, + 0, 1436, 0, 0, 1428, 0, 0, 0, 0, 0, + 0, 0, 0, 963, 0, 0, 966, 0, 0, 0, + 0, 957, 928, 0, 929, 0, -2, 0, 0, 92, 93, 0, 0, 0, 115, 116, 0, 0, 122, 383, 384, 156, 165, 459, 180, 432, 0, 0, 304, 370, 331, 332, 333, 0, 355, 0, 0, 0, 0, 453, - 128, 1363, 1362, 398, 398, 389, 0, 392, 0, 0, - 0, 1472, 358, 421, 0, 146, 0, 0, 0, 0, - 0, 152, 605, 0, 0, 612, 0, 0, 0, 521, - 0, 532, 533, 0, 639, -2, 701, 386, 0, 400, - 403, 944, 0, 0, 534, 0, 537, 538, 452, 512, - 543, 544, 558, 545, 494, 495, 492, 0, 0, 1386, - 1387, 1392, 1390, 1391, 133, 579, 581, 580, 584, 0, - 0, 0, 516, 0, 516, 577, 0, 448, 1359, 0, - 709, 449, 450, 775, 775, 848, 97, 0, 851, 0, - 0, 0, 0, 1004, 1008, 1290, 1316, 357, 357, 1303, - 357, 363, 1306, 357, 1308, 357, 1311, 357, 1314, 1315, - 0, 0, 0, 906, 0, 0, 1132, 1326, 0, 0, - 1142, 1143, 1144, 1145, 1146, 1320, 0, 0, 0, 1161, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 144, 145, 0, 0, 0, 0, 0, 0, 1256, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1081, - 1085, 0, 1087, 1088, 0, 0, 1214, 0, 0, 1226, - 0, 1330, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 980, 985, 985, 985, 0, 0, 0, 1454, - 1455, 1334, 1335, 989, 1336, 918, 897, 936, 1417, 0, - 1410, 0, -2, 1419, 0, 0, 0, 1425, 372, 373, - 910, 80, 990, 83, 0, 1435, 1444, 0, 1426, 1437, - 1439, 0, 0, 0, 1431, 0, 989, 920, 951, 953, - 0, 948, 963, 964, 966, 0, 968, 0, 970, 971, - 931, 925, 0, 100, 0, 989, 989, 99, 0, 976, + 128, 1364, 1363, 398, 398, 389, 0, 392, 0, 0, + 0, 1473, 358, 421, 0, 146, 0, 0, 0, 0, + 0, 152, 606, 0, 0, 613, 0, 0, 0, 522, + 0, 533, 534, 0, 640, -2, 702, 386, 0, 400, + 403, 945, 0, 0, 535, 0, 538, 539, 452, 513, + 544, 545, 559, 546, 494, 495, 492, 0, 0, 1387, + 1388, 1393, 1391, 1392, 133, 580, 582, 581, 585, 0, + 0, 0, 517, 0, 517, 578, 0, 448, 1360, 0, + 710, 449, 450, 776, 776, 849, 97, 0, 852, 0, + 0, 0, 0, 1005, 1009, 1291, 1317, 357, 357, 1304, + 357, 363, 1307, 357, 1309, 357, 1312, 357, 1315, 1316, + 0, 0, 0, 907, 0, 0, 1133, 1327, 0, 0, + 1143, 1144, 1145, 1146, 1147, 1321, 0, 0, 0, 1162, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 144, 145, 0, 0, 0, 0, 0, 0, 1257, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1082, + 1086, 0, 1088, 1089, 0, 0, 1215, 0, 0, 1227, + 0, 1331, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 981, 986, 986, 986, 0, 0, 0, 1455, + 1456, 1335, 1336, 990, 1337, 919, 898, 937, 1418, 0, + 1411, 0, -2, 1420, 0, 0, 0, 1426, 372, 373, + 911, 80, 991, 83, 0, 1436, 1445, 0, 1427, 1438, + 1440, 0, 0, 0, 1432, 0, 990, 921, 952, 954, + 0, 949, 964, 965, 967, 0, 969, 0, 971, 972, + 932, 926, 0, 100, 0, 990, 990, 99, 0, 977, 119, 120, 121, 458, 184, 189, 0, 0, 0, 194, 0, 196, 0, 0, 0, 201, 202, 398, 398, 433, 0, 301, 303, 0, 0, 187, 371, 0, 371, 0, - 362, 364, 0, 434, 454, 1360, 1361, 0, 0, 391, - 395, 396, 397, 0, 1461, 148, 0, 0, 0, 608, - 0, 636, 0, 0, 0, 0, 0, 0, 176, 513, - 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, - 398, 0, 0, 0, 398, 398, 398, 0, 693, 385, - 0, 0, 664, 661, 535, 0, 225, 226, 228, 0, - 0, 0, 0, 0, 542, 931, 1377, 1378, 1379, 0, - 1389, 1393, 136, 0, 0, 0, 0, 589, 595, 0, - 515, 596, 706, 707, 708, 95, 716, 722, 850, 870, - 997, 1005, 1009, 0, 0, 0, 0, 1317, 1301, 371, - 1304, 1305, 1307, 1309, 1310, 1312, 1313, 1045, 1046, 1050, - 0, 1129, 0, 1131, 1324, 0, 1354, 0, 0, 0, - 1160, 0, 0, 0, 1171, 1170, 1172, 0, 1174, 1175, - 1180, 1181, 1185, 0, 1187, 1189, 1190, 0, 0, 0, - 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, - 0, 1079, 1082, 1213, 1089, 1090, 1095, 1216, 0, 0, - 1125, 1228, 0, 1233, 0, 0, 1239, 0, 1243, 0, - 1249, 1250, 1252, 1254, 0, 0, 0, 0, 0, 957, - 938, 64, 1336, 1338, 0, 1404, 1402, 1402, 1412, 1413, - 0, 0, 1420, 0, 0, 0, 0, 84, 0, 0, - 0, 1440, 0, 0, 0, 0, 101, 1345, 945, 952, - 0, 0, 946, 0, 947, 967, 969, 924, 0, 989, - 989, 90, 91, 0, 190, 0, 192, 218, 219, 0, + 362, 364, 0, 434, 454, 1361, 1362, 0, 0, 391, + 395, 396, 397, 0, 1462, 148, 0, 0, 0, 609, + 0, 637, 0, 0, 0, 0, 0, 0, 176, 514, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 0, + 398, 0, 0, 0, 398, 398, 398, 0, 694, 385, + 0, 0, 665, 662, 536, 0, 225, 226, 228, 0, + 0, 0, 0, 0, 543, 932, 1378, 1379, 1380, 0, + 1390, 1394, 136, 0, 0, 0, 0, 590, 596, 0, + 516, 597, 707, 708, 709, 95, 717, 723, 851, 871, + 998, 1006, 1010, 0, 0, 0, 0, 1318, 1302, 371, + 1305, 1306, 1308, 1310, 1311, 1313, 1314, 1046, 1047, 1051, + 0, 1130, 0, 1132, 1325, 0, 1355, 0, 0, 0, + 1161, 0, 0, 0, 1172, 1171, 1173, 0, 1175, 1176, + 1181, 1182, 1186, 0, 1188, 1190, 1191, 0, 0, 0, + 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, + 0, 1080, 1083, 1214, 1090, 1091, 1096, 1217, 0, 0, + 1126, 1229, 0, 1234, 0, 0, 1240, 0, 1244, 0, + 1250, 1251, 1253, 1255, 0, 0, 0, 0, 0, 958, + 939, 64, 1337, 1339, 0, 1405, 1403, 1403, 1413, 1414, + 0, 0, 1421, 0, 0, 0, 0, 84, 0, 0, + 0, 1441, 0, 0, 0, 0, 101, 1346, 946, 953, + 0, 0, 947, 0, 948, 968, 970, 925, 0, 990, + 990, 90, 91, 0, 190, 0, 192, 218, 219, 0, 195, 197, 198, 199, 205, 206, 207, 200, 0, 0, - 300, 302, 0, 0, 345, 356, 346, 0, 0, 1364, - 1365, 1366, 1367, 1368, 1369, 1370, 1371, 931, 149, 150, - 151, 600, 0, 610, 0, 933, 0, 603, 0, 524, + 300, 302, 0, 0, 345, 356, 346, 0, 0, 1365, + 1366, 1367, 1368, 1369, 1370, 1371, 1372, 932, 149, 150, + 151, 601, 0, 611, 0, 934, 0, 604, 0, 525, 0, 0, 0, 398, 398, 398, 0, 0, 0, 0, - 678, 0, 0, 641, 0, 649, 0, 0, 0, 229, - 230, 0, 1388, 578, 0, 134, 135, 0, 0, 583, - 517, 518, 1043, 0, 0, 0, 1044, 1302, 0, 0, - 0, 0, 1321, 0, 0, 0, 0, 1167, 0, 0, - 0, 1193, 0, 0, 0, 630, 631, 0, 1257, 1084, - 1345, 0, 1086, 1096, 1097, 0, 1086, 1227, 0, 0, - 0, 0, 0, 0, 0, 986, 0, 0, 0, 0, - 977, 1338, 1343, 0, 0, 1407, 0, 1400, 1403, 1401, - 1414, 0, 0, 1421, 0, 1423, 0, 1445, 1446, 1438, - 0, 1430, 1433, 1429, 1432, 1354, 949, 0, 954, 0, - 1345, 89, 0, 193, 0, 0, 0, 0, 0, 0, + 679, 0, 0, 642, 0, 650, 0, 0, 0, 229, + 230, 0, 1389, 579, 0, 134, 135, 0, 0, 584, + 518, 519, 1044, 0, 0, 0, 1045, 1303, 0, 0, + 0, 0, 1322, 0, 0, 0, 0, 1168, 0, 0, + 0, 1194, 0, 0, 0, 631, 632, 0, 1258, 1085, + 1346, 0, 1087, 1097, 1098, 0, 1087, 1228, 0, 0, + 0, 0, 0, 0, 0, 987, 0, 0, 0, 0, + 978, 1339, 1344, 0, 0, 1408, 0, 1401, 1404, 1402, + 1415, 0, 0, 1422, 0, 1424, 0, 1446, 1447, 1439, + 0, 1431, 1434, 1430, 1433, 1355, 950, 0, 955, 0, + 1346, 89, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -8438,37 +8485,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, 203, 204, 0, 0, 360, 365, - 0, 0, 0, 601, 0, 934, 613, 604, 0, 691, - 0, 695, 0, 0, 0, 698, 699, 700, 677, 0, - 681, 426, 665, 662, 663, 536, 0, 137, 138, 0, - 0, 0, 1291, 0, 1294, 1128, 1130, 0, 1157, 1158, - 1159, 1299, 1300, 1173, 1186, 1191, 0, 1194, 0, 0, - 1195, 0, 632, 1075, 0, 0, 1093, 1094, 0, 1229, - 0, 1234, 1235, 0, 1240, 0, 1244, 1255, 0, 982, - 939, 940, 987, 988, 0, 0, 930, 1343, 82, 1344, - 1341, 0, 1339, 1337, 1396, 0, 1405, 1406, 1415, 1416, - 1422, 0, 1428, 0, 87, 0, 0, 0, 1354, 191, - 0, 210, 0, 609, 0, 612, 602, 689, 690, 0, - 702, 694, 696, 697, 679, -2, 1380, 0, 0, 0, - 585, 1292, 0, 0, 1196, 0, 628, 629, 1083, 1076, - 0, 1061, 1062, 1080, 1215, 1217, 0, 0, 0, 0, - 981, 983, 984, 81, 0, 1340, 1101, 0, 1408, 1409, - 1436, 1434, 950, 957, 0, 88, 439, 432, 1380, 0, - 0, 0, 682, 683, 684, 685, 686, 687, 688, 575, - 1382, 139, 140, 505, 506, 507, 133, 0, 1134, 1192, - 1077, 0, 0, 0, 0, 1073, 1074, 0, 1230, 0, - 1236, 0, 1241, 0, 941, 942, 1342, 0, 0, 614, - 0, 616, 0, -2, 427, 440, 0, 185, 211, 212, - 0, 0, 215, 216, 217, 208, 209, 129, 0, 0, - 703, 0, 1383, 1384, 136, 0, 0, 1068, 1069, 1070, - 1071, 1072, 0, 0, 0, 1102, 1081, 615, 0, 0, - 382, 0, 625, 428, 429, 0, 435, 436, 437, 438, - 213, 214, 637, 0, 0, 582, 1293, 0, 1231, 0, - 1237, 0, 1242, 0, 617, 618, 626, 0, 430, 0, - 431, 0, 0, 0, 606, 0, 637, 1381, 1078, 0, - 0, 1100, 0, 627, 623, 441, 443, 444, 0, 0, - 442, 638, 607, 1232, 1238, 0, 445, 446, 447, 619, - 620, 621, 622, + 0, 0, 0, 602, 0, 935, 614, 605, 0, 692, + 0, 696, 0, 0, 0, 699, 700, 701, 678, 0, + 682, 426, 666, 663, 664, 537, 0, 137, 138, 0, + 0, 0, 1292, 0, 1295, 1129, 1131, 0, 1158, 1159, + 1160, 1300, 1301, 1174, 1187, 1192, 0, 1195, 0, 0, + 1196, 0, 633, 1076, 0, 0, 1094, 1095, 0, 1230, + 0, 1235, 1236, 0, 1241, 0, 1245, 1256, 0, 983, + 940, 941, 988, 989, 0, 0, 931, 1344, 82, 1345, + 1342, 0, 1340, 1338, 1397, 0, 1406, 1407, 1416, 1417, + 1423, 0, 1429, 0, 87, 0, 0, 0, 1355, 191, + 0, 210, 0, 610, 0, 613, 603, 690, 691, 0, + 703, 695, 697, 698, 680, -2, 1381, 0, 0, 0, + 586, 1293, 0, 0, 1197, 0, 629, 630, 1084, 1077, + 0, 1062, 1063, 1081, 1216, 1218, 0, 0, 0, 0, + 982, 984, 985, 81, 0, 1341, 1102, 0, 1409, 1410, + 1437, 1435, 951, 958, 0, 88, 439, 432, 1381, 0, + 0, 0, 683, 684, 685, 686, 687, 688, 689, 576, + 1383, 139, 140, 0, 506, 507, 508, 133, 0, 1135, + 1193, 1078, 0, 0, 0, 0, 1074, 1075, 0, 1231, + 0, 1237, 0, 1242, 0, 942, 943, 1343, 0, 0, + 615, 0, 617, 0, -2, 427, 440, 0, 185, 211, + 212, 0, 0, 215, 216, 217, 208, 209, 129, 0, + 0, 704, 0, 1384, 1385, 0, 136, 0, 0, 1069, + 1070, 1071, 1072, 1073, 0, 0, 0, 1103, 1082, 616, + 0, 0, 382, 0, 626, 428, 429, 0, 435, 436, + 437, 438, 213, 214, 638, 0, 0, 505, 583, 1294, + 0, 1232, 0, 1238, 0, 1243, 0, 618, 619, 627, + 0, 430, 0, 431, 0, 0, 0, 607, 0, 638, + 1382, 1079, 0, 0, 1101, 0, 628, 624, 441, 443, + 444, 0, 0, 442, 639, 608, 1233, 1239, 0, 445, + 446, 447, 620, 621, 622, 623, } var yyTok1 = [...]int{ @@ -12340,158 +12387,157 @@ yydefault: yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 505: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2863 { - yyVAL.str = yyDollar[1].identifierCI.String() + yyVAL.str = String(TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}) } case 506: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:2867 { - yyVAL.str = encodeSQLString(yyDollar[1].str) + yyVAL.str = yyDollar[1].identifierCI.String() } case 507: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:2871 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = encodeSQLString(yyDollar[1].str) } case 508: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:2875 + { + yyVAL.str = string(yyDollar[1].str) + } + case 509: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2876 +//line sql.y:2880 { yyVAL.str = "" } - case 510: + case 511: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2882 +//line sql.y:2886 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 511: + case 512: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2886 +//line sql.y:2890 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 512: + case 513: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColName -//line sql.y:2891 +//line sql.y:2895 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 513: + case 514: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColName -//line sql.y:2895 +//line sql.y:2899 { yyLOCAL = yyDollar[2].colNameUnion() } yyVAL.union = yyLOCAL - case 514: + case 515: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2900 +//line sql.y:2904 { yyVAL.str = "" } - case 515: + case 516: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2904 +//line sql.y:2908 { yyVAL.str = string(yyDollar[2].str) } - case 516: + case 517: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Literal -//line sql.y:2909 +//line sql.y:2913 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 517: + case 518: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2913 +//line sql.y:2917 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 518: + case 519: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2917 +//line sql.y:2921 { yyLOCAL = NewDecimalLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 519: + case 520: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2922 +//line sql.y:2926 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 520: + case 521: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2926 +//line sql.y:2930 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL - case 521: + case 522: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2930 +//line sql.y:2934 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &OrderByOption{Cols: yyDollar[5].columnsUnion()}) } - case 522: + case 523: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2934 +//line sql.y:2938 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL - case 523: + case 524: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2938 +//line sql.y:2942 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionsUnion()...) } - case 524: + case 525: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2942 +//line sql.y:2946 { yyLOCAL = append(append(yyDollar[1].alterOptionsUnion(), yyDollar[3].alterOptionsUnion()...), &OrderByOption{Cols: yyDollar[7].columnsUnion()}) } yyVAL.union = yyLOCAL - case 525: + case 526: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2948 +//line sql.y:2952 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 526: - yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2952 - { - yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) - *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) - } case 527: yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2956 @@ -12500,19 +12546,18 @@ yydefault: *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } case 528: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL AlterOption -//line sql.y:2962 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:2960 { - yyLOCAL = yyDollar[1].tableOptionsUnion() + yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) + *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - yyVAL.union = yyLOCAL case 529: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption //line sql.y:2966 { - yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} + yyLOCAL = yyDollar[1].tableOptionsUnion() } yyVAL.union = yyLOCAL case 530: @@ -12528,15 +12573,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2974 { - yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} + yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } yyVAL.union = yyLOCAL case 532: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption //line sql.y:2978 { - yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} + yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} } yyVAL.union = yyLOCAL case 533: @@ -12544,7 +12589,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2982 { - 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 534: @@ -12552,49 +12597,49 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2986 { - 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 535: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption //line sql.y:2990 { - yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion()} + yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} } yyVAL.union = yyLOCAL case 536: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption //line sql.y:2994 { - 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 537: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL AlterOption //line sql.y:2998 { - 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 538: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3003 +//line sql.y:3002 { - val := true + val := false yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: &val} } yyVAL.union = yyLOCAL case 539: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3008 +//line sql.y:3007 { - yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} + val := true + yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: &val} } yyVAL.union = yyLOCAL case 540: @@ -12602,7 +12647,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3012 { - yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} + yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL case 541: @@ -12610,23 +12655,23 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3016 { - yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: true} + yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} } yyVAL.union = yyLOCAL case 542: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption //line sql.y:3020 { - 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 543: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption //line sql.y:3024 { - 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 544: @@ -12634,7 +12679,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3028 { - 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 545: @@ -12642,15 +12687,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3032 { - yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} + yyLOCAL = &RenameColumn{OldName: yyDollar[3].colNameUnion(), NewName: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL case 546: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption //line sql.y:3036 { - yyLOCAL = &KeyState{Enable: false} + yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} } yyVAL.union = yyLOCAL case 547: @@ -12658,7 +12703,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3040 { - yyLOCAL = &KeyState{Enable: true} + yyLOCAL = &KeyState{Enable: false} } yyVAL.union = yyLOCAL case 548: @@ -12666,7 +12711,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3044 { - yyLOCAL = &TablespaceOperation{Import: false} + yyLOCAL = &KeyState{Enable: true} } yyVAL.union = yyLOCAL case 549: @@ -12674,15 +12719,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3048 { - yyLOCAL = &TablespaceOperation{Import: true} + yyLOCAL = &TablespaceOperation{Import: false} } yyVAL.union = yyLOCAL case 550: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption //line sql.y:3052 { - yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} + yyLOCAL = &TablespaceOperation{Import: true} } yyVAL.union = yyLOCAL case 551: @@ -12690,7 +12735,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3056 { - yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} + yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL case 552: @@ -12698,23 +12743,23 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3060 { - yyLOCAL = &DropKey{Type: PrimaryKeyType} + yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL case 553: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:3064 { - yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} + yyLOCAL = &DropKey{Type: PrimaryKeyType} } yyVAL.union = yyLOCAL case 554: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption //line sql.y:3068 { - yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} + yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL case 555: @@ -12726,52 +12771,52 @@ yydefault: } yyVAL.union = yyLOCAL case 556: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:3076 { - yyLOCAL = &Force{} + yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL case 557: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption //line sql.y:3080 { - yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} + yyLOCAL = &Force{} } yyVAL.union = yyLOCAL case 558: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:3084 { - yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} + yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL case 559: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL []AlterOption -//line sql.y:3090 + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL AlterOption +//line sql.y:3088 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} + yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL case 560: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL []AlterOption //line sql.y:3094 { - yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) - *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } + yyVAL.union = yyLOCAL case 561: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL AlterOption -//line sql.y:3100 +//line sql.y:3098 { - yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) + yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) + *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - yyVAL.union = yyLOCAL case 562: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption @@ -12801,7 +12846,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3116 { - yyLOCAL = &LockOption{Type: DefaultType} + yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL case 566: @@ -12809,7 +12854,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3120 { - yyLOCAL = &LockOption{Type: NoneType} + yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL case 567: @@ -12817,7 +12862,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3124 { - yyLOCAL = &LockOption{Type: SharedType} + yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL case 568: @@ -12825,15 +12870,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3128 { - yyLOCAL = &LockOption{Type: ExclusiveType} + yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL case 569: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:3132 { - yyLOCAL = &Validation{With: true} + yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL case 570: @@ -12841,13 +12886,21 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3136 { - yyLOCAL = &Validation{With: false} + yyLOCAL = &Validation{With: true} } yyVAL.union = yyLOCAL case 571: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL AlterOption +//line sql.y:3140 + { + yyLOCAL = &Validation{With: false} + } + yyVAL.union = yyLOCAL + case 572: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3142 +//line sql.y:3146 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12855,10 +12908,10 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 572: + case 573: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3149 +//line sql.y:3153 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12866,10 +12919,10 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 573: + case 574: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3156 +//line sql.y:3160 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12877,28 +12930,28 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 574: + case 575: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3163 +//line sql.y:3167 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().PartitionSpec = yyDollar[2].partSpecUnion() yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 575: + case 576: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:3169 +//line sql.y:3173 { 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 576: + case 577: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3179 +//line sql.y:3183 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -12906,10 +12959,10 @@ yydefault: yyLOCAL = yyDollar[1].alterDatabaseUnion() } yyVAL.union = yyLOCAL - case 577: + case 578: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3186 +//line sql.y:3190 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -12917,10 +12970,10 @@ yydefault: yyLOCAL = yyDollar[1].alterDatabaseUnion() } yyVAL.union = yyLOCAL - case 578: + case 579: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3193 +//line sql.y:3197 { yyLOCAL = &AlterVschema{ Action: CreateVindexDDLAction, @@ -12933,10 +12986,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 579: + case 580: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3205 +//line sql.y:3209 { yyLOCAL = &AlterVschema{ Action: DropVindexDDLAction, @@ -12947,26 +13000,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 580: + case 581: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3215 +//line sql.y:3219 { yyLOCAL = &AlterVschema{Action: AddVschemaTableDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 581: + case 582: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3219 +//line sql.y:3223 { yyLOCAL = &AlterVschema{Action: DropVschemaTableDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 582: + case 583: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL Statement -//line sql.y:3223 +//line sql.y:3227 { yyLOCAL = &AlterVschema{ Action: AddColVindexDDLAction, @@ -12980,10 +13033,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 583: + case 584: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3236 +//line sql.y:3240 { yyLOCAL = &AlterVschema{ Action: DropColVindexDDLAction, @@ -12994,18 +13047,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 584: + case 585: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3246 +//line sql.y:3250 { yyLOCAL = &AlterVschema{Action: AddSequenceDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 585: + case 586: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:3250 +//line sql.y:3254 { yyLOCAL = &AlterVschema{ Action: AddAutoIncDDLAction, @@ -13017,10 +13070,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 586: + case 587: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3261 +//line sql.y:3265 { yyLOCAL = &AlterMigration{ Type: RetryMigrationType, @@ -13028,10 +13081,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 587: + case 588: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3268 +//line sql.y:3272 { yyLOCAL = &AlterMigration{ Type: CleanupMigrationType, @@ -13039,10 +13092,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 588: + case 589: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3275 +//line sql.y:3279 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -13050,10 +13103,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 589: + case 590: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3282 +//line sql.y:3286 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -13062,20 +13115,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 590: + case 591: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3290 +//line sql.y:3294 { yyLOCAL = &AlterMigration{ Type: LaunchAllMigrationType, } } yyVAL.union = yyLOCAL - case 591: + case 592: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3296 +//line sql.y:3300 { yyLOCAL = &AlterMigration{ Type: CompleteMigrationType, @@ -13083,20 +13136,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 592: + case 593: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3303 +//line sql.y:3307 { yyLOCAL = &AlterMigration{ Type: CompleteAllMigrationType, } } yyVAL.union = yyLOCAL - case 593: + case 594: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3309 +//line sql.y:3313 { yyLOCAL = &AlterMigration{ Type: CancelMigrationType, @@ -13104,20 +13157,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 594: + case 595: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3316 +//line sql.y:3320 { yyLOCAL = &AlterMigration{ Type: CancelAllMigrationType, } } yyVAL.union = yyLOCAL - case 595: + case 596: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3322 +//line sql.y:3326 { yyLOCAL = &AlterMigration{ Type: ThrottleMigrationType, @@ -13127,10 +13180,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 596: + case 597: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3331 +//line sql.y:3335 { yyLOCAL = &AlterMigration{ Type: ThrottleAllMigrationType, @@ -13139,10 +13192,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 597: + case 598: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3339 +//line sql.y:3343 { yyLOCAL = &AlterMigration{ Type: UnthrottleMigrationType, @@ -13150,28 +13203,28 @@ yydefault: } } yyVAL.union = yyLOCAL - case 598: + case 599: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3346 +//line sql.y:3350 { yyLOCAL = &AlterMigration{ Type: UnthrottleAllMigrationType, } } yyVAL.union = yyLOCAL - case 599: + case 600: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3353 +//line sql.y:3357 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 600: + case 601: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3357 +//line sql.y:3361 { yyDollar[3].partitionOptionUnion().Partitions = yyDollar[4].integerUnion() yyDollar[3].partitionOptionUnion().SubPartition = yyDollar[5].subPartitionUnion() @@ -13179,10 +13232,10 @@ yydefault: yyLOCAL = yyDollar[3].partitionOptionUnion() } yyVAL.union = yyLOCAL - case 601: + case 602: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3366 +//line sql.y:3370 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -13191,10 +13244,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 602: + case 603: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3374 +//line sql.y:3378 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -13204,10 +13257,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 603: + case 604: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3383 +//line sql.y:3387 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -13215,10 +13268,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 604: + case 605: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3390 +//line sql.y:3394 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -13226,18 +13279,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 605: + case 606: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3398 +//line sql.y:3402 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 606: + case 607: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3402 +//line sql.y:3406 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -13247,10 +13300,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 607: + case 608: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3411 +//line sql.y:3415 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -13261,292 +13314,284 @@ yydefault: } } yyVAL.union = yyLOCAL - case 608: + case 609: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3422 +//line sql.y:3426 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 609: + case 610: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3426 +//line sql.y:3430 { yyLOCAL = yyDollar[2].partDefsUnion() } yyVAL.union = yyLOCAL - case 610: + case 611: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3431 +//line sql.y:3435 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 611: + case 612: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3435 +//line sql.y:3439 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 612: + case 613: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3440 +//line sql.y:3444 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 613: + case 614: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3444 +//line sql.y:3448 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 614: + case 615: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL TableExpr -//line sql.y:3450 +//line sql.y:3454 { yyLOCAL = &JSONTableExpr{Expr: yyDollar[3].exprUnion(), Filter: yyDollar[5].exprUnion(), Columns: yyDollar[6].jtColumnListUnion(), Alias: yyDollar[8].identifierCS} } yyVAL.union = yyLOCAL - case 615: + case 616: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3456 +//line sql.y:3460 { yyLOCAL = yyDollar[3].jtColumnListUnion() } yyVAL.union = yyLOCAL - case 616: + case 617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3462 +//line sql.y:3466 { yyLOCAL = []*JtColumnDefinition{yyDollar[1].jtColumnDefinitionUnion()} } yyVAL.union = yyLOCAL - case 617: + case 618: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3466 +//line sql.y:3470 { yySLICE := (*[]*JtColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jtColumnDefinitionUnion()) } - case 618: + case 619: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3472 +//line sql.y:3476 { yyLOCAL = &JtColumnDefinition{JtOrdinal: &JtOrdinalColDef{Name: yyDollar[1].identifierCI}} } yyVAL.union = yyLOCAL - case 619: + case 620: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3476 +//line sql.y:3480 { 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 620: + case 621: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3482 +//line sql.y:3486 { 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 621: + case 622: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3488 +//line sql.y:3492 { 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 622: + case 623: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3494 +//line sql.y:3498 { 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 623: + case 624: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3500 +//line sql.y:3504 { jtNestedPath := &JtNestedPathColDef{Path: yyDollar[3].exprUnion(), Columns: yyDollar[4].jtColumnListUnion()} yyLOCAL = &JtColumnDefinition{JtNestedPath: jtNestedPath} } yyVAL.union = yyLOCAL - case 624: + case 625: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3506 +//line sql.y:3510 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 625: + case 626: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3510 +//line sql.y:3514 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 626: + case 627: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3514 +//line sql.y:3518 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 627: + case 628: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3518 +//line sql.y:3522 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 628: + case 629: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3524 +//line sql.y:3528 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 629: + case 630: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3530 +//line sql.y:3534 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 630: + case 631: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3536 +//line sql.y:3540 { yyLOCAL = &JtOnResponse{ResponseType: ErrorJSONType} } yyVAL.union = yyLOCAL - case 631: + case 632: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3540 +//line sql.y:3544 { yyLOCAL = &JtOnResponse{ResponseType: NullJSONType} } yyVAL.union = yyLOCAL - case 632: + case 633: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3544 +//line sql.y:3548 { yyLOCAL = &JtOnResponse{ResponseType: DefaultJSONType, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 633: + case 634: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3550 +//line sql.y:3554 { yyLOCAL = RangeType } yyVAL.union = yyLOCAL - case 634: + case 635: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3554 +//line sql.y:3558 { yyLOCAL = ListType } yyVAL.union = yyLOCAL - case 635: + case 636: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3559 +//line sql.y:3563 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 636: + case 637: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3563 +//line sql.y:3567 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 637: + case 638: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3568 +//line sql.y:3572 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 638: + case 639: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3572 +//line sql.y:3576 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 639: - yyDollar = yyS[yypt-5 : yypt+1] - var yyLOCAL *PartitionSpec -//line sql.y:3578 - { - yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} - } - yyVAL.union = yyLOCAL case 640: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3582 { - yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} } yyVAL.union = yyLOCAL case 641: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3586 { - yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} + yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 642: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3590 { - yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} } yyVAL.union = yyLOCAL case 643: @@ -13554,7 +13599,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3594 { - yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 644: @@ -13562,7 +13607,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3598 { - yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} } yyVAL.union = yyLOCAL case 645: @@ -13570,15 +13615,15 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3602 { - yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 646: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3606 { - yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} } yyVAL.union = yyLOCAL case 647: @@ -13586,7 +13631,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3610 { - yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 648: @@ -13594,23 +13639,23 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3614 { - yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} + yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} } yyVAL.union = yyLOCAL case 649: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3618 { - 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 650: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3622 { - 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 651: @@ -13618,7 +13663,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3626 { - yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 652: @@ -13626,7 +13671,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3630 { - yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} } yyVAL.union = yyLOCAL case 653: @@ -13634,7 +13679,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3634 { - yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 654: @@ -13642,7 +13687,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3638 { - yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} } yyVAL.union = yyLOCAL case 655: @@ -13650,7 +13695,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3642 { - yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 656: @@ -13658,7 +13703,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3646 { - yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} } yyVAL.union = yyLOCAL case 657: @@ -13666,7 +13711,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3650 { - yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 658: @@ -13674,7 +13719,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3654 { - yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} } yyVAL.union = yyLOCAL case 659: @@ -13682,27 +13727,27 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3658 { - yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 660: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3662 { - yyLOCAL = &PartitionSpec{Action: UpgradeAction} + yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} } yyVAL.union = yyLOCAL case 661: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL bool -//line sql.y:3667 + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionSpec +//line sql.y:3666 { - yyLOCAL = false + yyLOCAL = &PartitionSpec{Action: UpgradeAction} } yyVAL.union = yyLOCAL case 662: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool //line sql.y:3671 { @@ -13714,229 +13759,237 @@ yydefault: var yyLOCAL bool //line sql.y:3675 { - yyLOCAL = true + yyLOCAL = false } yyVAL.union = yyLOCAL case 664: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL bool +//line sql.y:3679 + { + yyLOCAL = true + } + yyVAL.union = yyLOCAL + case 665: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3681 +//line sql.y:3685 { yyLOCAL = []*PartitionDefinition{yyDollar[1].partDefUnion()} } yyVAL.union = yyLOCAL - case 665: + case 666: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3685 +//line sql.y:3689 { yySLICE := (*[]*PartitionDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].partDefUnion()) } - case 666: + case 667: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3691 +//line sql.y:3695 { yyVAL.partDefUnion().Options = yyDollar[2].partitionDefinitionOptionsUnion() } - case 667: + case 668: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3696 +//line sql.y:3700 { yyLOCAL = &PartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 668: + case 669: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3700 +//line sql.y:3704 { yyDollar[1].partitionDefinitionOptionsUnion().ValueRange = yyDollar[2].partitionValueRangeUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 669: + case 670: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3705 +//line sql.y:3709 { yyDollar[1].partitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 670: + case 671: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3710 +//line sql.y:3714 { yyDollar[1].partitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 671: + case 672: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3715 +//line sql.y:3719 { yyDollar[1].partitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 672: + case 673: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3720 +//line sql.y:3724 { yyDollar[1].partitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 673: + case 674: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3725 +//line sql.y:3729 { val := yyDollar[2].integerUnion() yyDollar[1].partitionDefinitionOptionsUnion().MaxRows = &val yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 674: + case 675: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3731 +//line sql.y:3735 { val := yyDollar[2].integerUnion() yyDollar[1].partitionDefinitionOptionsUnion().MinRows = &val yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 675: + case 676: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3737 +//line sql.y:3741 { yyDollar[1].partitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 676: + case 677: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3742 +//line sql.y:3746 { yyDollar[1].partitionDefinitionOptionsUnion().SubPartitionDefinitions = yyDollar[2].subPartitionDefinitionsUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 677: + case 678: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3748 +//line sql.y:3752 { yyLOCAL = yyDollar[2].subPartitionDefinitionsUnion() } yyVAL.union = yyLOCAL - case 678: + case 679: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3754 +//line sql.y:3758 { yyLOCAL = SubPartitionDefinitions{yyDollar[1].subPartitionDefinitionUnion()} } yyVAL.union = yyLOCAL - case 679: + case 680: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3758 +//line sql.y:3762 { yySLICE := (*SubPartitionDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].subPartitionDefinitionUnion()) } - case 680: + case 681: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SubPartitionDefinition -//line sql.y:3764 +//line sql.y:3768 { yyLOCAL = &SubPartitionDefinition{Name: yyDollar[2].identifierCI, Options: yyDollar[3].subPartitionDefinitionOptionsUnion()} } yyVAL.union = yyLOCAL - case 681: + case 682: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3769 +//line sql.y:3773 { yyLOCAL = &SubPartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 682: + case 683: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3773 +//line sql.y:3777 { yyDollar[1].subPartitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 683: + case 684: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3778 +//line sql.y:3782 { yyDollar[1].subPartitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 684: + case 685: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3783 +//line sql.y:3787 { yyDollar[1].subPartitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 685: + case 686: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3788 +//line sql.y:3792 { yyDollar[1].subPartitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 686: + case 687: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3793 +//line sql.y:3797 { val := yyDollar[2].integerUnion() yyDollar[1].subPartitionDefinitionOptionsUnion().MaxRows = &val yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 687: + case 688: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3799 +//line sql.y:3803 { val := yyDollar[2].integerUnion() yyDollar[1].subPartitionDefinitionOptionsUnion().MinRows = &val yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 688: + case 689: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3805 +//line sql.y:3809 { yyDollar[1].subPartitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 689: + case 690: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3812 +//line sql.y:3816 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -13944,10 +13997,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 690: + case 691: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3819 +//line sql.y:3823 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -13955,10 +14008,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 691: + case 692: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3826 +//line sql.y:3830 { yyLOCAL = &PartitionValueRange{ Type: InType, @@ -13966,131 +14019,131 @@ yydefault: } } yyVAL.union = yyLOCAL - case 692: + case 693: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3834 +//line sql.y:3838 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 693: + case 694: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3838 +//line sql.y:3842 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 694: + case 695: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionEngine -//line sql.y:3844 +//line sql.y:3848 { yyLOCAL = &PartitionEngine{Storage: yyDollar[1].booleanUnion(), Name: yyDollar[4].identifierCS.String()} } yyVAL.union = yyLOCAL - case 695: + case 696: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Literal -//line sql.y:3850 +//line sql.y:3854 { yyLOCAL = NewStrLiteral(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 696: + case 697: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3856 +//line sql.y:3860 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 697: + case 698: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3862 +//line sql.y:3866 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 698: + case 699: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3868 +//line sql.y:3872 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 699: + case 700: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3874 +//line sql.y:3878 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 700: + case 701: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3880 +//line sql.y:3884 { yyVAL.str = yyDollar[3].identifierCS.String() } - case 701: + case 702: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinition -//line sql.y:3886 +//line sql.y:3890 { yyLOCAL = &PartitionDefinition{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 702: + case 703: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3892 +//line sql.y:3896 { yyVAL.str = "" } - case 703: + case 704: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3896 +//line sql.y:3900 { yyVAL.str = "" } - case 704: + case 705: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3902 +//line sql.y:3906 { yyLOCAL = &RenameTable{TablePairs: yyDollar[3].renameTablePairsUnion()} } yyVAL.union = yyLOCAL - case 705: + case 706: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*RenameTablePair -//line sql.y:3908 +//line sql.y:3912 { yyLOCAL = []*RenameTablePair{{FromTable: yyDollar[1].tableName, ToTable: yyDollar[3].tableName}} } yyVAL.union = yyLOCAL - case 706: + case 707: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3912 +//line sql.y:3916 { yySLICE := (*[]*RenameTablePair)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &RenameTablePair{FromTable: yyDollar[3].tableName, ToTable: yyDollar[5].tableName}) } - case 707: + case 708: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3918 +//line sql.y:3922 { yyLOCAL = &DropTable{FromTables: yyDollar[6].tableNamesUnion(), IfExists: yyDollar[5].booleanUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Temp: yyDollar[3].booleanUnion()} } yyVAL.union = yyLOCAL - case 708: + case 709: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3922 +//line sql.y:3926 { // Change this to an alter statement if yyDollar[4].identifierCI.Lowered() == "primary" { @@ -14100,52 +14153,44 @@ yydefault: } } yyVAL.union = yyLOCAL - case 709: + case 710: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3931 +//line sql.y:3935 { yyLOCAL = &DropView{FromTables: yyDollar[5].tableNamesUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 710: + case 711: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3935 +//line sql.y:3939 { yyLOCAL = &DropDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 711: + case 712: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3941 +//line sql.y:3945 { yyLOCAL = &TruncateTable{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 712: + case 713: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3945 +//line sql.y:3949 { yyLOCAL = &TruncateTable{Table: yyDollar[2].tableName} } yyVAL.union = yyLOCAL - case 713: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL Statement -//line sql.y:3951 - { - yyLOCAL = &OtherRead{} - } - yyVAL.union = yyLOCAL case 714: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3957 +//line sql.y:3955 { - yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &OtherRead{} } yyVAL.union = yyLOCAL case 715: @@ -14153,23 +14198,23 @@ yydefault: var yyLOCAL Statement //line sql.y:3961 { - yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 716: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:3965 { - 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 717: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement //line sql.y:3969 { - 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 718: @@ -14185,7 +14230,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3977 { - yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 720: @@ -14197,43 +14242,43 @@ yydefault: } yyVAL.union = yyLOCAL case 721: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:3985 { - yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 722: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:3989 { - 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 723: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement //line sql.y:3993 { - 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 724: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:3997 { - yyLOCAL = &Show{&ShowBasic{Command: Privilege}} + yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL case 725: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:4001 { - yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Privilege}} } yyVAL.union = yyLOCAL case 726: @@ -14241,7 +14286,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4005 { - yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 727: @@ -14249,7 +14294,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4009 { - yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 728: @@ -14257,7 +14302,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4013 { - yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 729: @@ -14265,15 +14310,15 @@ yydefault: var yyLOCAL Statement //line sql.y:4017 { - yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 730: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4021 { - 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 731: @@ -14281,15 +14326,15 @@ yydefault: var yyLOCAL Statement //line sql.y:4025 { - 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 732: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:4029 { - 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 733: @@ -14297,7 +14342,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4033 { - 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 734: @@ -14305,7 +14350,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4037 { - yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 735: @@ -14313,7 +14358,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4041 { - yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 736: @@ -14321,7 +14366,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4045 { - yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 737: @@ -14329,7 +14374,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4049 { - yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 738: @@ -14337,7 +14382,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4053 { - yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 739: @@ -14345,15 +14390,15 @@ yydefault: var yyLOCAL Statement //line sql.y:4057 { - yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 740: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4061 { - yyLOCAL = &Show{&ShowBasic{Command: Engines}} + yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 741: @@ -14361,15 +14406,15 @@ yydefault: var yyLOCAL Statement //line sql.y:4065 { - yyLOCAL = &Show{&ShowBasic{Command: Plugins}} + yyLOCAL = &Show{&ShowBasic{Command: Engines}} } yyVAL.union = yyLOCAL case 742: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:4069 { - yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} + yyLOCAL = &Show{&ShowBasic{Command: Plugins}} } yyVAL.union = yyLOCAL case 743: @@ -14377,7 +14422,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4073 { - yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} + yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL case 744: @@ -14385,7 +14430,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4077 { - yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL case 745: @@ -14393,7 +14438,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4081 { - 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 746: @@ -14401,23 +14446,23 @@ yydefault: var yyLOCAL Statement //line sql.y:4085 { - yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} + yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL case 747: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4089 { - yyLOCAL = &ShowThrottledApps{} + yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL case 748: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:4093 { - yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &ShowThrottledApps{} } yyVAL.union = yyLOCAL case 749: @@ -14425,7 +14470,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4097 { - yyLOCAL = &ShowThrottlerStatus{} + yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 750: @@ -14433,7 +14478,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4101 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} + yyLOCAL = &ShowThrottlerStatus{} } yyVAL.union = yyLOCAL case 751: @@ -14441,31 +14486,31 @@ yydefault: var yyLOCAL Statement //line sql.y:4105 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} } yyVAL.union = yyLOCAL case 752: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4109 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} } yyVAL.union = yyLOCAL case 753: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:4113 { - yyLOCAL = &Show{&ShowBasic{Command: Warnings}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} } yyVAL.union = yyLOCAL case 754: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:4117 { - yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Warnings}} } yyVAL.union = yyLOCAL case 755: @@ -14473,31 +14518,31 @@ yydefault: var yyLOCAL Statement //line sql.y:4121 { - yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 756: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4125 { - yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} + yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 757: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4132 +//line sql.y:4129 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} + yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} } yyVAL.union = yyLOCAL case 758: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4136 { - 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 759: @@ -14505,7 +14550,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4140 { - 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 760: @@ -14513,23 +14558,23 @@ yydefault: var yyLOCAL Statement //line sql.y:4144 { - 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 761: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4148 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 762: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4152 { - 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 763: @@ -14541,55 +14586,57 @@ yydefault: } yyVAL.union = yyLOCAL case 764: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4160 { - 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 765: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:4164 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 766: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL Statement +//line sql.y:4168 + { + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + } + yyVAL.union = yyLOCAL + case 767: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4170 +//line sql.y:4174 { yyVAL.str = "" } - case 767: + case 768: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4174 +//line sql.y:4178 { yyVAL.str = "extended " } - case 768: + case 769: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4180 +//line sql.y:4184 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 769: + case 770: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4184 +//line sql.y:4188 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 770: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4190 - { - yyVAL.str = string(yyDollar[1].str) - } case 771: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4194 @@ -14597,16 +14644,16 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 772: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4200 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4198 { - yyVAL.identifierCS = NewIdentifierCS("") + yyVAL.str = string(yyDollar[1].str) } case 773: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:4204 { - yyVAL.identifierCS = yyDollar[2].identifierCS + yyVAL.identifierCS = NewIdentifierCS("") } case 774: yyDollar = yyS[yypt-2 : yypt+1] @@ -14615,53 +14662,53 @@ yydefault: yyVAL.identifierCS = yyDollar[2].identifierCS } case 775: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:4212 + { + yyVAL.identifierCS = yyDollar[2].identifierCS + } + case 776: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4214 +//line sql.y:4218 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 776: + case 777: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4218 +//line sql.y:4222 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 777: + case 778: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4222 +//line sql.y:4226 { yyLOCAL = &ShowFilter{Filter: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 778: + case 779: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4228 +//line sql.y:4232 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 779: + case 780: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4232 +//line sql.y:4236 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 780: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4238 - { - yyVAL.empty = struct{}{} - } case 781: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:4242 { yyVAL.empty = struct{}{} @@ -14674,9 +14721,9 @@ yydefault: } case 783: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4252 +//line sql.y:4250 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.empty = struct{}{} } case 784: yyDollar = yyS[yypt-1 : yypt+1] @@ -14685,202 +14732,200 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 785: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4260 + { + yyVAL.str = string(yyDollar[1].str) + } + case 786: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4262 +//line sql.y:4266 { yyLOCAL = &Use{DBName: yyDollar[2].identifierCS} } yyVAL.union = yyLOCAL - case 786: + case 787: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4266 +//line sql.y:4270 { yyLOCAL = &Use{DBName: IdentifierCS{v: ""}} } yyVAL.union = yyLOCAL - case 787: + case 788: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4270 +//line sql.y:4274 { yyLOCAL = &Use{DBName: NewIdentifierCS(yyDollar[2].identifierCS.String() + "@" + string(yyDollar[3].str))} } yyVAL.union = yyLOCAL - case 788: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4277 - { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) - } case 789: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4281 { - yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 790: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4285 { - yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) } case 791: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4289 { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) } case 792: yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4293 + { + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + } + case 793: + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4296 +//line sql.y:4300 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 793: + case 794: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4300 +//line sql.y:4304 { yyLOCAL = &Begin{TxAccessModes: yyDollar[3].txAccessModesUnion()} } yyVAL.union = yyLOCAL - case 794: + case 795: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4305 +//line sql.y:4309 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 795: + case 796: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4309 +//line sql.y:4313 { yyLOCAL = yyDollar[1].txAccessModesUnion() } yyVAL.union = yyLOCAL - case 796: + case 797: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4315 +//line sql.y:4319 { yyLOCAL = []TxAccessMode{yyDollar[1].txAccessModeUnion()} } yyVAL.union = yyLOCAL - case 797: + case 798: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4319 +//line sql.y:4323 { yySLICE := (*[]TxAccessMode)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].txAccessModeUnion()) } - case 798: + case 799: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4325 +//line sql.y:4329 { yyLOCAL = WithConsistentSnapshot } yyVAL.union = yyLOCAL - case 799: + case 800: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4329 +//line sql.y:4333 { yyLOCAL = ReadWrite } yyVAL.union = yyLOCAL - case 800: + case 801: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4333 +//line sql.y:4337 { yyLOCAL = ReadOnly } yyVAL.union = yyLOCAL - case 801: + case 802: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4340 +//line sql.y:4344 { yyLOCAL = &Commit{} } yyVAL.union = yyLOCAL - case 802: + case 803: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4346 +//line sql.y:4350 { yyLOCAL = &Rollback{} } yyVAL.union = yyLOCAL - case 803: + case 804: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4350 +//line sql.y:4354 { yyLOCAL = &SRollback{Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 804: + case 805: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4355 +//line sql.y:4359 { yyVAL.empty = struct{}{} } - case 805: + case 806: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4357 +//line sql.y:4361 { yyVAL.empty = struct{}{} } - case 806: + case 807: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4360 +//line sql.y:4364 { yyVAL.empty = struct{}{} } - case 807: + case 808: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4362 +//line sql.y:4366 { yyVAL.empty = struct{}{} } - case 808: + case 809: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4366 +//line sql.y:4370 { yyLOCAL = &Savepoint{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 809: + case 810: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4372 +//line sql.y:4376 { yyLOCAL = &Release{Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 810: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL ExplainType -//line sql.y:4377 - { - yyLOCAL = EmptyType - } - yyVAL.union = yyLOCAL case 811: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL ExplainType //line sql.y:4381 { - yyLOCAL = JSONType + yyLOCAL = EmptyType } yyVAL.union = yyLOCAL case 812: @@ -14888,7 +14933,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4385 { - yyLOCAL = TreeType + yyLOCAL = JSONType } yyVAL.union = yyLOCAL case 813: @@ -14896,7 +14941,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4389 { - yyLOCAL = VitessType + yyLOCAL = TreeType } yyVAL.union = yyLOCAL case 814: @@ -14904,7 +14949,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4393 { - yyLOCAL = VTExplainType + yyLOCAL = VitessType } yyVAL.union = yyLOCAL case 815: @@ -14912,27 +14957,27 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4397 { - yyLOCAL = TraditionalType + yyLOCAL = VTExplainType } yyVAL.union = yyLOCAL case 816: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType //line sql.y:4401 { - yyLOCAL = AnalyzeType + yyLOCAL = TraditionalType } yyVAL.union = yyLOCAL case 817: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL VExplainType -//line sql.y:4406 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ExplainType +//line sql.y:4405 { - yyLOCAL = PlanVExplainType + yyLOCAL = AnalyzeType } yyVAL.union = yyLOCAL case 818: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL VExplainType //line sql.y:4410 { @@ -14944,7 +14989,7 @@ yydefault: var yyLOCAL VExplainType //line sql.y:4414 { - yyLOCAL = AllVExplainType + yyLOCAL = PlanVExplainType } yyVAL.union = yyLOCAL case 820: @@ -14952,15 +14997,17 @@ yydefault: var yyLOCAL VExplainType //line sql.y:4418 { - yyLOCAL = QueriesVExplainType + yyLOCAL = AllVExplainType } yyVAL.union = yyLOCAL case 821: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4424 + var yyLOCAL VExplainType +//line sql.y:4422 { - yyVAL.str = yyDollar[1].str + yyLOCAL = QueriesVExplainType } + yyVAL.union = yyLOCAL case 822: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4428 @@ -14975,18 +15022,16 @@ yydefault: } case 824: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL Statement -//line sql.y:4438 +//line sql.y:4436 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyVAL.str = yyDollar[1].str } - yyVAL.union = yyLOCAL case 825: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement //line sql.y:4442 { - yyLOCAL = yyDollar[1].statementUnion() + yyLOCAL = yyDollar[1].selStmtUnion() } yyVAL.union = yyLOCAL case 826: @@ -15006,208 +15051,210 @@ yydefault: } yyVAL.union = yyLOCAL case 828: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4455 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Statement +//line sql.y:4454 { - yyVAL.str = "" + yyLOCAL = yyDollar[1].statementUnion() } + yyVAL.union = yyLOCAL case 829: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:4459 { - yyVAL.str = yyDollar[1].identifierCI.val + yyVAL.str = "" } case 830: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4463 { - yyVAL.str = encodeSQLString(yyDollar[1].str) + yyVAL.str = yyDollar[1].identifierCI.val } case 831: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4467 + { + yyVAL.str = encodeSQLString(yyDollar[1].str) + } + case 832: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4469 +//line sql.y:4473 { yyLOCAL = &ExplainTab{Table: yyDollar[3].tableName, Wild: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 832: + case 833: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4473 +//line sql.y:4477 { yyLOCAL = &ExplainStmt{Type: yyDollar[3].explainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 833: + case 834: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4479 +//line sql.y:4483 { yyLOCAL = &VExplainStmt{Type: yyDollar[3].vexplainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 834: + case 835: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4485 +//line sql.y:4489 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 835: + case 836: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4489 +//line sql.y:4493 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 836: + case 837: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4495 +//line sql.y:4499 { yyLOCAL = &LockTables{Tables: yyDollar[3].tableAndLockTypesUnion()} } yyVAL.union = yyLOCAL - case 837: + case 838: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableAndLockTypes -//line sql.y:4501 +//line sql.y:4505 { yyLOCAL = TableAndLockTypes{yyDollar[1].tableAndLockTypeUnion()} } yyVAL.union = yyLOCAL - case 838: + case 839: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4505 +//line sql.y:4509 { yySLICE := (*TableAndLockTypes)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableAndLockTypeUnion()) } - case 839: + case 840: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *TableAndLockType -//line sql.y:4511 +//line sql.y:4515 { yyLOCAL = &TableAndLockType{Table: yyDollar[1].aliasedTableNameUnion(), Lock: yyDollar[2].lockTypeUnion()} } yyVAL.union = yyLOCAL - case 840: + case 841: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4517 +//line sql.y:4521 { yyLOCAL = Read } yyVAL.union = yyLOCAL - case 841: + case 842: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4521 +//line sql.y:4525 { yyLOCAL = ReadLocal } yyVAL.union = yyLOCAL - case 842: + case 843: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4525 +//line sql.y:4529 { yyLOCAL = Write } yyVAL.union = yyLOCAL - case 843: + case 844: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4529 +//line sql.y:4533 { yyLOCAL = LowPriorityWrite } yyVAL.union = yyLOCAL - case 844: + case 845: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4535 +//line sql.y:4539 { yyLOCAL = &UnlockTables{} } yyVAL.union = yyLOCAL - case 845: + case 846: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4541 +//line sql.y:4545 { yyLOCAL = &RevertMigration{Comments: Comments(yyDollar[2].strs).Parsed(), UUID: string(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 846: + case 847: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4547 +//line sql.y:4551 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), FlushOptions: yyDollar[3].strs} } yyVAL.union = yyLOCAL - case 847: + case 848: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4551 +//line sql.y:4555 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion()} } yyVAL.union = yyLOCAL - case 848: + case 849: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4555 +//line sql.y:4559 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 849: + case 850: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4559 +//line sql.y:4563 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL - case 850: + case 851: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4563 +//line sql.y:4567 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 851: + case 852: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4567 +//line sql.y:4571 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), ForExport: true} } yyVAL.union = yyLOCAL - case 852: + case 853: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4573 +//line sql.y:4577 { yyVAL.strs = []string{yyDollar[1].str} } - case 853: + case 854: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4577 +//line sql.y:4581 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } - case 854: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4583 - { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) - } case 855: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4587 @@ -15227,10 +15274,10 @@ yydefault: yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 858: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4599 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 859: yyDollar = yyS[yypt-1 : yypt+1] @@ -15245,22 +15292,22 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 861: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4611 { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str + yyVAL.str = string(yyDollar[1].str) } case 862: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:4615 { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str } case 863: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4619 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 864: yyDollar = yyS[yypt-1 : yypt+1] @@ -15275,144 +15322,150 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 866: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4631 + { + yyVAL.str = string(yyDollar[1].str) + } + case 867: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4632 +//line sql.y:4636 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 867: + case 868: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4636 +//line sql.y:4640 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 868: + case 869: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4640 +//line sql.y:4644 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 869: + case 870: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4645 +//line sql.y:4649 { yyVAL.str = "" } - case 870: + case 871: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4649 +//line sql.y:4653 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String() } - case 871: + case 872: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4654 +//line sql.y:4658 { setAllowComments(yylex, true) } - case 872: + case 873: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4658 +//line sql.y:4662 { yyVAL.strs = yyDollar[2].strs setAllowComments(yylex, false) } - case 873: + case 874: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4664 +//line sql.y:4668 { yyVAL.strs = nil } - case 874: + case 875: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4668 +//line sql.y:4672 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 875: + case 876: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4674 +//line sql.y:4678 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 876: + case 877: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4678 +//line sql.y:4682 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 877: + case 878: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4682 +//line sql.y:4686 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 878: + case 879: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4687 +//line sql.y:4691 { yyVAL.str = "" } - case 879: + case 880: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4691 +//line sql.y:4695 { yyVAL.str = SQLNoCacheStr } - case 880: + case 881: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4695 +//line sql.y:4699 { yyVAL.str = SQLCacheStr } - case 881: + case 882: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4700 +//line sql.y:4704 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 882: + case 883: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4704 +//line sql.y:4708 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 883: + case 884: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4708 +//line sql.y:4712 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 884: + case 885: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4714 +//line sql.y:4718 { yyLOCAL = &PrepareStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Statement: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 885: + case 886: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4718 +//line sql.y:4722 { yyLOCAL = &PrepareStmt{ Name: yyDollar[3].identifierCI, @@ -15421,109 +15474,103 @@ yydefault: } } yyVAL.union = yyLOCAL - case 886: + case 887: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4728 +//line sql.y:4732 { yyLOCAL = &ExecuteStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Arguments: yyDollar[4].variablesUnion()} } yyVAL.union = yyLOCAL - case 887: + case 888: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4733 +//line sql.y:4737 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 888: + case 889: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4737 +//line sql.y:4741 { yyLOCAL = yyDollar[2].variablesUnion() } yyVAL.union = yyLOCAL - case 889: + case 890: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4743 +//line sql.y:4747 { yyLOCAL = &DeallocateStmt{Type: DeallocateType, Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 890: + case 891: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4747 +//line sql.y:4751 { yyLOCAL = &DeallocateStmt{Type: DropType, Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 891: + case 892: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4752 +//line sql.y:4756 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 892: + case 893: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4756 +//line sql.y:4760 { yyLOCAL = yyDollar[1].selectExprsUnion() } yyVAL.union = yyLOCAL - case 893: + case 894: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4761 +//line sql.y:4765 { yyVAL.strs = nil } - case 894: + case 895: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4765 +//line sql.y:4769 { yyVAL.strs = []string{yyDollar[1].str} } - case 895: + case 896: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4769 +//line sql.y:4773 { // 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 896: + case 897: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4773 +//line sql.y:4777 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } - case 897: + case 898: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4777 +//line sql.y:4781 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } - case 898: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4783 - { - yyVAL.str = SQLNoCacheStr - } case 899: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4787 { - yyVAL.str = SQLCacheStr + yyVAL.str = SQLNoCacheStr } case 900: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4791 { - yyVAL.str = DistinctStr + yyVAL.str = SQLCacheStr } case 901: yyDollar = yyS[yypt-1 : yypt+1] @@ -15535,481 +15582,487 @@ yydefault: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4799 { - yyVAL.str = StraightJoinHint + yyVAL.str = DistinctStr } case 903: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4803 { - yyVAL.str = SQLCalcFoundRowsStr + yyVAL.str = StraightJoinHint } case 904: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4807 { - 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 905: yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4811 + { + 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 906: + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4813 +//line sql.y:4817 { yyLOCAL = SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL - case 906: + case 907: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4817 +//line sql.y:4821 { yySLICE := (*SelectExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].selectExprUnion()) } - case 907: + case 908: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4823 +//line sql.y:4827 { yyLOCAL = &StarExpr{} } yyVAL.union = yyLOCAL - case 908: + case 909: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4827 +//line sql.y:4831 { yyLOCAL = &AliasedExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 909: + case 910: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4831 +//line sql.y:4835 { yyLOCAL = &StarExpr{TableName: TableName{Name: yyDollar[1].identifierCS}} } yyVAL.union = yyLOCAL - case 910: + case 911: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4835 +//line sql.y:4839 { yyLOCAL = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL - case 911: + case 912: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4840 +//line sql.y:4844 { yyVAL.identifierCI = IdentifierCI{} } - case 912: + case 913: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4844 +//line sql.y:4848 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 913: + case 914: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4848 +//line sql.y:4852 { yyVAL.identifierCI = yyDollar[2].identifierCI } - case 915: + case 916: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4855 +//line sql.y:4859 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 916: + case 917: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4860 +//line sql.y:4864 { yyLOCAL = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewIdentifierCS("dual")}}} } yyVAL.union = yyLOCAL - case 917: + case 918: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4864 +//line sql.y:4868 { yyLOCAL = yyDollar[1].tableExprsUnion() } yyVAL.union = yyLOCAL - case 918: + case 919: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4870 +//line sql.y:4874 { yyLOCAL = yyDollar[2].tableExprsUnion() } yyVAL.union = yyLOCAL - case 919: + case 920: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4876 +//line sql.y:4880 { yyLOCAL = TableExprs{yyDollar[1].tableExprUnion()} } yyVAL.union = yyLOCAL - case 920: + case 921: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4880 +//line sql.y:4884 { yySLICE := (*TableExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableExprUnion()) } - case 923: + case 924: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4890 +//line sql.y:4894 { yyLOCAL = yyDollar[1].aliasedTableNameUnion() } yyVAL.union = yyLOCAL - case 924: + case 925: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4894 +//line sql.y:4898 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].derivedTableUnion(), As: yyDollar[3].identifierCS, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 925: + case 926: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4898 +//line sql.y:4902 { yyLOCAL = &ParenTableExpr{Exprs: yyDollar[2].tableExprsUnion()} } yyVAL.union = yyLOCAL - case 926: + case 927: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4902 +//line sql.y:4906 { yyLOCAL = yyDollar[1].tableExprUnion() } yyVAL.union = yyLOCAL - case 927: + case 928: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4908 +//line sql.y:4912 { yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 928: + case 929: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4912 +//line sql.y:4916 { yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].selStmtUnion()} } yyVAL.union = yyLOCAL - case 929: + case 930: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4918 +//line sql.y:4922 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].identifierCS, Hints: yyDollar[3].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 930: + case 931: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4922 +//line sql.y:4926 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitionsUnion(), As: yyDollar[6].identifierCS, Hints: yyDollar[7].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 931: + case 932: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4927 +//line sql.y:4931 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 932: + case 933: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:4931 +//line sql.y:4935 { yyLOCAL = yyDollar[2].columnsUnion() } yyVAL.union = yyLOCAL - case 933: + case 934: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4936 +//line sql.y:4940 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 934: + case 935: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4940 +//line sql.y:4944 { yyLOCAL = yyDollar[1].columnsUnion() } yyVAL.union = yyLOCAL - case 935: + case 936: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4946 +//line sql.y:4950 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 936: + case 937: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4950 +//line sql.y:4954 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 937: + case 938: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4956 +//line sql.y:4960 { yyLOCAL = []*Variable{yyDollar[1].variableUnion()} } yyVAL.union = yyLOCAL - case 938: + case 939: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4960 +//line sql.y:4964 { yySLICE := (*[]*Variable)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].variableUnion()) } - case 939: + case 940: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4966 +//line sql.y:4970 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 940: + case 941: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4970 +//line sql.y:4974 { yyLOCAL = Columns{NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 941: + case 942: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4974 +//line sql.y:4978 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 942: + case 943: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4978 +//line sql.y:4982 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewIdentifierCI(string(yyDollar[3].str))) } - case 943: + case 944: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Partitions -//line sql.y:4984 +//line sql.y:4988 { yyLOCAL = Partitions{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 944: + case 945: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4988 +//line sql.y:4992 { yySLICE := (*Partitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 945: + case 946: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5001 +//line sql.y:5005 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 946: + case 947: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5005 +//line sql.y:5009 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 947: + case 948: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5009 +//line sql.y:5013 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 948: + case 949: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5013 +//line sql.y:5017 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion()} } yyVAL.union = yyLOCAL - case 949: + case 950: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5019 +//line sql.y:5023 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 950: + case 951: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:5021 +//line sql.y:5025 { yyVAL.joinCondition = &JoinCondition{Using: yyDollar[3].columnsUnion()} } - case 951: + case 952: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5025 +//line sql.y:5029 { yyVAL.joinCondition = &JoinCondition{} } - case 952: + case 953: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5027 +//line sql.y:5031 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 953: + case 954: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5031 +//line sql.y:5035 { yyVAL.joinCondition = &JoinCondition{} } - case 954: + case 955: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5033 +//line sql.y:5037 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 955: + case 956: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5036 +//line sql.y:5040 { yyVAL.empty = struct{}{} } - case 956: + case 957: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5038 +//line sql.y:5042 { yyVAL.empty = struct{}{} } - case 957: + case 958: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5041 +//line sql.y:5045 { yyVAL.identifierCS = NewIdentifierCS("") } - case 958: + case 959: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5045 +//line sql.y:5049 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 959: + case 960: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5049 +//line sql.y:5053 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 961: + case 962: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5056 +//line sql.y:5060 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 962: + case 963: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5062 +//line sql.y:5066 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 963: + case 964: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5066 +//line sql.y:5070 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 964: + case 965: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5070 +//line sql.y:5074 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 965: + case 966: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5076 +//line sql.y:5080 { yyLOCAL = StraightJoinType } yyVAL.union = yyLOCAL - case 966: + case 967: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5082 +//line sql.y:5086 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 967: + case 968: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5086 +//line sql.y:5090 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 968: + case 969: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5090 +//line sql.y:5094 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 969: + case 970: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5094 +//line sql.y:5098 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 970: + case 971: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5100 +//line sql.y:5104 { yyLOCAL = NaturalJoinType } yyVAL.union = yyLOCAL - case 971: + case 972: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5104 +//line sql.y:5108 { if yyDollar[2].joinTypeUnion() == LeftJoinType { yyLOCAL = NaturalLeftJoinType @@ -16018,347 +16071,339 @@ yydefault: } } yyVAL.union = yyLOCAL - case 972: + case 973: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5114 +//line sql.y:5118 { yyVAL.tableName = yyDollar[2].tableName } - case 973: + case 974: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5118 +//line sql.y:5122 { yyVAL.tableName = yyDollar[1].tableName } - case 974: + case 975: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5124 +//line sql.y:5128 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 975: + case 976: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5128 +//line sql.y:5132 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS} } - case 976: + case 977: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5134 +//line sql.y:5138 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 977: + case 978: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5139 +//line sql.y:5143 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 978: + case 979: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5143 +//line sql.y:5147 { yyLOCAL = yyDollar[1].indexHintsUnion() } yyVAL.union = yyLOCAL - case 979: + case 980: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5149 +//line sql.y:5153 { yyLOCAL = IndexHints{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL - case 980: + case 981: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5153 +//line sql.y:5157 { yySLICE := (*IndexHints)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexHintUnion()) } - case 981: + case 982: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5159 +//line sql.y:5163 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 982: + case 983: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5163 +//line sql.y:5167 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion()} } yyVAL.union = yyLOCAL - case 983: + case 984: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5167 +//line sql.y:5171 { yyLOCAL = &IndexHint{Type: IgnoreOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 984: + case 985: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5171 +//line sql.y:5175 { yyLOCAL = &IndexHint{Type: ForceOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 985: + case 986: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5176 +//line sql.y:5180 { yyLOCAL = NoForType } yyVAL.union = yyLOCAL - case 986: + case 987: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5180 +//line sql.y:5184 { yyLOCAL = JoinForType } yyVAL.union = yyLOCAL - case 987: + case 988: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5184 +//line sql.y:5188 { yyLOCAL = OrderByForType } yyVAL.union = yyLOCAL - case 988: + case 989: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5188 +//line sql.y:5192 { yyLOCAL = GroupByForType } yyVAL.union = yyLOCAL - case 989: + case 990: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5194 +//line sql.y:5198 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 990: + case 991: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5198 +//line sql.y:5202 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 991: + case 992: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5205 +//line sql.y:5209 { yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 992: + case 993: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5209 +//line sql.y:5213 { yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 993: + case 994: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5213 +//line sql.y:5217 { yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 994: + case 995: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5217 +//line sql.y:5221 { yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 995: + case 996: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5221 +//line sql.y:5225 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} } yyVAL.union = yyLOCAL - case 996: + case 997: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5225 +//line sql.y:5229 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 997: + case 998: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5229 +//line sql.y:5233 { yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 998: + case 999: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5235 +//line sql.y:5239 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} } yyVAL.union = yyLOCAL - case 999: + case 1000: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5239 +//line sql.y:5243 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} } yyVAL.union = yyLOCAL - case 1000: + case 1001: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5243 +//line sql.y:5247 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1001: + case 1002: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5247 +//line sql.y:5251 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1002: + case 1003: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5253 +//line sql.y:5257 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} } yyVAL.union = yyLOCAL - case 1003: + case 1004: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5257 +//line sql.y:5261 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} } yyVAL.union = yyLOCAL - case 1004: + case 1005: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5261 +//line sql.y:5265 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1005: + case 1006: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5265 +//line sql.y:5269 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1006: + case 1007: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5269 +//line sql.y:5273 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1007: + case 1008: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5273 +//line sql.y:5277 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1008: + case 1009: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5277 +//line sql.y:5281 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1009: + case 1010: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5281 +//line sql.y:5285 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1010: + case 1011: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5285 +//line sql.y:5289 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1011: + case 1012: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5289 +//line sql.y:5293 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1012: + case 1013: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5293 +//line sql.y:5297 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1013: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5299 - { - } case 1014: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5302 +//line sql.y:5303 { } case 1015: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL Expr -//line sql.y:5308 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:5306 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } - yyVAL.union = yyLOCAL case 1016: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5312 { - 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 1017: @@ -16366,7 +16411,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5316 { - 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 1018: @@ -16374,7 +16419,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5320 { - 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 1019: @@ -16382,7 +16427,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5324 { - 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 1020: @@ -16390,7 +16435,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5328 { - 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 1021: @@ -16398,7 +16443,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5332 { - 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 1022: @@ -16406,7 +16451,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5336 { - 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 1023: @@ -16414,7 +16459,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5340 { - 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 1024: @@ -16422,7 +16467,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5344 { - 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 1025: @@ -16430,7 +16475,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5348 { - 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 1026: @@ -16438,21 +16483,21 @@ yydefault: var yyLOCAL Expr //line sql.y:5352 { - 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 1027: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5356 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1028: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5362 +//line sql.y:5360 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16482,19 +16527,19 @@ yydefault: } yyVAL.union = yyLOCAL case 1032: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5378 { - yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1033: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5382 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } yyVAL.union = yyLOCAL case 1034: @@ -16510,15 +16555,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5390 { - yyLOCAL = yyDollar[1].variableUnion() + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1036: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5394 { - 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 1037: @@ -16526,7 +16571,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5398 { - 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 1038: @@ -16534,7 +16579,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5402 { - yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1039: @@ -16542,15 +16587,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5406 { - yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1040: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5410 { - yyLOCAL = yyDollar[1].subqueryUnion() + yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1041: @@ -16558,53 +16603,61 @@ yydefault: var yyLOCAL Expr //line sql.y:5414 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL case 1042: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5418 { - yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1043: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL Expr +//line sql.y:5422 + { + yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} + } + yyVAL.union = yyLOCAL + case 1044: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5422 +//line sql.y:5426 { yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} } yyVAL.union = yyLOCAL - case 1044: + case 1045: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5426 +//line sql.y:5430 { yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} } yyVAL.union = yyLOCAL - case 1045: + case 1046: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5430 +//line sql.y:5434 { yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 1046: + case 1047: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5434 +//line sql.y:5438 { yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 1047: + case 1048: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5438 +//line sql.y:5442 { // 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: @@ -16613,18 +16666,18 @@ yydefault: yyLOCAL = &ConvertExpr{Expr: yyDollar[2].exprUnion(), Type: &ConvertType{Type: yyDollar[1].str}} } yyVAL.union = yyLOCAL - case 1048: + case 1049: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5446 +//line sql.y:5450 { yyLOCAL = &Default{ColName: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1049: + case 1050: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5450 +//line sql.y:5454 { // INTERVAL can trigger a shift / reduce conflict. We want // to shift here for the interval rule. In case we do have @@ -16633,83 +16686,75 @@ yydefault: yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1050: + case 1051: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5458 +//line sql.y:5462 { yyLOCAL = &IntervalFuncExpr{Expr: yyDollar[3].exprUnion(), Exprs: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1051: + case 1052: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5462 +//line sql.y:5466 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONExtractOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1052: + case 1053: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5466 +//line sql.y:5470 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONUnquoteExtractOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1053: + case 1054: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5472 +//line sql.y:5476 { yyLOCAL = &IntervalExpr{Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].identifierCI.String()} } yyVAL.union = yyLOCAL - case 1054: + case 1055: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5478 +//line sql.y:5482 { yyLOCAL = yyDollar[1].colNamesUnion() } yyVAL.union = yyLOCAL - case 1055: + case 1056: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5482 +//line sql.y:5486 { yyLOCAL = yyDollar[2].colNamesUnion() } yyVAL.union = yyLOCAL - case 1056: + case 1057: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5488 +//line sql.y:5492 { yyLOCAL = []*ColName{yyDollar[1].colNameUnion()} } yyVAL.union = yyLOCAL - case 1057: + case 1058: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5492 +//line sql.y:5496 { yySLICE := (*[]*ColName)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colNameUnion()) } - case 1058: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL TrimType -//line sql.y:5498 - { - yyLOCAL = BothTrimType - } - yyVAL.union = yyLOCAL case 1059: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType //line sql.y:5502 { - yyLOCAL = LeadingTrimType + yyLOCAL = BothTrimType } yyVAL.union = yyLOCAL case 1060: @@ -16717,15 +16762,15 @@ yydefault: var yyLOCAL TrimType //line sql.y:5506 { - yyLOCAL = TrailingTrimType + yyLOCAL = LeadingTrimType } yyVAL.union = yyLOCAL case 1061: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL FrameUnitType -//line sql.y:5512 + var yyLOCAL TrimType +//line sql.y:5510 { - yyLOCAL = FrameRowsType + yyLOCAL = TrailingTrimType } yyVAL.union = yyLOCAL case 1062: @@ -16733,15 +16778,15 @@ yydefault: var yyLOCAL FrameUnitType //line sql.y:5516 { - yyLOCAL = FrameRangeType + yyLOCAL = FrameRowsType } yyVAL.union = yyLOCAL case 1063: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5523 + var yyLOCAL FrameUnitType +//line sql.y:5520 { - yyLOCAL = CumeDistExprType + yyLOCAL = FrameRangeType } yyVAL.union = yyLOCAL case 1064: @@ -16749,7 +16794,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5527 { - yyLOCAL = DenseRankExprType + yyLOCAL = CumeDistExprType } yyVAL.union = yyLOCAL case 1065: @@ -16757,7 +16802,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5531 { - yyLOCAL = PercentRankExprType + yyLOCAL = DenseRankExprType } yyVAL.union = yyLOCAL case 1066: @@ -16765,7 +16810,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5535 { - yyLOCAL = RankExprType + yyLOCAL = PercentRankExprType } yyVAL.union = yyLOCAL case 1067: @@ -16773,15 +16818,15 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5539 { - yyLOCAL = RowNumberExprType + yyLOCAL = RankExprType } yyVAL.union = yyLOCAL case 1068: - yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL *FramePoint -//line sql.y:5545 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ArgumentLessWindowExprType +//line sql.y:5543 { - yyLOCAL = &FramePoint{Type: CurrentRowType} + yyLOCAL = RowNumberExprType } yyVAL.union = yyLOCAL case 1069: @@ -16789,7 +16834,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5549 { - yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} + yyLOCAL = &FramePoint{Type: CurrentRowType} } yyVAL.union = yyLOCAL case 1070: @@ -16797,7 +16842,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5553 { - yyLOCAL = &FramePoint{Type: UnboundedFollowingType} + yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} } yyVAL.union = yyLOCAL case 1071: @@ -16805,7 +16850,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5557 { - yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} + yyLOCAL = &FramePoint{Type: UnboundedFollowingType} } yyVAL.union = yyLOCAL case 1072: @@ -16813,15 +16858,15 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5561 { - yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} + yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL case 1073: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL Expr -//line sql.y:5567 + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *FramePoint +//line sql.y:5565 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL case 1074: @@ -16833,281 +16878,281 @@ yydefault: } yyVAL.union = yyLOCAL case 1075: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Expr +//line sql.y:5575 + { + yyLOCAL = yyDollar[1].exprUnion() + } + yyVAL.union = yyLOCAL + case 1076: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5576 +//line sql.y:5580 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1076: + case 1077: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5580 +//line sql.y:5584 { yyLOCAL = yyDollar[1].frameClauseUnion() } yyVAL.union = yyLOCAL - case 1077: + case 1078: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5586 +//line sql.y:5590 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[2].framePointUnion()} } yyVAL.union = yyLOCAL - case 1078: + case 1079: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5590 +//line sql.y:5594 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[3].framePointUnion(), End: yyDollar[5].framePointUnion()} } yyVAL.union = yyLOCAL - case 1079: + case 1080: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:5595 +//line sql.y:5599 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1080: + case 1081: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:5599 +//line sql.y:5603 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1081: + case 1082: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5604 +//line sql.y:5608 { } - case 1082: + case 1083: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5607 +//line sql.y:5611 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1083: + case 1084: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *WindowSpecification -//line sql.y:5613 +//line sql.y:5617 { yyLOCAL = &WindowSpecification{Name: yyDollar[1].identifierCI, PartitionClause: yyDollar[2].exprsUnion(), OrderClause: yyDollar[3].orderByUnion(), FrameClause: yyDollar[4].frameClauseUnion()} } yyVAL.union = yyLOCAL - case 1084: + case 1085: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5619 +//line sql.y:5623 { yyLOCAL = &OverClause{WindowSpec: yyDollar[3].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1085: + case 1086: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5623 +//line sql.y:5627 { yyLOCAL = &OverClause{WindowName: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 1086: + case 1087: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5628 +//line sql.y:5632 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1088: + case 1089: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5635 +//line sql.y:5639 { yyLOCAL = &NullTreatmentClause{yyDollar[1].nullTreatmentTypeUnion()} } yyVAL.union = yyLOCAL - case 1089: + case 1090: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5641 +//line sql.y:5645 { yyLOCAL = RespectNullsType } yyVAL.union = yyLOCAL - case 1090: + case 1091: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5645 +//line sql.y:5649 { yyLOCAL = IgnoreNullsType } yyVAL.union = yyLOCAL - case 1091: + case 1092: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5651 +//line sql.y:5655 { yyLOCAL = FirstValueExprType } yyVAL.union = yyLOCAL - case 1092: + case 1093: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5655 +//line sql.y:5659 { yyLOCAL = LastValueExprType } yyVAL.union = yyLOCAL - case 1093: + case 1094: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5661 +//line sql.y:5665 { yyLOCAL = FromFirstType } yyVAL.union = yyLOCAL - case 1094: + case 1095: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5665 +//line sql.y:5669 { yyLOCAL = FromLastType } yyVAL.union = yyLOCAL - case 1095: + case 1096: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5670 +//line sql.y:5674 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1097: + case 1098: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5677 +//line sql.y:5681 { yyLOCAL = &FromFirstLastClause{yyDollar[1].fromFirstLastTypeUnion()} } yyVAL.union = yyLOCAL - case 1098: + case 1099: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5683 +//line sql.y:5687 { yyLOCAL = LagExprType } yyVAL.union = yyLOCAL - case 1099: + case 1100: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5687 +//line sql.y:5691 { yyLOCAL = LeadExprType } yyVAL.union = yyLOCAL - case 1100: + case 1101: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *WindowDefinition -//line sql.y:5693 +//line sql.y:5697 { yyLOCAL = &WindowDefinition{Name: yyDollar[1].identifierCI, WindowSpec: yyDollar[4].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1101: + case 1102: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL WindowDefinitions -//line sql.y:5699 +//line sql.y:5703 { yyLOCAL = WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL - case 1102: + case 1103: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5703 +//line sql.y:5707 { yySLICE := (*WindowDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].windowDefinitionUnion()) } - case 1103: + case 1104: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5709 +//line sql.y:5713 { yyVAL.str = "" } - case 1104: + case 1105: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5713 +//line sql.y:5717 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } - case 1105: + case 1106: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5719 +//line sql.y:5723 { yyLOCAL = BoolVal(true) } yyVAL.union = yyLOCAL - case 1106: + case 1107: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5723 +//line sql.y:5727 { yyLOCAL = BoolVal(false) } yyVAL.union = yyLOCAL - case 1107: + case 1108: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5730 +//line sql.y:5734 { yyLOCAL = IsTrueOp } yyVAL.union = yyLOCAL - case 1108: + case 1109: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5734 +//line sql.y:5738 { yyLOCAL = IsNotTrueOp } yyVAL.union = yyLOCAL - case 1109: + case 1110: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5738 +//line sql.y:5742 { yyLOCAL = IsFalseOp } yyVAL.union = yyLOCAL - case 1110: + case 1111: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5742 +//line sql.y:5746 { yyLOCAL = IsNotFalseOp } yyVAL.union = yyLOCAL - case 1111: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ComparisonExprOperator -//line sql.y:5748 - { - yyLOCAL = EqualOp - } - yyVAL.union = yyLOCAL case 1112: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator //line sql.y:5752 { - yyLOCAL = LessThanOp + yyLOCAL = EqualOp } yyVAL.union = yyLOCAL case 1113: @@ -17115,7 +17160,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5756 { - yyLOCAL = GreaterThanOp + yyLOCAL = LessThanOp } yyVAL.union = yyLOCAL case 1114: @@ -17123,7 +17168,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5760 { - yyLOCAL = LessEqualOp + yyLOCAL = GreaterThanOp } yyVAL.union = yyLOCAL case 1115: @@ -17131,7 +17176,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5764 { - yyLOCAL = GreaterEqualOp + yyLOCAL = LessEqualOp } yyVAL.union = yyLOCAL case 1116: @@ -17139,7 +17184,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5768 { - yyLOCAL = NotEqualOp + yyLOCAL = GreaterEqualOp } yyVAL.union = yyLOCAL case 1117: @@ -17147,15 +17192,15 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5772 { - yyLOCAL = NullSafeEqualOp + yyLOCAL = NotEqualOp } yyVAL.union = yyLOCAL case 1118: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ColTuple -//line sql.y:5778 + var yyLOCAL ComparisonExprOperator +//line sql.y:5776 { - yyLOCAL = yyDollar[1].valTupleUnion() + yyLOCAL = NullSafeEqualOp } yyVAL.union = yyLOCAL case 1119: @@ -17163,159 +17208,159 @@ yydefault: var yyLOCAL ColTuple //line sql.y:5782 { - yyLOCAL = yyDollar[1].subqueryUnion() + yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL case 1120: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple //line sql.y:5786 + { + yyLOCAL = yyDollar[1].subqueryUnion() + } + yyVAL.union = yyLOCAL + case 1121: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ColTuple +//line sql.y:5790 { yyLOCAL = ListArg(yyDollar[1].str[2:]) bindVariable(yylex, yyDollar[1].str[2:]) } yyVAL.union = yyLOCAL - case 1121: + case 1122: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Subquery -//line sql.y:5793 +//line sql.y:5797 { yyLOCAL = &Subquery{yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1122: + case 1123: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:5799 +//line sql.y:5803 { yyLOCAL = Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1123: + case 1124: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5803 +//line sql.y:5807 { yySLICE := (*Exprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].exprUnion()) } - case 1124: + case 1125: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5813 +//line sql.y:5817 { yyLOCAL = &FuncExpr{Name: yyDollar[1].identifierCI, Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1125: + case 1126: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5817 +//line sql.y:5821 { yyLOCAL = &FuncExpr{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCI, Exprs: yyDollar[5].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1126: - yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL Expr -//line sql.y:5827 - { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].selectExprsUnion()} - } - yyVAL.union = yyLOCAL case 1127: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5831 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1128: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5835 { - 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 1129: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5839 { - 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 1130: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5843 { - 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 1131: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5847 { - 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 1132: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5851 { - 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 1133: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5855 { - yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} + yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1134: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5859 { - 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 1135: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr //line sql.y:5863 { - 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 1136: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5874 +//line sql.y:5867 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1137: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5878 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} } yyVAL.union = yyLOCAL case 1138: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5884 +//line sql.y:5882 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1139: @@ -17323,31 +17368,31 @@ yydefault: var yyLOCAL Expr //line sql.y:5888 { - yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].exprUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} } yyVAL.union = yyLOCAL case 1140: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5893 +//line sql.y:5892 { - yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].exprUnion()} + yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1141: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5897 { - yyLOCAL = &CountStar{} + yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1142: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5901 { - yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion()} + yyLOCAL = &CountStar{} } yyVAL.union = yyLOCAL case 1143: @@ -17355,7 +17400,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5905 { - yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL case 1144: @@ -17363,7 +17408,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5909 { - yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1145: @@ -17371,7 +17416,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5913 { - yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1146: @@ -17379,15 +17424,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5917 { - yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1147: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5921 { - yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1148: @@ -17395,7 +17440,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5925 { - yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1149: @@ -17403,7 +17448,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5929 { - yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1150: @@ -17411,7 +17456,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5933 { - yyLOCAL = &Std{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1151: @@ -17419,7 +17464,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5937 { - yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &Std{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1152: @@ -17427,7 +17472,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5941 { - yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1153: @@ -17435,7 +17480,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5945 { - yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1154: @@ -17443,7 +17488,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5949 { - yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1155: @@ -17451,7 +17496,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5953 { - yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1156: @@ -17459,15 +17504,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5957 { - yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1157: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5961 { - 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 1158: @@ -17475,7 +17520,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5965 { - 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 1159: @@ -17483,31 +17528,31 @@ yydefault: var yyLOCAL Expr //line sql.y:5969 { - 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 1160: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5973 { - 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 1161: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5977 { - yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} + yyLOCAL = &ExtractFuncExpr{IntervalTypes: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1162: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5981 { - yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} } yyVAL.union = yyLOCAL case 1163: @@ -17515,7 +17560,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5985 { - yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1164: @@ -17523,7 +17568,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5989 { - yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1165: @@ -17531,7 +17576,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5993 { - yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1166: @@ -17539,23 +17584,23 @@ yydefault: var yyLOCAL Expr //line sql.y:5997 { - yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1167: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6001 { - 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 1168: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:6005 { - yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL case 1169: @@ -17563,15 +17608,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6009 { - yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} + yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1170: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6013 { - yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} + yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1171: @@ -17579,7 +17624,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6017 { - yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} + yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} } yyVAL.union = yyLOCAL case 1172: @@ -17587,23 +17632,23 @@ yydefault: var yyLOCAL Expr //line sql.y:6021 { - yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1173: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6025 { - 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 1174: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6029 { - 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 1175: @@ -17611,15 +17656,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6033 { - 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 1176: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6037 { - yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1177: @@ -17627,31 +17672,31 @@ yydefault: var yyLOCAL Expr //line sql.y:6041 { - yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1178: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6045 { - yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} + yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1179: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:6049 { - yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} } yyVAL.union = yyLOCAL case 1180: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6053 { - yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} + yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1181: @@ -17659,15 +17704,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6057 { - yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} + yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1182: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6061 { - yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} + yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1183: @@ -17675,7 +17720,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6065 { - yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} + yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1184: @@ -17683,47 +17728,47 @@ yydefault: var yyLOCAL Expr //line sql.y:6069 { - yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1185: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6073 { - 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 1186: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6077 { - 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 1187: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6081 { - 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 1188: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6085 { - yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1189: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6089 { - yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} + yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1190: @@ -17731,39 +17776,39 @@ yydefault: var yyLOCAL Expr //line sql.y:6093 { - yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} + yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1191: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6097 { - 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 1192: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6101 { - 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 1193: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr //line sql.y:6105 { - 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 1194: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:6109 { - 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 1195: @@ -17771,23 +17816,23 @@ yydefault: var yyLOCAL Expr //line sql.y:6113 { - 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 1196: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6117 { - 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 1197: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr //line sql.y:6121 { - 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 1198: @@ -17795,7 +17840,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6125 { - yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1199: @@ -17803,7 +17848,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6129 { - yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1200: @@ -17811,15 +17856,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6133 { - yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1201: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6137 { - yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1202: @@ -17827,7 +17872,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6141 { - 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 1203: @@ -17835,7 +17880,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6145 { - 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 1204: @@ -17843,7 +17888,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6149 { - 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 1205: @@ -17851,7 +17896,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6153 { - 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 1206: @@ -17859,7 +17904,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6157 { - 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 1207: @@ -17867,7 +17912,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6161 { - 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 1208: @@ -17875,7 +17920,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6165 { - 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 1209: @@ -17883,7 +17928,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6169 { - 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 1210: @@ -17891,15 +17936,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6173 { - 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 1211: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6177 { - yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} + yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1212: @@ -17907,360 +17952,360 @@ yydefault: var yyLOCAL Expr //line sql.y:6181 { - yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} + yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1213: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6185 { - 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 1214: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6189 + { + yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} + } + yyVAL.union = yyLOCAL + case 1215: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL Expr +//line sql.y:6193 { yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1215: + case 1216: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6193 +//line sql.y:6197 { 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 1216: + case 1217: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6197 +//line sql.y:6201 { yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1217: + case 1218: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6201 +//line sql.y:6205 { 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 1222: + case 1223: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6211 +//line sql.y:6215 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1223: + case 1224: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6215 +//line sql.y:6219 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1224: + case 1225: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6219 +//line sql.y:6223 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 1225: + case 1226: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6223 +//line sql.y:6227 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1226: + case 1227: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6229 +//line sql.y:6233 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1227: + case 1228: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6233 +//line sql.y:6237 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1228: + case 1229: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6239 +//line sql.y:6243 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1229: + case 1230: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6243 +//line sql.y:6247 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1230: + case 1231: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6247 +//line sql.y:6251 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1231: + case 1232: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6251 +//line sql.y:6255 { 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 1232: + case 1233: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6255 +//line sql.y:6259 { // 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 1233: + case 1234: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6260 +//line sql.y:6264 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1234: + case 1235: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6264 +//line sql.y:6268 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), MatchType: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1235: + case 1236: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6268 +//line sql.y:6272 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1236: + case 1237: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6272 +//line sql.y:6276 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1237: + case 1238: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6276 +//line sql.y:6280 { 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 1238: + case 1239: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6280 +//line sql.y:6284 { // 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 1239: + case 1240: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6285 +//line sql.y:6289 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1240: + case 1241: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6289 +//line sql.y:6293 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1241: + case 1242: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6293 +//line sql.y:6297 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1242: + case 1243: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6297 +//line sql.y:6301 { // 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 1243: + case 1244: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6304 +//line sql.y:6308 { yyLOCAL = &ExtractValueExpr{Fragment: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1244: + case 1245: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6308 +//line sql.y:6312 { yyLOCAL = &UpdateXMLExpr{Target: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion(), NewXML: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1245: + case 1246: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6314 +//line sql.y:6318 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatBytesType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1246: + case 1247: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6318 +//line sql.y:6322 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatPicoTimeType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1247: + case 1248: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6322 +//line sql.y:6326 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsCurrentThreadIDType} } yyVAL.union = yyLOCAL - case 1248: + case 1249: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6326 +//line sql.y:6330 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsThreadIDType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1249: + case 1250: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6332 +//line sql.y:6336 { yyLOCAL = >IDFuncExpr{Type: GTIDSubsetType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1250: + case 1251: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6336 +//line sql.y:6340 { yyLOCAL = >IDFuncExpr{Type: GTIDSubtractType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1251: + case 1252: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6340 +//line sql.y:6344 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1252: + case 1253: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6344 +//line sql.y:6348 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1253: + case 1254: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6348 +//line sql.y:6352 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1254: + case 1255: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6352 +//line sql.y:6356 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1255: + case 1256: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6356 +//line sql.y:6360 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion(), Channel: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1256: + case 1257: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6361 +//line sql.y:6365 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1257: + case 1258: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6365 +//line sql.y:6369 { yyLOCAL = yyDollar[2].convertTypeUnion() } yyVAL.union = yyLOCAL - case 1258: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6371 - { - } case 1259: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL IntervalTypes -//line sql.y:6373 +//line sql.y:6375 { - yyLOCAL = IntervalDayHour } - yyVAL.union = yyLOCAL case 1260: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes //line sql.y:6377 { - yyLOCAL = IntervalDayMicrosecond + yyLOCAL = IntervalDayHour } yyVAL.union = yyLOCAL case 1261: @@ -18268,7 +18313,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6381 { - yyLOCAL = IntervalDayMinute + yyLOCAL = IntervalDayMicrosecond } yyVAL.union = yyLOCAL case 1262: @@ -18276,7 +18321,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6385 { - yyLOCAL = IntervalDaySecond + yyLOCAL = IntervalDayMinute } yyVAL.union = yyLOCAL case 1263: @@ -18284,7 +18329,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6389 { - yyLOCAL = IntervalHourMicrosecond + yyLOCAL = IntervalDaySecond } yyVAL.union = yyLOCAL case 1264: @@ -18292,7 +18337,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6393 { - yyLOCAL = IntervalHourMinute + yyLOCAL = IntervalHourMicrosecond } yyVAL.union = yyLOCAL case 1265: @@ -18300,7 +18345,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6397 { - yyLOCAL = IntervalHourSecond + yyLOCAL = IntervalHourMinute } yyVAL.union = yyLOCAL case 1266: @@ -18308,7 +18353,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6401 { - yyLOCAL = IntervalMinuteMicrosecond + yyLOCAL = IntervalHourSecond } yyVAL.union = yyLOCAL case 1267: @@ -18316,7 +18361,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6405 { - yyLOCAL = IntervalMinuteSecond + yyLOCAL = IntervalMinuteMicrosecond } yyVAL.union = yyLOCAL case 1268: @@ -18324,7 +18369,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6409 { - yyLOCAL = IntervalSecondMicrosecond + yyLOCAL = IntervalMinuteSecond } yyVAL.union = yyLOCAL case 1269: @@ -18332,15 +18377,15 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6413 { - yyLOCAL = IntervalYearMonth + yyLOCAL = IntervalSecondMicrosecond } yyVAL.union = yyLOCAL case 1270: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6419 +//line sql.y:6417 { - yyLOCAL = IntervalDay + yyLOCAL = IntervalYearMonth } yyVAL.union = yyLOCAL case 1271: @@ -18348,7 +18393,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6423 { - yyLOCAL = IntervalWeek + yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL case 1272: @@ -18356,7 +18401,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6427 { - yyLOCAL = IntervalHour + yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL case 1273: @@ -18364,7 +18409,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6431 { - yyLOCAL = IntervalMinute + yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL case 1274: @@ -18372,7 +18417,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6435 { - yyLOCAL = IntervalMonth + yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL case 1275: @@ -18380,7 +18425,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6439 { - yyLOCAL = IntervalQuarter + yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL case 1276: @@ -18388,7 +18433,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6443 { - yyLOCAL = IntervalSecond + yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL case 1277: @@ -18396,7 +18441,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6447 { - yyLOCAL = IntervalMicrosecond + yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL case 1278: @@ -18404,19 +18449,19 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6451 { - yyLOCAL = IntervalYear + yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1281: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL Expr -//line sql.y:6461 + case 1279: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL IntervalTypes +//line sql.y:6455 { - yyLOCAL = nil + yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL case 1282: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr //line sql.y:6465 { @@ -18424,11 +18469,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1283: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:6469 { - yyLOCAL = NewIntLiteral(yyDollar[2].str) + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1284: @@ -18436,16 +18481,16 @@ yydefault: var yyLOCAL Expr //line sql.y:6473 { - yyLOCAL = NewArgument(yyDollar[2].str[1:]) - bindVariable(yylex, yyDollar[2].str[1:]) + yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL case 1285: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6484 +//line sql.y:6477 { - 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 1286: @@ -18453,7 +18498,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6488 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1287: @@ -18461,7 +18506,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6492 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1288: @@ -18469,7 +18514,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6496 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1289: @@ -18477,60 +18522,62 @@ yydefault: var yyLOCAL Expr //line sql.y:6500 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1290: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL MatchExprOption -//line sql.y:6506 + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL Expr +//line sql.y:6504 { - yyLOCAL = NoOption + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1291: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6510 { - yyLOCAL = BooleanModeOpt + yyLOCAL = NoOption } yyVAL.union = yyLOCAL case 1292: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6514 { - yyLOCAL = NaturalLanguageModeOpt + yyLOCAL = BooleanModeOpt } yyVAL.union = yyLOCAL case 1293: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6518 { - yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt + yyLOCAL = NaturalLanguageModeOpt } yyVAL.union = yyLOCAL case 1294: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6522 { - yyLOCAL = QueryExpansionOpt + yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt } yyVAL.union = yyLOCAL case 1295: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6528 + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL MatchExprOption +//line sql.y:6526 { - yyVAL.str = string(yyDollar[1].identifierCI.String()) + yyLOCAL = QueryExpansionOpt } + yyVAL.union = yyLOCAL case 1296: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:6532 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].identifierCI.String()) } case 1297: yyDollar = yyS[yypt-1 : yypt+1] @@ -18539,19 +18586,17 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1298: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL *ConvertType -//line sql.y:6542 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:6540 { - yyLOCAL = nil + yyVAL.str = string(yyDollar[1].str) } - yyVAL.union = yyLOCAL case 1299: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6546 { - yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1300: @@ -18563,35 +18608,35 @@ yydefault: } yyVAL.union = yyLOCAL case 1301: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6556 +//line sql.y:6554 { - 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 1302: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6560 { - 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 1303: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6564 { - 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 1304: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6568 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1305: @@ -18599,37 +18644,37 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:6572 { - 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 1306: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6578 +//line sql.y:6576 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length + yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale } yyVAL.union = yyLOCAL case 1307: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6582 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1308: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6586 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1309: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6590 { @@ -18641,19 +18686,19 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:6594 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1311: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6598 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1312: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6602 { @@ -18665,15 +18710,15 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:6606 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1314: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6610 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1315: @@ -18685,140 +18730,148 @@ yydefault: } yyVAL.union = yyLOCAL case 1316: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL *ConvertType +//line sql.y:6618 + { + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + } + yyVAL.union = yyLOCAL + case 1317: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:6620 +//line sql.y:6624 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1317: + case 1318: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:6624 +//line sql.y:6628 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1318: + case 1319: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6629 +//line sql.y:6633 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1319: + case 1320: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6633 +//line sql.y:6637 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1320: + case 1321: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6638 +//line sql.y:6642 { yyVAL.str = string("") } - case 1321: + case 1322: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6642 +//line sql.y:6646 { yyVAL.str = " separator " + encodeSQLString(yyDollar[2].str) } - case 1322: + case 1323: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*When -//line sql.y:6648 +//line sql.y:6652 { yyLOCAL = []*When{yyDollar[1].whenUnion()} } yyVAL.union = yyLOCAL - case 1323: + case 1324: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6652 +//line sql.y:6656 { yySLICE := (*[]*When)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].whenUnion()) } - case 1324: + case 1325: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *When -//line sql.y:6658 +//line sql.y:6662 { yyLOCAL = &When{Cond: yyDollar[2].exprUnion(), Val: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1325: + case 1326: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6663 +//line sql.y:6667 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1326: + case 1327: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6667 +//line sql.y:6671 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1327: + case 1328: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:6673 +//line sql.y:6677 { yyLOCAL = &ColName{Name: yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1328: + case 1329: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:6677 +//line sql.y:6681 { yyLOCAL = &ColName{Name: NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 1329: + case 1330: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColName -//line sql.y:6681 +//line sql.y:6685 { yyLOCAL = &ColName{Qualifier: TableName{Name: yyDollar[1].identifierCS}, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1330: + case 1331: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColName -//line sql.y:6685 +//line sql.y:6689 { yyLOCAL = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}, Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 1331: + case 1332: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6691 +//line sql.y:6695 { yyLOCAL = yyDollar[1].colNameUnion() } yyVAL.union = yyLOCAL - case 1332: + case 1333: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6695 +//line sql.y:6699 { yyLOCAL = &Offset{V: convertStringToInt(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1333: + case 1334: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6701 +//line sql.y:6705 { // TODO(sougou): Deprecate this construct. if yyDollar[1].identifierCI.Lowered() != "value" { @@ -18828,219 +18881,211 @@ yydefault: yyLOCAL = NewIntLiteral("1") } yyVAL.union = yyLOCAL - case 1334: + case 1335: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6710 +//line sql.y:6714 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1335: + case 1336: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6714 +//line sql.y:6718 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1336: + case 1337: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:6720 +//line sql.y:6724 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1337: + case 1338: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:6724 +//line sql.y:6728 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1338: + case 1339: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6729 +//line sql.y:6733 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1339: + case 1340: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6733 +//line sql.y:6737 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1340: + case 1341: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *NamedWindow -//line sql.y:6739 +//line sql.y:6743 { yyLOCAL = &NamedWindow{yyDollar[2].windowDefinitionsUnion()} } yyVAL.union = yyLOCAL - case 1341: + case 1342: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6745 +//line sql.y:6749 { yyLOCAL = NamedWindows{yyDollar[1].namedWindowUnion()} } yyVAL.union = yyLOCAL - case 1342: + case 1343: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6749 +//line sql.y:6753 { yySLICE := (*NamedWindows)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].namedWindowUnion()) } - case 1343: + case 1344: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6754 +//line sql.y:6758 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1344: + case 1345: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6758 +//line sql.y:6762 { yyLOCAL = yyDollar[1].namedWindowsUnion() } yyVAL.union = yyLOCAL - case 1345: + case 1346: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6763 +//line sql.y:6767 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1346: + case 1347: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6767 +//line sql.y:6771 { yyLOCAL = yyDollar[1].orderByUnion() } yyVAL.union = yyLOCAL - case 1347: + case 1348: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6773 +//line sql.y:6777 { yyLOCAL = yyDollar[3].orderByUnion() } yyVAL.union = yyLOCAL - case 1348: + case 1349: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6779 +//line sql.y:6783 { yyLOCAL = OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL - case 1349: + case 1350: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6783 +//line sql.y:6787 { yySLICE := (*OrderBy)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].orderUnion()) } - case 1350: + case 1351: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Order -//line sql.y:6789 +//line sql.y:6793 { yyLOCAL = &Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 1351: + case 1352: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6794 +//line sql.y:6798 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1352: + case 1353: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6798 +//line sql.y:6802 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1353: + case 1354: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6802 +//line sql.y:6806 { yyLOCAL = DescOrder } yyVAL.union = yyLOCAL - case 1354: + case 1355: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Limit -//line sql.y:6807 +//line sql.y:6811 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1355: + case 1356: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Limit -//line sql.y:6811 +//line sql.y:6815 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1356: + case 1357: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Limit -//line sql.y:6817 +//line sql.y:6821 { yyLOCAL = &Limit{Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1357: + case 1358: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:6821 +//line sql.y:6825 { yyLOCAL = &Limit{Offset: yyDollar[2].exprUnion(), Rowcount: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1358: + case 1359: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:6825 +//line sql.y:6829 { yyLOCAL = &Limit{Offset: yyDollar[4].exprUnion(), Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1359: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL []AlterOption -//line sql.y:6830 - { - yyLOCAL = nil - } - yyVAL.union = yyLOCAL case 1360: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption //line sql.y:6834 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1361: @@ -19052,11 +19097,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1362: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption //line sql.y:6842 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL case 1363: @@ -19068,11 +19113,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1364: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL AlterOption -//line sql.y:6853 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL []AlterOption +//line sql.y:6850 { - yyLOCAL = &LockOption{Type: DefaultType} + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 1365: @@ -19080,7 +19125,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:6857 { - yyLOCAL = &LockOption{Type: NoneType} + yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL case 1366: @@ -19088,7 +19133,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:6861 { - yyLOCAL = &LockOption{Type: SharedType} + yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL case 1367: @@ -19096,15 +19141,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:6865 { - yyLOCAL = &LockOption{Type: ExclusiveType} + yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL case 1368: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6871 +//line sql.y:6869 { - yyLOCAL = AlgorithmValue(yyDollar[3].str) + yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL case 1369: @@ -19132,16 +19177,18 @@ yydefault: } yyVAL.union = yyLOCAL case 1372: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6888 + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL AlterOption +//line sql.y:6887 { - yyVAL.str = "" + yyLOCAL = AlgorithmValue(yyDollar[3].str) } + yyVAL.union = yyLOCAL case 1373: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6892 { - yyVAL.str = string(yyDollar[3].str) + yyVAL.str = "" } case 1374: yyDollar = yyS[yypt-3 : yypt+1] @@ -19156,22 +19203,22 @@ yydefault: yyVAL.str = string(yyDollar[3].str) } case 1376: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6905 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:6904 { - yyVAL.str = "" + yyVAL.str = string(yyDollar[3].str) } case 1377: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6909 { - yyVAL.str = yyDollar[3].str + yyVAL.str = "" } case 1378: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6915 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:6913 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = yyDollar[3].str } case 1379: yyDollar = yyS[yypt-1 : yypt+1] @@ -19180,28 +19227,28 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1380: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6924 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:6923 { - yyVAL.str = "" + yyVAL.str = string(yyDollar[1].str) } case 1381: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6928 { - yyVAL.str = yyDollar[2].str + yyVAL.str = "" } case 1382: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6933 + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:6932 { - yyVAL.str = "cascaded" + yyVAL.str = yyDollar[2].str } case 1383: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6937 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = "cascaded" } case 1384: yyDollar = yyS[yypt-1 : yypt+1] @@ -19210,45 +19257,51 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1385: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:6945 + { + yyVAL.str = string(yyDollar[1].str) + } + case 1386: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Definer -//line sql.y:6946 +//line sql.y:6950 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1386: + case 1387: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:6950 +//line sql.y:6954 { yyLOCAL = yyDollar[3].definerUnion() } yyVAL.union = yyLOCAL - case 1387: + case 1388: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Definer -//line sql.y:6956 +//line sql.y:6960 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1388: + case 1389: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:6962 +//line sql.y:6966 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1389: + case 1390: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Definer -//line sql.y:6968 +//line sql.y:6972 { yyLOCAL = &Definer{ Name: yyDollar[1].str, @@ -19256,369 +19309,369 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1390: + case 1391: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6977 +//line sql.y:6981 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 1391: + case 1392: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6981 +//line sql.y:6985 { yyVAL.str = formatIdentifier(yyDollar[1].str) } - case 1392: + case 1393: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6986 +//line sql.y:6990 { yyVAL.str = "" } - case 1393: + case 1394: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6990 +//line sql.y:6994 { yyVAL.str = formatAddress(yyDollar[1].str) } - case 1394: + case 1395: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:6996 +//line sql.y:7000 { yyLOCAL = ForUpdateLock } yyVAL.union = yyLOCAL - case 1395: + case 1396: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7000 +//line sql.y:7004 { yyLOCAL = ShareModeLock } yyVAL.union = yyLOCAL - case 1396: + case 1397: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7006 +//line sql.y:7010 { 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 1397: + case 1398: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7010 +//line sql.y:7014 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1398: + case 1399: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7014 +//line sql.y:7018 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1399: + case 1400: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7019 +//line sql.y:7023 { yyVAL.str = "" } - case 1400: + case 1401: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7023 +//line sql.y:7027 { yyVAL.str = " format csv" + yyDollar[3].str } - case 1401: + case 1402: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7027 +//line sql.y:7031 { yyVAL.str = " format text" + yyDollar[3].str } - case 1402: + case 1403: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7032 +//line sql.y:7036 { yyVAL.str = "" } - case 1403: + case 1404: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7036 +//line sql.y:7040 { yyVAL.str = " header" } - case 1404: + case 1405: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7041 +//line sql.y:7045 { yyVAL.str = "" } - case 1405: + case 1406: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7045 +//line sql.y:7049 { yyVAL.str = " manifest on" } - case 1406: + case 1407: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7049 +//line sql.y:7053 { yyVAL.str = " manifest off" } - case 1407: + case 1408: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7054 +//line sql.y:7058 { yyVAL.str = "" } - case 1408: + case 1409: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7058 +//line sql.y:7062 { yyVAL.str = " overwrite on" } - case 1409: + case 1410: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7062 +//line sql.y:7066 { yyVAL.str = " overwrite off" } - case 1410: + case 1411: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7068 +//line sql.y:7072 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1411: + case 1412: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7073 +//line sql.y:7077 { yyVAL.str = "" } - case 1412: + case 1413: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7077 +//line sql.y:7081 { yyVAL.str = " lines" + yyDollar[2].str } - case 1413: + case 1414: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7083 +//line sql.y:7087 { yyVAL.str = yyDollar[1].str } - case 1414: + case 1415: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7087 +//line sql.y:7091 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1415: + case 1416: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7093 +//line sql.y:7097 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } - case 1416: + case 1417: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7097 +//line sql.y:7101 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1417: + case 1418: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7102 +//line sql.y:7106 { yyVAL.str = "" } - case 1418: + case 1419: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7106 +//line sql.y:7110 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } - case 1419: + case 1420: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7112 +//line sql.y:7116 { yyVAL.str = yyDollar[1].str } - case 1420: + case 1421: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7116 +//line sql.y:7120 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1421: + case 1422: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7122 +//line sql.y:7126 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1422: + case 1423: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7126 +//line sql.y:7130 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } - case 1423: + case 1424: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7130 +//line sql.y:7134 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } - case 1424: + case 1425: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7135 +//line sql.y:7139 { yyVAL.str = "" } - case 1425: + case 1426: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7139 +//line sql.y:7143 { yyVAL.str = " optionally" } - case 1426: + case 1427: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Insert -//line sql.y:7152 +//line sql.y:7156 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion()} } yyVAL.union = yyLOCAL - case 1427: + case 1428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7156 +//line sql.y:7160 { yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1428: + case 1429: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7160 +//line sql.y:7164 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion()} } yyVAL.union = yyLOCAL - case 1429: + case 1430: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7164 +//line sql.y:7168 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion()} } yyVAL.union = yyLOCAL - case 1430: + case 1431: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7168 +//line sql.y:7172 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1431: + case 1432: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7174 +//line sql.y:7178 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1432: + case 1433: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7178 +//line sql.y:7182 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1433: + case 1434: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7182 +//line sql.y:7186 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 1434: + case 1435: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7186 +//line sql.y:7190 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) } - case 1435: + case 1436: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7191 +//line sql.y:7195 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1436: + case 1437: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7195 +//line sql.y:7199 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 1437: + case 1438: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7201 +//line sql.y:7205 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL - case 1438: + case 1439: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7205 +//line sql.y:7209 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) } - case 1439: + case 1440: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7211 +//line sql.y:7215 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1440: + case 1441: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7215 +//line sql.y:7219 { yyLOCAL = ValTuple{} } yyVAL.union = yyLOCAL - case 1441: + case 1442: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7221 +//line sql.y:7225 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1442: + case 1443: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7225 +//line sql.y:7229 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1443: + case 1444: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7230 +//line sql.y:7234 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -19627,212 +19680,206 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1444: + case 1445: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7240 +//line sql.y:7244 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 1445: + case 1446: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7244 +//line sql.y:7248 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) } - case 1446: + case 1447: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7250 +//line sql.y:7254 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1448: + case 1449: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7257 +//line sql.y:7261 { yyVAL.str = "charset" } - case 1451: + case 1452: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7267 +//line sql.y:7271 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } yyVAL.union = yyLOCAL - case 1452: + case 1453: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7271 +//line sql.y:7275 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1453: + case 1454: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7275 +//line sql.y:7279 { yyLOCAL = &Default{} } yyVAL.union = yyLOCAL - case 1456: + case 1457: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7284 +//line sql.y:7288 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1457: + case 1458: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7286 +//line sql.y:7290 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1458: + case 1459: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7289 +//line sql.y:7293 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1459: + case 1460: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7291 +//line sql.y:7295 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1460: + case 1461: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7294 +//line sql.y:7298 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1461: + case 1462: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:7296 +//line sql.y:7300 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1462: + case 1463: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:7299 +//line sql.y:7303 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1463: + case 1464: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:7301 +//line sql.y:7305 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1464: + case 1465: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7304 +//line sql.y:7308 { yyVAL.empty = struct{}{} } - case 1465: + case 1466: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7306 +//line sql.y:7310 { yyVAL.empty = struct{}{} } - case 1466: + case 1467: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7308 +//line sql.y:7312 { yyVAL.empty = struct{}{} } - case 1467: + case 1468: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:7312 +//line sql.y:7316 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL - case 1468: + case 1469: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:7317 +//line sql.y:7321 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1469: + case 1470: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:7321 +//line sql.y:7325 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1470: + case 1471: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7326 +//line sql.y:7330 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1471: + case 1472: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7328 +//line sql.y:7332 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 1472: + case 1473: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:7332 +//line sql.y:7336 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL - case 1473: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7338 - { - yyVAL.identifierCI = yyDollar[1].identifierCI - } case 1474: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:7342 { - yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) + yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1476: + case 1475: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7349 +//line sql.y:7346 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1477: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7355 +//line sql.y:7353 { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1478: yyDollar = yyS[yypt-1 : yypt+1] @@ -19841,52 +19888,52 @@ yydefault: yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 1479: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:7363 + { + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + } + case 1480: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7365 +//line sql.y:7369 { yyVAL.identifierCS = NewIdentifierCS("") } - case 1480: + case 1481: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7369 +//line sql.y:7373 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 1482: + case 1483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7376 +//line sql.y:7380 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 2032: + case 2033: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7952 +//line sql.y:7956 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 2033: + case 2034: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7961 +//line sql.y:7965 { decNesting(yylex) } - case 2034: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7966 - { - skipToEnd(yylex) - } case 2035: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7971 +//line sql.y:7970 { skipToEnd(yylex) } case 2036: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:7975 { skipToEnd(yylex) @@ -19897,6 +19944,12 @@ yydefault: { skipToEnd(yylex) } + case 2038: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:7983 + { + skipToEnd(yylex) + } } goto yystack /* stack new state and value */ } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 69e3d41f149..add7976ecb4 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -2859,7 +2859,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 2faec7a59ff..d361e25f5bf 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 970b8ff3d86ef6b72bc1bf2b1a26429aa8fa2cc0 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 29 Mar 2023 12:32:38 +0200 Subject: [PATCH 080/233] Addition of the 16.0.1 release summary (#12751) Signed-off-by: Florent Poinsard --- changelog/16.0/16.0.1/summary.md | 9 +++++++++ changelog/16.0/README.md | 2 ++ 2 files changed, 11 insertions(+) create mode 100644 changelog/16.0/16.0.1/summary.md diff --git a/changelog/16.0/16.0.1/summary.md b/changelog/16.0/16.0.1/summary.md new file mode 100644 index 00000000000..e2a393310ba --- /dev/null +++ b/changelog/16.0/16.0.1/summary.md @@ -0,0 +1,9 @@ +## Summary + +### Upgrade to `go1.20.2` + +Vitess `v16.0.1` now runs on `go1.20.2`. +Below is a summary of this Go patch release. You can learn more [here](https://go.dev/doc/devel/release#go1.20). + +> go1.20.2 (released 2023-03-07) includes a security fix to the crypto/elliptic package, as well as bug fixes to the compiler, the covdata command, the linker, the runtime, and the crypto/ecdh, crypto/rsa, crypto/x509, os, and syscall packages. + diff --git a/changelog/16.0/README.md b/changelog/16.0/README.md index 342df67eaea..2f085cdecb6 100644 --- a/changelog/16.0/README.md +++ b/changelog/16.0/README.md @@ -1,5 +1,7 @@ ## v16.0 The dedicated team for this release can be found [here](team.md). +* **[16.0.1](16.0.1)** + * **[16.0.0](16.0.0)** * [Changelog](16.0.0/changelog.md) * [Release Notes](16.0.0/release_notes.md) From 098913a2bb0bae0c6f5d6e24a9d5fb2a79088890 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 29 Mar 2023 21:15:24 +0530 Subject: [PATCH 081/233] Code freeze of release-16.0 (#12762) Signed-off-by: Manan Gupta --- .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 efe1d6e8856..1bb74feee50 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 adf10196760ad0b3991a7aa7a8580a544e6ddf88 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Thu, 30 Mar 2023 10:23:02 -0400 Subject: [PATCH 082/233] [Backport] Update topo {Get,Create}Keyspace to prevent invalid keyspace names (#12732) (#12771) * Update topo {Get,Create}Keyspace to prevent invalid keyspace names (#12732) * Update topo {Get,Create}Keyspace to prevent invalid keyspace names Signed-off-by: Andrew Mason * embarrassing Signed-off-by: Andrew Mason * docs, release notes Signed-off-by: Andrew Mason * only validate, do not correct Signed-off-by: Andrew Mason * broader restrictions via allow-list Signed-off-by: Andrew Mason * Revert "broader restrictions via allow-list" This reverts commit 5354d4f0025aba4649e32fa63d4894b430d19d1a. Signed-off-by: Andrew Mason * tighten up release notes scope Signed-off-by: Andrew Mason * Update go/vt/topo/keyspace.go Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Signed-off-by: Andrew Mason --------- Signed-off-by: Andrew Mason Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> * update notes and comments Signed-off-by: Andrew Mason --------- Signed-off-by: Andrew Mason Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> --- changelog/16.0/16.0.1/summary.md | 6 +++ go/vt/topo/keyspace.go | 23 +++++++++ go/vt/topo/topotests/keyspace_test.go | 72 +++++++++++++++++++++++++++ go/vt/vtorc/inst/keyspace_dao.go | 4 ++ 4 files changed, 105 insertions(+) create mode 100644 go/vt/topo/topotests/keyspace_test.go diff --git a/changelog/16.0/16.0.1/summary.md b/changelog/16.0/16.0.1/summary.md index e2a393310ba..05381d735bc 100644 --- a/changelog/16.0/16.0.1/summary.md +++ b/changelog/16.0/16.0.1/summary.md @@ -7,3 +7,9 @@ Below is a summary of this Go patch release. You can learn more [here](https://g > go1.20.2 (released 2023-03-07) includes a security fix to the crypto/elliptic package, as well as bug fixes to the compiler, the covdata command, the linker, the runtime, and the crypto/ecdh, crypto/rsa, crypto/x509, os, and syscall packages. +### Keyspace name validation in TopoServer + +Prior to v16.0.1, it was possible to create a keyspace with invalid characters, which would then be inaccessible to various cluster management operations. + + Keyspace names may no longer contain the forward slash ("/") character, and TopoServer's `GetKeyspace` and `CreateKeyspace` methods return an error if given such a name. + diff --git a/go/vt/topo/keyspace.go b/go/vt/topo/keyspace.go index aeacacb232f..3a0416c9032 100755 --- a/go/vt/topo/keyspace.go +++ b/go/vt/topo/keyspace.go @@ -18,6 +18,7 @@ package topo import ( "path" + "strings" "google.golang.org/protobuf/proto" @@ -54,6 +55,20 @@ func (ki *KeyspaceInfo) SetKeyspaceName(name string) { ki.keyspace = name } +var invalidKeyspaceNameChars = "/" + +// ValidateKeyspaceName checks if the provided name is a valid name for a +// keyspace. +// +// As of v16.0.1, "all invalid characters" is just the forward slash ("/"). +func ValidateKeyspaceName(name string) error { + if strings.ContainsAny(name, invalidKeyspaceNameChars) { + return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "keyspace name %s contains invalid characters; may not contain any of the following: %+v", name, strings.Split(invalidKeyspaceNameChars, "")) + } + + return nil +} + // GetServedFrom returns a Keyspace_ServedFrom record if it exists. func (ki *KeyspaceInfo) GetServedFrom(tabletType topodatapb.TabletType) *topodatapb.Keyspace_ServedFrom { for _, ksf := range ki.ServedFroms { @@ -161,6 +176,10 @@ func (ki *KeyspaceInfo) ComputeCellServedFrom(cell string) []*topodatapb.SrvKeys // CreateKeyspace wraps the underlying Conn.Create // and dispatches the event. func (ts *Server) CreateKeyspace(ctx context.Context, keyspace string, value *topodatapb.Keyspace) error { + if err := ValidateKeyspaceName(keyspace); err != nil { + return vterrors.Wrapf(err, "CreateKeyspace: %s", err) + } + data, err := proto.Marshal(value) if err != nil { return err @@ -181,6 +200,10 @@ func (ts *Server) CreateKeyspace(ctx context.Context, keyspace string, value *to // GetKeyspace reads the given keyspace and returns it func (ts *Server) GetKeyspace(ctx context.Context, keyspace string) (*KeyspaceInfo, error) { + if err := ValidateKeyspaceName(keyspace); err != nil { + return nil, vterrors.Wrapf(err, "GetKeyspace: %s", err) + } + keyspacePath := path.Join(KeyspacesPath, keyspace, KeyspaceFile) data, version, err := ts.globalCell.Get(ctx, keyspacePath) if err != nil { diff --git a/go/vt/topo/topotests/keyspace_test.go b/go/vt/topo/topotests/keyspace_test.go new file mode 100644 index 00000000000..b0b35c1421c --- /dev/null +++ b/go/vt/topo/topotests/keyspace_test.go @@ -0,0 +1,72 @@ +/* +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 topotests + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/topo/memorytopo" + "vitess.io/vitess/go/vt/vterrors" + + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/proto/vtrpc" +) + +func TestCreateKeyspace(t *testing.T) { + ts := memorytopo.NewServer("zone1") + ctx := context.Background() + + t.Run("valid name", func(t *testing.T) { + err := ts.CreateKeyspace(ctx, "ks", &topodatapb.Keyspace{}) + require.NoError(t, err) + }) + t.Run("invalid name", func(t *testing.T) { + err := ts.CreateKeyspace(ctx, "no/slashes/allowed", &topodatapb.Keyspace{}) + assert.Error(t, err) + assert.Equal(t, vtrpc.Code_INVALID_ARGUMENT, vterrors.Code(err), "%+v", err) + }) +} + +func TestGetKeyspace(t *testing.T) { + ts := memorytopo.NewServer("zone1") + ctx := context.Background() + + t.Run("valid name", func(t *testing.T) { + // First, create the keyspace. + err := ts.CreateKeyspace(ctx, "ks", &topodatapb.Keyspace{}) + require.NoError(t, err) + + // Now, get it. + ks, err := ts.GetKeyspace(ctx, "ks") + require.NoError(t, err) + assert.NotNil(t, ks) + }) + + t.Run("invalid name", func(t *testing.T) { + // We can't create the keyspace (because we can't create a keyspace + // with an invalid name), so we'll validate the error we get is *not* + // NOT_FOUND. + ks, err := ts.GetKeyspace(ctx, "no/slashes/allowed") + assert.Error(t, err) + assert.Equal(t, vtrpc.Code_INVALID_ARGUMENT, vterrors.Code(err), "%+v", err) + assert.Nil(t, ks) + }) +} diff --git a/go/vt/vtorc/inst/keyspace_dao.go b/go/vt/vtorc/inst/keyspace_dao.go index 7e55471854d..fe8d37af575 100644 --- a/go/vt/vtorc/inst/keyspace_dao.go +++ b/go/vt/vtorc/inst/keyspace_dao.go @@ -30,6 +30,10 @@ var ErrKeyspaceNotFound = errors.New("keyspace not found") // ReadKeyspace reads the vitess keyspace record. func ReadKeyspace(keyspaceName string) (*topo.KeyspaceInfo, error) { + if err := topo.ValidateKeyspaceName(keyspaceName); err != nil { + return nil, err + } + query := ` select keyspace_type, From d1ba6258ea2462d5d28d67661aace7b79bb7e27b Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 30 Mar 2023 21:20:45 +0530 Subject: [PATCH 083/233] Release of v16.0.1 (#12765) * Release notes for 16.0.1 Signed-off-by: Manan Gupta * Release commit for 16.0.1 Signed-off-by: Manan Gupta * feat: fix release notes folder Signed-off-by: Manan Gupta * rebase after 12732 Signed-off-by: Florent Poinsard --------- Signed-off-by: Manan Gupta Signed-off-by: Florent Poinsard Co-authored-by: Florent Poinsard --- .github/workflows/code_freeze.yml | 2 +- changelog/16.0/16.0.1/changelog.md | 71 +++++++++++++++++++ changelog/16.0/16.0.1/release_notes.md | 18 +++++ 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 | 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 +- 19 files changed, 171 insertions(+), 82 deletions(-) create mode 100644 changelog/16.0/16.0.1/changelog.md create mode 100644 changelog/16.0/16.0.1/release_notes.md diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 1bb74feee50..efe1d6e8856 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/16.0/16.0.1/changelog.md b/changelog/16.0/16.0.1/changelog.md new file mode 100644 index 00000000000..47ea58c2469 --- /dev/null +++ b/changelog/16.0/16.0.1/changelog.md @@ -0,0 +1,71 @@ +# Changelog of Vitess v16.0.1 + +### Bug fixes +#### Build/CI + * Fix `TestFuzz` that hangs on `go1.20.1` [#12514](https://github.com/vitessio/vitess/pull/12514) + * Fix dubious ownership of git directory in `vitess/base` Docker build [#12530](https://github.com/vitessio/vitess/pull/12530) +#### 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 + * Fix initialization code to also stop replication to prevent crash [#12534](https://github.com/vitessio/vitess/pull/12534) + * [Backport] Update topo {Get,Create}Keyspace to prevent invalid keyspace names [#12732](https://github.com/vitessio/vitess/pull/12732) +#### General + * Fixing backup tests flakiness [#12655](https://github.com/vitessio/vitess/pull/12655) + * [release-16.0] Port two flaky test fixes #12603 and #12546 [#12745](https://github.com/vitessio/vitess/pull/12745) +#### Observability + * Reset the current lag when closing the replication lag reader. [#12683](https://github.com/vitessio/vitess/pull/12683) +#### Online DDL + * Throttler: Store Config in Global Keyspace Topo Record [#12520](https://github.com/vitessio/vitess/pull/12520) + * v16: Online DDL: enforce ALGORITHM=COPY on shadow table [#12522](https://github.com/vitessio/vitess/pull/12522) + * Mysqld.GetSchema: tolerate tables being dropped while inspecting schema [#12641](https://github.com/vitessio/vitess/pull/12641) +#### Query Serving + * 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-16.0] `ApplyVSchemaDDL`: escape Sequence names when writing the VSchema (#12519) [#12599](https://github.com/vitessio/vitess/pull/12599) + * [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) + * Always add columns in the `Derived` operator [#12634](https://github.com/vitessio/vitess/pull/12634) + * planner: fix predicate simplifier [#12650](https://github.com/vitessio/vitess/pull/12650) + * [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) + * [planner fix] make unknown column an error only for sharded queries [#12704](https://github.com/vitessio/vitess/pull/12704) +#### VReplication + * VStreamer: improve representation of integers in json data types [#12630](https://github.com/vitessio/vitess/pull/12630) +#### VTorc + * Fix unhandled error in VTOrc `recoverDeadPrimary` [#12510](https://github.com/vitessio/vitess/pull/12510) +### CI/Build +#### Build/CI + * [release-16.0] Make upgrade downgrade job names unique [#12499](https://github.com/vitessio/vitess/pull/12499) +#### Examples + * Examples, Flakes: Wait for Shard's VReplication Engine to Open [#12560](https://github.com/vitessio/vitess/pull/12560) +#### General + * [release-16.0] Upgrade the Golang version to `go1.20.2` [#12723](https://github.com/vitessio/vitess/pull/12723) +#### Online DDL + * CI: extend timeouts in onlineddl_vrepl due to slow CI runners [#12583](https://github.com/vitessio/vitess/pull/12583) + * [release-16.0] CI: increase overall test timeouts for all OnlineDDL tests (#12584) [#12589](https://github.com/vitessio/vitess/pull/12589) +### Enhancement +#### Build/CI + * Auto upgrade the Golang version [#12585](https://github.com/vitessio/vitess/pull/12585) +### Internal Cleanup +#### Build/CI + * Run launchable only on PRs against `main` [#12694](https://github.com/vitessio/vitess/pull/12694) +#### General + * Add a known issue into the release notes for xtrabackup and DDLs [#12536](https://github.com/vitessio/vitess/pull/12536) +### Release +#### Build/CI + * [release-16.0] Tooling improvements backports [#12528](https://github.com/vitessio/vitess/pull/12528) +#### Documentation + * Re-organize the `releasenotes` directory into `changelog` [#12566](https://github.com/vitessio/vitess/pull/12566) + * Addition of the `v16.0.1` release summary [#12751](https://github.com/vitessio/vitess/pull/12751) +#### General + * Back to dev mode after v16.0.0 [#12515](https://github.com/vitessio/vitess/pull/12515) + * Release 16.0 code freeze for 16.0.1 patch release [#12762](https://github.com/vitessio/vitess/pull/12762) +#### VTAdmin + * Add the vtadmin `web` directory to the release packages [#12639](https://github.com/vitessio/vitess/pull/12639) +### Testing +#### General + * Fix fullstatus test for backward compat [#12685](https://github.com/vitessio/vitess/pull/12685) +#### VReplication + * Flakes: Use new healthy shard check in vreplication e2e tests [#12502](https://github.com/vitessio/vitess/pull/12502) + diff --git a/changelog/16.0/16.0.1/release_notes.md b/changelog/16.0/16.0.1/release_notes.md new file mode 100644 index 00000000000..6d9ea0d2017 --- /dev/null +++ b/changelog/16.0/16.0.1/release_notes.md @@ -0,0 +1,18 @@ +# Release of Vitess v16.0.1 +## Summary + +### Upgrade to `go1.20.2` + +Vitess `v16.0.1` now runs on `go1.20.2`. +Below is a summary of this Go patch release. You can learn more [here](https://go.dev/doc/devel/release#go1.20). + +> go1.20.2 (released 2023-03-07) includes a security fix to the crypto/elliptic package, as well as bug fixes to the compiler, the covdata command, the linker, the runtime, and the crypto/ecdh, crypto/rsa, crypto/x509, os, and syscall packages. + + +------------ +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/16.0/16.0.1/changelog.md). + +The release includes 39 commits (excluding merges) + +Thanks to all our contributors: @GuptaManan100, @ajm188, @frouioui, @github-actions[bot], @mattlord, @rohit-nayak-ps, @rsajwani, @shlomi-noach, @systay, @vitess-bot[bot] + diff --git a/docker/release.sh b/docker/release.sh index f7c7fc911e8..cb59436d0f9 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.1-SNAPSHOT' +vt_base_version='v16.0.1' 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 caed2f8b2aa..537f29a9156 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:v16.0.0 + image: vitess/lite:v16.0.1 ports: - "15000:$WEB_PORT" - "$GRPC_PORT" @@ -81,7 +81,7 @@ services: condition: service_healthy vtgate: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 ports: - "15099:$WEB_PORT" - "$GRPC_PORT" @@ -111,7 +111,7 @@ services: condition: service_healthy schemaload: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 command: - sh - -c @@ -144,12 +144,12 @@ services: environment: - KEYSPACES=$KEYSPACE - GRPC_PORT=15999 - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - .:/script vttablet100: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 ports: - "15100:$WEB_PORT" - "$GRPC_PORT" @@ -181,7 +181,7 @@ services: retries: 15 vttablet101: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 ports: - "15101:$WEB_PORT" - "$GRPC_PORT" @@ -213,7 +213,7 @@ services: retries: 15 vttablet102: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 ports: - "15102:$WEB_PORT" - "$GRPC_PORT" @@ -245,7 +245,7 @@ services: retries: 15 vttablet103: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 ports: - "15103:$WEB_PORT" - "$GRPC_PORT" @@ -277,7 +277,7 @@ services: retries: 15 vtorc: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 command: ["sh", "-c", "/script/vtorc-up.sh"] depends_on: - vtctld @@ -307,7 +307,7 @@ services: retries: 15 vreplication: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - ".:/script" environment: diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index 9dc6af7132f..d8e516a1b42 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - .:/script set_keyspace_durability_policy: @@ -115,7 +115,7 @@ services: environment: - KEYSPACES=test_keyspace lookup_keyspace - GRPC_PORT=15999 - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - .:/script vtctld: @@ -143,7 +143,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 ports: - 15000:8080 - "15999" @@ -160,7 +160,7 @@ services: --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 ports: - 15099:8080 - "15999" @@ -182,7 +182,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 ports: - 15302:8080 - "15999" diff --git a/examples/compose/vtcompose/docker-compose.test.yml b/examples/compose/vtcompose/docker-compose.test.yml index f31665ade16..47c7bd76d15 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - .:/script set_keyspace_durability_policy_test_keyspace: @@ -117,7 +117,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=test_keyspace - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - .:/script set_keyspace_durability_policy_unsharded_keyspace: @@ -130,7 +130,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=unsharded_keyspace - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - .:/script vtctld: @@ -159,7 +159,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 ports: - 15000:8080 - "15999" @@ -176,7 +176,7 @@ services: ''grpc-vtgateservice'' --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 ports: - 15099:8080 - "15999" @@ -199,7 +199,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 ports: - 15301:8080 - "15999" diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index b0c182b8765..5830360602b 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 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:v16.0.0 + image: vitess/lite:v16.0.1 ports: - "15000:%[1]d" - "%[2]d" @@ -696,7 +696,7 @@ func generateVtgate(opts vtOptions) string { - op: add path: /services/vtgate value: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 ports: - "15099:%[1]d" - "%[2]d" @@ -738,7 +738,7 @@ func generateVTOrc(dbInfo externalDbInfo, keyspaceInfoMap map[string]keyspaceInf - op: add path: /services/vtorc value: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - ".:/script" environment: @@ -763,7 +763,7 @@ func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - op: add path: /services/vreplication value: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - ".:/script" environment: @@ -791,7 +791,7 @@ func generateSetKeyspaceDurabilityPolicy( - op: add path: /services/set_keyspace_durability_policy_%[3]s value: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - ".:/script" environment: @@ -828,7 +828,7 @@ func generateSchemaload( - op: add path: /services/schemaload_%[7]s value: - image: vitess/lite:v16.0.0 + image: vitess/lite:v16.0.1 volumes: - ".:/script" environment: diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index 325e1291515..322fce06259 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:v16.0.0 - vtadmin: vitess/vtadmin:v16.0.0 - vtgate: vitess/lite:v16.0.0 - vttablet: vitess/lite:v16.0.0 - vtbackup: vitess/lite:v16.0.0 - vtorc: vitess/lite:v16.0.0 + vtctld: vitess/lite:v16.0.1 + vtadmin: vitess/vtadmin:v16.0.1 + vtgate: vitess/lite:v16.0.1 + vttablet: vitess/lite:v16.0.1 + vtbackup: vitess/lite:v16.0.1 + vtorc: vitess/lite:v16.0.1 mysqld: - mysql80Compatible: vitess/lite:v16.0.0 + mysql80Compatible: vitess/lite:v16.0.1 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 448c8a7190d..538164bc818 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:v16.0.0 - vtadmin: vitess/vtadmin:v16.0.0 - vtgate: vitess/lite:v16.0.0 - vttablet: vitess/lite:v16.0.0 - vtbackup: vitess/lite:v16.0.0 - vtorc: vitess/lite:v16.0.0 + vtctld: vitess/lite:v16.0.1 + vtadmin: vitess/vtadmin:v16.0.1 + vtgate: vitess/lite:v16.0.1 + vttablet: vitess/lite:v16.0.1 + vtbackup: vitess/lite:v16.0.1 + vtorc: vitess/lite:v16.0.1 mysqld: - mysql80Compatible: vitess/lite:v16.0.0 + mysql80Compatible: vitess/lite:v16.0.1 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 d05d790565a..89348f589ce 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:v16.0.0 - vtadmin: vitess/vtadmin:v16.0.0 - vtgate: vitess/lite:v16.0.0 - vttablet: vitess/lite:v16.0.0 - vtbackup: vitess/lite:v16.0.0 - vtorc: vitess/lite:v16.0.0 + vtctld: vitess/lite:v16.0.1 + vtadmin: vitess/vtadmin:v16.0.1 + vtgate: vitess/lite:v16.0.1 + vttablet: vitess/lite:v16.0.1 + vtbackup: vitess/lite:v16.0.1 + vtorc: vitess/lite:v16.0.1 mysqld: - mysql80Compatible: vitess/lite:v16.0.0 + mysql80Compatible: vitess/lite:v16.0.1 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 9d31fa0d730..61511535834 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:v16.0.0 - vtadmin: vitess/vtadmin:v16.0.0 - vtgate: vitess/lite:v16.0.0 - vttablet: vitess/lite:v16.0.0 - vtbackup: vitess/lite:v16.0.0 - vtorc: vitess/lite:v16.0.0 + vtctld: vitess/lite:v16.0.1 + vtadmin: vitess/vtadmin:v16.0.1 + vtgate: vitess/lite:v16.0.1 + vttablet: vitess/lite:v16.0.1 + vtbackup: vitess/lite:v16.0.1 + vtorc: vitess/lite:v16.0.1 mysqld: - mysql80Compatible: vitess/lite:v16.0.0 + mysql80Compatible: vitess/lite:v16.0.1 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/operator.yaml b/examples/operator/operator.yaml index 9429889a686..078a4d229b0 100644 --- a/examples/operator/operator.yaml +++ b/examples/operator/operator.yaml @@ -6145,7 +6145,7 @@ spec: fieldPath: metadata.name - name: OPERATOR_NAME value: vitess-operator - image: planetscale/vitess-operator:v2.9.0 + image: planetscale/vitess-operator:v2.9.1 name: vitess-operator resources: limits: diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index ca41e7115a0..e5b12224e29 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 = "16.0.1-SNAPSHOT" +const versionName = "16.0.1" diff --git a/java/client/pom.xml b/java/client/pom.xml index 932e48a15f1..eb55d5b7197 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.1-SNAPSHOT + 16.0.1 vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index d90df15d5a5..2837bb96909 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.1-SNAPSHOT + 16.0.1 vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index ff12fbb6fd6..587ccdb8d69 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.1-SNAPSHOT + 16.0.1 vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index c85f2c7c246..66463a5f26c 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.1-SNAPSHOT + 16.0.1 vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 76ea7fbca72..1accf313409 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.1-SNAPSHOT + 16.0.1 pom Vitess Java Client libraries [Parent] From 2d2d1df083f652916ef2ba8db3b642329db5f2ad Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 30 Mar 2023 22:09:31 +0530 Subject: [PATCH 084/233] Back to dev mode (#12783) Signed-off-by: Manan Gupta --- 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 cb59436d0f9..80d520b396f 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.1' +vt_base_version='v16.0.2-SNAPSHOT' debian_versions='buster bullseye' default_debian_version='bullseye' diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index e5b12224e29..6a46ff3b1ff 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 = "16.0.1" +const versionName = "16.0.2-SNAPSHOT" diff --git a/java/client/pom.xml b/java/client/pom.xml index eb55d5b7197..25b0e3b5bf3 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.1 + 16.0.2-SNAPSHOT vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 2837bb96909..73100791351 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.1 + 16.0.2-SNAPSHOT vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 587ccdb8d69..358f3ffdca7 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.1 + 16.0.2-SNAPSHOT vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 66463a5f26c..422ae68d497 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.1 + 16.0.2-SNAPSHOT vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 1accf313409..2c828968ea8 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.1 + 16.0.2-SNAPSHOT pom Vitess Java Client libraries [Parent] From 984793fdd4584cdfb64c3d106df167384ddba624 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Fri, 31 Mar 2023 12:46:47 +0200 Subject: [PATCH 085/233] Remove unnecessary code bits in workflows (#12756) (#12775) Signed-off-by: Florent Poinsard --- .github/workflows/create_release.yml | 6 ------ .github/workflows/docker_test_cluster_10.yml | 7 ------- .github/workflows/docker_test_cluster_25.yml | 7 ------- .github/workflows/endtoend.yml | 7 ------- .github/workflows/sonar_analysis.yml | 6 ------ .github/workflows/static_checks_etc.yml | 7 ------- .../workflows/upgrade_downgrade_test_backups_manual.yml | 7 ------- .../upgrade_downgrade_test_backups_manual_next_release.yml | 7 ------- 8 files changed, 54 deletions(-) diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 9fbcd4186f0..fd113bd9c72 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -22,12 +22,6 @@ jobs: run: | sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - # TEMPORARY WHILE GITHUB FIXES THIS https://github.com/actions/virtual-environments/issues/3185 - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index df033ad134e..554bb80ba56 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -61,13 +61,6 @@ jobs: echo "value: " ${{steps.skip-workflow.outputs.skip-workflow}} sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - # TEMPORARY WHILE GITHUB FIXES THIS https://github.com/actions/virtual-environments/issues/3185 - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - - name: Run tests which require docker - 1 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index 32b82f776e6..a0f4b1de68b 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -60,13 +60,6 @@ jobs: run: | sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - # TEMPORARY WHILE GITHUB FIXES THIS https://github.com/actions/virtual-environments/issues/3185 - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - - name: Run tests which require docker - 2 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index 4bc81975dd1..98d70d79f3b 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -58,13 +58,6 @@ jobs: run: | sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - # TEMPORARY WHILE GITHUB FIXES THIS https://github.com/actions/virtual-environments/issues/3185 - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index 56e8bd5d9c0..3ba308f20ae 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -18,12 +18,6 @@ jobs: run: | sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - # TEMPORARY WHILE GITHUB FIXES THIS https://github.com/actions/virtual-environments/issues/3185 - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 9fb564d2ac6..ecfd23d70a1 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -112,13 +112,6 @@ jobs: run: | sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - # TEMPORARY WHILE GITHUB FIXES THIS https://github.com/actions/virtual-environments/issues/3185 - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - - name: Run go fmt if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' run: | diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 9f65063d732..472a505ab1b 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -96,13 +96,6 @@ jobs: run: | sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - # TEMPORARY WHILE GITHUB FIXES THIS https://github.com/actions/virtual-environments/issues/3185 - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - - name: Get base dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | 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 a7ba240af46..c6338164b26 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -99,13 +99,6 @@ jobs: run: | sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - # TEMPORARY WHILE GITHUB FIXES THIS https://github.com/actions/virtual-environments/issues/3185 - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - - name: Get base dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | From f2c1c13be5205fe91d564aa60796eb690e7a7bd6 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Fri, 31 Mar 2023 14:05:58 -0400 Subject: [PATCH 086/233] [release-16.0] Throttler: Expose Tablet's Config & Leverage to Deflake Tests (#12791) * Throttler: Expose Tablet's Config & Leverage to Deflake Tests (#12737) * Flakes: effectively disable vtorc for deterministic behavior For example, we stop replication, wait a few seconds, then expect there to be lag. But vtorc could repair replication during that wait and then the lag is gone. Signed-off-by: Matt Lord * Wait for the throttler to be up and running everywhere Signed-off-by: Matt Lord * Expose tablet's throttler config and leverage to deflake tests Signed-off-by: Matt Lord * Apply various corrections Signed-off-by: Matt Lord * Be more explicit about VTOrc behavior changes Signed-off-by: Matt Lord * Note received throttler response when it is unexpected Signed-off-by: Matt Lord * Fixes from local testing Signed-off-by: Matt Lord * Nits from self review Signed-off-by: Matt Lord * Use assert.Equalf on failed assertions Signed-off-by: Matt Lord * Ummm, duh. Signed-off-by: Matt Lord * Try to get rid of last bit of flakiness Which seemed to revolve around NOT sleeping long enough after starting all the sleep queries. Signed-off-by: Matt Lord * Nits from self review Signed-off-by: Matt Lord * Address review comments Signed-off-by: Matt Lord * Adjust test for behavior and comment it And adjust timing Signed-off-by: Matt Lord * Align both stale hearbeat checks Signed-off-by: Matt Lord * Remove no longer needed flag This is because enabling heartbeats with --heartbeat_enable also results in the replication reporter being enabled: https://github.com/vitessio/vitess/blob/3d9ef871e42bd20a60ec95997c97ecf0694c1e78/go/vt/vttablet/tabletserver/tabletenv/config.go#L235-L237 Signed-off-by: Matt Lord * Correct comment Signed-off-by: Matt Lord * Correct comment part II: electric boogaloo Signed-off-by: Matt Lord * Revert one other minor unnecessary change. Signed-off-by: Matt Lord --------- Signed-off-by: Matt Lord * Post cherry-pick fixup Signed-off-by: Matt Lord --------- Signed-off-by: Matt Lord --- examples/common/scripts/vttablet-up.sh | 2 +- go/flags/endtoend/vttablet.txt | 2 +- .../onlineddl/vrepl/onlineddl_vrepl_test.go | 5 +- go/test/endtoend/onlineddl/vtctlutil.go | 50 ----- .../throttler_topo/throttler_test.go | 168 ++++++++------ go/test/endtoend/throttler/util.go | 212 ++++++++++++++++++ .../tabletserver/throttle/throttler.go | 17 +- 7 files changed, 334 insertions(+), 122 deletions(-) create mode 100644 go/test/endtoend/throttler/util.go diff --git a/examples/common/scripts/vttablet-up.sh b/examples/common/scripts/vttablet-up.sh index 0e70837d235..d22fd33ab48 100755 --- a/examples/common/scripts/vttablet-up.sh +++ b/examples/common/scripts/vttablet-up.sh @@ -46,7 +46,6 @@ vttablet \ --init_shard $shard \ --init_tablet_type $tablet_type \ --health_check_interval 5s \ - --enable_replication_reporter \ --backup_storage_implementation file \ --file_backup_storage_root $VTDATAROOT/backups \ --restore_from_backup \ @@ -56,6 +55,7 @@ vttablet \ --pid_file $VTDATAROOT/$tablet_dir/vttablet.pid \ --vtctld_addr http://$hostname:$vtctld_web_port/ \ --disable_active_reparents \ + --throttler-config-via-topo --heartbeat_enable --heartbeat_interval=250ms --heartbeat_on_demand_duration=5s \ > $VTDATAROOT/$tablet_dir/vttablet.out 2>&1 & # Block waiting for the tablet to be listening diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index cc3d4a275d0..32160387009 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -300,7 +300,7 @@ Usage of vttablet: --tablet_protocol string Protocol to use to make queryservice RPCs to vttablets. (default "grpc") --throttle_check_as_check_self Should throttler/check return a throttler/check-self result (changes throttler behavior for writes) --throttle_metrics_query SELECT Override default heartbeat/lag metric. Use either SELECT (must return single row, single value) or `SHOW GLOBAL ... LIKE ...` queries. Set -throttle_metrics_threshold respectively. - --throttle_metrics_threshold float Override default throttle threshold, respective to -throttle_metrics_query (default 1.7976931348623157e+308) + --throttle_metrics_threshold float Override default throttle threshold, respective to --throttle_metrics_query (default 1.7976931348623157e+308) --throttle_tablet_types string Comma separated VTTablet types to be considered by the throttler. default: 'replica'. example: 'replica,rdonly'. 'replica' aways implicitly included (default "replica") --throttle_threshold duration Replication lag threshold for default lag throttling (default 1s) --throttler-config-via-topo When 'true', read config from topo service and ignore throttle_threshold, throttle_metrics_threshold, throttle_metrics_query, throttle_check_as_check_self diff --git a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go index 001ded3d9cb..ec6eed14f17 100644 --- a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go +++ b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go @@ -30,6 +30,7 @@ import ( "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/onlineddl" + "vitess.io/vitess/go/test/endtoend/throttler" "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" throttlebase "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" @@ -259,13 +260,13 @@ func TestSchemaChange(t *testing.T) { err := clusterInstance.WaitForTabletsToHealthyInVtgate() require.NoError(t, err) - _, err = onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, 0, "", false) + _, err = throttler.UpdateThrottlerTopoConfig(clusterInstance, true, false, 0, "", false) require.NoError(t, err) for _, ks := range clusterInstance.Keyspaces { for _, shard := range ks.Shards { for _, tablet := range shard.Vttablets { - onlineddl.WaitForThrottlerStatusEnabled(t, tablet, extendedMigrationWait) + throttler.WaitForThrottlerStatusEnabled(t, tablet, true, nil, extendedMigrationWait) } } } diff --git a/go/test/endtoend/onlineddl/vtctlutil.go b/go/test/endtoend/onlineddl/vtctlutil.go index 62cc681eab1..d2da7327e3a 100644 --- a/go/test/endtoend/onlineddl/vtctlutil.go +++ b/go/test/endtoend/onlineddl/vtctlutil.go @@ -17,8 +17,6 @@ limitations under the License. package onlineddl import ( - "context" - "fmt" "testing" "time" @@ -36,51 +34,3 @@ func CheckCancelAllMigrationsViaVtctl(t *testing.T, vtctlclient *cluster.VtctlCl _, err := vtctlclient.ApplySchemaWithOutput(keyspace, cancelQuery, cluster.VtctlClientParams{SkipPreflight: true}) assert.NoError(t, err) } - -// UpdateThrottlerTopoConfig runs vtctlclient UpdateThrottlerConfig. -// This retries the command until it succeeds or times out as the -// SrvKeyspace record may not yet exist for a newly created -// Keyspace that is still initializing before it becomes serving. -func UpdateThrottlerTopoConfig(clusterInstance *cluster.LocalProcessCluster, enable bool, disable bool, threshold float64, metricsQuery string, viaVtctldClient bool) (result string, err error) { - args := []string{} - clientfunc := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput - if !viaVtctldClient { - args = append(args, "--") - clientfunc = clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput - } - args = append(args, "UpdateThrottlerConfig") - if enable { - args = append(args, "--enable") - } - if disable { - args = append(args, "--disable") - } - if threshold > 0 { - args = append(args, "--threshold", fmt.Sprintf("%f", threshold)) - } - if metricsQuery != "" { - args = append(args, "--custom-query", metricsQuery) - args = append(args, "--check-as-check-self") - } else { - args = append(args, "--check-as-check-shard") - } - args = append(args, clusterInstance.Keyspaces[0].Name) - - ctx, cancel := context.WithTimeout(context.Background(), throttlerConfigTimeout) - defer cancel() - - ticker := time.NewTicker(time.Second) - defer ticker.Stop() - - for { - result, err = clientfunc(args...) - if err == nil { - return result, nil - } - select { - case <-ctx.Done(): - return "", fmt.Errorf("timed out waiting for UpdateThrottlerConfig to succeed after %v. Last seen value: %+v, error: %v", throttlerConfigTimeout, result, err) - case <-ticker.C: - } - } -} diff --git a/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go b/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go index 78daaed63a0..fe87262a21f 100644 --- a/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go +++ b/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go @@ -31,12 +31,22 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" "vitess.io/vitess/go/test/endtoend/cluster" - "vitess.io/vitess/go/test/endtoend/onlineddl" + "vitess.io/vitess/go/test/endtoend/throttler" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +const ( + customQuery = "show global status like 'threads_running'" + customThreshold = 5 * time.Second + unreasonablyLowThreshold = 1 * time.Millisecond + extremelyHighThreshold = 1 * time.Hour + onDemandHeartbeatDuration = 5 * time.Second + throttlerEnabledTimeout = 60 * time.Second + useDefaultQuery = "" +) + var ( clusterInstance *cluster.LocalProcessCluster primaryTablet *cluster.Vttablet @@ -77,16 +87,10 @@ var ( throttledAppsAPIPath = "throttler/throttled-apps" checkAPIPath = "throttler/check" checkSelfAPIPath = "throttler/check-self" - customQuery = "show global status like 'threads_running'" - customThreshold = 5 -) - -const ( - throttlerThreshold = 1 * time.Second // standard, tight threshold - unreasonablyLowThreshold = 1 * time.Millisecond - extremelyHighThreshold = 1 * time.Hour - onDemandHeartbeatDuration = 5 * time.Second - applyConfigWait = 15 * time.Second // time after which we're sure the throttler has refreshed config and tablets + getResponseBody = func(resp *http.Response) string { + body, _ := io.ReadAll(resp.Body) + return string(body) + } ) func TestMain(m *testing.M) { @@ -109,7 +113,6 @@ func TestMain(m *testing.M) { "--watch_replication_stream", "--enable_replication_reporter", "--throttler-config-via-topo", - "--throttle_threshold", throttlerThreshold.String(), "--heartbeat_enable", "--heartbeat_interval", "250ms", "--heartbeat_on_demand_duration", onDemandHeartbeatDuration.String(), @@ -191,7 +194,7 @@ func warmUpHeartbeat(t *testing.T) (respStatus int) { // waitForThrottleCheckStatus waits for the tablet to return the provided HTTP code in a throttle check func waitForThrottleCheckStatus(t *testing.T, tablet *cluster.Vttablet, wantCode int) { _ = warmUpHeartbeat(t) - ctx, cancel := context.WithTimeout(context.Background(), onDemandHeartbeatDuration+applyConfigWait) + ctx, cancel := context.WithTimeout(context.Background(), onDemandHeartbeatDuration*4) defer cancel() for { @@ -210,7 +213,7 @@ func waitForThrottleCheckStatus(t *testing.T, tablet *cluster.Vttablet, wantCode require.NoError(t, err) resp.Body.Close() - assert.Equal(t, wantCode, resp.StatusCode, "body: %v", string(b)) + assert.Equalf(t, wantCode, resp.StatusCode, "body: %s", string(b)) return default: resp.Body.Close() @@ -243,37 +246,64 @@ func TestInitialThrottler(t *testing.T) { t.Run("validating OK response from disabled throttler", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) }) - t.Run("enabling throttler with low threshold", func(t *testing.T) { - _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, unreasonablyLowThreshold.Seconds(), "", false) + t.Run("enabling throttler with very low threshold", func(t *testing.T) { + _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, true, false, unreasonablyLowThreshold.Seconds(), useDefaultQuery, false) assert.NoError(t, err) + + // Wait for the throttler to be enabled everywhere with the new config. + for _, tablet := range clusterInstance.Keyspaces[0].Shards[0].Vttablets { + throttler.WaitForThrottlerStatusEnabled(t, tablet, true, &throttler.Config{Query: throttler.DefaultQuery, Threshold: unreasonablyLowThreshold.Seconds()}, throttlerEnabledTimeout) + } }) t.Run("validating pushback response from throttler", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) }) t.Run("disabling throttler", func(t *testing.T) { - _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, false, true, unreasonablyLowThreshold.Seconds(), "", false) + _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, false, true, unreasonablyLowThreshold.Seconds(), useDefaultQuery, false) assert.NoError(t, err) + + // Wait for the throttler to be disabled everywhere. + for _, tablet := range clusterInstance.Keyspaces[0].Shards[0].Vttablets { + throttler.WaitForThrottlerStatusEnabled(t, tablet, false, nil, throttlerEnabledTimeout) + } }) t.Run("validating OK response from disabled throttler, again", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) }) t.Run("enabling throttler, again", func(t *testing.T) { - _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, 0, "", true) + // Enable the throttler again with the default query which also moves us back + // to the default threshold. + _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, true, false, 0, useDefaultQuery, true) assert.NoError(t, err) + + // Wait for the throttler to be enabled everywhere again with the default config. + for _, tablet := range clusterInstance.Keyspaces[0].Shards[0].Vttablets { + throttler.WaitForThrottlerStatusEnabled(t, tablet, true, throttler.DefaultConfig, throttlerEnabledTimeout) + } }) t.Run("validating pushback response from throttler, again", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) }) t.Run("setting high threshold", func(t *testing.T) { - _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, false, false, extremelyHighThreshold.Seconds(), "", true) + _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, false, false, extremelyHighThreshold.Seconds(), useDefaultQuery, true) assert.NoError(t, err) + + // Wait for the throttler to be enabled everywhere with new config. + for _, tablet := range []cluster.Vttablet{*primaryTablet, *replicaTablet} { + throttler.WaitForThrottlerStatusEnabled(t, &tablet, true, &throttler.Config{Query: throttler.DefaultQuery, Threshold: extremelyHighThreshold.Seconds()}, throttlerEnabledTimeout) + } }) t.Run("validating OK response from throttler with high threshold", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) }) t.Run("setting low threshold", func(t *testing.T) { - _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, false, false, throttlerThreshold.Seconds(), "", true) + _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, false, false, throttler.DefaultThreshold.Seconds(), useDefaultQuery, true) assert.NoError(t, err) + + // Wait for the throttler to be enabled everywhere with new config. + for _, tablet := range clusterInstance.Keyspaces[0].Shards[0].Vttablets { + throttler.WaitForThrottlerStatusEnabled(t, tablet, true, throttler.DefaultConfig, throttlerEnabledTimeout) + } }) t.Run("validating pushback response from throttler on low threshold", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) @@ -287,16 +317,17 @@ func TestInitialThrottler(t *testing.T) { resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) }) t.Run("validating OK response from throttler with low threshold, heartbeats running still", func(t *testing.T) { time.Sleep(1 * time.Second) resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) }) t.Run("validating pushback response from throttler on low threshold once heartbeats go stale", func(t *testing.T) { + time.Sleep(2 * onDemandHeartbeatDuration) // just... really wait long enough, make sure on-demand stops waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) }) } @@ -306,7 +337,6 @@ func TestThrottlerAfterMetricsCollected(t *testing.T) { // By this time metrics will have been collected. We expect no lag, and something like: // {"StatusCode":200,"Value":0.282278,"Threshold":1,"Message":""} - // t.Run("validating throttler OK", func(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) }) @@ -314,50 +344,55 @@ func TestThrottlerAfterMetricsCollected(t *testing.T) { resp, body, err := throttledApps(primaryTablet) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) assert.Contains(t, body, "always-throttled-app") }) t.Run("validating primary check self", func(t *testing.T) { resp, err := throttleCheckSelf(primaryTablet) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) }) t.Run("validating replica check self", func(t *testing.T) { resp, err := throttleCheckSelf(replicaTablet) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) }) } func TestLag(t *testing.T) { defer cluster.PanicHandler(t) + // Temporarily disable VTOrc recoveries because we want to + // STOP replication specifically in order to increase the + // lag and we DO NOT want VTOrc to try and fix this. + clusterInstance.DisableVTOrcRecoveries(t) + defer clusterInstance.EnableVTOrcRecoveries(t) t.Run("stopping replication", func(t *testing.T) { err := clusterInstance.VtctlclientProcess.ExecuteCommand("StopReplication", replicaTablet.Alias) assert.NoError(t, err) }) t.Run("accumulating lag, expecting throttler push back", func(t *testing.T) { - time.Sleep(2 * throttlerThreshold) + time.Sleep(2 * throttler.DefaultThreshold) resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusTooManyRequests, resp.StatusCode) + assert.Equalf(t, http.StatusTooManyRequests, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) }) t.Run("primary self-check should still be fine", func(t *testing.T) { resp, err := throttleCheckSelf(primaryTablet) require.NoError(t, err) defer resp.Body.Close() // self (on primary) is unaffected by replication lag - assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) }) t.Run("replica self-check should show error", func(t *testing.T) { resp, err := throttleCheckSelf(replicaTablet) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusTooManyRequests, resp.StatusCode) + assert.Equalf(t, http.StatusTooManyRequests, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) }) t.Run("starting replication", func(t *testing.T) { err := clusterInstance.VtctlclientProcess.ExecuteCommand("StartReplication", replicaTablet.Alias) @@ -371,13 +406,13 @@ func TestLag(t *testing.T) { require.NoError(t, err) defer resp.Body.Close() // self (on primary) is unaffected by replication lag - assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) }) t.Run("replica self-check should be fine", func(t *testing.T) { resp, err := throttleCheckSelf(replicaTablet) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) }) } @@ -392,7 +427,6 @@ func TestNoReplicas(t *testing.T) { waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) }) t.Run("restoring to REPLICA", func(t *testing.T) { - err := clusterInstance.VtctlclientProcess.ExecuteCommand("ChangeTabletType", replicaTablet.Alias, "REPLICA") assert.NoError(t, err) @@ -403,25 +437,26 @@ func TestNoReplicas(t *testing.T) { func TestCustomQuery(t *testing.T) { defer cluster.PanicHandler(t) - t.Run("enabling throttler with low threshold", func(t *testing.T) { - _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, float64(customThreshold), customQuery, false) + t.Run("enabling throttler with custom query and threshold", func(t *testing.T) { + _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, true, false, customThreshold.Seconds(), customQuery, false) assert.NoError(t, err) - time.Sleep(applyConfigWait) + + // Wait for the throttler to be enabled everywhere with new custom config. + for _, tablet := range clusterInstance.Keyspaces[0].Shards[0].Vttablets { + throttler.WaitForThrottlerStatusEnabled(t, tablet, true, &throttler.Config{Query: customQuery, Threshold: customThreshold.Seconds()}, throttlerEnabledTimeout) + } }) t.Run("validating OK response from throttler with custom query", func(t *testing.T) { resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) defer resp.Body.Close() - - b, err := io.ReadAll(resp.Body) - assert.NoError(t, err) - assert.Equal(t, http.StatusOK, resp.StatusCode, "response: %v", string(b)) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) }) t.Run("test threads running", func(t *testing.T) { - sleepDuration := 10 * time.Second + sleepDuration := 20 * time.Second var wg sync.WaitGroup - for i := 0; i < customThreshold; i++ { - // generate different Sleep() calls, all at minimum sleepDuration + for i := 0; i < int(customThreshold.Seconds()); i++ { + // Generate different Sleep() calls, all at minimum sleepDuration. wg.Add(1) go func(i int) { defer wg.Done() @@ -429,26 +464,24 @@ func TestCustomQuery(t *testing.T) { }(i) } t.Run("exceeds threshold", func(t *testing.T) { - time.Sleep(sleepDuration / 2) - // by this time we will have testThreshold+1 threads_running, and we should hit the threshold - // {"StatusCode":429,"Value":2,"Threshold":2,"Message":"Threshold exceeded"} + throttler.WaitForQueryResult(t, primaryTablet, + "select if(variable_value > 5, 'true', 'false') as result from performance_schema.global_status where variable_name='threads_running'", + "true", sleepDuration/3) + throttler.WaitForValidData(t, primaryTablet, sleepDuration-(5*time.Second)) + // Now we should be reporting ~ customThreshold*2 threads_running, and we should + // hit the threshold. For example: + // {"StatusCode":429,"Value":6,"Threshold":5,"Message":"Threshold exceeded"} { resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) defer resp.Body.Close() - - b, err := io.ReadAll(resp.Body) - assert.NoError(t, err) - assert.Equal(t, http.StatusTooManyRequests, resp.StatusCode, "response: %v", string(b)) + assert.Equalf(t, http.StatusTooManyRequests, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) } { resp, err := throttleCheckSelf(primaryTablet) require.NoError(t, err) defer resp.Body.Close() - - b, err := io.ReadAll(resp.Body) - assert.NoError(t, err) - assert.Equal(t, http.StatusTooManyRequests, resp.StatusCode, "response: %v", string(b)) + assert.Equalf(t, http.StatusTooManyRequests, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) } }) t.Run("wait for queries to terminate", func(t *testing.T) { @@ -460,34 +493,39 @@ func TestCustomQuery(t *testing.T) { resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) } { resp, err := throttleCheckSelf(primaryTablet) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) } }) }) } func TestRestoreDefaultQuery(t *testing.T) { - // validte going back from custom-query to default-query (replication lag) still works defer cluster.PanicHandler(t) - t.Run("enabling throttler with standard threshold", func(t *testing.T) { - _, err := onlineddl.UpdateThrottlerTopoConfig(clusterInstance, true, false, throttlerThreshold.Seconds(), "", false) + // Validate going back from custom-query to default-query (replication lag) still works. + t.Run("enabling throttler with default query and threshold", func(t *testing.T) { + _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, true, false, throttler.DefaultThreshold.Seconds(), useDefaultQuery, false) assert.NoError(t, err) + + // Wait for the throttler to be up and running everywhere again with the default config. + for _, tablet := range clusterInstance.Keyspaces[0].Shards[0].Vttablets { + throttler.WaitForThrottlerStatusEnabled(t, tablet, true, throttler.DefaultConfig, throttlerEnabledTimeout) + } }) - t.Run("validating OK response from throttler with low threshold, heartbeats running", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) - }) - t.Run("validating pushback response from throttler on low threshold once heartbeats go stale", func(t *testing.T) { - time.Sleep(2 * onDemandHeartbeatDuration) // just... really wait long enough, make sure on-demand stops + t.Run("validating OK response from throttler with default threshold, heartbeats running", func(t *testing.T) { resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, http.StatusTooManyRequests, resp.StatusCode) + assert.Equalf(t, http.StatusOK, resp.StatusCode, "Unexpected response from throttler: %s", getResponseBody(resp)) + }) + t.Run("validating pushback response from throttler on default threshold once heartbeats go stale", func(t *testing.T) { + time.Sleep(2 * onDemandHeartbeatDuration) // just... really wait long enough, make sure on-demand stops + waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) }) } diff --git a/go/test/endtoend/throttler/util.go b/go/test/endtoend/throttler/util.go new file mode 100644 index 00000000000..e8769999fc1 --- /dev/null +++ b/go/test/endtoend/throttler/util.go @@ -0,0 +1,212 @@ +/* +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 throttler + +import ( + "context" + "fmt" + "io" + "net/http" + "testing" + "time" + + "github.com/buger/jsonparser" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/vt/log" +) + +type Config struct { + Query string + Threshold float64 +} + +const ( + DefaultQuery = "select unix_timestamp(now(6))-max(ts/1000000000) as replication_lag from _vt.heartbeat" + DefaultThreshold = 1 * time.Second + ConfigTimeout = 60 * time.Second +) + +var DefaultConfig = &Config{ + Query: DefaultQuery, + Threshold: DefaultThreshold.Seconds(), +} + +// UpdateThrottlerTopoConfig runs vtctlclient UpdateThrottlerConfig. +// This retries the command until it succeeds or times out as the +// SrvKeyspace record may not yet exist for a newly created +// Keyspace that is still initializing before it becomes serving. +func UpdateThrottlerTopoConfig(clusterInstance *cluster.LocalProcessCluster, enable bool, disable bool, threshold float64, metricsQuery string, viaVtctldClient bool) (result string, err error) { + args := []string{} + clientfunc := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput + if !viaVtctldClient { + args = append(args, "--") + clientfunc = clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput + } + args = append(args, "UpdateThrottlerConfig") + if enable { + args = append(args, "--enable") + } + if disable { + args = append(args, "--disable") + } + if threshold > 0 { + args = append(args, "--threshold", fmt.Sprintf("%f", threshold)) + } + args = append(args, "--custom-query", metricsQuery) + if metricsQuery != "" { + args = append(args, "--check-as-check-self") + } else { + args = append(args, "--check-as-check-shard") + } + args = append(args, clusterInstance.Keyspaces[0].Name) + + ctx, cancel := context.WithTimeout(context.Background(), ConfigTimeout) + defer cancel() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + result, err = clientfunc(args...) + if err == nil { + return result, nil + } + select { + case <-ctx.Done(): + return "", fmt.Errorf("timed out waiting for UpdateThrottlerConfig to succeed after %v; last seen value: %+v, error: %v", ConfigTimeout, result, err) + case <-ticker.C: + } + } +} + +// WaitForThrottlerStatusEnabled waits for a tablet to report its throttler status as +// enabled/disabled and have the provided config (if any) until the specified timeout. +func WaitForThrottlerStatusEnabled(t *testing.T, tablet *cluster.Vttablet, enabled bool, config *Config, timeout time.Duration) { + enabledJSONPath := "IsEnabled" + queryJSONPath := "Query" + thresholdJSONPath := "Threshold" + url := fmt.Sprintf("http://localhost:%d/throttler/status", tablet.HTTPPort) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + body := getHTTPBody(url) + isEnabled, err := jsonparser.GetBoolean([]byte(body), enabledJSONPath) + require.NoError(t, err) + if isEnabled == enabled { + if config == nil { + return + } + query, err := jsonparser.GetString([]byte(body), queryJSONPath) + require.NoError(t, err) + threshold, err := jsonparser.GetFloat([]byte(body), thresholdJSONPath) + require.NoError(t, err) + if query == config.Query && threshold == config.Threshold { + return + } + } + select { + case <-ctx.Done(): + t.Errorf("timed out waiting for the %s tablet's throttler status enabled to be %t with the correct config after %v; last seen value: %s", + tablet.Alias, enabled, timeout, body) + return + case <-ticker.C: + } + } +} + +func getHTTPBody(url string) string { + resp, err := http.Get(url) + if err != nil { + log.Infof("http Get returns %+v", err) + return "" + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + log.Infof("http Get returns status %d", resp.StatusCode) + return "" + } + respByte, _ := io.ReadAll(resp.Body) + body := string(respByte) + return body +} + +// WaitForQueryResult waits for a tablet to return the given result for the given +// query until the specified timeout. +// This is for simple queries that return 1 column in 1 row. It compares the result +// for that column as a string with the provided result. +func WaitForQueryResult(t *testing.T, tablet *cluster.Vttablet, query, result string, timeout time.Duration) { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + res, err := tablet.VttabletProcess.QueryTablet(query, "", false) + require.NoError(t, err) + if res != nil && len(res.Rows) == 1 && res.Rows[0][0].ToString() == result { + return + } + select { + case <-ctx.Done(): + t.Errorf("timed out waiting for the %q query to produce a result of %q on tablet %s after %v; last seen value: %s", + query, result, tablet.Alias, timeout, res.Rows[0][0].ToString()) + return + case <-ticker.C: + } + } +} + +// WaitForValidData waits for a tablet's checks to return a non 500 http response +// which indicates that it's not able to provide valid results. This is most +// commonly caused by the throttler still gathering the initial results for +// the given configuration. +func WaitForValidData(t *testing.T, tablet *cluster.Vttablet, timeout time.Duration) { + checkURL := fmt.Sprintf("http://localhost:%d/throttler/check", tablet.HTTPPort) + selfCheckURL := fmt.Sprintf("http://localhost:%d/throttler/check-self", tablet.HTTPPort) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + ticker := time.NewTicker(500 * time.Millisecond) + defer ticker.Stop() + + for { + checkResp, checkErr := http.Get(checkURL) + if checkErr != nil { + defer checkResp.Body.Close() + } + selfCheckResp, selfCheckErr := http.Get(selfCheckURL) + if selfCheckErr != nil { + defer selfCheckResp.Body.Close() + } + if checkErr == nil && selfCheckErr == nil && + checkResp.StatusCode != http.StatusInternalServerError && + selfCheckResp.StatusCode != http.StatusInternalServerError { + return + } + select { + case <-ctx.Done(): + t.Errorf("timed out waiting for %s tablet's throttler to return a valid result after %v; last seen value: %+v", + tablet.Alias, timeout, checkResp) + return + case <-ticker.C: + } + } +} diff --git a/go/vt/vttablet/tabletserver/throttle/throttler.go b/go/vt/vttablet/tabletserver/throttle/throttler.go index df415ddf582..9b04dd4bb21 100644 --- a/go/vt/vttablet/tabletserver/throttle/throttler.go +++ b/go/vt/vttablet/tabletserver/throttle/throttler.go @@ -81,7 +81,7 @@ func registerThrottlerFlags(fs *pflag.FlagSet) { fs.DurationVar(&throttleThreshold, "throttle_threshold", throttleThreshold, "Replication lag threshold for default lag throttling") fs.StringVar(&throttleMetricQuery, "throttle_metrics_query", throttleMetricQuery, "Override default heartbeat/lag metric. Use either `SELECT` (must return single row, single value) or `SHOW GLOBAL ... LIKE ...` queries. Set -throttle_metrics_threshold respectively.") - fs.Float64Var(&throttleMetricThreshold, "throttle_metrics_threshold", throttleMetricThreshold, "Override default throttle threshold, respective to -throttle_metrics_query") + fs.Float64Var(&throttleMetricThreshold, "throttle_metrics_threshold", throttleMetricThreshold, "Override default throttle threshold, respective to --throttle_metrics_query") fs.BoolVar(&throttlerCheckAsCheckSelf, "throttle_check_as_check_self", throttlerCheckAsCheckSelf, "Should throttler/check return a throttler/check-self result (changes throttler behavior for writes)") fs.BoolVar(&throttlerConfigViaTopo, "throttler-config-via-topo", throttlerConfigViaTopo, "When 'true', read config from topo service and ignore throttle_threshold, throttle_metrics_threshold, throttle_metrics_query, throttle_check_as_check_self") } @@ -164,6 +164,9 @@ type ThrottlerStatus struct { IsEnabled bool IsDormant bool + Query string + Threshold float64 + AggregatedMetrics map[string]base.MetricResult MetricsHealth base.MetricHealthMap } @@ -256,6 +259,10 @@ func (throttler *Throttler) GetMetricsQuery() string { return throttler.metricsQuery.Load().(string) } +func (throttler *Throttler) GetMetricsThreshold() float64 { + return throttler.MetricsThreshold.Get() +} + // initThrottler initializes config func (throttler *Throttler) initConfig() { log.Infof("Throttler: initializing config") @@ -310,8 +317,9 @@ func (throttler *Throttler) WatchSrvKeyspaceCallback(srvks *topodatapb.SrvKeyspa } throttlerConfig := throttler.normalizeThrottlerConfig(srvks.ThrottlerConfig) - if throttler.isEnabled > 0 { - // throttler is running and we should apply the config change through Operate() or else we get into race conditions + if throttler.IsEnabled() { + // Throttler is running and we should apply the config change through Operate() + // or else we get into race conditions. go func() { throttler.throttlerConfigChan <- throttlerConfig }() @@ -1031,6 +1039,9 @@ func (throttler *Throttler) Status() *ThrottlerStatus { IsEnabled: (atomic.LoadInt64(&throttler.isEnabled) > 0), IsDormant: throttler.isDormant(), + Query: throttler.GetMetricsQuery(), + Threshold: throttler.GetMetricsThreshold(), + AggregatedMetrics: throttler.aggregatedMetricsSnapshot(), MetricsHealth: throttler.metricsHealthSnapshot(), } From 5ee1e46db01ae16fa69f032b0be622369418a9e6 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Mon, 3 Apr 2023 10:32:17 +0200 Subject: [PATCH 087/233] Automatically add milestone to new Pull Request (#12759) (#12807) * Automatically add milestone to new Pull Request * Run the workflow on pull_request_target event * Use gh pr edit to add milestone * Use bash instead of go script --------- Signed-off-by: Florent Poinsard --- .github/workflows/assign_milestone.yml | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/assign_milestone.yml diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml new file mode 100644 index 00000000000..dcc698a8b50 --- /dev/null +++ b/.github/workflows/assign_milestone.yml @@ -0,0 +1,30 @@ +name: Assign Milestone + +on: + pull_request_target: + types: [opened] + +permissions: read-all + +env: + GH_TOKEN: ${{ github.token }} + +jobs: + build: + name: Assign Milestone + runs-on: ubuntu-22.04 + permissions: + pull-requests: write + + steps: + - name: Set up Go + uses: actions/setup-go@v3 + with: + go-version: 1.20.2 + + - name: Checkout code + uses: actions/checkout@v3 + + - name: Assign Milestone + run: | + gh pr edit ${{ github.event.number }} --milestone "v$(sed -n 's/.*versionName.*\"\([[:digit:]\.]*\).*\"/\1/p' ./go/vt/servenv/version.go)" From 126c523dd66ba40ec8a5c88b5b522d7e4e756620 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 13:54:43 +0200 Subject: [PATCH 088/233] [release-16.0] Fix incorrect path during release notes generation (#12769) (#12796) * Fix incorrect path during release notes generation Signed-off-by: Florent Poinsard * Apply review suggestion Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard Co-authored-by: Florent Poinsard --- go/tools/release-notes/release_notes.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/tools/release-notes/release_notes.go b/go/tools/release-notes/release_notes.go index e6e44e83e3e..72211dd88f2 100644 --- a/go/tools/release-notes/release_notes.go +++ b/go/tools/release-notes/release_notes.go @@ -511,7 +511,7 @@ func main() { // Define the path to the release notes folder majorVersion := versionMatch[1] + "." + versionMatch[2] - patchVersion := versionMatch[0] + patchVersion := versionMatch[1] + "." + versionMatch[2] + "." + versionMatch[3] releaseNotesPath = path.Join(releaseNotesPath, majorVersion, patchVersion) err := os.MkdirAll(releaseNotesPath, os.ModePerm) From af8e5e5d0f74c216ab15ae7efa5ebadb081f1060 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Mon, 3 Apr 2023 15:26:23 +0200 Subject: [PATCH 089/233] Table GC: remove spammy log entry (#12625) (#12808) 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/vt/vttablet/tabletserver/gc/tablegc.go | 1 - 1 file changed, 1 deletion(-) diff --git a/go/vt/vttablet/tabletserver/gc/tablegc.go b/go/vt/vttablet/tabletserver/gc/tablegc.go index d20f20d7835..87beab04ef0 100644 --- a/go/vt/vttablet/tabletserver/gc/tablegc.go +++ b/go/vt/vttablet/tabletserver/gc/tablegc.go @@ -263,7 +263,6 @@ func (collector *TableGC) operate(ctx context.Context) { } case <-purgeRequestsChan: { - log.Info("TableGC: purgeRequestsChan") go func() { tableName, err := collector.purge(ctx) if err != nil { From b04435f820b3e1f34428fee0a344e4bbb2fee675 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 4 Apr 2023 22:11:03 +0200 Subject: [PATCH 090/233] Cleanup TODOs in vtorc flag parsing code from v15 (#12787) (#12818) Signed-off-by: Andrew Mason Co-authored-by: Andrew Mason --- go/cmd/vtorc/main.go | 44 ++++++++++------------------------------ go/vt/servenv/servenv.go | 1 + 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/go/cmd/vtorc/main.go b/go/cmd/vtorc/main.go index 0d28c8da9bf..f3591505c45 100644 --- a/go/cmd/vtorc/main.go +++ b/go/cmd/vtorc/main.go @@ -17,8 +17,6 @@ package main import ( - "os" - "reflect" "strings" _ "github.com/go-sql-driver/mysql" @@ -26,9 +24,7 @@ import ( _ "modernc.org/sqlite" "vitess.io/vitess/go/acl" - "vitess.io/vitess/go/vt/grpccommon" "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/vtorc/config" "vitess.io/vitess/go/vt/vtorc/inst" @@ -95,42 +91,24 @@ func transformArgsForPflag(fs *pflag.FlagSet, args []string) (result []string) { // main is the application's entry point. It will spawn an HTTP interface. func main() { - // TODO(ajm188): after v15, remove this pflag hack and use servenv.ParseFlags - // directly. - fs := pflag.NewFlagSet("vtorc", pflag.ExitOnError) - grpccommon.RegisterFlags(fs) - log.RegisterFlags(fs) - logutil.RegisterFlags(fs) - logic.RegisterFlags(fs) - server.RegisterFlags(fs) - config.RegisterFlags(fs) servenv.RegisterDefaultFlags() servenv.RegisterFlags() - acl.RegisterFlags(fs) - servenv.OnParseFor("vtorc", func(flags *pflag.FlagSet) { flags.AddFlagSet(fs) }) - - args := append([]string{}, os.Args...) - os.Args = os.Args[0:1] - - configFile := fs.String("config", "", "config file name") - - os.Args = append(os.Args, transformArgsForPflag(fs, args[1:])...) - if !reflect.DeepEqual(args, os.Args) { - // warn the user so they can adjust their CLI scripts - warning := `CLI args passed do not conform to pflag parsing behavior -The arguments have been transformed for compatibility as follows: - %v => %v -Please update your scripts before the next version, when this will begin to break. -` - log.Warningf(warning, args, os.Args) - } + var configFile string + servenv.OnParseFor("vtorc", func(fs *pflag.FlagSet) { + logic.RegisterFlags(fs) + server.RegisterFlags(fs) + config.RegisterFlags(fs) + acl.RegisterFlags(fs) + + fs.StringVar(&configFile, "config", "", "config file name") + }) servenv.ParseFlags("vtorc") config.UpdateConfigValuesFromFlags() log.Info("starting vtorc") - if len(*configFile) > 0 { - config.ForceRead(*configFile) + if len(configFile) > 0 { + config.ForceRead(configFile) } else { config.Read("/etc/vtorc.conf.json", "conf/vtorc.conf.json", "vtorc.conf.json") } diff --git a/go/vt/servenv/servenv.go b/go/vt/servenv/servenv.go index 9f3d63f1a02..03b2973698b 100644 --- a/go/vt/servenv/servenv.go +++ b/go/vt/servenv/servenv.go @@ -399,6 +399,7 @@ func init() { "vtgate", "vtgateclienttest", "vtgr", + "vtorc", "vttablet", "vttestserver", } { From d6c92cb429e3d810bc6853aaa6d1c568d5fd168e Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 5 Apr 2023 10:42:49 +0200 Subject: [PATCH 091/233] fakedbclient: Add locking to avoid races (#12814) (#12822) We have tests like `TestMoveTablesV2` which end up reading and writing queries concurrently. This causes the race detector to appropriately trigger and detect issues here. Signed-off-by: Dirkjan Bussink Co-authored-by: Dirkjan Bussink --- go/vt/wrangler/fake_dbclient_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/go/vt/wrangler/fake_dbclient_test.go b/go/vt/wrangler/fake_dbclient_test.go index f69d95f6c5a..5b7fc0c1873 100644 --- a/go/vt/wrangler/fake_dbclient_test.go +++ b/go/vt/wrangler/fake_dbclient_test.go @@ -20,6 +20,7 @@ import ( "fmt" "regexp" "strings" + "sync" "testing" "github.com/stretchr/testify/assert" @@ -63,6 +64,7 @@ func (dbrs *dbResults) exhausted() bool { // fakeDBClient fakes a binlog_player.DBClient. type fakeDBClient struct { + mu sync.Mutex name string queries map[string]*dbResults queriesRE map[string]*dbResults @@ -86,6 +88,8 @@ func newFakeDBClient(name string) *fakeDBClient { } func (dc *fakeDBClient) addQuery(query string, result *sqltypes.Result, err error) { + dc.mu.Lock() + defer dc.mu.Unlock() if testMode == "debug" { log.Infof("%s::addQuery %s\n\n", dc.id(), query) } @@ -98,6 +102,8 @@ func (dc *fakeDBClient) addQuery(query string, result *sqltypes.Result, err erro } func (dc *fakeDBClient) addQueryRE(query string, result *sqltypes.Result, err error) { + dc.mu.Lock() + defer dc.mu.Unlock() if testMode == "debug" { log.Infof("%s::addQueryRE %s\n\n", dc.id(), query) } @@ -110,11 +116,15 @@ func (dc *fakeDBClient) addQueryRE(query string, result *sqltypes.Result, err er } func (dc *fakeDBClient) getInvariant(query string) *sqltypes.Result { + dc.mu.Lock() + defer dc.mu.Unlock() return dc.invariants[query] } // note: addInvariant will replace a previous result for a query with the provided one: this is used in the tests func (dc *fakeDBClient) addInvariant(query string, result *sqltypes.Result) { + dc.mu.Lock() + defer dc.mu.Unlock() if testMode == "debug" { log.Infof("%s::addInvariant %s\n\n", dc.id(), query) } @@ -156,6 +166,8 @@ func (dc *fakeDBClient) id() string { // ExecuteFetch is part of the DBClient interface func (dc *fakeDBClient) ExecuteFetch(query string, maxrows int) (*sqltypes.Result, error) { + dc.mu.Lock() + defer dc.mu.Unlock() qr, err := dc.executeFetch(query, maxrows) if testMode == "debug" { log.Infof("%s::ExecuteFetch for >>>%s<<< returns >>>%v<<< error >>>%+v<<< ", dc.id(), query, qr, err) @@ -187,6 +199,8 @@ func (dc *fakeDBClient) executeFetch(query string, maxrows int) (*sqltypes.Resul } func (dc *fakeDBClient) verifyQueries(t *testing.T) { + dc.mu.Lock() + defer dc.mu.Unlock() t.Helper() for query, dbrs := range dc.queries { if !dbrs.exhausted() { From 2193482c3729d449ac934d9c1b860088935dc3d2 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Fri, 7 Apr 2023 09:08:15 +0200 Subject: [PATCH 092/233] Fix `vtgate_schema_tracker` flaky tests (#12780) (#12849) --- go/test/endtoend/cellalias/cell_alias_test.go | 10 ++-- go/test/endtoend/cluster/cluster_process.go | 6 +-- go/test/endtoend/cluster/vtgate_process.go | 6 +-- .../recovery/unshardedrecovery/recovery.go | 23 ++++----- go/test/endtoend/utils/utils.go | 16 ++++++ .../resharding_workflows_v2_test.go | 49 ++++++------------- .../vreplication/vreplication_test.go | 4 +- .../vreplication/vschema_load_test.go | 2 +- go/test/endtoend/vreplication/vstream_test.go | 2 +- .../loadkeyspace/schema_load_keyspace_test.go | 19 +++++-- .../restarttablet/schema_restart_test.go | 11 +++-- .../unauthorized/unauthorized_test.go | 6 ++- .../correctness_test.go | 2 +- 13 files changed, 81 insertions(+), 75 deletions(-) diff --git a/go/test/endtoend/cellalias/cell_alias_test.go b/go/test/endtoend/cellalias/cell_alias_test.go index 47f3108e6c7..8d749c73bbf 100644 --- a/go/test/endtoend/cellalias/cell_alias_test.go +++ b/go/test/endtoend/cellalias/cell_alias_test.go @@ -28,6 +28,7 @@ import ( "os" "os/exec" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -339,12 +340,9 @@ func TestAddAliasWhileVtgateUp(t *testing.T) { func waitTillAllTabletsAreHealthyInVtgate(t *testing.T, vtgateInstance cluster.VtgateProcess, shards ...string) { for _, shard := range shards { - err := vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", keyspaceName, shard), 1) - require.Nil(t, err) - err = vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspaceName, shard), 1) - require.Nil(t, err) - err = vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", keyspaceName, shard), 1) - require.Nil(t, err) + require.NoError(t, vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", keyspaceName, shard), 1, 30*time.Second)) + require.NoError(t, vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspaceName, shard), 1, 30*time.Second)) + require.NoError(t, vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", keyspaceName, shard), 1, 30*time.Second)) } } diff --git a/go/test/endtoend/cluster/cluster_process.go b/go/test/endtoend/cluster/cluster_process.go index 467d1140b89..7fd670e42a3 100644 --- a/go/test/endtoend/cluster/cluster_process.go +++ b/go/test/endtoend/cluster/cluster_process.go @@ -783,14 +783,14 @@ func (cluster *LocalProcessCluster) WaitForTabletsToHealthyInVtgate() (err error rdonlyTabletCount++ } } - if err = cluster.VtgateProcess.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", keyspace.Name, shard.Name), 1); err != nil { + if err = cluster.VtgateProcess.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", keyspace.Name, shard.Name), 1, 2*time.Minute); err != nil { return err } if replicaTabletCount > 0 { - err = cluster.VtgateProcess.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspace.Name, shard.Name), replicaTabletCount) + err = cluster.VtgateProcess.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspace.Name, shard.Name), replicaTabletCount, 2*time.Minute) } if rdonlyTabletCount > 0 { - err = cluster.VtgateProcess.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", keyspace.Name, shard.Name), rdonlyTabletCount) + err = cluster.VtgateProcess.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", keyspace.Name, shard.Name), rdonlyTabletCount, 2*time.Minute) } if err != nil { return err diff --git a/go/test/endtoend/cluster/vtgate_process.go b/go/test/endtoend/cluster/vtgate_process.go index 80e2d4cc4d7..f037f53a055 100644 --- a/go/test/endtoend/cluster/vtgate_process.go +++ b/go/test/endtoend/cluster/vtgate_process.go @@ -201,11 +201,11 @@ func (vtgate *VtgateProcess) GetStatusForTabletOfShard(name string, endPointsCou // WaitForStatusOfTabletInShard function waits till status of a tablet in shard is 1 // endPointsCount: how many endpoints to wait for -func (vtgate *VtgateProcess) WaitForStatusOfTabletInShard(name string, endPointsCount int) error { +func (vtgate *VtgateProcess) WaitForStatusOfTabletInShard(name string, endPointsCount int, timeout time.Duration) error { log.Infof("Waiting for healthy status of %d %s tablets in cell %s", endPointsCount, name, vtgate.Cell) - timeout := time.Now().Add(30 * time.Second) - for time.Now().Before(timeout) { + deadline := time.Now().Add(timeout) + for time.Now().Before(deadline) { if vtgate.GetStatusForTabletOfShard(name, endPointsCount) { return nil } diff --git a/go/test/endtoend/recovery/unshardedrecovery/recovery.go b/go/test/endtoend/recovery/unshardedrecovery/recovery.go index 1ab9f1647ca..e42540ac7bc 100644 --- a/go/test/endtoend/recovery/unshardedrecovery/recovery.go +++ b/go/test/endtoend/recovery/unshardedrecovery/recovery.go @@ -24,6 +24,7 @@ import ( "os/exec" "path" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -232,12 +233,12 @@ func TestRecoveryImpl(t *testing.T) { _, err = primary.VttabletProcess.QueryTablet("update vt_insert_test set msg = 'msgx1' where id = 1", keyspaceName, true) assert.NoError(t, err) - //verify that primary has new value + // verify that primary has new value qr, err := primary.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) assert.NoError(t, err) assert.Equal(t, "msgx1", qr.Rows[0][0].ToString()) - //verify that restored replica has old value + // verify that restored replica has old value qr, err = replica2.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) assert.NoError(t, err) assert.Equal(t, "test1", qr.Rows[0][0].ToString()) @@ -261,12 +262,12 @@ func TestRecoveryImpl(t *testing.T) { _, err = primary.VttabletProcess.QueryTablet("update vt_insert_test set msg = 'msgx2' where id = 1", keyspaceName, true) assert.NoError(t, err) - //verify that primary has new value + // verify that primary has new value qr, err = primary.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) assert.NoError(t, err) assert.Equal(t, "msgx2", qr.Rows[0][0].ToString()) - //verify that restored replica has old value + // verify that restored replica has old value qr, err = replica3.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) assert.NoError(t, err) assert.Equal(t, "msgx1", qr.Rows[0][0].ToString()) @@ -277,14 +278,10 @@ func TestRecoveryImpl(t *testing.T) { localCluster.VtgateGrpcPort = vtgateInstance.GrpcPort assert.NoError(t, err) defer vtgateInstance.TearDown() - err = vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", keyspaceName, shardName), 1) - assert.NoError(t, err) - err = vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspaceName, shardName), 1) - assert.NoError(t, err) - err = vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", recoveryKS1, shardName), 1) - assert.NoError(t, err) - err = vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", recoveryKS2, shardName), 1) - assert.NoError(t, err) + assert.NoError(t, vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", keyspaceName, shardName), 1, 30*time.Second)) + assert.NoError(t, vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspaceName, shardName), 1, 30*time.Second)) + assert.NoError(t, vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", recoveryKS1, shardName), 1, 30*time.Second)) + assert.NoError(t, vtgateInstance.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", recoveryKS2, shardName), 1, 30*time.Second)) // Build vtgate grpc connection grpcAddress := fmt.Sprintf("%s:%d", localCluster.Hostname, localCluster.VtgateGrpcPort) @@ -293,7 +290,7 @@ func TestRecoveryImpl(t *testing.T) { defer vtgateConn.Close() session := vtgateConn.Session("@replica", nil) - //check that vtgate doesn't route queries to new tablet + // check that vtgate doesn't route queries to new tablet recovery.VerifyQueriesUsingVtgate(t, session, "select count(*) from vt_insert_test", "INT64(3)") recovery.VerifyQueriesUsingVtgate(t, session, "select msg from vt_insert_test where id = 1", `VARCHAR("msgx2")`) recovery.VerifyQueriesUsingVtgate(t, session, fmt.Sprintf("select count(*) from %s.vt_insert_test", recoveryKS1), "INT64(1)") diff --git a/go/test/endtoend/utils/utils.go b/go/test/endtoend/utils/utils.go index 7b37c1b0ecf..e4b4310237f 100644 --- a/go/test/endtoend/utils/utils.go +++ b/go/test/endtoend/utils/utils.go @@ -289,3 +289,19 @@ func convertToMap(input interface{}) map[string]interface{} { output := input.(map[string]interface{}) return output } + +// TimeoutAction performs the action within the given timeout limit. +// If the timeout is reached, the test is failed with errMsg. +// If action returns false, the timeout loop continues, if it returns true, the function succeeds. +func TimeoutAction(t *testing.T, timeout time.Duration, errMsg string, action func() bool) { + deadline := time.After(timeout) + ok := false + for !ok { + select { + case <-deadline: + t.Error(errMsg) + case <-time.After(1 * time.Second): + ok = action() + } + } +} diff --git a/go/test/endtoend/vreplication/resharding_workflows_v2_test.go b/go/test/endtoend/vreplication/resharding_workflows_v2_test.go index db7633e18d2..bfe0404f5ab 100644 --- a/go/test/endtoend/vreplication/resharding_workflows_v2_test.go +++ b/go/test/endtoend/vreplication/resharding_workflows_v2_test.go @@ -22,6 +22,7 @@ import ( "strconv" "strings" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -434,7 +435,7 @@ func testMoveTablesV2Workflow(t *testing.T) { } func testPartialSwitches(t *testing.T) { - //nothing switched + // nothing switched require.Equal(t, getCurrentState(t), wrangler.WorkflowStateNotSwitched) tstWorkflowSwitchReads(t, "replica,rdonly", "zone1") nextState := "Reads partially switched. Replica switched in cells: zone1. Rdonly switched in cells: zone1. Writes Not Switched" @@ -446,7 +447,7 @@ func testPartialSwitches(t *testing.T) { checkStates(t, currentState, nextState) tstWorkflowSwitchReads(t, "", "") - checkStates(t, nextState, nextState) //idempotency + checkStates(t, nextState, nextState) // idempotency tstWorkflowSwitchWrites(t) currentState = nextState @@ -454,7 +455,7 @@ func testPartialSwitches(t *testing.T) { checkStates(t, currentState, nextState) tstWorkflowSwitchWrites(t) - checkStates(t, nextState, nextState) //idempotency + checkStates(t, nextState, nextState) // idempotency keyspace := "product" if currentWorkflowType == wrangler.ReshardWorkflow { @@ -572,8 +573,8 @@ func setupCluster(t *testing.T) *VitessCluster { require.NotNil(t, vtgate) err := cluster.WaitForHealthyShard(vc.VtctldClient, "product", "0") require.NoError(t, err) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "product", "0"), 2) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", "product", "0"), 1) + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "product", "0"), 2, 30*time.Second)) + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", "product", "0"), 1, 30*time.Second)) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) verifyClusterHealth(t, vc) @@ -591,22 +592,12 @@ func setupCustomerKeyspace(t *testing.T) { customerVSchema, customerSchema, defaultReplicas, defaultRdonly, 200, nil); err != nil { t.Fatal(err) } - err := cluster.WaitForHealthyShard(vc.VtctldClient, "customer", "-80") - require.NoError(t, err) - err = cluster.WaitForHealthyShard(vc.VtctldClient, "customer", "80-") - require.NoError(t, err) - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "customer", "-80"), 2); err != nil { - t.Fatal(err) - } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "customer", "80-"), 2); err != nil { - t.Fatal(err) - } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", "customer", "-80"), 1); err != nil { - t.Fatal(err) - } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", "customer", "80-"), 1); err != nil { - t.Fatal(err) - } + require.NoError(t, cluster.WaitForHealthyShard(vc.VtctldClient, "customer", "-80")) + require.NoError(t, cluster.WaitForHealthyShard(vc.VtctldClient, "customer", "80-")) + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "customer", "-80"), 2, 30*time.Second)) + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "customer", "80-"), 2, 30*time.Second)) + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", "customer", "-80"), 1, 30*time.Second)) + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", "customer", "80-"), 1, 30*time.Second)) custKs := vc.Cells[defaultCell.Name].Keyspaces["customer"] targetTab1 = custKs.Shards["-80"].Tablets["zone1-200"].Vttablet targetTab2 = custKs.Shards["80-"].Tablets["zone1-300"].Vttablet @@ -625,14 +616,10 @@ func setupCustomer2Keyspace(t *testing.T) { err := cluster.WaitForHealthyShard(vc.VtctldClient, c2keyspace, c2shard) require.NoError(t, err) if defaultReplicas > 0 { - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", c2keyspace, c2shard), defaultReplicas); err != nil { - t.Fatal(err) - } + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", c2keyspace, c2shard), defaultReplicas, 30*time.Second)) } if defaultRdonly > 0 { - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", c2keyspace, c2shard), defaultRdonly); err != nil { - t.Fatal(err) - } + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", c2keyspace, c2shard), defaultRdonly, 30*time.Second)) } } } @@ -758,12 +745,8 @@ func createAdditionalCustomerShards(t *testing.T, shards string) { for _, shardName := range arrTargetShardNames { err := cluster.WaitForHealthyShard(vc.VtctldClient, ksName, shardName) require.NoError(t, err) - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", ksName, shardName), 2); err != nil { - require.NoError(t, err) - } - if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", ksName, shardName), 1); err != nil { - require.NoError(t, err) - } + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", ksName, shardName), 2, 30*time.Second)) + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.rdonly", ksName, shardName), 1, 30*time.Second)) } custKs := vc.Cells[defaultCell.Name].Keyspaces[ksName] targetTab2 = custKs.Shards["80-c0"].Tablets["zone1-600"].Vttablet diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go index 91f5410545c..a16d335363e 100644 --- a/go/test/endtoend/vreplication/vreplication_test.go +++ b/go/test/endtoend/vreplication/vreplication_test.go @@ -378,7 +378,7 @@ func TestMultiCellVreplicationWorkflow(t *testing.T) { require.NotNil(t, vtgate) err := cluster.WaitForHealthyShard(vc.VtctldClient, keyspace, shard) require.NoError(t, err) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspace, shard), 2) + vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspace, shard), 2, 30*time.Second) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() @@ -578,7 +578,7 @@ func TestCellAliasVreplicationWorkflow(t *testing.T) { require.NotNil(t, vtgate) err = cluster.WaitForHealthyShard(vc.VtctldClient, keyspace, shard) require.NoError(t, err) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspace, shard), 2) + vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", keyspace, shard), 2, 30*time.Second) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() diff --git a/go/test/endtoend/vreplication/vschema_load_test.go b/go/test/endtoend/vreplication/vschema_load_test.go index 5d20d7f2d32..a5cac4c68f8 100644 --- a/go/test/endtoend/vreplication/vschema_load_test.go +++ b/go/test/endtoend/vreplication/vschema_load_test.go @@ -55,7 +55,7 @@ func TestVSchemaChangesUnderLoad(t *testing.T) { require.NotNil(t, vtgate) err := cluster.WaitForHealthyShard(vc.VtctldClient, "product", "0") require.NoError(t, err) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "product", "0"), 1) + vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", "product", "0"), 1, 30*time.Second) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() diff --git a/go/test/endtoend/vreplication/vstream_test.go b/go/test/endtoend/vreplication/vstream_test.go index 44fe7edaa1c..3f3044b0294 100644 --- a/go/test/endtoend/vreplication/vstream_test.go +++ b/go/test/endtoend/vreplication/vstream_test.go @@ -58,7 +58,7 @@ func testVStreamWithFailover(t *testing.T, failover bool) { vc.AddKeyspace(t, []*Cell{defaultCell}, "product", "0", initialProductVSchema, initialProductSchema, defaultReplicas, defaultRdonly, 100, nil) vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) - vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 3) + vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 3, 30*time.Second) vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) defer vtgateConn.Close() diff --git a/go/test/endtoend/vtgate/schematracker/loadkeyspace/schema_load_keyspace_test.go b/go/test/endtoend/vtgate/schematracker/loadkeyspace/schema_load_keyspace_test.go index 8580240a942..0b00b571393 100644 --- a/go/test/endtoend/vtgate/schematracker/loadkeyspace/schema_load_keyspace_test.go +++ b/go/test/endtoend/vtgate/schematracker/loadkeyspace/schema_load_keyspace_test.go @@ -19,10 +19,14 @@ package loadkeyspace import ( "os" "path" + "strings" "testing" + "time" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/test/endtoend/cluster" ) @@ -76,6 +80,9 @@ func TestLoadKeyspaceWithNoTablet(t *testing.T) { for _, vttablet := range clusterInstance.Keyspaces[0].Shards[0].Vttablets { err = vttablet.VttabletProcess.TearDown() require.NoError(t, err) + utils.TimeoutAction(t, 1*time.Minute, "timeout - teardown of VTTablet", func() bool { + return vttablet.VttabletProcess.GetStatus() == "" + }) } // Start vtgate with the schema_change_signal flag @@ -83,11 +90,13 @@ func TestLoadKeyspaceWithNoTablet(t *testing.T) { err = clusterInstance.StartVtgate() require.NoError(t, err) - // check warning logs - logDir := clusterInstance.VtgateProcess.LogDir - all, err := os.ReadFile(path.Join(logDir, "vtgate-stderr.txt")) - require.NoError(t, err) - require.Contains(t, string(all), "Unable to get initial schema reload") + // After starting VTGate we need to leave enough time for resolveAndLoadKeyspace to reach + // the schema tracking timeout (5 seconds). + utils.TimeoutAction(t, 5*time.Minute, "timeout - could not find 'Unable to get initial schema reload' in 'vtgate-stderr.txt'", func() bool { + logDir := clusterInstance.VtgateProcess.LogDir + all, _ := os.ReadFile(path.Join(logDir, "vtgate-stderr.txt")) + return strings.Contains(string(all), "Unable to get initial schema reload") + }) } func TestNoInitialKeyspace(t *testing.T) { diff --git a/go/test/endtoend/vtgate/schematracker/restarttablet/schema_restart_test.go b/go/test/endtoend/vtgate/schematracker/restarttablet/schema_restart_test.go index 6990aa01f88..fa0fa2e4672 100644 --- a/go/test/endtoend/vtgate/schematracker/restarttablet/schema_restart_test.go +++ b/go/test/endtoend/vtgate/schematracker/restarttablet/schema_restart_test.go @@ -147,11 +147,12 @@ func TestVSchemaTrackerKeyspaceReInit(t *testing.T) { require.NoError(t, err) err = clusterInstance.WaitForTabletsToHealthyInVtgate() require.NoError(t, err) - time.Sleep(time.Duration(signalInterval*2) * time.Second) - var newResults any - readVSchema(t, &clusterInstance.VtgateProcess, &newResults) - assert.Equal(t, originalResults, newResults) - newResults = nil + + utils.TimeoutAction(t, 1*time.Minute, "timeout - could not find the updated vschema in VTGate", func() bool { + var newResults any + readVSchema(t, &clusterInstance.VtgateProcess, &newResults) + return assert.ObjectsAreEqual(originalResults, newResults) + }) } } diff --git a/go/test/endtoend/vtgate/schematracker/unauthorized/unauthorized_test.go b/go/test/endtoend/vtgate/schematracker/unauthorized/unauthorized_test.go index 276664c74fd..d2fcf07810c 100644 --- a/go/test/endtoend/vtgate/schematracker/unauthorized/unauthorized_test.go +++ b/go/test/endtoend/vtgate/schematracker/unauthorized/unauthorized_test.go @@ -102,9 +102,11 @@ func TestSchemaTrackingError(t *testing.T) { case <-timeout: t.Error("timeout waiting for schema tracking error") case <-time.After(1 * time.Second): - // check info logs + // check info logs, continue if the file could not be read correctly. all, err := os.ReadFile(path.Join(logDir, "vtgate.WARNING")) - require.NoError(t, err) + if err != nil { + continue + } if strings.Contains(string(all), "Table ACL might be enabled, --schema_change_signal_user needs to be passed to VTGate for schema tracking to work. Check 'schema tracking' docs on vitess.io") { present = true } diff --git a/go/test/endtoend/vtgate/tablet_healthcheck_cache/correctness_test.go b/go/test/endtoend/vtgate/tablet_healthcheck_cache/correctness_test.go index 386ef325996..a080fe968ad 100644 --- a/go/test/endtoend/vtgate/tablet_healthcheck_cache/correctness_test.go +++ b/go/test/endtoend/vtgate/tablet_healthcheck_cache/correctness_test.go @@ -214,7 +214,7 @@ func addTablet(t *testing.T, tabletUID int, tabletType string) *cluster.Vttablet serving := tablet.VttabletProcess.WaitForStatus("SERVING", time.Duration(60*time.Second)) assert.Equal(t, serving, true, "Tablet did not become ready within a reasonable time") err = clusterInstance.VtgateProcess.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.%s", - tablet.VttabletProcess.Keyspace, tablet.VttabletProcess.Shard, tablet.Type), 1) + tablet.VttabletProcess.Keyspace, tablet.VttabletProcess.Shard, tablet.Type), 1, 30*time.Second) require.Nil(t, err) t.Logf("Added tablet: %s", tablet.Alias) From 9b7a0c72b0d5cd37fbf882f1d624c3548951a7a5 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 10 Apr 2023 16:29:10 +0200 Subject: [PATCH 093/233] [release-16.0] Small fixes to the auto-upgrade golang tool (#12838) (#12848) * fix float issue with bootstrap version increment Signed-off-by: Florent Poinsard * handle case where there are no minor bootstrap version Signed-off-by: Florent Poinsard * avoid re-creating Pull Requests Signed-off-by: Florent Poinsard * remove parse float Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard Co-authored-by: Florent Poinsard --- .github/workflows/update_golang_version.yml | 11 +++- go/tools/go-upgrade/go-upgrade.go | 67 +++++++++++++++------ 2 files changed, 56 insertions(+), 22 deletions(-) diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index 62f917adfd7..8502fe4e5be 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -39,13 +39,20 @@ jobs: 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 + # Check if the PR already exists, if it does then do not create new PR. + gh pr list -S "is:open [${{ matrix.branch }}] Upgrade the Golang version to go${go_version}" | grep "OPEN" + if [ $? -eq 0 ]; then + exit 0 + fi + + echo "create-pr=true" >> $GITHUB_OUTPUT + - name: Create Pull Request if: steps.detect-and-update.outputs.create-pr == 'true' uses: peter-evans/create-pull-request@v4 diff --git a/go/tools/go-upgrade/go-upgrade.go b/go/tools/go-upgrade/go-upgrade.go index 2720725a2ec..26224dfdf8d 100644 --- a/go/tools/go-upgrade/go-upgrade.go +++ b/go/tools/go-upgrade/go-upgrade.go @@ -38,10 +38,16 @@ const ( goDevAPI = "https://go.dev/dl/?mode=json" ) -type latestGolangRelease struct { - Version string `json:"version"` - Stable bool `json:"stable"` -} +type ( + latestGolangRelease struct { + Version string `json:"version"` + Stable bool `json:"stable"` + } + + bootstrapVersion struct { + major, minor int // when minor == -1, it means there are no minor version + } +) var ( workflowUpdate = true @@ -151,7 +157,7 @@ func runGetBootstrapCmd(_ *cobra.Command, _ []string) { if err != nil { log.Fatal(err) } - fmt.Println(currentVersion) + fmt.Println(currentVersion.toString()) } func runUpgradeWorkflowsCmd(_ *cobra.Command, _ []string) { @@ -218,11 +224,11 @@ func upgradePath(allowMajorUpgrade, workflowUpdate, isMainBranch bool) error { } nextBootstrapVersionF := currentBootstrapVersionF if isMainBranch { - nextBootstrapVersionF += 1 + nextBootstrapVersionF.major += 1 } else { - nextBootstrapVersionF += 0.1 + nextBootstrapVersionF.minor += 1 } - err = updateBootstrapVersionInCodebase(currentBootstrapVersionF, nextBootstrapVersionF, upgradeTo) + err = updateBootstrapVersionInCodebase(currentBootstrapVersionF.toString(), nextBootstrapVersionF.toString(), upgradeTo) if err != nil { return err } @@ -251,23 +257,37 @@ func currentGolangVersion() (*version.Version, error) { return version.NewVersion(versionStr[1]) } -func currentBootstrapVersion() (float64, error) { +func currentBootstrapVersion() (bootstrapVersion, error) { contentRaw, err := os.ReadFile("Makefile") if err != nil { - return 0, err + return bootstrapVersion{}, 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) + return bootstrapVersion{}, fmt.Errorf("malformatted error, got: %v", versionStr) } - f, err := strconv.ParseFloat(versionStr[1], 64) + + vs := strings.Split(versionStr[1], ".") + major, err := strconv.Atoi(vs[0]) if err != nil { - return 0, err + return bootstrapVersion{}, err + } + + minor := -1 + if len(vs) > 1 { + minor, err = strconv.Atoi(vs[1]) + if err != nil { + return bootstrapVersion{}, err + } } - return f, nil + + return bootstrapVersion{ + major: major, + minor: minor, + }, nil } // getLatestStableGolangReleases fetches the latest stable releases of Golang from @@ -371,7 +391,7 @@ func replaceGoVersionInCodebase(old, new *version.Version, workflowUpdate bool) return nil } -func updateBootstrapVersionInCodebase(old, new float64, newGoVersion *version.Version) error { +func updateBootstrapVersionInCodebase(old, new string, newGoVersion *version.Version) error { if old == new { return nil } @@ -394,8 +414,8 @@ func updateBootstrapVersionInCodebase(old, new float64, newGoVersion *version.Ve 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 + fmt.Sprintf("ARG bootstrap_version=%s", new), // Dockerfile + fmt.Sprintf("BOOTSTRAP_VERSION=%s", new), // Makefile }, file, ) @@ -406,7 +426,7 @@ func updateBootstrapVersionInCodebase(old, new float64, newGoVersion *version.Ve err = replaceInFile( []*regexp.Regexp{regexp.MustCompile(`\"bootstrap-version\",[[:space:]]*\"([0-9.]+)\"`)}, - []string{fmt.Sprintf("\"bootstrap-version\", \"%-1g\"", new)}, + []string{fmt.Sprintf("\"bootstrap-version\", \"%s\"", new)}, "./test.go", ) if err != nil { @@ -421,7 +441,7 @@ func updateBootstrapVersionInCodebase(old, new float64, newGoVersion *version.Ve return nil } -func updateBootstrapChangelog(new float64, goVersion *version.Version) error { +func updateBootstrapChangelog(new string, goVersion *version.Version) error { file, err := os.OpenFile("./docker/bootstrap/CHANGELOG.md", os.O_RDWR, 0600) if err != nil { return err @@ -434,7 +454,7 @@ func updateBootstrapChangelog(new float64, goVersion *version.Version) error { } newContent := fmt.Sprintf(` -## [%-1g] - %s +## [%s] - %s ### Changes - Update build to golang %s`, new, time.Now().Format(time.DateOnly), goVersion.String()) @@ -502,3 +522,10 @@ func replaceInFile(oldexps []*regexp.Regexp, new []string, fileToChange string) } return nil } + +func (b bootstrapVersion) toString() string { + if b.minor == -1 { + return fmt.Sprintf("%d", b.major) + } + return fmt.Sprintf("%d.%d", b.major, b.minor) +} From ee547c8e00574113190474b9cdcf0b65a964a801 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 11 Apr 2023 07:40:15 +0200 Subject: [PATCH 094/233] [planbuilder bugfix] do not push aggregations into derived tables (#12810) (#12823) * fixes #12798 * [planbuilder bugfix] don't push down predicates that need to be aggregated at the vtgate level --------- Signed-off-by: Andres Taylor Signed-off-by: Florent Poinsard Co-authored-by: Andres Taylor --- go/vt/vtgate/planbuilder/operators/derived.go | 21 ++++ .../planbuilder/testdata/aggr_cases.json | 97 ++++++++++++++++++- 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/go/vt/vtgate/planbuilder/operators/derived.go b/go/vt/vtgate/planbuilder/operators/derived.go index 06fa8a3f7af..6edb9f84e47 100644 --- a/go/vt/vtgate/planbuilder/operators/derived.go +++ b/go/vt/vtgate/planbuilder/operators/derived.go @@ -17,6 +17,8 @@ limitations under the License. package operators import ( + "io" + "golang.org/x/exp/slices" "vitess.io/vitess/go/vt/vtgate/planbuilder/operators/ops" @@ -125,6 +127,10 @@ func (d *Derived) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser. } newExpr := semantics.RewriteDerivedTableExpression(expr, tableInfo) + if !canBePushedDownIntoDerived(newExpr) { + // if we have an aggregation, we don't want to push it inside + return &Filter{Source: d, Predicates: []sqlparser.Expr{expr}}, nil + } d.Source, err = d.Source.AddPredicate(ctx, newExpr) if err != nil { return nil, err @@ -132,6 +138,21 @@ func (d *Derived) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser. return d, nil } +func canBePushedDownIntoDerived(expr sqlparser.Expr) (canBePushed bool) { + canBePushed = true + _ = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node.(type) { + case *sqlparser.Max, *sqlparser.Min: + // empty by default + case sqlparser.AggrFunc: + canBePushed = false + return false, io.EOF + } + return true, nil + }, expr) + return +} + func (d *Derived) AddColumn(ctx *plancontext.PlanningContext, expr sqlparser.Expr) (int, error) { col, ok := expr.(*sqlparser.ColName) if !ok { diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index 7f0ab1555c3..d1dedaa8d88 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -5034,12 +5034,107 @@ "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", + "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" }, "TablesUsed": [ "user.user_extra" ] } + }, + { + "comment": "aggregation, where and derived tables - we can push extremums", + "query": "SELECT foo FROM (SELECT foo, max(baz) as bazo FROM (SELECT foo, baz FROM user) f GROUP BY foo) tt WHERE bazo BETWEEN 100 AND 200", + "v3-plan": "VT12001: unsupported: filtering on results of cross-shard subquery", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT foo FROM (SELECT foo, max(baz) as bazo FROM (SELECT foo, baz FROM user) f GROUP BY foo) tt WHERE bazo BETWEEN 100 AND 200", + "Instructions": { + "OperatorType": "SimpleProjection", + "Columns": [ + 0 + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Ordered", + "Aggregates": "max(1) AS bazo", + "GroupBy": "(0|2)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select foo, max(baz) as bazo, weight_string(foo) from (select foo, baz from `user` where 1 != 1) as f where 1 != 1 group by foo, weight_string(foo)", + "OrderBy": "(0|2) ASC", + "Query": "select foo, max(baz) as bazo, weight_string(foo) from (select foo, baz from `user` having max(baz) between 100 and 200) as f group by foo, weight_string(foo) order by foo asc", + "Table": "`user`" + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } + }, + { + "comment": "aggregation, where and derived tables - we can't push aggregations that might need a second layer of aggregation", + "query": "SELECT foo FROM (SELECT foo, count(baz) as bazo FROM (SELECT foo, baz FROM user) f GROUP BY foo) tt WHERE bazo BETWEEN 100 AND 200", + "v3-plan": "VT12001: unsupported: filtering on results of cross-shard subquery", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT foo FROM (SELECT foo, count(baz) as bazo FROM (SELECT foo, baz FROM user) f GROUP BY foo) tt WHERE bazo BETWEEN 100 AND 200", + "Instructions": { + "OperatorType": "SimpleProjection", + "Columns": [ + 1 + ], + "Inputs": [ + { + "OperatorType": "Filter", + "Predicate": "bazo between 100 and 200", + "Inputs": [ + { + "OperatorType": "SimpleProjection", + "Columns": [ + 1, + 0 + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Ordered", + "Aggregates": "sum_count(1) AS bazo", + "GroupBy": "(0|2)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select foo, count(baz) as bazo, weight_string(foo) from (select foo, baz from `user` where 1 != 1) as f where 1 != 1 group by foo, weight_string(foo)", + "OrderBy": "(0|2) ASC", + "Query": "select foo, count(baz) as bazo, weight_string(foo) from (select foo, baz from `user`) as f group by foo, weight_string(foo) order by foo asc", + "Table": "`user`" + } + ] + } + ] + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } } ] From dbb2cf706bbeab8dd2792dca5fd0017b62d1f667 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 11 Apr 2023 16:50:24 +0200 Subject: [PATCH 095/233] Add timeout to golangci-lint and bump its version (#12852) (#12854) Signed-off-by: Florent Poinsard --- .github/workflows/static_checks_etc.yml | 4 ++-- .golangci.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index ecfd23d70a1..0f23370819d 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -165,7 +165,7 @@ jobs: - name: Install golangci-lint if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' - run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.51.2 + run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.52.2 - name: Clean Env if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' @@ -177,7 +177,7 @@ jobs: - name: Run golangci-lint if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' - run: $(go env GOPATH)/bin/golangci-lint run go/... || exit 1 + run: $(go env GOPATH)/bin/golangci-lint run go/... --timeout 10m || exit 1 - name: Run go mod tidy if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.golangci.yml b/.golangci.yml index e2bdb5336e4..50bf68f4bfb 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -154,4 +154,4 @@ issues: # https://github.com/golangci/golangci/wiki/Configuration service: - golangci-lint-version: 1.51.2 # use the fixed version to not introduce new linters unexpectedly + golangci-lint-version: 1.52.2 # use the fixed version to not introduce new linters unexpectedly From 702cb2f5ebe8c7b9bbf22533bee7743552805f0d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Apr 2023 18:12:07 +0200 Subject: [PATCH 096/233] [release-16.0] Upgrade the Golang version to `go1.20.3` (#12832) * bump go version to go1.20.3 Signed-off-by: GitHub * modify the github workflows and fix the bootstrap version increment Signed-off-by: Florent Poinsard --------- Signed-off-by: GitHub Signed-off-by: Florent Poinsard Co-authored-by: frouioui Co-authored-by: Florent Poinsard --- .github/workflows/assign_milestone.yml | 2 +- .github/workflows/check_make_vtadmin_authz_testgen.yml | 2 +- .github/workflows/check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr_mysql57.yml | 2 +- .../cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .github/workflows/cluster_endtoend_mysql_server_vault.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_scheduler.yml | 2 +- .../cluster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- ...luster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl.yml | 2 +- .../workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_consul.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_tablegc.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_throttler.yml | 2 +- ...uster_endtoend_tabletmanager_throttler_custom_config.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .../workflows/cluster_endtoend_topo_connection_cache.yml | 2 +- .../cluster_endtoend_vreplication_across_db_versions.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_basic.yml | 2 +- .../workflows/cluster_endtoend_vreplication_cellalias.yml | 2 +- ...ster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .../workflows/cluster_endtoend_vreplication_multicell.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_v2.yml | 2 +- .github/workflows/cluster_endtoend_vstream_failover.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_false.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_true.yml | 2 +- .../cluster_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- ...uster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_general_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_godriver.yml | 2 +- .../workflows/cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .../workflows/cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_reservedconn.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .../workflows/cluster_endtoend_vtgate_schema_tracker.yml | 2 +- .../cluster_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_consul.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_transaction.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_unsharded.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .github/workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 2 +- .github/workflows/docker_test_cluster_10.yml | 2 +- .github/workflows/docker_test_cluster_25.yml | 2 +- .github/workflows/e2e_race.yml | 2 +- .github/workflows/endtoend.yml | 2 +- .github/workflows/local_example.yml | 2 +- .github/workflows/region_example.yml | 2 +- .github/workflows/sonar_analysis.yml | 2 +- .github/workflows/static_checks_etc.yml | 2 +- .github/workflows/unit_race.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- .github/workflows/update_golang_version.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 2 +- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 2 +- .../upgrade_downgrade_test_backups_manual_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries.yml | 2 +- ...de_downgrade_test_query_serving_queries_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_schema.yml | 2 +- ...ade_downgrade_test_query_serving_schema_next_release.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 2 +- docker/lite/Dockerfile.ubi7.mysql80 | 2 +- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 2 +- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 2 +- docker/lite/Dockerfile.ubi8.mysql80 | 2 +- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- test.go | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_docker.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/dockerfile.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 128 files changed, 132 insertions(+), 128 deletions(-) diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index dcc698a8b50..37dd7e3c119 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index a7d7c28db35..17d82c4532a 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -48,7 +48,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 0929576bdd3..719b81b6016 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -50,7 +50,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 45a7f83bf74..713257e112b 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 94fec84e46d..23d71c67896 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 a5ac442e001..5c24421dcea 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 eb34ce111b4..2063ad00387 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 74a8189ed6b..f9ba75a34ca 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 ca9cf7e7bc1..ec58302a959 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index 63c74feba7b..9df12163311 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index 4f5158105fb..7642f212178 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 c02cfe4b52b..f65d2b1e5fc 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 1417bc5fb7f..f1518eb019e 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 01ba9f47ebd..0b9335fdf69 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 daf60b53783..e7f324ef7cd 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 eb21a9218dd..19184425707 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 138ac8185c3..afc76a24896 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 6d662c4dfa9..4d6dd7af92b 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 038cca4beba..87d7e861890 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 e590d549189..55554bdcd82 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 8f5eabf58e3..3e15d27fdaf 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 fd4dfd69a97..79a7acce126 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 4a3eb56067d..5c73b6f3e43 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 9373fbd95cc..44dcc73f82d 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 51d1838d731..618102967b8 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 c40eecc1a7a..da9013e1003 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 b92a4d8f45a..278e90d840f 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 29057439659..a03bb455251 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 d7cdb2df981..a7feb92453c 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 8890176d5ae..b75190d43ab 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 1c2dcf0c4c1..49a90284dd0 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 c9309b91c5a..209222a764c 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 830aaceb006..612d130fb94 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 9a2304c5bf6..91bb722e44f 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 b614d969a02..f8ac27793b0 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 76214b22b27..619de27a09f 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 0e5a16f28aa..56332023ce1 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 64fc3488466..a2d523afebe 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 89401d78660..04d033913d9 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 eec34fecf05..bfd7660e815 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 23bc186bbb4..9f4e29d7f90 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 c0b4e84112b..07a019d452a 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 c415821f085..4ede64507ed 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 f66627a5416..e5f06e84e4f 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 9173897b823..ad9533f8da3 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 a4b051fa3ad..ad9e104406b 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 d2ba9c7977d..745266b9bd6 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index 6b6d7c38098..ce3382f4c2b 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 99240959d43..69bbdab1b85 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 e202842e647..a4c85557f1b 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 38e860c1338..59e9771fb7c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 c9f2bc24d40..ea97dc58aed 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 46db4da2a6e..cb961169ede 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 c630eba66ab..7b030eb80e5 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 31c4a04c954..6be839dabc0 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 f13b8f7a3bd..626a17ba64e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 83ac25039e9..fc790f97754 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 f56c4104921..6a9c402abfe 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 b1adc8a9b49..1490f4f35e5 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 9f5a887bd9c..664e0b764bd 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 36556c21053..1284fa556ac 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 c03bcf1876c..70a6b9db3fb 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 59132bca5e1..0235f6c1e4e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 b67b36423dd..b5b3fe60e16 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 14c66c34fc3..93cc032d60f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 9f20a1c432a..8030673b96b 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 f64252b6eae..c4d7e9780a7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 c3026d238b1..edbc2e1e265 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 eaaac8451d9..e5916fd4e23 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 04dfe9e6775..b60fedc2d0a 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 d0079cfd8d7..bf079c41ef7 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 1b7c7c2c58f..76e836851f1 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 a5f5674ecc6..bd52a5c556a 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 bc2e390ce6d..4f2d9eb6b74 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 c1e2df4e260..e802be0c6cf 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -42,7 +42,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Get base dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index fd113bd9c72..1672fa9358f 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index 554bb80ba56..6943b0277ba 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index a0f4b1de68b..4ab3e8eb00b 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 615d6c6baec..e9c6666c8ef 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index 98d70d79f3b..f5534c954d8 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index c11a4558598..10c803afe47 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index 3dd3be484a8..7c1cfc24109 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index 3ba308f20ae..86079d91471 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS run: | diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 0f23370819d..85d6425932b 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -105,7 +105,7 @@ jobs: 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@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index bc6f1665a32..bd08b4de65c 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -55,7 +55,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 00e09143f34..adbc813fb17 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index 079d3ed9a47..a3551574859 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index 8502fe4e5be..73b00bc4ed7 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 1aba094fb74..a0a238c848e 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -83,7 +83,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index ce0016b5774..1ad331b0775 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -86,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 472a505ab1b..2e897065cf5 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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 c6338164b26..2f5217f6daf 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 6943b9c84a1..730ace54ae3 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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 ed3f060f79a..a4410589b77 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 16a857d65b9..0f43f92368b 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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 474aaeaee40..df30d43c603 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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 247d15fe64c..f22be5b745a 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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 26b59126e55..c76110e0db8 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 42f11e6ccce..7b357b43ede 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index b8182ae607e..01834f6025d 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/Makefile b/Makefile index e9efd5d38dd..b8602577f8a 100644 --- a/Makefile +++ b/Makefile @@ -275,7 +275,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=14.2 +BOOTSTRAP_VERSION=14.3 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index 01a37556230..e971a372a11 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.20.2 || fail "Go version reported: `go version`. Version 1.20.2+ required. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.20.3 || fail "Go version reported: `go version`. Version 1.20.3+ required. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 94ea4728908..2e54ecbfadd 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index 98093116e14..f357d916d20 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index 1faed657914..6896592c911 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index 6fb34903460..be289f21f84 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index 1987a9f2d95..a6b676d4688 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -60,4 +60,8 @@ List of changes between bootstrap image versions. ## [14.2] - 2023-03-27 ### Changes -- Update build to golang 1.20.2 \ No newline at end of file +- Update build to golang 1.20.2 + +## [14.3] - 2023-04-05 +### Changes +- Update build to golang 1.20.3 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 47b5ab320fc..c9a41011337 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.20.2-buster +FROM --platform=linux/amd64 golang:1.20.3-buster # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index 95c133db6e0..9bccdcb28a8 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index 444b1015b1d..2e82d63e169 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index 634b7936a27..977ddaae7dc 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index bda47b8f7d2..25ff4bc15a5 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index f67c1429672..4b2121e9894 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index 53ce9612799..d117f324015 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index f65da4dbf1a..7f646195b37 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index bde336f99d3..e8e291861ce 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index f30f5fb0af0..090d2bcdc24 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index 4d63f1f44e2..f04c0aa5f62 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index ce4f78952ed..32552f28044 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index ed896df5ad5..549253a578e 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index 0b83d43c962..73089799c6f 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index 9a12a334b12..90a104501c3 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/test.go b/test.go index 9a6586f4f7d..8b4c399040a 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "14.2", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "14.3", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index 31a7b88338b..a8610a3dcf7 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python 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 4b2b630d0da..26be7216d66 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - 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_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index 7bcba132eaf..fe83341235b 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -68,7 +68,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index c3f9540b000..d6c74c88c3b 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.2 +ARG bootstrap_version=14.3 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index a6e361cc8f4..9c3d672c9cf 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -59,7 +59,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.2 + go-version: 1.20.3 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' From b04c38de2cc71c8cb89296fd7c602dc950ffdc00 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 12 Apr 2023 12:41:17 -0700 Subject: [PATCH 097/233] [release-16.0] Do not fail build on incorrect Go version (#12809) (#12812) * Do not fail build on incorrect Go version Signed-off-by: Florent Poinsard * Remove misleading message in build.env Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard Co-authored-by: Florent Poinsard --- build.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.env b/build.env index e971a372a11..2e5197343a5 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.20.3 || fail "Go version reported: `go version`. Version 1.20.3+ required. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.20.3 || echo "Go version reported: `go version`. Version 1.20.3+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin From 9dcbd7de3180f47e94f54989fb5c66daea00c920 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Wed, 12 Apr 2023 18:32:57 -0400 Subject: [PATCH 098/233] Backport: [topo] Disallow the slash character in shard names #12843 (#12858) * [topo] Disallow the slash character in shard names (#12843) * Disallow the slash character in shard names Fixes #12842. Signed-off-by: Andrew Mason * add release note Signed-off-by: Andrew Mason * Update go/vt/topo/shard.go Co-authored-by: Deepthi Sigireddi Signed-off-by: Andrew Mason * Update changelog/17.0/17.0.0/summary.md Co-authored-by: Deepthi Sigireddi Signed-off-by: Andrew Mason --------- Signed-off-by: Andrew Mason Signed-off-by: Andrew Mason Co-authored-by: Deepthi Sigireddi * add changelog stub Signed-off-by: Andrew Mason * fix version name Signed-off-by: Andrew Mason --------- Signed-off-by: Andrew Mason Signed-off-by: Andrew Mason Co-authored-by: Deepthi Sigireddi --- changelog/16.0/16.0.2/summary.md | 7 ++++ go/vt/topo/shard.go | 4 +++ go/vt/topo/shard_test.go | 60 ++++++++++++++++++++++++++++++-- 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 changelog/16.0/16.0.2/summary.md diff --git a/changelog/16.0/16.0.2/summary.md b/changelog/16.0/16.0.2/summary.md new file mode 100644 index 00000000000..99b0c998396 --- /dev/null +++ b/changelog/16.0/16.0.2/summary.md @@ -0,0 +1,7 @@ +## Summary + +### Shard name validation in TopoServer + +Prior to v16.0.2, it was possible to create a shard name with invalid characters, which would then be inaccessible to various cluster management operations. + +Shard names may no longer contain the forward slash ("/") character, and TopoServer's `CreateShard` method returns an error if given such a name. \ No newline at end of file diff --git a/go/vt/topo/shard.go b/go/vt/topo/shard.go index 7f03bf13364..2599c7de962 100644 --- a/go/vt/topo/shard.go +++ b/go/vt/topo/shard.go @@ -120,6 +120,10 @@ func IsShardUsingRangeBasedSharding(shard string) bool { // ValidateShardName takes a shard name and sanitizes it, and also returns // the KeyRange. func ValidateShardName(shard string) (string, *topodatapb.KeyRange, error) { + if strings.Contains(shard, "/") { + return "", nil, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "invalid shardId, may not contain '/': %v", shard) + } + if !IsShardUsingRangeBasedSharding(shard) { return shard, nil, nil } diff --git a/go/vt/topo/shard_test.go b/go/vt/topo/shard_test.go index 4c0088f00ee..d0ec08f94ea 100644 --- a/go/vt/topo/shard_test.go +++ b/go/vt/topo/shard_test.go @@ -17,13 +17,14 @@ limitations under the License. package topo import ( + "context" "reflect" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "context" - + "vitess.io/vitess/go/test/utils" topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) @@ -222,3 +223,58 @@ func TestUpdateSourceDeniedTables(t *testing.T) { t.Fatalf("one cell removal from all failed: %v", si) } } + +func TestValidateShardName(t *testing.T) { + t.Parallel() + + cases := []struct { + name string + expectedRange *topodatapb.KeyRange + valid bool + }{ + { + name: "0", + valid: true, + }, + { + name: "-80", + expectedRange: &topodatapb.KeyRange{ + Start: nil, + End: []byte{0x80}, + }, + valid: true, + }, + { + name: "40-80", + expectedRange: &topodatapb.KeyRange{ + Start: []byte{0x40}, + End: []byte{0x80}, + }, + valid: true, + }, + { + name: "foo-bar", + valid: false, + }, + { + name: "a/b", + valid: false, + }, + } + + for _, tcase := range cases { + tcase := tcase + t.Run(tcase.name, func(t *testing.T) { + t.Parallel() + + _, kr, err := ValidateShardName(tcase.name) + if !tcase.valid { + assert.Error(t, err, "expected %q to be an invalid shard name", tcase.name) + return + } + + require.NoError(t, err, "expected %q to be a valid shard name, got error: %v", tcase.name, err) + utils.MustMatch(t, tcase.expectedRange, kr) + }) + } +} From e18974d447bb5d714e7562c4383012201dc33ffd Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Fri, 14 Apr 2023 11:22:01 +0200 Subject: [PATCH 099/233] [release-16.0] planner fix: scoping rules for JOIN ON expression inside a subquery (#12891) * planner fix: scoping rules for JOIN ON expression inside a subquery (#12881) * fix: scoping rules for on clause expression inside a subquery Signed-off-by: Harshit Gangal * find the parent scope of the statement in on clause Signed-off-by: harshit-gangal * addressed review comments Signed-off-by: harshit-gangal --------- Signed-off-by: Harshit Gangal Signed-off-by: harshit-gangal Signed-off-by: Florent Poinsard * Fix plan test expectation for v3 Signed-off-by: Florent Poinsard --------- Signed-off-by: Harshit Gangal Signed-off-by: harshit-gangal Signed-off-by: Florent Poinsard Co-authored-by: Harshit Gangal --- .../planbuilder/testdata/select_cases.json | 27 +++++++++++++++++ go/vt/vtgate/semantics/analyzer_test.go | 30 ++++++++++++++++--- go/vt/vtgate/semantics/early_rewriter_test.go | 6 ++-- go/vt/vtgate/semantics/scoper.go | 22 +++++++++++--- go/vt/vtgate/semantics/semantic_state.go | 2 +- go/vt/vtgate/semantics/table_set.go | 2 +- 6 files changed, 76 insertions(+), 13 deletions(-) diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index 6adcf331f25..d1a69fbc7a9 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -8041,5 +8041,32 @@ "main.unsharded_a" ] } + }, + { + "comment": "subquery having join table on clause, using column reference of outer select table", + "query": "select (select 1 from user u1 join user u2 on u1.id = u2.id and u1.id = u3.id) subquery from user u3 where u3.id = 1", + "v3-plan": "VT03019: symbol u3.id not found", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select (select 1 from user u1 join user u2 on u1.id = u2.id and u1.id = u3.id) subquery from user u3 where u3.id = 1", + "Instructions": { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select (select 1 from `user` as u1 join `user` as u2 on u1.id = u2.id and u1.id = u3.id where 1 != 1) as subquery from `user` as u3 where 1 != 1", + "Query": "select (select 1 from `user` as u1 join `user` as u2 on u1.id = u2.id and u1.id = u3.id) as subquery from `user` as u3 where u3.id = 1", + "Table": "`user`", + "Values": [ + "INT64(1)" + ], + "Vindex": "user_index" + }, + "TablesUsed": [ + "user.user" + ] + } } ] diff --git a/go/vt/vtgate/semantics/analyzer_test.go b/go/vt/vtgate/semantics/analyzer_test.go index 96bce0b7edf..fc87946c71f 100644 --- a/go/vt/vtgate/semantics/analyzer_test.go +++ b/go/vt/vtgate/semantics/analyzer_test.go @@ -320,7 +320,7 @@ func TestMissingTable(t *testing.T) { func TestUnknownColumnMap2(t *testing.T) { varchar := querypb.Type_VARCHAR - int := querypb.Type_INT32 + integer := querypb.Type_INT32 authoritativeTblA := vindexes.Table{ Name: sqlparser.NewIdentifierCS("a"), @@ -346,7 +346,7 @@ func TestUnknownColumnMap2(t *testing.T) { Name: sqlparser.NewIdentifierCS("a"), Columns: []vindexes.Column{{ Name: sqlparser.NewIdentifierCI("col"), - Type: int, + Type: integer, }}, ColumnListAuthoritative: true, } @@ -354,7 +354,7 @@ func TestUnknownColumnMap2(t *testing.T) { Name: sqlparser.NewIdentifierCS("b"), Columns: []vindexes.Column{{ Name: sqlparser.NewIdentifierCI("col"), - Type: int, + Type: integer, }}, ColumnListAuthoritative: true, } @@ -391,7 +391,7 @@ func TestUnknownColumnMap2(t *testing.T) { name: "authoritative columns", schema: map[string]*vindexes.Table{"a": &authoritativeTblA, "b": &authoritativeTblBWithInt}, err: false, - typ: &int, + typ: &integer, }, { name: "authoritative columns with overlap", schema: map[string]*vindexes.Table{"a": &authoritativeTblAWithConflict, "b": &authoritativeTblB}, @@ -1434,6 +1434,28 @@ func TestSingleUnshardedKeyspace(t *testing.T) { } } +// TestScopingSubQueryJoinClause tests the scoping behavior of a subquery containing a join clause. +// The test ensures that the scoping analysis correctly identifies and handles the relationships +// between the tables involved in the join operation with the outer query. +func TestScopingSubQueryJoinClause(t *testing.T) { + query := "select (select 1 from u1 join u2 on u1.id = u2.id and u2.id = u3.id) x from u3" + + parse, err := sqlparser.Parse(query) + require.NoError(t, err) + + st, err := Analyze(parse, "user", &FakeSI{ + Tables: map[string]*vindexes.Table{ + "t": {Name: sqlparser.NewIdentifierCS("t")}, + }, + }) + require.NoError(t, err) + require.NoError(t, st.NotUnshardedErr) + + tb := st.DirectDeps(parse.(*sqlparser.Select).SelectExprs[0].(*sqlparser.AliasedExpr).Expr.(*sqlparser.Subquery).Select.(*sqlparser.Select).From[0].(*sqlparser.JoinTableExpr).Condition.On) + require.Equal(t, 3, tb.NumberOfTables()) + +} + var ks1 = &vindexes.Keyspace{ Name: "ks1", Sharded: false, diff --git a/go/vt/vtgate/semantics/early_rewriter_test.go b/go/vt/vtgate/semantics/early_rewriter_test.go index 1edd45a9c4d..324172ab72e 100644 --- a/go/vt/vtgate/semantics/early_rewriter_test.go +++ b/go/vt/vtgate/semantics/early_rewriter_test.go @@ -180,6 +180,9 @@ func TestExpandStar(t *testing.T) { require.True(t, isSelectStatement, "analyzer expects a select statement") st, err := Analyze(selectStatement, cDB, schemaInfo) if tcase.expErr == "" { + require.NoError(t, err) + require.NoError(t, st.NotUnshardedErr) + require.NoError(t, st.NotSingleRouteErr) found := 0 outer: for _, selExpr := range selectStatement.SelectExprs { @@ -204,9 +207,6 @@ func TestExpandStar(t *testing.T) { } else { require.Equal(t, tcase.colExpandedNumber, found) } - require.NoError(t, err) - require.NoError(t, st.NotUnshardedErr) - require.NoError(t, st.NotSingleRouteErr) assert.Equal(t, tcase.expSQL, sqlparser.String(selectStatement)) } else { require.EqualError(t, err, tcase.expErr) diff --git a/go/vt/vtgate/semantics/scoper.go b/go/vt/vtgate/semantics/scoper.go index adae1319e37..e61a9130b86 100644 --- a/go/vt/vtgate/semantics/scoper.go +++ b/go/vt/vtgate/semantics/scoper.go @@ -46,6 +46,7 @@ type ( tables []TableInfo isUnion bool joinUsing map[string]TableSet + stmtScope bool } ) @@ -62,11 +63,13 @@ func (s *scoper) down(cursor *sqlparser.Cursor) error { switch node := node.(type) { case *sqlparser.Update, *sqlparser.Delete: currScope := newScope(s.currentScope()) + currScope.stmtScope = true s.push(currScope) currScope.stmt = node.(sqlparser.Statement) case *sqlparser.Select: currScope := newScope(s.currentScope()) + currScope.stmtScope = true s.push(currScope) // Needed for order by with Literal to find the Expression. @@ -77,10 +80,10 @@ func (s *scoper) down(cursor *sqlparser.Cursor) error { case sqlparser.TableExpr: if isParentSelect(cursor) { // when checking the expressions used in JOIN conditions, special rules apply where the ON expression - // can only see the two tables involved in the JOIN, and no other tables. - // To create this special context, we create a special scope here that is then merged with - // the surrounding scope when we come back out from the JOIN - nScope := newScope(nil) + // can only see the two tables involved in the JOIN, and no other tables of that select statement. + // They are allowed to see the tables of the outer select query. + // To create this special context, we will find the parent scope of the select statement involved. + nScope := newScope(s.currentScope().findParentScopeOfStatement()) nScope.stmt = cursor.Parent().(*sqlparser.Select) s.push(nScope) } @@ -289,3 +292,14 @@ func (s *scope) prepareUsingMap() (result map[TableSet]map[string]TableSet) { } return } + +// findParentScopeOfStatement finds the scope that belongs to a statement. +func (s *scope) findParentScopeOfStatement() *scope { + if s.stmtScope { + return s.parent + } + if s.parent == nil { + return nil + } + return s.parent.findParentScopeOfStatement() +} diff --git a/go/vt/vtgate/semantics/semantic_state.go b/go/vt/vtgate/semantics/semantic_state.go index 7d838eb286a..b3163ae7fb0 100644 --- a/go/vt/vtgate/semantics/semantic_state.go +++ b/go/vt/vtgate/semantics/semantic_state.go @@ -364,7 +364,7 @@ var _ evalengine.TranslationLookup = (*SemTable)(nil) var columnNotSupportedErr = vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "column access not supported here") // ColumnLookup implements the TranslationLookup interface -func (st *SemTable) ColumnLookup(col *sqlparser.ColName) (int, error) { +func (st *SemTable) ColumnLookup(*sqlparser.ColName) (int, error) { return 0, columnNotSupportedErr } diff --git a/go/vt/vtgate/semantics/table_set.go b/go/vt/vtgate/semantics/table_set.go index 0ddbc87a224..aa9042f9587 100644 --- a/go/vt/vtgate/semantics/table_set.go +++ b/go/vt/vtgate/semantics/table_set.go @@ -27,7 +27,7 @@ import ( type TableSet bitset.Bitset // Format formats the TableSet. -func (ts TableSet) Format(f fmt.State, verb rune) { +func (ts TableSet) Format(f fmt.State, _ rune) { first := true fmt.Fprintf(f, "TableSet{") bitset.Bitset(ts).ForEach(func(tid int) { From 818ccd554e75d684cafe889948e53197ce6c7d76 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Mon, 17 Apr 2023 22:56:06 +0200 Subject: [PATCH 100/233] Remove recent golangci-lint version bump (#12909) Signed-off-by: Florent Poinsard --- .github/workflows/static_checks_etc.yml | 2 +- .golangci.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 85d6425932b..9c1cd7c7ae9 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -165,7 +165,7 @@ jobs: - name: Install golangci-lint if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' - run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.52.2 + run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.51.2 - name: Clean Env if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.golangci.yml b/.golangci.yml index 50bf68f4bfb..e2bdb5336e4 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -154,4 +154,4 @@ issues: # https://github.com/golangci/golangci/wiki/Configuration service: - golangci-lint-version: 1.52.2 # use the fixed version to not introduce new linters unexpectedly + golangci-lint-version: 1.51.2 # use the fixed version to not introduce new linters unexpectedly From d5d69546321268174e8587083f1b30a27349bce2 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 18 Apr 2023 20:30:12 +0530 Subject: [PATCH 101/233] fix: reset transaction session with better checks when no reserved connection (#12877) Signed-off-by: Harshit Gangal --- go/test/endtoend/cluster/cluster_process.go | 6 +- .../reparent/prssettingspool/main_test.go | 148 ++++++++++++++++++ .../reparent/prssettingspool/schema.sql | 5 + go/test/endtoend/reparent/utils/utils.go | 24 +++ go/vt/vtgate/safe_session.go | 19 ++- test/config.json | 9 ++ 6 files changed, 204 insertions(+), 7 deletions(-) create mode 100644 go/test/endtoend/reparent/prssettingspool/main_test.go create mode 100644 go/test/endtoend/reparent/prssettingspool/schema.sql diff --git a/go/test/endtoend/cluster/cluster_process.go b/go/test/endtoend/cluster/cluster_process.go index 7fd670e42a3..b0401f56324 100644 --- a/go/test/endtoend/cluster/cluster_process.go +++ b/go/test/endtoend/cluster/cluster_process.go @@ -808,7 +808,7 @@ func (cluster *LocalProcessCluster) ExecOnTablet(ctx context.Context, vttablet * return nil, err } - tablet, err := cluster.vtctlclientGetTablet(vttablet) + tablet, err := cluster.VtctlclientGetTablet(vttablet) if err != nil { return nil, err } @@ -851,7 +851,7 @@ func (cluster *LocalProcessCluster) ExecOnVTGate(ctx context.Context, addr strin // returns the responses. It returns an error if the stream ends with fewer than // `count` responses. func (cluster *LocalProcessCluster) StreamTabletHealth(ctx context.Context, vttablet *Vttablet, count int) (responses []*querypb.StreamHealthResponse, err error) { - tablet, err := cluster.vtctlclientGetTablet(vttablet) + tablet, err := cluster.VtctlclientGetTablet(vttablet) if err != nil { return nil, err } @@ -883,7 +883,7 @@ func (cluster *LocalProcessCluster) StreamTabletHealth(ctx context.Context, vtta return responses, nil } -func (cluster *LocalProcessCluster) vtctlclientGetTablet(tablet *Vttablet) (*topodatapb.Tablet, error) { +func (cluster *LocalProcessCluster) VtctlclientGetTablet(tablet *Vttablet) (*topodatapb.Tablet, error) { result, err := cluster.VtctlclientProcess.ExecuteCommandWithOutput("GetTablet", "--", tablet.Alias) if err != nil { return nil, err diff --git a/go/test/endtoend/reparent/prssettingspool/main_test.go b/go/test/endtoend/reparent/prssettingspool/main_test.go new file mode 100644 index 00000000000..a9f4312caea --- /dev/null +++ b/go/test/endtoend/reparent/prssettingspool/main_test.go @@ -0,0 +1,148 @@ +/* +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 misc + +import ( + "context" + _ "embed" + "flag" + "os" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/test/endtoend/cluster" + rutils "vitess.io/vitess/go/test/endtoend/reparent/utils" + "vitess.io/vitess/go/test/endtoend/utils" +) + +var ( + clusterInstance *cluster.LocalProcessCluster + vtParams mysql.ConnParams + keyspaceName = "ks" + cell = "test" + + //go:embed schema.sql + schemaSQL string +) + +func TestMain(m *testing.M) { + defer cluster.PanicHandler(nil) + flag.Parse() + + exitCode := func() int { + clusterInstance = cluster.NewCluster(cell, "localhost") + defer clusterInstance.Teardown() + + // Start topo server + err := clusterInstance.StartTopo() + if err != nil { + return 1 + } + + // Start keyspace + keyspace := &cluster.Keyspace{ + Name: keyspaceName, + SchemaSQL: schemaSQL, + } + clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, + "--queryserver-enable-settings-pool") + err = clusterInstance.StartUnshardedKeyspace(*keyspace, 2, false) + if err != nil { + return 1 + } + + // Start vtgate + clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, + "--planner-version", "gen4") + err = clusterInstance.StartVtgate() + if err != nil { + return 1 + } + + vtParams = mysql.ConnParams{ + Host: clusterInstance.Hostname, + Port: clusterInstance.VtgateMySQLPort, + } + return m.Run() + }() + os.Exit(exitCode) +} + +func TestSettingsPoolWithTXAndPRS(t *testing.T) { + ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + defer conn.Close() + + // set a system settings that will trigger reserved connection usage. + utils.Exec(t, conn, "set default_week_format = 5") + + // have transaction on the session + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "select id1, id2 from t1") + utils.Exec(t, conn, "commit") + + tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets + + // prs should happen without any error. + text, err := rutils.Prs(t, clusterInstance, tablets[1]) + require.NoError(t, err, text) + rutils.WaitForTabletToBeServing(t, clusterInstance, tablets[0], 1*time.Minute) + + defer func() { + // reset state + text, err = rutils.Prs(t, clusterInstance, tablets[0]) + require.NoError(t, err, text) + rutils.WaitForTabletToBeServing(t, clusterInstance, tablets[1], 1*time.Minute) + }() + + // no error should occur and it should go to the right tablet. + utils.Exec(t, conn, "select id1, id2 from t1") +} + +func TestSettingsPoolWithoutTXAndPRS(t *testing.T) { + ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + defer conn.Close() + + // set a system settings that will trigger reserved connection usage. + utils.Exec(t, conn, "set default_week_format = 5") + + // execute non-tx query + utils.Exec(t, conn, "select id1, id2 from t1") + + tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets + + // prs should happen without any error. + text, err := rutils.Prs(t, clusterInstance, tablets[1]) + require.NoError(t, err, text) + rutils.WaitForTabletToBeServing(t, clusterInstance, tablets[0], 1*time.Minute) + defer func() { + // reset state + text, err = rutils.Prs(t, clusterInstance, tablets[0]) + require.NoError(t, err, text) + rutils.WaitForTabletToBeServing(t, clusterInstance, tablets[1], 1*time.Minute) + }() + + // no error should occur and it should go to the right tablet. + utils.Exec(t, conn, "select id1, id2 from t1") + +} diff --git a/go/test/endtoend/reparent/prssettingspool/schema.sql b/go/test/endtoend/reparent/prssettingspool/schema.sql new file mode 100644 index 00000000000..3e78cab09d6 --- /dev/null +++ b/go/test/endtoend/reparent/prssettingspool/schema.sql @@ -0,0 +1,5 @@ +create table t1( + id1 bigint, + id2 bigint, + primary key(id1) +) Engine=InnoDB; \ No newline at end of file diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index c2ab9d48306..0505f4a266b 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -31,6 +31,9 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/vttablet/tabletconn" + "vitess.io/vitess/go/json2" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" @@ -693,3 +696,24 @@ func CheckReplicationStatus(ctx context.Context, t *testing.T, tablet *cluster.V require.Equal(t, "No", res.Rows[0][11].ToString()) } } + +func WaitForTabletToBeServing(t *testing.T, clusterInstance *cluster.LocalProcessCluster, tablet *cluster.Vttablet, timeout time.Duration) { + vTablet, err := clusterInstance.VtctlclientGetTablet(tablet) + require.NoError(t, err) + + tConn, err := tabletconn.GetDialer()(vTablet, false) + require.NoError(t, err) + + newCtx, cancel := context.WithTimeout(context.Background(), timeout) + err = tConn.StreamHealth(newCtx, func(shr *querypb.StreamHealthResponse) error { + if shr.Serving { + cancel() + } + return nil + }) + + // the error should only be because we cancelled the context when the tablet became serving again. + if err != nil && !strings.Contains(err.Error(), "context canceled") { + t.Fatal(err.Error()) + } +} diff --git a/go/vt/vtgate/safe_session.go b/go/vt/vtgate/safe_session.go index 7ecb2943265..326c98b6b06 100644 --- a/go/vt/vtgate/safe_session.go +++ b/go/vt/vtgate/safe_session.go @@ -149,11 +149,22 @@ func (session *SafeSession) ResetTx() { session.mu.Lock() defer session.mu.Unlock() session.resetCommonLocked() - if !session.Session.InReservedConn { - session.ShardSessions = nil - session.PreSessions = nil - session.PostSessions = nil + // If settings pools is enabled on the vttablet. + // This variable will be true but there will not be a shard session with reserved connection id. + // So, we should check the shard session and not just this variable. + if session.Session.InReservedConn { + allSessions := append(session.ShardSessions, append(session.PreSessions, session.PostSessions...)...) + for _, ss := range allSessions { + if ss.ReservedId != 0 { + // found that reserved connection exists. + // abort here, we should keep the shard sessions. + return + } + } } + session.ShardSessions = nil + session.PreSessions = nil + session.PostSessions = nil } // Reset clears the session diff --git a/test/config.json b/test/config.json index 13ab5bfcbf0..d5757645b6c 100644 --- a/test/config.json +++ b/test/config.json @@ -1214,6 +1214,15 @@ "Shard": "vttablet_prscomplex", "RetryMax": 1, "Tags": [""] + }, + "prssettingspool": { + "File": "unused.go", + "Args": ["vitess.io/vitess/go/test/endtoend/reparent/prssettingspool"], + "Command": [], + "Manual": false, + "Shard": "vttablet_prscomplex", + "RetryMax": 1, + "Tags": [""] } } } From b1948343fc2554dbbe4e18f716140fdbd0276891 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 21:09:09 +0000 Subject: [PATCH 102/233] test: change cfc test to make it work consistently (#12960) Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- go/vt/vtgate/executor_select_test.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index 5e158ed4e2e..4aa51368be2 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -3913,12 +3913,24 @@ func TestSelectCFC(t *testing.T) { executor.normalize = true session := NewAutocommitSession(&vtgatepb.Session{}) - for i := 1; i < 100; i++ { - _, err := executor.Execute(context.Background(), "TestSelectCFC", session, - "select /*vt+ PLANNER=gen4 */ c2 from tbl_cfc where c1 like 'A%'", nil) - require.NoError(t, err) - assert.EqualValues(t, 1, executor.plans.Misses(), "missed count:") - assert.EqualValues(t, i-1, executor.plans.Hits(), "hit count:") + _, err := executor.Execute(context.Background(), "TestSelectCFC", session, + "select /*vt+ PLANNER=gen4 */ c2 from tbl_cfc where c1 like 'A%'", nil) + require.NoError(t, err) + + timeout := time.After(10 * time.Second) + for { + select { + case <-timeout: + t.Fatal("not able to cache a plan withing 10 seconds.") + case <-time.After(5 * time.Millisecond): + // should be able to find cache entry before the timeout. + cacheItems := executor.debugCacheEntries() + for _, item := range cacheItems { + if strings.Contains(item.Key, "c2 from tbl_cfc where c1 like") { + return + } + } + } } } From b05d3a4a52343180bc9e736c33cb93667cf1aa2c Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 11:11:33 +0000 Subject: [PATCH 103/233] fix: union distinct between unsharded route and sharded join (#12974) Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- .gitignore | 3 + .../planbuilder/operator_transformers.go | 29 ++-- .../planbuilder/testdata/union_cases.json | 125 ++++++++++++++++++ 3 files changed, 141 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 3595b9673d8..881e89890cc 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,6 @@ venv .scannerwork report + +# plan test output +/go/vt/vtgate/planbuilder/testdata/plan_test* diff --git a/go/vt/vtgate/planbuilder/operator_transformers.go b/go/vt/vtgate/planbuilder/operator_transformers.go index 9dc2dcd6e0f..ddceddc9ea0 100644 --- a/go/vt/vtgate/planbuilder/operator_transformers.go +++ b/go/vt/vtgate/planbuilder/operator_transformers.go @@ -464,25 +464,22 @@ func pushWeightStringForDistinct(ctx *plancontext.PlanningContext, plan logicalP } node.noNeedToTypeCheck = append(node.noNeedToTypeCheck, newOffset) case *joinGen4: - lhsSolves := node.Left.ContainsTables() - rhsSolves := node.Right.ContainsTables() - expr := node.OutputColumns()[offset] - aliasedExpr, isAliased := expr.(*sqlparser.AliasedExpr) - if !isAliased { - return 0, vterrors.VT13001("cannot convert JOIN output columns to an aliased-expression") - } - deps := ctx.SemTable.RecursiveDeps(aliasedExpr.Expr) + joinOffset := node.Cols[offset] switch { - case deps.IsSolvedBy(lhsSolves): - offset, err = pushWeightStringForDistinct(ctx, node.Left, offset) - node.Cols = append(node.Cols, -(offset + 1)) - case deps.IsSolvedBy(rhsSolves): - offset, err = pushWeightStringForDistinct(ctx, node.Right, offset) - node.Cols = append(node.Cols, offset+1) + case joinOffset < 0: + offset, err = pushWeightStringForDistinct(ctx, node.Left, -(joinOffset + 1)) + offset = -(offset + 1) + case joinOffset > 0: + offset, err = pushWeightStringForDistinct(ctx, node.Right, joinOffset-1) + offset = offset + 1 default: - return 0, vterrors.VT12001("push DISTINCT WEIGHT_STRING to both sides of the join") + return 0, vterrors.VT13001("wrong column offset in join plan to push DISTINCT WEIGHT_STRING") } - newOffset = len(node.Cols) - 1 + if err != nil { + return 0, err + } + newOffset = len(node.Cols) + node.Cols = append(node.Cols, offset) default: return 0, vterrors.VT13001(fmt.Sprintf("pushWeightStringForDistinct on %T", plan)) } diff --git a/go/vt/vtgate/planbuilder/testdata/union_cases.json b/go/vt/vtgate/planbuilder/testdata/union_cases.json index cd78c889706..1acfa7b82dd 100644 --- a/go/vt/vtgate/planbuilder/testdata/union_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/union_cases.json @@ -2453,5 +2453,130 @@ "main.unsharded" ] } + }, + { + "comment": "union of unsharded route with sharded join with involvement of weight string", + "query": "select id, foo, bar from unsharded union select user.intcol, user.textcol2, authoritative.col2 from user join authoritative", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select id, foo, bar from unsharded union select user.intcol, user.textcol2, authoritative.col2 from user join authoritative", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select id, foo, bar from unsharded where 1 != 1", + "Query": "select id, foo, bar from unsharded", + "Table": "unsharded" + }, + { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0,L:1,R:0", + "TableName": "`user`_authoritative", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `user`.intcol, `user`.textcol2 from `user` where 1 != 1", + "Query": "select `user`.intcol, `user`.textcol2 from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select authoritative.col2 from authoritative where 1 != 1", + "Query": "select authoritative.col2 from authoritative", + "Table": "authoritative" + } + ] + } + ] + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select id, foo, bar from unsharded union select user.intcol, user.textcol2, authoritative.col2 from user join authoritative", + "Instructions": { + "OperatorType": "Distinct", + "Collations": [ + "(0:3)", + "(1:4)", + "(2:5)" + ], + "ResultColumns": 3, + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select id, foo, bar, weight_string(id), weight_string(foo), weight_string(bar) from unsharded where 1 != 1", + "Query": "select distinct id, foo, bar, weight_string(id), weight_string(foo), weight_string(bar) from unsharded", + "Table": "unsharded" + }, + { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0,L:1,R:0,L:2,L:3,R:1", + "TableName": "`user`_authoritative", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `user`.intcol, `user`.textcol2, weight_string(`user`.intcol), weight_string(`user`.textcol2) from `user` where 1 != 1", + "Query": "select `user`.intcol, `user`.textcol2, weight_string(`user`.intcol), weight_string(`user`.textcol2) from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select authoritative.col2, weight_string(authoritative.col2) from authoritative where 1 != 1", + "Query": "select authoritative.col2, weight_string(authoritative.col2) from authoritative", + "Table": "authoritative" + } + ] + } + ] + } + ] + }, + "TablesUsed": [ + "main.unsharded", + "user.authoritative", + "user.user" + ] + } } ] From 199e53caab75cd025c12a8127ac87625f8cee034 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 2 May 2023 11:26:50 +0530 Subject: [PATCH 104/233] [release-16.0] update v16 release notes about VTGate Advertised MySQL Version (#12957) (#12962) * update v16 release notes about VTGate Advertised MySQL Version Signed-off-by: yoheimuta * Update changelog/16.0/16.0.0/release_notes.md Signed-off-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> * Update changelog/16.0/16.0.0/summary.md Signed-off-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> --------- Signed-off-by: yoheimuta Signed-off-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Co-authored-by: yoheimuta Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> --- changelog/16.0/16.0.0/release_notes.md | 2 ++ changelog/16.0/16.0.0/summary.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/changelog/16.0/16.0.0/release_notes.md b/changelog/16.0/16.0.0/release_notes.md index a9fdc0b47c0..729f192d54b 100644 --- a/changelog/16.0/16.0.0/release_notes.md +++ b/changelog/16.0/16.0.0/release_notes.md @@ -109,6 +109,8 @@ or Since [Pull Request #11989](https://github.com/vitessio/vitess/pull/11989), VTGate advertises MySQL version 8.0.30. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. The users can set the `mysql_server_version` flag to advertise the correct version. +It is worth noting that [the feature to avoid using reserved connections](https://vitess.io/docs/16.0/reference/query-serving/reserved-conn/#avoiding-the-use-of-reserved-connections) depends on the `mysql_server_version` CLI flag, which default value has been changed from `5.7.9-vitess` to `8.0.30-vitess`. We recommend that users running MySQL 5.7 set vtgate's `mysql_server_version` CLI flag to `5.7.9-vitess` to prevent the queries from being unexpectedly rewritten. + #### Default MySQL version on Docker The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the patch version of MySQL80 has been upgraded from `8.0.23` to `8.0.30`. diff --git a/changelog/16.0/16.0.0/summary.md b/changelog/16.0/16.0.0/summary.md index 7a14f2533b7..ac2cb5a5b6c 100644 --- a/changelog/16.0/16.0.0/summary.md +++ b/changelog/16.0/16.0.0/summary.md @@ -108,6 +108,8 @@ or Since [Pull Request #11989](https://github.com/vitessio/vitess/pull/11989), VTGate advertises MySQL version 8.0.30. This is a breaking change for clients that rely on the VTGate advertised MySQL version and still use MySQL 5.7. The users can set the `mysql_server_version` flag to advertise the correct version. +It is worth noting that [the feature to avoid using reserved connections](https://vitess.io/docs/16.0/reference/query-serving/reserved-conn/#avoiding-the-use-of-reserved-connections) depends on the `mysql_server_version` CLI flag, which default value has been changed from `5.7.9-vitess` to `8.0.30-vitess`. We recommend that users running MySQL 5.7 set vtgate's `mysql_server_version` CLI flag to `5.7.9-vitess` to prevent the queries from being unexpectedly rewritten. + #### Default MySQL version on Docker The default major MySQL version used by our `vitess/lite:latest` image is going from `5.7` to `8.0`. Additionally, the patch version of MySQL80 has been upgraded from `8.0.23` to `8.0.30`. From 24ca345e9fbeb2a3bd7eddf4e5105482f1e506d2 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Tue, 9 May 2023 08:03:40 +0200 Subject: [PATCH 105/233] gen4 planner: allow last_insert_id with arguments (#13026) (#13033) Signed-off-by: Andres Taylor --- go/vt/sqlparser/ast_rewriting.go | 11 +++++- .../planbuilder/testdata/dml_cases.json | 23 ++++++++++++ .../planbuilder/testdata/select_cases.json | 37 +++++++++++++++++++ 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/go/vt/sqlparser/ast_rewriting.go b/go/vt/sqlparser/ast_rewriting.go index 9a66202e7be..1e7029e3b87 100644 --- a/go/vt/sqlparser/ast_rewriting.go +++ b/go/vt/sqlparser/ast_rewriting.go @@ -564,12 +564,19 @@ var funcRewrites = map[string]string{ } func (er *astRewriter) funcRewrite(cursor *Cursor, node *FuncExpr) { - bindVar, found := funcRewrites[node.Name.Lowered()] + lowered := node.Name.Lowered() + if lowered == "last_insert_id" && len(node.Exprs) > 0 { + // if we are dealing with is LAST_INSERT_ID() with an argument, we don't need to rewrite it. + // with an argument, this is an identity function that will update the session state and + // sets the correct fields in the OK TCP packet that we send back + return + } + bindVar, found := funcRewrites[lowered] if !found || (bindVar == DBVarName && !er.shouldRewriteDatabaseFunc) { return } if len(node.Exprs) > 0 { - er.err = vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "Argument to %s() not supported", node.Name.Lowered()) + er.err = vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "Argument to %s() not supported", lowered) return } cursor.Replace(bindVarExpression(bindVar)) diff --git a/go/vt/vtgate/planbuilder/testdata/dml_cases.json b/go/vt/vtgate/planbuilder/testdata/dml_cases.json index d41e586019b..a3cb1120dff 100644 --- a/go/vt/vtgate/planbuilder/testdata/dml_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/dml_cases.json @@ -6244,5 +6244,28 @@ "user.ref" ] } + }, + { + "comment": "update using last_insert_id with an argument", + "query": "update main.m1 set foo = last_insert_id(foo+1) where id = 12345", + "plan": { + "QueryType": "UPDATE", + "Original": "update main.m1 set foo = last_insert_id(foo+1) where id = 12345", + "Instructions": { + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "MultiShardAutocommit": false, + "Query": "update m1 set foo = last_insert_id(foo + 1) where id = 12345", + "Table": "m1" + }, + "TablesUsed": [ + "main.m1" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index d1a69fbc7a9..467421f7258 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -8068,5 +8068,42 @@ "user.user" ] } + }, + { + "comment": "allow last_insert_id with argument", + "query": "select last_insert_id(id) from user", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select last_insert_id(id) from user", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select last_insert_id(id) from `user` where 1 != 1", + "Query": "select last_insert_id(id) from `user`", + "Table": "`user`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select last_insert_id(id) from user", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select last_insert_id(id) from `user` where 1 != 1", + "Query": "select last_insert_id(id) from `user`", + "Table": "`user`" + }, + "TablesUsed": [ + "user.user" + ] + } } ] From 808821c364c44032f816d1ad2ac5c2324db1d0a2 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 9 May 2023 14:10:08 +0530 Subject: [PATCH 106/233] [release-16.0] vtgate : Disable Automatically setting immediateCallerID to user from static authentication context (#12961) (#12984) * Disables automatically setting immediateCallerID to User from Static authentication Context Signed-off-by: Phani Raj * Set effectiveCallerID based on these rules The client cert common name (if using mTLS) The effective caller id (if --grpc_use_effective_callerid=true) The static auth username (if --mysql_use_static_auth_username=true) Signed-off-by: Phani Raj * update vtgate help text fixture Signed-off-by: Phani Raj * Add new test to vtgate_shard_heavy test run Signed-off-by: Phani Raj * Run EffectiveCallerID tests in vtgate_general_heavy Signed-off-by: Phani Raj * feat: use DialWithOpts in release-16.0 since Dial doesn't exist Signed-off-by: Manan Gupta --------- Signed-off-by: Phani Raj Signed-off-by: Manan Gupta Co-authored-by: Phani Raj Co-authored-by: Manan Gupta --- go/flags/endtoend/vtgate.txt | 1 + .../vtgate/grpc_server_acls/acls_test.go | 204 ++++++++++++++++++ .../grpc_server_auth_static/main_test.go | 1 + go/vt/vtgate/grpcvtgateservice/server.go | 24 ++- test/config.json | 9 + 5 files changed, 234 insertions(+), 5 deletions(-) create mode 100644 go/test/endtoend/vtgate/grpc_server_acls/acls_test.go diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index 0761740d33c..946b10a39b2 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -34,6 +34,7 @@ Usage of vtgate: --gate_query_cache_size int gate server query cache size, maximum number of queries to be cached. vtgate analyzes every incoming query and generate a query plan, these plans are being cached in a cache. This config controls the expected amount of unique entries in the cache. (default 5000) --gateway_initial_tablet_timeout duration At startup, the tabletGateway will wait up to this duration to get at least one tablet per keyspace/shard/tablet type (default 30s) --grpc-use-effective-groups If set, and SSL is not used, will set the immediate caller's security groups from the effective caller id's groups. + --grpc-use-static-authentication-callerid If set, will set the immediate caller id to the username authenticated by the static auth plugin. --grpc_auth_mode string Which auth plugin implementation to use (eg: static) --grpc_auth_mtls_allowed_substrings string List of substrings of at least one of the client certificate names (separated by colon). --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. diff --git a/go/test/endtoend/vtgate/grpc_server_acls/acls_test.go b/go/test/endtoend/vtgate/grpc_server_acls/acls_test.go new file mode 100644 index 00000000000..a63ca12a201 --- /dev/null +++ b/go/test/endtoend/vtgate/grpc_server_acls/acls_test.go @@ -0,0 +1,204 @@ +/* +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 grpc_server_acls + +import ( + "context" + "flag" + "fmt" + "os" + "path" + "testing" + + "vitess.io/vitess/go/vt/callerid" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + + "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/vt/grpcclient" + "vitess.io/vitess/go/vt/vtgate/grpcvtgateconn" + "vitess.io/vitess/go/vt/vtgate/vtgateconn" +) + +var ( + clusterInstance *cluster.LocalProcessCluster + vtgateGrpcAddress string + hostname = "localhost" + keyspaceName = "ks" + cell = "zone1" + sqlSchema = ` + create table test_table ( + id bigint, + val varchar(128), + primary key(id) + ) Engine=InnoDB; +` + grpcServerAuthStaticJSON = ` + [ + { + "Username": "some_other_user", + "Password": "test_password" + }, + { + "Username": "another_unrelated_user", + "Password": "test_password" + } + ] +` + tableACLJSON = ` + { + "table_groups": [ + { + "name": "default", + "table_names_or_prefixes": ["%"], + "readers": ["user_with_access"], + "writers": ["user_with_access"], + "admins": ["user_with_access"] + } + ] + } +` +) + +func TestMain(m *testing.M) { + + defer cluster.PanicHandler(nil) + flag.Parse() + + exitcode := func() int { + clusterInstance = cluster.NewCluster(cell, hostname) + defer clusterInstance.Teardown() + + // Start topo server + if err := clusterInstance.StartTopo(); err != nil { + return 1 + } + + // Directory for authn / authz config files + authDirectory := path.Join(clusterInstance.TmpDirectory, "auth") + if err := os.Mkdir(authDirectory, 0700); err != nil { + return 1 + } + + // Create grpc_server_auth_static.json file + grpcServerAuthStaticPath := path.Join(authDirectory, "grpc_server_auth_static.json") + if err := createFile(grpcServerAuthStaticPath, grpcServerAuthStaticJSON); err != nil { + return 1 + } + + // Create table_acl.json file + tableACLPath := path.Join(authDirectory, "table_acl.json") + if err := createFile(tableACLPath, tableACLJSON); err != nil { + return 1 + } + + // Configure vtgate to use static auth + clusterInstance.VtGateExtraArgs = []string{ + "--grpc_auth_mode", "static", + "--grpc_auth_static_password_file", grpcServerAuthStaticPath, + "--grpc_use_effective_callerid", + "--grpc-use-static-authentication-callerid", + } + + // Configure vttablet to use table ACL + clusterInstance.VtTabletExtraArgs = []string{ + "--enforce-tableacl-config", + "--queryserver-config-strict-table-acl", + "--table-acl-config", tableACLPath, + } + + // Start keyspace + keyspace := &cluster.Keyspace{ + Name: keyspaceName, + SchemaSQL: sqlSchema, + } + if err := clusterInstance.StartUnshardedKeyspace(*keyspace, 1, false); err != nil { + return 1 + } + + // Start vtgate + if err := clusterInstance.StartVtgate(); err != nil { + clusterInstance.VtgateProcess = cluster.VtgateProcess{} + return 1 + } + vtgateGrpcAddress = fmt.Sprintf("%s:%d", clusterInstance.Hostname, clusterInstance.VtgateGrpcPort) + + return m.Run() + }() + os.Exit(exitcode) +} + +// TestEffectiveCallerIDWithAccess verifies that an authenticated gRPC static user with an effectiveCallerID that has ACL access can execute queries +func TestEffectiveCallerIDWithAccess(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + vtgateConn, err := dialVTGate(ctx, t, "some_other_user", "test_password") + if err != nil { + t.Fatal(err) + } + defer vtgateConn.Close() + + session := vtgateConn.Session(keyspaceName+"@primary", nil) + query := "SELECT id FROM test_table" + ctx = callerid.NewContext(ctx, callerid.NewEffectiveCallerID("user_with_access", "", ""), nil) + _, err = session.Execute(ctx, query, nil) + assert.NoError(t, err) +} + +// TestEffectiveCallerIDWithNoAccess verifies that an authenticated gRPC static user without an effectiveCallerID that has ACL access cannot execute queries +func TestEffectiveCallerIDWithNoAccess(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + vtgateConn, err := dialVTGate(ctx, t, "another_unrelated_user", "test_password") + if err != nil { + t.Fatal(err) + } + defer vtgateConn.Close() + + session := vtgateConn.Session(keyspaceName+"@primary", nil) + query := "SELECT id FROM test_table" + ctx = callerid.NewContext(ctx, callerid.NewEffectiveCallerID("user_no_access", "", ""), nil) + _, err = session.Execute(ctx, query, nil) + require.Error(t, err) + assert.Contains(t, err.Error(), "Select command denied to user") + assert.Contains(t, err.Error(), "for table 'test_table' (ACL check error)") +} + +func dialVTGate(ctx context.Context, t *testing.T, username string, password string) (*vtgateconn.VTGateConn, error) { + clientCreds := &grpcclient.StaticAuthClientCreds{Username: username, Password: password} + creds := grpc.WithPerRPCCredentials(clientCreds) + dialerFunc := grpcvtgateconn.DialWithOpts(ctx, creds) + dialerName := t.Name() + vtgateconn.RegisterDialer(dialerName, dialerFunc) + return vtgateconn.DialProtocol(ctx, dialerName, vtgateGrpcAddress) +} + +func createFile(path string, contents string) error { + f, err := os.Create(path) + if err != nil { + return err + } + _, err = f.WriteString(contents) + if err != nil { + return err + } + return f.Close() +} diff --git a/go/test/endtoend/vtgate/grpc_server_auth_static/main_test.go b/go/test/endtoend/vtgate/grpc_server_auth_static/main_test.go index 510f969ce9a..c00f4b3f2c1 100644 --- a/go/test/endtoend/vtgate/grpc_server_auth_static/main_test.go +++ b/go/test/endtoend/vtgate/grpc_server_auth_static/main_test.go @@ -109,6 +109,7 @@ func TestMain(m *testing.M) { clusterInstance.VtGateExtraArgs = []string{ "--grpc_auth_mode", "static", "--grpc_auth_static_password_file", grpcServerAuthStaticPath, + "--grpc-use-static-authentication-callerid", } // Configure vttablet to use table ACL diff --git a/go/vt/vtgate/grpcvtgateservice/server.go b/go/vt/vtgate/grpcvtgateservice/server.go index d012786d6eb..0ebe829ac4d 100644 --- a/go/vt/vtgate/grpcvtgateservice/server.go +++ b/go/vt/vtgate/grpcvtgateservice/server.go @@ -46,13 +46,15 @@ const ( ) var ( - useEffective bool - useEffectiveGroups bool + useEffective bool + useEffectiveGroups bool + useStaticAuthenticationIdentity bool ) func registerFlags(fs *pflag.FlagSet) { fs.BoolVar(&useEffective, "grpc_use_effective_callerid", false, "If set, and SSL is not used, will set the immediate caller id from the effective caller id's principal.") fs.BoolVar(&useEffectiveGroups, "grpc-use-effective-groups", false, "If set, and SSL is not used, will set the immediate caller's security groups from the effective caller id's groups.") + fs.BoolVar(&useStaticAuthenticationIdentity, "grpc-use-static-authentication-callerid", false, "If set, will set the immediate caller id to the username authenticated by the static auth plugin.") } func init() { @@ -94,23 +96,35 @@ func immediateCallerIDFromCert(ctx context.Context) (string, []string) { return cert.Subject.CommonName, cert.DNSNames } -func immediateCallerID(ctx context.Context) (string, []string) { +// immediateCallerIdFromStaticAuthentication extracts the username of the current +// static authentication context and returns that to the caller. +func immediateCallerIdFromStaticAuthentication(ctx context.Context) (string, []string) { if immediate := servenv.StaticAuthUsernameFromContext(ctx); immediate != "" { return immediate, nil } - return immediateCallerIDFromCert(ctx) + + return "", nil } // withCallerIDContext creates a context that extracts what we need // from the incoming call and can be forwarded for use when talking to vttablet. func withCallerIDContext(ctx context.Context, effectiveCallerID *vtrpcpb.CallerID) context.Context { - immediate, securityGroups := immediateCallerID(ctx) + // The client cert common name (if using mTLS) + immediate, securityGroups := immediateCallerIDFromCert(ctx) + + // The effective caller id (if --grpc_use_effective_callerid=true) if immediate == "" && useEffective && effectiveCallerID != nil { immediate = effectiveCallerID.Principal if useEffectiveGroups && len(effectiveCallerID.Groups) > 0 { securityGroups = effectiveCallerID.Groups } } + + // The static auth username (if --grpc-use-static-authentication-callerid=true) + if immediate == "" && useStaticAuthenticationIdentity { + immediate, securityGroups = immediateCallerIdFromStaticAuthentication(ctx) + } + if immediate == "" { immediate = unsecureClient } diff --git a/test/config.json b/test/config.json index d5757645b6c..511e632e4ad 100644 --- a/test/config.json +++ b/test/config.json @@ -882,6 +882,15 @@ "RetryMax": 1, "Tags": [] }, + "vtgate_grpc_server_acls": { + "File": "unused.go", + "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/grpc_server_acls"], + "Command": [], + "Manual": false, + "Shard": "vtgate_general_heavy", + "RetryMax": 1, + "Tags": [] + }, "topo_zk2": { "File": "unused.go", "Args": ["vitess.io/vitess/go/test/endtoend/topotest/zk2", "--topo-flavor=zk2"], From 693444474ca9f7cee4e91381e2bcf2986e723992 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Tue, 9 May 2023 14:59:28 +0530 Subject: [PATCH 107/233] Summary changes and code freeze for release of v16.0.2 (#13049) * feat: add summary docs changes Signed-off-by: Manan Gupta * Code freeze of release-16.0 Signed-off-by: Manan Gupta --------- Signed-off-by: Manan Gupta --- .github/workflows/code_freeze.yml | 2 +- changelog/16.0/16.0.2/summary.md | 13 +++++++++++++ changelog/16.0/README.md | 4 ++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index efe1d6e8856..1bb74feee50 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 diff --git a/changelog/16.0/16.0.2/summary.md b/changelog/16.0/16.0.2/summary.md index 99b0c998396..1db25b678b9 100644 --- a/changelog/16.0/16.0.2/summary.md +++ b/changelog/16.0/16.0.2/summary.md @@ -1,5 +1,18 @@ ## Summary +### Upgrade to `go1.20.3` + +Vitess `v16.0.2` now runs on `go1.20.3`. +Below is a summary of this Go patch release. You can learn more [here](https://go.dev/doc/devel/release#go1.20). + +> go1.20.3 (released 2023-04-04) includes security fixes to the go/parser, html/template, mime/multipart, net/http, and net/textproto packages, as well as bug fixes to the compiler, the linker, the runtime, and the time package. See the Go 1.20.3 milestone on our issue tracker for details. + +### EffectiveCallerId in Vtgate gRPC calls + +A new flag `grpc-use-static-authentication-callerid` is added to gate the behavior introduced in https://github.com/vitessio/vitess/pull/12050. +Earlier, we used to automatically set immediateCallerID to user from static authentication context that overrode the EffectiveCallerId. + + ### Shard name validation in TopoServer Prior to v16.0.2, it was possible to create a shard name with invalid characters, which would then be inaccessible to various cluster management operations. diff --git a/changelog/16.0/README.md b/changelog/16.0/README.md index 2f085cdecb6..da958347db9 100644 --- a/changelog/16.0/README.md +++ b/changelog/16.0/README.md @@ -1,6 +1,10 @@ ## v16.0 The dedicated team for this release can be found [here](team.md). +* **[16.0.2](16.0.2)** + * **[16.0.1](16.0.1)** + * [Changelog](16.0.1/changelog.md) + * [Release Notes](16.0.1/release_notes.md) * **[16.0.0](16.0.0)** * [Changelog](16.0.0/changelog.md) From 6076fed0300de2eb7a17a5f5cd67527c29b5b3c6 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Tue, 9 May 2023 20:40:42 +0530 Subject: [PATCH 108/233] Release of v16.0.2 (#13050) * Release notes for 16.0.2 Signed-off-by: Manan Gupta * Release commit for 16.0.2 Signed-off-by: Manan Gupta * regenerate the changelog Signed-off-by: Florent Poinsard --------- Signed-off-by: Manan Gupta Signed-off-by: Florent Poinsard Co-authored-by: Florent Poinsard --- .github/workflows/code_freeze.yml | 2 +- changelog/16.0/16.0.2/changelog.md | 50 +++++++++++++++++++ changelog/16.0/16.0.2/release_notes.md | 28 +++++++++++ changelog/16.0/README.md | 2 + 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 | 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 +- 20 files changed, 162 insertions(+), 82 deletions(-) create mode 100644 changelog/16.0/16.0.2/changelog.md create mode 100644 changelog/16.0/16.0.2/release_notes.md diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 1bb74feee50..efe1d6e8856 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/16.0/16.0.2/changelog.md b/changelog/16.0/16.0.2/changelog.md new file mode 100644 index 00000000000..978cf9441e6 --- /dev/null +++ b/changelog/16.0/16.0.2/changelog.md @@ -0,0 +1,50 @@ +# Changelog of Vitess v16.0.2 + +### Bug fixes +#### Build/CI + * Small fixes to the auto-upgrade golang tool [#12838](https://github.com/vitessio/vitess/pull/12838) + * Add timeout to `golangci-lint` and bump its version [#12852](https://github.com/vitessio/vitess/pull/12852) + * [release-16.0] Remove recent golangci-lint version bump [#12909](https://github.com/vitessio/vitess/pull/12909) +#### Cluster management + * Backport: [topo] Disallow the slash character in shard names #12843 [#12858](https://github.com/vitessio/vitess/pull/12858) +#### Query Serving + * Fix `vtgate_schema_tracker` flaky tests [#12780](https://github.com/vitessio/vitess/pull/12780) + * [planbuilder bugfix] do not push aggregations into derived tables [#12810](https://github.com/vitessio/vitess/pull/12810) + * [16.0] Fix: reset transaction session when no reserved connection [#12877](https://github.com/vitessio/vitess/pull/12877) + * [release-16.0] fix: union distinct between unsharded route and sharded join (#12968) [#12974](https://github.com/vitessio/vitess/pull/12974) +### CI/Build +#### General + * Do not fail build on incorrect Go version [#12809](https://github.com/vitessio/vitess/pull/12809) + * [release-16.0] Upgrade the Golang version to `go1.20.3` [#12832](https://github.com/vitessio/vitess/pull/12832) +### Documentation +#### Query Serving + * update v16 release notes about VTGate Advertised MySQL Version [#12957](https://github.com/vitessio/vitess/pull/12957) +### Enhancement +#### Build/CI + * Remove unnecessary code bits in workflows [#12756](https://github.com/vitessio/vitess/pull/12756) +#### General + * Automatically add milestone to new Pull Request [#12759](https://github.com/vitessio/vitess/pull/12759) +#### Query Serving + * [release-16.0] planner fix: scoping rules for JOIN ON expression inside a subquery [#12891](https://github.com/vitessio/vitess/pull/12891) +### Internal Cleanup +#### CLI + * Cleanup TODOs in vtorc flag parsing code from v15 [#12787](https://github.com/vitessio/vitess/pull/12787) +#### TabletManager + * Table GC: remove spammy log entry [#12625](https://github.com/vitessio/vitess/pull/12625) +### Regression +#### ACL + * vtgate : Disable Automatically setting immediateCallerID to user from static authentication context [#12961](https://github.com/vitessio/vitess/pull/12961) +#### Query Serving + * gen4 planner: allow last_insert_id with arguments [#13026](https://github.com/vitessio/vitess/pull/13026) +### Release +#### Documentation + * Fix incorrect path during release notes generation [#12769](https://github.com/vitessio/vitess/pull/12769) +#### General + * Back to dev mode after v16.0.1 [#12783](https://github.com/vitessio/vitess/pull/12783) + * Summary changes and code freeze for release of v16.0.2 [#13049](https://github.com/vitessio/vitess/pull/13049) +### Testing +#### Build/CI + * [release-16.0] Throttler: Expose Tablet's Config & Leverage to Deflake Tests [#12791](https://github.com/vitessio/vitess/pull/12791) + * fakedbclient: Add locking to avoid races [#12814](https://github.com/vitessio/vitess/pull/12814) + * [release-16.0] test: fix cfc flaky test (#12941) [#12960](https://github.com/vitessio/vitess/pull/12960) + diff --git a/changelog/16.0/16.0.2/release_notes.md b/changelog/16.0/16.0.2/release_notes.md new file mode 100644 index 00000000000..98439a93524 --- /dev/null +++ b/changelog/16.0/16.0.2/release_notes.md @@ -0,0 +1,28 @@ +# Release of Vitess v16.0.2 +## Summary + +### Upgrade to `go1.20.3` + +Vitess `v16.0.2` now runs on `go1.20.3`. +Below is a summary of this Go patch release. You can learn more [here](https://go.dev/doc/devel/release#go1.20). + +> go1.20.3 (released 2023-04-04) includes security fixes to the go/parser, html/template, mime/multipart, net/http, and net/textproto packages, as well as bug fixes to the compiler, the linker, the runtime, and the time package. See the Go 1.20.3 milestone on our issue tracker for details. + +### EffectiveCallerId in Vtgate gRPC calls + +A new flag `grpc-use-static-authentication-callerid` is added to gate the behavior introduced in https://github.com/vitessio/vitess/pull/12050. +Earlier, we used to automatically set immediateCallerID to user from static authentication context that overrode the EffectiveCallerId. + + +### Shard name validation in TopoServer + +Prior to v16.0.2, it was possible to create a shard name with invalid characters, which would then be inaccessible to various cluster management operations. + +Shard names may no longer contain the forward slash ("/") character, and TopoServer's `CreateShard` method returns an error if given such a name. +------------ +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/16.0/16.0.2/changelog.md). + +The release includes 24 commits (excluding merges) + +Thanks to all our contributors: @GuptaManan100, @ajm188, @frouioui, @github-actions[bot], @harshit-gangal, @mattlord, @systay, @vitess-bot[bot] + diff --git a/changelog/16.0/README.md b/changelog/16.0/README.md index da958347db9..35e87974acb 100644 --- a/changelog/16.0/README.md +++ b/changelog/16.0/README.md @@ -1,6 +1,8 @@ ## v16.0 The dedicated team for this release can be found [here](team.md). * **[16.0.2](16.0.2)** + * [Changelog](16.0.2/changelog.md) + * [Release Notes](16.0.2/release_notes.md) * **[16.0.1](16.0.1)** * [Changelog](16.0.1/changelog.md) diff --git a/docker/release.sh b/docker/release.sh index 80d520b396f..39dbeb53873 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.2-SNAPSHOT' +vt_base_version='v16.0.2' 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 537f29a9156..51cd9eae3b8 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:v16.0.1 + image: vitess/lite:v16.0.2 ports: - "15000:$WEB_PORT" - "$GRPC_PORT" @@ -81,7 +81,7 @@ services: condition: service_healthy vtgate: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 ports: - "15099:$WEB_PORT" - "$GRPC_PORT" @@ -111,7 +111,7 @@ services: condition: service_healthy schemaload: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 command: - sh - -c @@ -144,12 +144,12 @@ services: environment: - KEYSPACES=$KEYSPACE - GRPC_PORT=15999 - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - .:/script vttablet100: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 ports: - "15100:$WEB_PORT" - "$GRPC_PORT" @@ -181,7 +181,7 @@ services: retries: 15 vttablet101: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 ports: - "15101:$WEB_PORT" - "$GRPC_PORT" @@ -213,7 +213,7 @@ services: retries: 15 vttablet102: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 ports: - "15102:$WEB_PORT" - "$GRPC_PORT" @@ -245,7 +245,7 @@ services: retries: 15 vttablet103: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 ports: - "15103:$WEB_PORT" - "$GRPC_PORT" @@ -277,7 +277,7 @@ services: retries: 15 vtorc: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 command: ["sh", "-c", "/script/vtorc-up.sh"] depends_on: - vtctld @@ -307,7 +307,7 @@ services: retries: 15 vreplication: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - ".:/script" environment: diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index d8e516a1b42..001f4a75ea1 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - .:/script set_keyspace_durability_policy: @@ -115,7 +115,7 @@ services: environment: - KEYSPACES=test_keyspace lookup_keyspace - GRPC_PORT=15999 - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - .:/script vtctld: @@ -143,7 +143,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 ports: - 15000:8080 - "15999" @@ -160,7 +160,7 @@ services: --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 ports: - 15099:8080 - "15999" @@ -182,7 +182,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 ports: - 15302:8080 - "15999" diff --git a/examples/compose/vtcompose/docker-compose.test.yml b/examples/compose/vtcompose/docker-compose.test.yml index 47c7bd76d15..c3c61ba9627 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - .:/script set_keyspace_durability_policy_test_keyspace: @@ -117,7 +117,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=test_keyspace - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - .:/script set_keyspace_durability_policy_unsharded_keyspace: @@ -130,7 +130,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=unsharded_keyspace - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - .:/script vtctld: @@ -159,7 +159,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 ports: - 15000:8080 - "15999" @@ -176,7 +176,7 @@ services: ''grpc-vtgateservice'' --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 ports: - 15099:8080 - "15999" @@ -199,7 +199,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 ports: - 15301:8080 - "15999" diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index 5830360602b..b085319bca6 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 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:v16.0.1 + image: vitess/lite:v16.0.2 ports: - "15000:%[1]d" - "%[2]d" @@ -696,7 +696,7 @@ func generateVtgate(opts vtOptions) string { - op: add path: /services/vtgate value: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 ports: - "15099:%[1]d" - "%[2]d" @@ -738,7 +738,7 @@ func generateVTOrc(dbInfo externalDbInfo, keyspaceInfoMap map[string]keyspaceInf - op: add path: /services/vtorc value: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - ".:/script" environment: @@ -763,7 +763,7 @@ func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - op: add path: /services/vreplication value: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - ".:/script" environment: @@ -791,7 +791,7 @@ func generateSetKeyspaceDurabilityPolicy( - op: add path: /services/set_keyspace_durability_policy_%[3]s value: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - ".:/script" environment: @@ -828,7 +828,7 @@ func generateSchemaload( - op: add path: /services/schemaload_%[7]s value: - image: vitess/lite:v16.0.1 + image: vitess/lite:v16.0.2 volumes: - ".:/script" environment: diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index 322fce06259..09fbebff975 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:v16.0.1 - vtadmin: vitess/vtadmin:v16.0.1 - vtgate: vitess/lite:v16.0.1 - vttablet: vitess/lite:v16.0.1 - vtbackup: vitess/lite:v16.0.1 - vtorc: vitess/lite:v16.0.1 + vtctld: vitess/lite:v16.0.2 + vtadmin: vitess/vtadmin:v16.0.2 + vtgate: vitess/lite:v16.0.2 + vttablet: vitess/lite:v16.0.2 + vtbackup: vitess/lite:v16.0.2 + vtorc: vitess/lite:v16.0.2 mysqld: - mysql80Compatible: vitess/lite:v16.0.1 + mysql80Compatible: vitess/lite:v16.0.2 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 538164bc818..8a40d1567e6 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:v16.0.1 - vtadmin: vitess/vtadmin:v16.0.1 - vtgate: vitess/lite:v16.0.1 - vttablet: vitess/lite:v16.0.1 - vtbackup: vitess/lite:v16.0.1 - vtorc: vitess/lite:v16.0.1 + vtctld: vitess/lite:v16.0.2 + vtadmin: vitess/vtadmin:v16.0.2 + vtgate: vitess/lite:v16.0.2 + vttablet: vitess/lite:v16.0.2 + vtbackup: vitess/lite:v16.0.2 + vtorc: vitess/lite:v16.0.2 mysqld: - mysql80Compatible: vitess/lite:v16.0.1 + mysql80Compatible: vitess/lite:v16.0.2 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 89348f589ce..5003cd2f5e5 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:v16.0.1 - vtadmin: vitess/vtadmin:v16.0.1 - vtgate: vitess/lite:v16.0.1 - vttablet: vitess/lite:v16.0.1 - vtbackup: vitess/lite:v16.0.1 - vtorc: vitess/lite:v16.0.1 + vtctld: vitess/lite:v16.0.2 + vtadmin: vitess/vtadmin:v16.0.2 + vtgate: vitess/lite:v16.0.2 + vttablet: vitess/lite:v16.0.2 + vtbackup: vitess/lite:v16.0.2 + vtorc: vitess/lite:v16.0.2 mysqld: - mysql80Compatible: vitess/lite:v16.0.1 + mysql80Compatible: vitess/lite:v16.0.2 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 61511535834..45d92419aa1 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:v16.0.1 - vtadmin: vitess/vtadmin:v16.0.1 - vtgate: vitess/lite:v16.0.1 - vttablet: vitess/lite:v16.0.1 - vtbackup: vitess/lite:v16.0.1 - vtorc: vitess/lite:v16.0.1 + vtctld: vitess/lite:v16.0.2 + vtadmin: vitess/vtadmin:v16.0.2 + vtgate: vitess/lite:v16.0.2 + vttablet: vitess/lite:v16.0.2 + vtbackup: vitess/lite:v16.0.2 + vtorc: vitess/lite:v16.0.2 mysqld: - mysql80Compatible: vitess/lite:v16.0.1 + mysql80Compatible: vitess/lite:v16.0.2 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/operator.yaml b/examples/operator/operator.yaml index 078a4d229b0..7f211db50a1 100644 --- a/examples/operator/operator.yaml +++ b/examples/operator/operator.yaml @@ -6145,7 +6145,7 @@ spec: fieldPath: metadata.name - name: OPERATOR_NAME value: vitess-operator - image: planetscale/vitess-operator:v2.9.1 + image: planetscale/vitess-operator:v2.9.2 name: vitess-operator resources: limits: diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index 6a46ff3b1ff..6119012b5ab 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 = "16.0.2-SNAPSHOT" +const versionName = "16.0.2" diff --git a/java/client/pom.xml b/java/client/pom.xml index 25b0e3b5bf3..0fbafeeda34 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.2-SNAPSHOT + 16.0.2 vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 73100791351..cc45d260a42 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.2-SNAPSHOT + 16.0.2 vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 358f3ffdca7..71872d6874c 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.2-SNAPSHOT + 16.0.2 vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 422ae68d497..3a38517d14a 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.2-SNAPSHOT + 16.0.2 vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 2c828968ea8..f1ca3393caf 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.2-SNAPSHOT + 16.0.2 pom Vitess Java Client libraries [Parent] From 1597b681d4637417d232c281ef97aa4ab2a4e4ce Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 10 May 2023 06:00:48 +0530 Subject: [PATCH 109/233] Back to dev mode (#13055) Signed-off-by: Manan Gupta --- 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 39dbeb53873..aae5c38e5c3 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.2' +vt_base_version='v16.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 6119012b5ab..e6fc057fe94 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 = "16.0.2" +const versionName = "16.0.3-SNAPSHOT" diff --git a/java/client/pom.xml b/java/client/pom.xml index 0fbafeeda34..b50af98b563 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.2 + 16.0.3-SNAPSHOT vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index cc45d260a42..43059d2cfec 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.2 + 16.0.3-SNAPSHOT vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 71872d6874c..575ffbaf6bf 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.2 + 16.0.3-SNAPSHOT vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 3a38517d14a..9d827bc84f8 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.2 + 16.0.3-SNAPSHOT vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index f1ca3393caf..87aef5d1522 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.2 + 16.0.3-SNAPSHOT pom Vitess Java Client libraries [Parent] From b87ef7a4f696fddbd00ee37c5c602812a41f3fc6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 13:05:33 +0100 Subject: [PATCH 110/233] [release-16.0] Upgrade the Golang version to `go1.20.4` (#13053) * bump go version to go1.20.4 Signed-off-by: GitHub * upgrade the workflows with newer golang version Signed-off-by: Florent Poinsard --------- Signed-off-by: GitHub Signed-off-by: Florent Poinsard Co-authored-by: frouioui Co-authored-by: Florent Poinsard --- .github/workflows/assign_milestone.yml | 2 +- .github/workflows/check_make_vtadmin_authz_testgen.yml | 2 +- .github/workflows/check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr_mysql57.yml | 2 +- .../cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .github/workflows/cluster_endtoend_mysql_server_vault.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_scheduler.yml | 2 +- .../cluster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- ...luster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl.yml | 2 +- .../workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_consul.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_tablegc.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_throttler.yml | 2 +- ...uster_endtoend_tabletmanager_throttler_custom_config.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .../workflows/cluster_endtoend_topo_connection_cache.yml | 2 +- .../cluster_endtoend_vreplication_across_db_versions.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_basic.yml | 2 +- .../workflows/cluster_endtoend_vreplication_cellalias.yml | 2 +- ...ster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .../workflows/cluster_endtoend_vreplication_multicell.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_v2.yml | 2 +- .github/workflows/cluster_endtoend_vstream_failover.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_false.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_true.yml | 2 +- .../cluster_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- ...uster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_general_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_godriver.yml | 2 +- .../workflows/cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .../workflows/cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_reservedconn.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .../workflows/cluster_endtoend_vtgate_schema_tracker.yml | 2 +- .../cluster_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_consul.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_transaction.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_unsharded.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .github/workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 2 +- .github/workflows/docker_test_cluster_10.yml | 2 +- .github/workflows/docker_test_cluster_25.yml | 2 +- .github/workflows/e2e_race.yml | 2 +- .github/workflows/endtoend.yml | 2 +- .github/workflows/local_example.yml | 2 +- .github/workflows/region_example.yml | 2 +- .github/workflows/sonar_analysis.yml | 2 +- .github/workflows/static_checks_etc.yml | 2 +- .github/workflows/unit_race.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- .github/workflows/update_golang_version.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 2 +- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 2 +- .../upgrade_downgrade_test_backups_manual_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries.yml | 2 +- ...de_downgrade_test_query_serving_queries_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_schema.yml | 2 +- ...ade_downgrade_test_query_serving_schema_next_release.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 2 +- docker/lite/Dockerfile.ubi7.mysql80 | 2 +- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 2 +- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 2 +- docker/lite/Dockerfile.ubi8.mysql80 | 2 +- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- out.txt | 0 test.go | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_docker.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/dockerfile.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 129 files changed, 132 insertions(+), 128 deletions(-) create mode 100644 out.txt diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index 37dd7e3c119..8bb5b1098ef 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index 17d82c4532a..21742f607ed 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -48,7 +48,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 719b81b6016..53c6d3f5563 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -50,7 +50,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 713257e112b..490b70f882e 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 23d71c67896..0bdc549cc00 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 5c24421dcea..8d1d8d1c89d 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 2063ad00387..5c6b02a26e9 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 f9ba75a34ca..3f0d20f4a07 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 ec58302a959..eacb6cdda2c 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index 9df12163311..9a6d0ca7d76 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index 7642f212178..2865b0f5574 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 f65d2b1e5fc..01ec5312890 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 f1518eb019e..253565005a0 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 0b9335fdf69..8103d127037 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 e7f324ef7cd..53797c58f57 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 19184425707..846885f5677 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 afc76a24896..60261c4f25e 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 4d6dd7af92b..d3dfbe5d06b 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 87d7e861890..6f0e8b7b11f 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 55554bdcd82..39fad19a06d 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 3e15d27fdaf..3aa1ad57105 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 79a7acce126..ed0865b0e54 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 5c73b6f3e43..fc8983c62e0 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 44dcc73f82d..bfe822c3e71 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 618102967b8..acba0152324 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 da9013e1003..d0bc977a3ae 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 278e90d840f..77854252b75 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 a03bb455251..b814d57e905 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 a7feb92453c..36935e7b5b8 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 b75190d43ab..7bfbc96a8b9 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 49a90284dd0..7d30b2c38c1 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 209222a764c..98d36b09671 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 612d130fb94..89a7f09498f 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 91bb722e44f..ad3be697973 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 f8ac27793b0..9d94db3ecb6 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 619de27a09f..219a3753aa8 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 56332023ce1..13cc5138011 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 a2d523afebe..2284891189c 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 04d033913d9..befb68f0473 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 bfd7660e815..67b2a6a6e8a 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 9f4e29d7f90..c13cfb2cf02 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 07a019d452a..69b5fa39169 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 4ede64507ed..32b57446e11 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 e5f06e84e4f..6b9fdc634b3 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 ad9533f8da3..1bafc7c8d8f 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 ad9e104406b..aa5d94bc2c3 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 745266b9bd6..77707fd1316 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index ce3382f4c2b..d3b38810966 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 69bbdab1b85..56ee738bbf6 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 a4c85557f1b..da61dca286d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 59e9771fb7c..85927392fc7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 ea97dc58aed..dd43a43d488 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 cb961169ede..1284e5d4b83 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 7b030eb80e5..a8728f977fc 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 6be839dabc0..f00ce4d3f3e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 626a17ba64e..2bf62a03647 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 fc790f97754..44f4b9eef78 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 6a9c402abfe..79188f99331 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 1490f4f35e5..52140dc8518 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 664e0b764bd..9d32701e444 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 1284fa556ac..1a3908faf69 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 70a6b9db3fb..2859d56c8c2 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 0235f6c1e4e..2b8fc399450 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 b5b3fe60e16..bf60669bc98 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 93cc032d60f..868422792b8 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 8030673b96b..a631a356a90 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 c4d7e9780a7..0fe2157879d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 edbc2e1e265..addcc7804ed 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 e5916fd4e23..d787cc06f35 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 b60fedc2d0a..2664881dbc1 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 bf079c41ef7..f1719107e59 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 76e836851f1..00337347931 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 bd52a5c556a..12544cdfeb9 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 4f2d9eb6b74..cbc0c0398f9 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 e802be0c6cf..23b93a16e8b 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -42,7 +42,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Get base dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 1672fa9358f..85fc13b224d 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index 6943b0277ba..dbb5cf28682 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index 4ab3e8eb00b..06f4e243843 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index e9c6666c8ef..8ec59032734 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index f5534c954d8..fb3c20622e2 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index 10c803afe47..683342c7a00 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index 7c1cfc24109..a5b002c2974 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index 86079d91471..3bfd05402af 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS run: | diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 9c1cd7c7ae9..f12d7f34011 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -105,7 +105,7 @@ jobs: 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@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index bd08b4de65c..f5ec4447f4e 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -55,7 +55,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index adbc813fb17..3e2f4f457b1 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index a3551574859..cfe007de1a5 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index 73b00bc4ed7..1a9fa74458b 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index a0a238c848e..bcd6b0be801 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -83,7 +83,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 1ad331b0775..60dc3fe5e67 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -86,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 2e897065cf5..3ad5e29330b 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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 2f5217f6daf..e693c29a95b 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 730ace54ae3..06e8315242c 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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 a4410589b77..8ed290c5775 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 0f43f92368b..767badb7763 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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 df30d43c603..0781a0ff0ee 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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 f22be5b745a..a4f4bffe0db 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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 c76110e0db8..48eaeb2a384 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 7b357b43ede..c767855ed31 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 01834f6025d..80ed7260abe 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/Makefile b/Makefile index b8602577f8a..7e11641553f 100644 --- a/Makefile +++ b/Makefile @@ -275,7 +275,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=14.3 +BOOTSTRAP_VERSION=14.4 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index 2e5197343a5..b783201dc4f 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.20.3 || echo "Go version reported: `go version`. Version 1.20.3+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.20.4 || echo "Go version reported: `go version`. Version 1.20.4+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 2e54ecbfadd..36491163411 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index f357d916d20..70ba5c4cb68 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index 6896592c911..10de813efa0 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index be289f21f84..424fc2533da 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index a6b676d4688..006f34d7aad 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -64,4 +64,8 @@ List of changes between bootstrap image versions. ## [14.3] - 2023-04-05 ### Changes -- Update build to golang 1.20.3 \ No newline at end of file +- Update build to golang 1.20.3 + +## [14.4] - 2023-05-09 +### Changes +- Update build to golang 1.20.4 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index c9a41011337..30c94bbdab8 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.20.3-buster +FROM --platform=linux/amd64 golang:1.20.4-buster # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index 9bccdcb28a8..76b8759243c 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index 2e82d63e169..edc55c003cc 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index 977ddaae7dc..217836cce88 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index 25ff4bc15a5..dc7b17ef71d 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index 4b2121e9894..8547f22c174 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index d117f324015..d5fb04738cc 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index 7f646195b37..3935d4b225f 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index e8e291861ce..804d14d9a25 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index 090d2bcdc24..9f0097a2b28 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index f04c0aa5f62..4f0498f5e18 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index 32552f28044..71c752e58f5 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index 549253a578e..a516594e246 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index 73089799c6f..dd4ae9a820d 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index 90a104501c3..0af788364fc 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/out.txt b/out.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test.go b/test.go index 8b4c399040a..cba771c544c 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "14.3", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "14.4", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index a8610a3dcf7..4e4b24a542f 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python 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 26be7216d66..8a999acc72f 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - 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_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index fe83341235b..3fb0060a798 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -68,7 +68,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index d6c74c88c3b..ac8a0500961 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.3 +ARG bootstrap_version=14.4 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index 9c3d672c9cf..442d9126df5 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -59,7 +59,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.3 + go-version: 1.20.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' From a2b738cee69d35e307106f7f07735c66fde2d1da Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 13:28:20 +0100 Subject: [PATCH 111/233] [release-16.0] Fix the resilientQuery to give correct results during initialization (#13080) (#13087) * feat: fix the resilient query code to work better right after it has started Signed-off-by: Manan Gupta * feat: return after erroring out in TimeoutAction Signed-off-by: Manan Gupta --------- Signed-off-by: Manan Gupta Co-authored-by: Manan Gupta --- go/test/endtoend/utils/utils.go | 1 + go/vt/srvtopo/query.go | 7 +++- go/vt/srvtopo/query_test.go | 72 +++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 go/vt/srvtopo/query_test.go diff --git a/go/test/endtoend/utils/utils.go b/go/test/endtoend/utils/utils.go index e4b4310237f..d2f4255f2bf 100644 --- a/go/test/endtoend/utils/utils.go +++ b/go/test/endtoend/utils/utils.go @@ -300,6 +300,7 @@ func TimeoutAction(t *testing.T, timeout time.Duration, errMsg string, action fu select { case <-deadline: t.Error(errMsg) + return case <-time.After(1 * time.Second): ok = action() } diff --git a/go/vt/srvtopo/query.go b/go/vt/srvtopo/query.go index 098f5c77bc1..ec1ed50100a 100644 --- a/go/vt/srvtopo/query.go +++ b/go/vt/srvtopo/query.go @@ -86,7 +86,12 @@ func (q *resilientQuery) getCurrentValue(ctx context.Context, wkey fmt.Stringer, // If it is not time to check again, then return either the cached // value or the cached error but don't ask topo again. - if !shouldRefresh { + // Here we have to be careful with the part where we haven't gotten even the first result. + // In that case, a refresh is already in progress, but the cache is empty! So, we can't use the cache. + // We have to wait for the query's results. + // We know the query has run at least once if the insertionTime is non-zero, or if we have an error. + queryRanAtLeastOnce := !entry.insertionTime.IsZero() || entry.lastError != nil + if !shouldRefresh && queryRanAtLeastOnce { if cacheValid { return entry.value, nil } diff --git a/go/vt/srvtopo/query_test.go b/go/vt/srvtopo/query_test.go new file mode 100644 index 00000000000..2569a2ad420 --- /dev/null +++ b/go/vt/srvtopo/query_test.go @@ -0,0 +1,72 @@ +/* +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 srvtopo + +import ( + "context" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "vitess.io/vitess/go/stats" +) + +// TestResilientQueryGetCurrentValueInitialization tests that the resilient query returns the correct results when it has been +// initialized. +func TestResilientQueryGetCurrentValueInitialization(t *testing.T) { + // Create a basic query, which doesn't do anything other than return the same cell it got as an input. + // The query however needs to simulate being slow, so we have a sleep in there. + query := func(ctx context.Context, entry *queryEntry) (any, error) { + time.Sleep(1 * time.Second) + cell := entry.key.(cellName) + return cell, nil + } + counts := stats.NewCountersWithSingleLabel("TestResilientQueryGetCurrentValue", "Test for resilient query", "type") + + // Create the resilient query + rq := &resilientQuery{ + query: query, + counts: counts, + cacheRefreshInterval: 5 * time.Second, + cacheTTL: 5 * time.Second, + entries: make(map[string]*queryEntry), + } + + // Create a context and a cell. + ctx := context.Background() + cell := cellName("cell-1") + + // Hammer the resilient query with multiple get requests just as it is created. + // We expect all of them to work. + wg := sync.WaitGroup{} + for i := 0; i < 10; i++ { + // To test with both stale and not-stale, we use the modulo of our index. + stale := i%2 == 0 + wg.Add(1) + go func() { + defer wg.Done() + res, err := rq.getCurrentValue(ctx, cell, stale) + // Assert that we don't have any error and the value matches what we want. + assert.NoError(t, err) + assert.EqualValues(t, cell, res) + }() + } + // Wait for the wait group to be empty, otherwise the test is marked a success before any of the go routines finish completion! + wg.Wait() +} From 398e52b517b22a32fe6d59306678c560b8b77f8a Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 16 May 2023 13:25:45 +0100 Subject: [PATCH 112/233] Fix format error in the v16.0.2 release notes (#13058) Signed-off-by: Florent Poinsard Co-authored-by: Florent Poinsard --- changelog/16.0/16.0.2/release_notes.md | 2 ++ changelog/16.0/16.0.2/summary.md | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/changelog/16.0/16.0.2/release_notes.md b/changelog/16.0/16.0.2/release_notes.md index 98439a93524..fd32cf7493d 100644 --- a/changelog/16.0/16.0.2/release_notes.md +++ b/changelog/16.0/16.0.2/release_notes.md @@ -19,6 +19,8 @@ Earlier, we used to automatically set immediateCallerID to user from static auth Prior to v16.0.2, it was possible to create a shard name with invalid characters, which would then be inaccessible to various cluster management operations. Shard names may no longer contain the forward slash ("/") character, and TopoServer's `CreateShard` method returns an error if given such a name. + + ------------ The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/16.0/16.0.2/changelog.md). diff --git a/changelog/16.0/16.0.2/summary.md b/changelog/16.0/16.0.2/summary.md index 1db25b678b9..d8fbbc966d9 100644 --- a/changelog/16.0/16.0.2/summary.md +++ b/changelog/16.0/16.0.2/summary.md @@ -17,4 +17,5 @@ Earlier, we used to automatically set immediateCallerID to user from static auth Prior to v16.0.2, it was possible to create a shard name with invalid characters, which would then be inaccessible to various cluster management operations. -Shard names may no longer contain the forward slash ("/") character, and TopoServer's `CreateShard` method returns an error if given such a name. \ No newline at end of file +Shard names may no longer contain the forward slash ("/") character, and TopoServer's `CreateShard` method returns an error if given such a name. + From fe648b916dc2d6aab70916590b5aa99f7921738b Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 26 May 2023 10:37:18 -0600 Subject: [PATCH 113/233] [release-16.0] VReplication: Do not delete sharded target vschema table entries on Cancel (#13146) (#13155) * Don't delete vschema table entries that VReplication does not create Signed-off-by: Matt Lord * Update unit test accordingly Signed-off-by: Matt Lord * Improve comment Signed-off-by: Matt Lord * Adjust workflow complete unit test as well Signed-off-by: Matt Lord * Limit this behavior change to Cancel Signed-off-by: Matt Lord * Improve comment Signed-off-by: Matt Lord --------- Signed-off-by: Matt Lord Co-authored-by: Matt Lord --- go/vt/wrangler/traffic_switcher.go | 9 ++++++++- go/vt/wrangler/workflow_test.go | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/go/vt/wrangler/traffic_switcher.go b/go/vt/wrangler/traffic_switcher.go index ea52c11c092..52ade3de64d 100644 --- a/go/vt/wrangler/traffic_switcher.go +++ b/go/vt/wrangler/traffic_switcher.go @@ -1689,6 +1689,14 @@ func (ts *trafficSwitcher) dropParticipatingTablesFromKeyspace(ctx context.Conte if err != nil { return err } + // VReplication does NOT create the vschema entries in SHARDED + // TARGET keyspaces -- as we cannot know the proper vindex + // definitions to use -- and we should not delete them either + // (on workflow Cancel) as the user must create them separately + // and they contain information about the vindex definitions, etc. + if vschema.Sharded && keyspace == ts.TargetKeyspaceName() { + return nil + } for _, tableName := range ts.Tables() { delete(vschema.Tables, tableName) } @@ -1776,7 +1784,6 @@ func (ts *trafficSwitcher) removeTargetTables(ctx context.Context) error { } return ts.dropParticipatingTablesFromKeyspace(ctx, ts.TargetKeyspaceName()) - } func (ts *trafficSwitcher) dropTargetShards(ctx context.Context) error { diff --git a/go/vt/wrangler/workflow_test.go b/go/vt/wrangler/workflow_test.go index b3aecb7ad4d..e6ac0d472e5 100644 --- a/go/vt/wrangler/workflow_test.go +++ b/go/vt/wrangler/workflow_test.go @@ -455,8 +455,20 @@ func TestMoveTablesV2Cancel(t *testing.T) { require.True(t, checkIfTableExistInVSchema(ctx, t, wf.wr.ts, "ks1", "t1")) require.True(t, checkIfTableExistInVSchema(ctx, t, wf.wr.ts, "ks1", "t2")) - require.False(t, checkIfTableExistInVSchema(ctx, t, wf.wr.ts, "ks2", "t1")) - require.False(t, checkIfTableExistInVSchema(ctx, t, wf.wr.ts, "ks2", "t2")) + + // Should target vschema table entries be deleted upon Cancel. For unsharded + // keyspaces they should be as they are empty table entries that we also + // create when the workflow is Created. + targetVSchemaEntriesRemain := false + if len(tme.targetShards) > 1 { + // If the target keyspace is sharded -- which it is today in the test -- the + // vschema must be created by the user before the workflow is started. Thus + // we should also not delete the vschema table entries upon Cancel as the + // management of the sharded vschema is up to the user. + targetVSchemaEntriesRemain = true + } + require.Equal(t, targetVSchemaEntriesRemain, checkIfTableExistInVSchema(ctx, t, wf.wr.ts, "ks2", "t1")) + require.Equal(t, targetVSchemaEntriesRemain, checkIfTableExistInVSchema(ctx, t, wf.wr.ts, "ks2", "t2")) } func TestReshardV2(t *testing.T) { From 88269adce16929c615c1fd49356208f7c6307b48 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 30 May 2023 16:50:11 +0530 Subject: [PATCH 114/233] [16.0] Fix: TabletServer ReserveBeginExecute to return transaction ID on error (#13193) * ReserveBeginExecute to return transaction id even if reserver id is not present when there is an error Signed-off-by: Harshit Gangal * enabled settings pool for e2e test Signed-off-by: Harshit Gangal --------- Signed-off-by: Harshit Gangal --- .../vtgate/partialfailure/main_test.go | 68 +++++++++++-------- go/vt/vttablet/grpcqueryservice/server.go | 4 +- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/go/test/endtoend/vtgate/partialfailure/main_test.go b/go/test/endtoend/vtgate/partialfailure/main_test.go index cf47ad6a70f..b74947d63e9 100644 --- a/go/test/endtoend/vtgate/partialfailure/main_test.go +++ b/go/test/endtoend/vtgate/partialfailure/main_test.go @@ -22,12 +22,11 @@ import ( "os" "testing" - "vitess.io/vitess/go/test/endtoend/utils" - "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/test/endtoend/utils" ) var ( @@ -99,39 +98,54 @@ CREATE TABLE test_vdx ( ` ) +var enableSettingsPool bool + func TestMain(m *testing.M) { defer cluster.PanicHandler(nil) flag.Parse() - exitCode := func() int { - clusterInstance = cluster.NewCluster(cell, hostname) - defer clusterInstance.Teardown() + code := runAllTests(m) + if code != 0 { + os.Exit(code) + } - // Start topo server - if err := clusterInstance.StartTopo(); err != nil { - return 1 - } + println("running with settings pool enabled") + // run again with settings pool enabled. + enableSettingsPool = true + code = runAllTests(m) + os.Exit(code) +} - // Start keyspace - keyspace := &cluster.Keyspace{ - Name: keyspaceName, - SchemaSQL: sqlSchema, - VSchema: vSchema, - } - if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-c0", "c0-"}, 0, false); err != nil { +func runAllTests(m *testing.M) int { + clusterInstance = cluster.NewCluster(cell, hostname) + defer clusterInstance.Teardown() - return 1 - } + // Start topo server + if err := clusterInstance.StartTopo(); err != nil { + return 1 + } - // Start vtgate - clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, "--planner-version", "Gen4Fallback") - if err := clusterInstance.StartVtgate(); err != nil { - return 1 - } - vtParams = clusterInstance.GetVTParams(keyspaceName) - return m.Run() - }() - os.Exit(exitCode) + // Start keyspace + keyspace := &cluster.Keyspace{ + Name: keyspaceName, + SchemaSQL: sqlSchema, + VSchema: vSchema, + } + if enableSettingsPool { + clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--queryserver-enable-settings-pool") + } + if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-c0", "c0-"}, 0, false); err != nil { + + return 1 + } + + // Start vtgate + clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, "--planner-version", "Gen4Fallback") + if err := clusterInstance.StartVtgate(); err != nil { + return 1 + } + vtParams = clusterInstance.GetVTParams(keyspaceName) + return m.Run() } func testAllModes(t *testing.T, stmts func(conn *mysql.Conn)) { diff --git a/go/vt/vttablet/grpcqueryservice/server.go b/go/vt/vttablet/grpcqueryservice/server.go index e23acba630f..49557d36ef3 100644 --- a/go/vt/vttablet/grpcqueryservice/server.go +++ b/go/vt/vttablet/grpcqueryservice/server.go @@ -422,8 +422,8 @@ func (q *query) ReserveBeginExecute(ctx context.Context, request *querypb.Reserv ) state, result, err := q.server.ReserveBeginExecute(ctx, request.Target, request.PreQueries, request.PostBeginQueries, request.Query.Sql, request.Query.BindVariables, request.Options) if err != nil { - // if we have a valid reservedID, return the error in-band - if state.ReservedID != 0 { + // if we have a valid reservedID or transactionID, return the error in-band + if state.TransactionID != 0 || state.ReservedID != 0 { return &querypb.ReserveBeginExecuteResponse{ Error: vterrors.ToVTRPC(err), TransactionId: state.TransactionID, From 28c9dcefc62d43661d0acf925aa36a7a5d0c00d0 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 12:53:08 -0400 Subject: [PATCH 115/233] [release-16.0] VReplication: Pass on --keep_routing_rules flag value for Cancel action (#13171) (#13194) * Pass on keep_routing_rules flag value for Cancel action Signed-off-by: Matt Lord * Add e2e test for Cancel --keep_routing_rules Signed-off-by: Matt Lord --------- Signed-off-by: Matt Lord Co-authored-by: Matt Lord --- .../endtoend/vreplication/vreplication_test.go | 15 ++++++++++++++- go/vt/vtctl/vtctl.go | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go index a16d335363e..d6a411fdb3c 100644 --- a/go/test/endtoend/vreplication/vreplication_test.go +++ b/go/test/endtoend/vreplication/vreplication_test.go @@ -34,6 +34,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/tidwall/gjson" "github.com/buger/jsonparser" @@ -173,7 +174,19 @@ func TestVReplicationDDLHandling(t *testing.T) { waitForQueryResult(t, vtgateConn, targetKs, checkColQueryTarget, "[[INT64(0)]]") // Confirm new col does exist on source waitForQueryResult(t, vtgateConn, sourceKs, checkColQuerySource, "[[INT64(1)]]") - moveTablesAction(t, "Cancel", defaultCellName, workflow, sourceKs, targetKs, table) + // Also test Cancel --keep_routing_rules + moveTablesAction(t, "Cancel", defaultCellName, workflow, sourceKs, targetKs, table, "--keep_routing_rules") + // Confirm that the routing rules were NOT cleared + rr, err := vc.VtctldClient.ExecuteCommandWithOutput("GetRoutingRules") + require.NoError(t, err) + require.Greater(t, len(gjson.Get(rr, "rules").Array()), 0) + // Manually clear the routing rules + err = vc.VtctldClient.ExecuteCommand("ApplyRoutingRules", "--rules", "{}") + require.NoError(t, err) + // Confirm that the routing rules are gone + rr, err = vc.VtctldClient.ExecuteCommandWithOutput("GetRoutingRules") + require.NoError(t, err) + require.Equal(t, len(gjson.Get(rr, "rules").Array()), 0) // Drop the column on source to start fresh again _, err = vtgateConn.ExecuteFetch(dropColDDL, 1, false) require.NoError(t, err, "error executing %q: %v", dropColDDL, err) diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 682576b7a49..93628b4d0f5 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -2294,6 +2294,7 @@ func commandVRWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *pfl vrwp.MaxAllowedTransactionLagSeconds = int64(math.Ceil(maxReplicationLagAllowed.Seconds())) case vReplicationWorkflowActionCancel: vrwp.KeepData = *keepData + vrwp.KeepRoutingRules = *keepRoutingRules case vReplicationWorkflowActionComplete: switch workflowType { case wrangler.MoveTablesWorkflow: From 272004c7f8882d0ae2073b683e5ac65fd48fad74 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 31 May 2023 16:52:32 +0530 Subject: [PATCH 116/233] Fix: errant GTID in health streamer (#13184) * test: add health-streamer test Signed-off-by: Manan Gupta * feat: fix test Signed-off-by: Manan Gupta * feat: fix health streamer Signed-off-by: Manan Gupta * feat: fix health streamer tests Signed-off-by: Manan Gupta --------- Signed-off-by: Manan Gupta --- go/mysql/fakesqldb/server.go | 23 ++++++++++- .../vttablet/tabletserver/health_streamer.go | 26 +++++++++++-- .../tabletserver/health_streamer_test.go | 38 ++++++++++++++++++- go/vt/vttablet/tabletserver/state_manager.go | 4 ++ 4 files changed, 83 insertions(+), 8 deletions(-) diff --git a/go/mysql/fakesqldb/server.go b/go/mysql/fakesqldb/server.go index c1e699fa0d7..7d45755bd11 100644 --- a/go/mysql/fakesqldb/server.go +++ b/go/mysql/fakesqldb/server.go @@ -124,6 +124,10 @@ type DB struct { // if fakesqldb is asked to serve queries or query patterns that it has not been explicitly told about it will // error out by default. However if you set this flag then any unmatched query results in an empty result neverFail atomic.Bool + + // lastError stores the last error in returning a query result. + lastErrorMu sync.Mutex + lastError error } // QueryHandler is the interface used by the DB to simulate executed queries @@ -176,6 +180,7 @@ func New(t testing.TB) *DB { connections: make(map[uint32]*mysql.Conn), queryPatternUserCallback: make(map[*regexp.Regexp]func(string)), patternData: make(map[string]exprResult), + lastErrorMu: sync.Mutex{}, } db.Handler = db @@ -245,6 +250,13 @@ func (db *DB) CloseAllConnections() { } } +// LastError gives the last error the DB ran into +func (db *DB) LastError() error { + db.lastErrorMu.Lock() + defer db.lastErrorMu.Unlock() + return db.lastError +} + // WaitForClose should be used after CloseAllConnections() is closed and // you want to provoke a MySQL client error with errno 2006. // @@ -342,7 +354,14 @@ func (db *DB) WarningCount(c *mysql.Conn) uint16 { } // HandleQuery is the default implementation of the QueryHandler interface -func (db *DB) HandleQuery(c *mysql.Conn, query string, callback func(*sqltypes.Result) error) error { +func (db *DB) HandleQuery(c *mysql.Conn, query string, callback func(*sqltypes.Result) error) (err error) { + defer func() { + if err != nil { + db.lastErrorMu.Lock() + db.lastError = err + db.lastErrorMu.Unlock() + } + }() if db.allowAll.Load() { return callback(&sqltypes.Result{}) } @@ -413,7 +432,7 @@ func (db *DB) HandleQuery(c *mysql.Conn, query string, callback func(*sqltypes.R return callback(&sqltypes.Result{}) } // Nothing matched. - err := fmt.Errorf("fakesqldb:: query: '%s' is not supported on %v", + err = fmt.Errorf("fakesqldb:: query: '%s' is not supported on %v", sqlparser.TruncateForUI(query), db.name) log.Errorf("Query not found: %s", sqlparser.TruncateForUI(query)) diff --git a/go/vt/vttablet/tabletserver/health_streamer.go b/go/vt/vttablet/tabletserver/health_streamer.go index aed37f338c6..0205b108455 100644 --- a/go/vt/vttablet/tabletserver/health_streamer.go +++ b/go/vt/vttablet/tabletserver/health_streamer.go @@ -26,9 +26,8 @@ import ( "github.com/spf13/pflag" - "vitess.io/vitess/go/vt/servenv" - "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/sqlparser" @@ -81,6 +80,8 @@ type healthStreamer struct { cancel context.CancelFunc clients map[chan *querypb.StreamHealthResponse]struct{} state *querypb.StreamHealthResponse + // isServingPrimary stores if this tablet is currently the serving primary or not. + isServingPrimary bool history *history.History @@ -310,6 +311,21 @@ func (hs *healthStreamer) AppendDetails(details []*kv) []*kv { return details } +// MakePrimary tells the healthstreamer that the current tablet is now the primary, +// so it can read and write to the MySQL instance for schema-tracking. +func (hs *healthStreamer) MakePrimary(serving bool) { + hs.mu.Lock() + defer hs.mu.Unlock() + hs.isServingPrimary = serving +} + +// MakeNonPrimary tells the healthstreamer that the current tablet is now not a primary. +func (hs *healthStreamer) MakeNonPrimary() { + hs.mu.Lock() + defer hs.mu.Unlock() + hs.isServingPrimary = false +} + func (hs *healthStreamer) SetUnhealthyThreshold(v time.Duration) { hs.unhealthyThreshold.Set(v) shr := proto.Clone(hs.state).(*querypb.StreamHealthResponse) @@ -328,8 +344,10 @@ func (hs *healthStreamer) SetUnhealthyThreshold(v time.Duration) { func (hs *healthStreamer) reload() error { hs.mu.Lock() defer hs.mu.Unlock() - // Schema Reload to happen only on primary. - if hs.state.Target.TabletType != topodatapb.TabletType_PRIMARY { + // Schema Reload to happen only on primary when it is serving. + // We can be in a state when the primary is not serving after we have run DemotePrimary. In that case, + // we don't want to run any queries in MySQL, so we shouldn't reload anything in the healthStreamer. + if !hs.isServingPrimary { return nil } diff --git a/go/vt/vttablet/tabletserver/health_streamer_test.go b/go/vt/vttablet/tabletserver/health_streamer_test.go index 73733ce8e74..8b27ab746a4 100644 --- a/go/vt/vttablet/tabletserver/health_streamer_test.go +++ b/go/vt/vttablet/tabletserver/health_streamer_test.go @@ -25,13 +25,13 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" - "vitess.io/vitess/go/sync2" - "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/sync2" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" @@ -60,6 +60,36 @@ func newConfig(db *fakesqldb.DB) *tabletenv.TabletConfig { return cfg } +// TestNotServingPrimaryNoWrite makes sure that the health-streamer doesn't write anything to the database when +// the state is not serving primary. +func TestNotServingPrimaryNoWrite(t *testing.T) { + db := fakesqldb.New(t) + defer db.Close() + config := newConfig(db) + config.SignalWhenSchemaChange = true + + env := tabletenv.NewEnv(config, "TestNotServingPrimary") + alias := &topodatapb.TabletAlias{ + Cell: "cell", + Uid: 1, + } + // Create a new health streamer and set it to a serving primary state + hs := newHealthStreamer(env, alias) + hs.isServingPrimary = true + hs.InitDBConfig(&querypb.Target{TabletType: topodatapb.TabletType_PRIMARY}, config.DB.DbaWithDB()) + hs.Open() + defer hs.Close() + + // Let's say the tablet goes to a non-serving primary state. + hs.MakePrimary(false) + + // A reload now should not write anything to the database. If any write happens it will error out since we have not + // added any query to the database to expect. + err := hs.reload() + require.NoError(t, err) + require.NoError(t, db.LastError()) +} + func TestHealthStreamerBroadcast(t *testing.T) { db := fakesqldb.New(t) defer db.Close() @@ -171,6 +201,7 @@ func TestReloadSchema(t *testing.T) { } blpFunc = testBlpFunc hs := newHealthStreamer(env, alias) + hs.MakePrimary(true) target := &querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} configs := config.DB @@ -231,6 +262,7 @@ func TestDoesNotReloadSchema(t *testing.T) { } blpFunc = testBlpFunc hs := newHealthStreamer(env, alias) + hs.MakePrimary(true) target := &querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} configs := config.DB @@ -283,6 +315,7 @@ func TestInitialReloadSchema(t *testing.T) { } blpFunc = testBlpFunc hs := newHealthStreamer(env, alias) + hs.MakePrimary(true) target := &querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} configs := config.DB @@ -341,6 +374,7 @@ func TestReloadView(t *testing.T) { env := tabletenv.NewEnv(config, "TestReloadView") alias := &topodatapb.TabletAlias{Cell: "cell", Uid: 1} hs := newHealthStreamer(env, alias) + hs.MakePrimary(true) target := &querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} configs := config.DB diff --git a/go/vt/vttablet/tabletserver/state_manager.go b/go/vt/vttablet/tabletserver/state_manager.go index 625d2188272..5ed165d7eae 100644 --- a/go/vt/vttablet/tabletserver/state_manager.go +++ b/go/vt/vttablet/tabletserver/state_manager.go @@ -443,6 +443,7 @@ func (sm *stateManager) servePrimary() error { return err } + sm.hs.MakePrimary(true) sm.rt.MakePrimary() sm.tracker.Open() // We instantly kill all stateful queries to allow for @@ -467,6 +468,7 @@ func (sm *stateManager) unservePrimary() error { return err } + sm.hs.MakePrimary(false) sm.rt.MakePrimary() sm.setState(topodatapb.TabletType_PRIMARY, StateNotServing) return nil @@ -483,6 +485,7 @@ func (sm *stateManager) serveNonPrimary(wantTabletType topodatapb.TabletType) er sm.messager.Close() sm.tracker.Close() sm.se.MakeNonPrimary() + sm.hs.MakeNonPrimary() if err := sm.connect(wantTabletType); err != nil { return err @@ -500,6 +503,7 @@ func (sm *stateManager) unserveNonPrimary(wantTabletType topodatapb.TabletType) sm.unserveCommon() sm.se.MakeNonPrimary() + sm.hs.MakeNonPrimary() if err := sm.connect(wantTabletType); err != nil { return err From 98f5afc7145d44fdb2deec1a775645482378f7dd Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 15:02:12 +0200 Subject: [PATCH 117/233] [release-16.0] Upgrade mysqld memory limits to 1024Mi (#13122) (#13204) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Upgrade mysqld memory limits to 1024Mi Signed-off-by: Vinícius do Carmo * Close #13118 Signed-off-by: Vinícius do Carmo --------- Signed-off-by: Vinícius do Carmo Co-authored-by: Vinícius do Carmo --- examples/operator/101_initial_cluster.yaml | 2 +- examples/operator/201_customer_tablets.yaml | 4 ++-- examples/operator/302_new_shards.yaml | 6 +++--- examples/operator/306_down_shard_0.yaml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index 09fbebff975..da2375ad2ec 100644 --- a/examples/operator/101_initial_cluster.yaml +++ b/examples/operator/101_initial_cluster.yaml @@ -103,7 +103,7 @@ spec: mysqld: resources: limits: - memory: 512Mi + memory: 1024Mi requests: cpu: 100m memory: 512Mi diff --git a/examples/operator/201_customer_tablets.yaml b/examples/operator/201_customer_tablets.yaml index 8a40d1567e6..6b367609ffb 100644 --- a/examples/operator/201_customer_tablets.yaml +++ b/examples/operator/201_customer_tablets.yaml @@ -99,7 +99,7 @@ spec: mysqld: resources: limits: - memory: 512Mi + memory: 1024Mi requests: cpu: 100m memory: 512Mi @@ -134,7 +134,7 @@ spec: mysqld: resources: limits: - memory: 512Mi + memory: 1024Mi requests: cpu: 100m memory: 512Mi diff --git a/examples/operator/302_new_shards.yaml b/examples/operator/302_new_shards.yaml index 5003cd2f5e5..5402f8a54a8 100644 --- a/examples/operator/302_new_shards.yaml +++ b/examples/operator/302_new_shards.yaml @@ -99,7 +99,7 @@ spec: mysqld: resources: limits: - memory: 512Mi + memory: 1024Mi requests: cpu: 100m memory: 512Mi @@ -134,7 +134,7 @@ spec: mysqld: resources: limits: - memory: 512Mi + memory: 1024Mi requests: cpu: 100m memory: 512Mi @@ -165,7 +165,7 @@ spec: mysqld: resources: limits: - memory: 512Mi + memory: 1024Mi requests: cpu: 100m memory: 512Mi diff --git a/examples/operator/306_down_shard_0.yaml b/examples/operator/306_down_shard_0.yaml index 45d92419aa1..37455dc11c7 100644 --- a/examples/operator/306_down_shard_0.yaml +++ b/examples/operator/306_down_shard_0.yaml @@ -99,7 +99,7 @@ spec: mysqld: resources: limits: - memory: 512Mi + memory: 1024Mi requests: cpu: 100m memory: 512Mi @@ -134,7 +134,7 @@ spec: mysqld: resources: limits: - memory: 512Mi + memory: 1024Mi requests: cpu: 100m memory: 512Mi From 17fae9592a8031160e21af334d4c051bb5205b64 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 5 Jun 2023 09:04:08 +0200 Subject: [PATCH 118/233] evalengine: TypeOf for Columns should only use value type when we have a value (#13148) (#13154) Signed-off-by: Andres Taylor --- go/vt/vtgate/evalengine/expr_column_test.go | 63 +++++++++++++++++++++ go/vt/vtgate/evalengine/expressions.go | 5 +- 2 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 go/vt/vtgate/evalengine/expr_column_test.go diff --git a/go/vt/vtgate/evalengine/expr_column_test.go b/go/vt/vtgate/evalengine/expr_column_test.go new file mode 100644 index 00000000000..d60c5980eed --- /dev/null +++ b/go/vt/vtgate/evalengine/expr_column_test.go @@ -0,0 +1,63 @@ +/* +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 evalengine + +import ( + "testing" + + "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" +) + +func TestTypeOf(t *testing.T) { + env := &ExpressionEnv{ + BindVars: make(map[string]*querypb.BindVariable), + } + + field1 := &querypb.Field{ + Name: "field1", + Type: querypb.Type_INT64, + Flags: uint32(querypb.MySqlFlag_NOT_NULL_FLAG), + } + field2 := &querypb.Field{ + Name: "field2", + Type: querypb.Type_VARCHAR, + Flags: 0, + } + fields := []*querypb.Field{field1, field2} + + c := &Column{} + env.Row = sqltypes.Row{sqltypes.NewInt64(10)} + env.Fields = fields + + t.Run("Check when row value is not null", func(t *testing.T) { + typ, f := c.typeof(env) + if typ != sqltypes.Int64 || f != flag(0) { + t.Errorf("typeof() failed, expected sqltypes.Int64 and typeFlag 0, got %v and %v", typ, f) + } + }) + + t.Run("Check when row value is null", func(t *testing.T) { + env.Row = sqltypes.Row{ + sqltypes.NULL, + } + typ, flag := c.typeof(env) + if typ != querypb.Type_INT64 || flag != flagNullable { + t.Errorf("typeof() failed, expected querypb.Type_INT64 and flagNullable, got %v and %v", typ, flag) + } + }) +} diff --git a/go/vt/vtgate/evalengine/expressions.go b/go/vt/vtgate/evalengine/expressions.go index 4809cc03729..761034c902f 100644 --- a/go/vt/vtgate/evalengine/expressions.go +++ b/go/vt/vtgate/evalengine/expressions.go @@ -578,10 +578,9 @@ func (c *Column) typeof(env *ExpressionEnv) (sqltypes.Type, flag) { // we'll try to do the best possible with the information we have if c.Offset < len(env.Row) { value := env.Row[c.Offset] - if value.IsNull() { - return sqltypes.Null, flagNull | flagNullable + if !value.IsNull() { + return value.Type(), flag(0) } - return value.Type(), flag(0) } if c.Offset < len(env.Fields) { From 625c057137b7fa4c0e3dcfe80c56eca7c996d7c3 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 7 Jun 2023 19:19:52 +0200 Subject: [PATCH 119/233] Fix new vtctl upgrade downgrade test on `release-16.0` (#13252) * skip test assertion if binary above 16 Signed-off-by: Florent Poinsard * Add result filtering for warning for vtconfig error Signed-off-by: Florent Poinsard * Revert change Signed-off-by: Florent Poinsard * filter result for warning Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard --- go/test/endtoend/cluster/cluster_util.go | 14 ++++++++++++-- go/test/endtoend/cluster/vtctlclient_process.go | 2 +- go/test/endtoend/reparent/utils/utils.go | 8 ++++---- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/go/test/endtoend/cluster/cluster_util.go b/go/test/endtoend/cluster/cluster_util.go index ea2dd0d7e20..0a820a63540 100644 --- a/go/test/endtoend/cluster/cluster_util.go +++ b/go/test/endtoend/cluster/cluster_util.go @@ -179,12 +179,22 @@ func getTablet(tabletGrpcPort int, hostname string) *topodatapb.Tablet { func filterResultForWarning(input string) string { lines := strings.Split(input, "\n") var result string - for _, line := range lines { + for i, line := range lines { if strings.Contains(line, "WARNING: vtctl should only be used for VDiff v1 workflows. Please use VDiff v2 and consider using vtctldclient for all other commands.") { continue } - result = result + line + "\n" + + if strings.Contains(line, "Failed to read in config") && strings.Contains(line, `Config File "vtconfig" Not Found in`) { + continue + } + + result += line + + if i < len(lines)-1 { + result += "\n" + } } + return result } diff --git a/go/test/endtoend/cluster/vtctlclient_process.go b/go/test/endtoend/cluster/vtctlclient_process.go index 369ffcb09c7..1bf02d7f513 100644 --- a/go/test/endtoend/cluster/vtctlclient_process.go +++ b/go/test/endtoend/cluster/vtctlclient_process.go @@ -219,7 +219,7 @@ func (vtctlclient *VtctlClientProcess) ExecuteCommandWithOutput(args ...string) } time.Sleep(retryDelay) } - return filterResultWhenRunsForCoverage(resultStr), err + return filterResultForWarning(filterResultWhenRunsForCoverage(resultStr)), err } // VtctlClientProcessInstance returns a VtctlProcess handle for vtctlclient process diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index 0505f4a266b..1b169d6c0ac 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -63,7 +63,7 @@ var ( replicationWaitTimeout = time.Duration(15 * time.Second) ) -//region cluster setup/teardown +// region cluster setup/teardown // SetupReparentCluster is used to setup the reparent cluster func SetupReparentCluster(t *testing.T, durability string) *cluster.LocalProcessCluster { @@ -133,7 +133,7 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s err = clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard}) require.NoError(t, err, "Cannot launch cluster") - //Start MySql + // Start MySql var mysqlCtlProcessList []*exec.Cmd for _, shard := range clusterInstance.Keyspaces[0].Shards { for _, tablet := range shard.Vttablets { @@ -234,7 +234,7 @@ func StartNewVTTablet(t *testing.T, clusterInstance *cluster.LocalProcessCluster return tablet } -//endregion +// endregion // region database queries func getMysqlConnParam(tablet *cluster.Vttablet) mysql.ConnParams { @@ -262,7 +262,7 @@ func execute(t *testing.T, conn *mysql.Conn, query string) *sqltypes.Result { return qr } -//endregion +// endregion // region ers, prs From b2de6b7433e370887d787c1a97b7f78f25d2ad5e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 18:57:32 +0200 Subject: [PATCH 120/233] [release-16.0] Upgrade the Golang version to `go1.20.5` (#13257) * bump go version to go1.20.5 Signed-off-by: GitHub * Update github actions workflow with go1.20.5 Signed-off-by: Florent Poinsard --------- Signed-off-by: GitHub Signed-off-by: Florent Poinsard Co-authored-by: frouioui Co-authored-by: Florent Poinsard --- .github/workflows/assign_milestone.yml | 2 +- .github/workflows/check_make_vtadmin_authz_testgen.yml | 2 +- .github/workflows/check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr_mysql57.yml | 2 +- .../cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .github/workflows/cluster_endtoend_mysql_server_vault.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_scheduler.yml | 2 +- .../cluster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- ...luster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl.yml | 2 +- .../workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_consul.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_tablegc.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_throttler.yml | 2 +- ...uster_endtoend_tabletmanager_throttler_custom_config.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .../workflows/cluster_endtoend_topo_connection_cache.yml | 2 +- .../cluster_endtoend_vreplication_across_db_versions.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_basic.yml | 2 +- .../workflows/cluster_endtoend_vreplication_cellalias.yml | 2 +- ...ster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .../workflows/cluster_endtoend_vreplication_multicell.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_v2.yml | 2 +- .github/workflows/cluster_endtoend_vstream_failover.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_false.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_true.yml | 2 +- .../cluster_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- ...uster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_general_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_godriver.yml | 2 +- .../workflows/cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .../workflows/cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_reservedconn.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .../workflows/cluster_endtoend_vtgate_schema_tracker.yml | 2 +- .../cluster_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_consul.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_transaction.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_unsharded.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .github/workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 2 +- .github/workflows/docker_test_cluster_10.yml | 2 +- .github/workflows/docker_test_cluster_25.yml | 2 +- .github/workflows/e2e_race.yml | 2 +- .github/workflows/endtoend.yml | 2 +- .github/workflows/local_example.yml | 2 +- .github/workflows/region_example.yml | 2 +- .github/workflows/sonar_analysis.yml | 2 +- .github/workflows/static_checks_etc.yml | 2 +- .github/workflows/unit_race.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- .github/workflows/update_golang_version.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 2 +- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 2 +- .../upgrade_downgrade_test_backups_manual_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries.yml | 2 +- ...de_downgrade_test_query_serving_queries_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_schema.yml | 2 +- ...ade_downgrade_test_query_serving_schema_next_release.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 2 +- docker/lite/Dockerfile.ubi7.mysql80 | 2 +- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 2 +- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 2 +- docker/lite/Dockerfile.ubi8.mysql80 | 2 +- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- out.txt | 0 test.go | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_docker.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/dockerfile.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 129 files changed, 132 insertions(+), 128 deletions(-) delete mode 100644 out.txt diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index 8bb5b1098ef..42413941471 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index 21742f607ed..9ffd6b53309 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -48,7 +48,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 53c6d3f5563..90ee01bd72f 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -50,7 +50,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 490b70f882e..c4741a582d1 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 0bdc549cc00..82e1633364e 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 8d1d8d1c89d..d813e799953 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 5c6b02a26e9..4cf3db3efb5 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 3f0d20f4a07..3149d2b3721 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 eacb6cdda2c..1c2257fc5f1 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index 9a6d0ca7d76..c4f56eb3bc9 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index 2865b0f5574..fdf60c2d921 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 01ec5312890..4181df3f56f 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 253565005a0..771c6aa4097 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 8103d127037..d954619cc43 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 53797c58f57..476553ee3bd 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 846885f5677..6101e4fbc21 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 60261c4f25e..0ec1987eaf2 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 d3dfbe5d06b..16247813e79 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 6f0e8b7b11f..a278abfc8cc 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 39fad19a06d..9dbcbe6652d 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 3aa1ad57105..96469d73d49 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 ed0865b0e54..1310893eb9d 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 fc8983c62e0..642daa653f2 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 bfe822c3e71..c3d772e6f47 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 acba0152324..ef317f37b21 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 d0bc977a3ae..e78aea9d982 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 77854252b75..c2710722ddb 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 b814d57e905..dd20d37431b 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 36935e7b5b8..b833b55bd18 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 7bfbc96a8b9..0e1c8097800 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 7d30b2c38c1..5740d9ed8f1 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 98d36b09671..8243fefd503 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 89a7f09498f..eab347079cf 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 ad3be697973..05252a55f2c 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 9d94db3ecb6..b14ff1a8c81 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 219a3753aa8..4e79ad26f0f 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 13cc5138011..011e7085ae5 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 2284891189c..9ed793f0543 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 befb68f0473..e08f39735fd 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 67b2a6a6e8a..89e52d40bcc 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 c13cfb2cf02..d7df7ba0eda 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 69b5fa39169..b43f9d21939 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 32b57446e11..75bfd84685b 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 6b9fdc634b3..86b2182a49c 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 1bafc7c8d8f..b8495923377 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 aa5d94bc2c3..2eb00c367dd 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 77707fd1316..f2a16eedecb 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index d3b38810966..3cdb11f4b79 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 56ee738bbf6..cfb76ff5bf2 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 da61dca286d..b88ba288893 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 85927392fc7..b2a413ab7b3 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 dd43a43d488..ac6b9927f1f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 1284e5d4b83..e5481ec140b 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 a8728f977fc..3dc7c31dba2 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 f00ce4d3f3e..6666ea18e76 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 2bf62a03647..cdeab66621d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 44f4b9eef78..629b0e6d763 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 79188f99331..898365c92fe 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 52140dc8518..18ba08aa8ea 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 9d32701e444..e554845a041 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 1a3908faf69..97377b17ad8 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 2859d56c8c2..7a842d6b20c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 2b8fc399450..da7e9ade564 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 bf60669bc98..6d72a7d92bf 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 868422792b8..1ef844cc3a1 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 a631a356a90..05436cb5990 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 0fe2157879d..0d23f9d3fbb 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 addcc7804ed..3ce296802ae 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 d787cc06f35..c28b17c657a 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 2664881dbc1..ce74715c0a6 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 f1719107e59..8d478d38ec8 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 00337347931..d657bfc1fc7 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 12544cdfeb9..f2570f616ac 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 cbc0c0398f9..40c1617acf8 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 23b93a16e8b..4e4ed75b45f 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -42,7 +42,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Get base dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 85fc13b224d..1ad9dcfdaeb 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index dbb5cf28682..b30d1687643 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index 06f4e243843..de75ed577f2 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 8ec59032734..87f97a205a9 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index fb3c20622e2..9c28676795d 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index 683342c7a00..639b02edc40 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index a5b002c2974..824ed20eaaa 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index 3bfd05402af..9c1f90ade40 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS run: | diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index f12d7f34011..0000d37b799 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -105,7 +105,7 @@ jobs: 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@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index f5ec4447f4e..96a8e214f98 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -55,7 +55,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 3e2f4f457b1..02473ec6d46 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index cfe007de1a5..e12a0e5d29a 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index 1a9fa74458b..19d1c50a25b 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index bcd6b0be801..0c76e314cac 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -83,7 +83,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 60dc3fe5e67..38581eeb8d3 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -86,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 3ad5e29330b..cefa6833d2a 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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 e693c29a95b..9cd64760afc 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 06e8315242c..04694af0688 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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 8ed290c5775..54138981f4f 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 767badb7763..60900425aa2 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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 0781a0ff0ee..ccc06158473 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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 a4f4bffe0db..9e3fa8fff57 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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 48eaeb2a384..f73acecdd77 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index c767855ed31..99028510716 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 80ed7260abe..2bca1844ba8 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/Makefile b/Makefile index 7e11641553f..58536683902 100644 --- a/Makefile +++ b/Makefile @@ -275,7 +275,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=14.4 +BOOTSTRAP_VERSION=14.5 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index b783201dc4f..038f791c3c3 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.20.4 || echo "Go version reported: `go version`. Version 1.20.4+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.20.5 || echo "Go version reported: `go version`. Version 1.20.5+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 36491163411..2223d7d1fd6 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index 70ba5c4cb68..b0c9af936a4 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index 10de813efa0..c54ba510b3e 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index 424fc2533da..83b256c6737 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index 006f34d7aad..36ad6e8dd76 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -68,4 +68,8 @@ List of changes between bootstrap image versions. ## [14.4] - 2023-05-09 ### Changes -- Update build to golang 1.20.4 \ No newline at end of file +- Update build to golang 1.20.4 + +## [14.5] - 2023-06-07 +### Changes +- Update build to golang 1.20.5 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 30c94bbdab8..5c6e4da5930 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.20.4-buster +FROM --platform=linux/amd64 golang:1.20.5-buster # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index 76b8759243c..21227e342e0 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index edc55c003cc..9d5f1980865 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index 217836cce88..178b0f702df 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index dc7b17ef71d..f4d6e0a0e71 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index 8547f22c174..a86eea7e786 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index d5fb04738cc..405263d974a 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index 3935d4b225f..3003ffdbe03 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index 804d14d9a25..b485aa660f1 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index 9f0097a2b28..20cc21e4319 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index 4f0498f5e18..a8f993a7279 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index 71c752e58f5..f5b2dbbf146 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index a516594e246..6d4b96cc3ec 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index dd4ae9a820d..5f553816a15 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index 0af788364fc..e5ad3098226 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/out.txt b/out.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/test.go b/test.go index cba771c544c..d62441629be 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "14.4", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "14.5", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index 4e4b24a542f..ff5bd434236 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python 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 8a999acc72f..eee5c7073a4 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - 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_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index 3fb0060a798..ce3ffe76a84 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -68,7 +68,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index ac8a0500961..f5d8af80cab 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.4 +ARG bootstrap_version=14.5 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index 442d9126df5..ea0d455c92e 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -59,7 +59,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.4 + go-version: 1.20.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' From 7a9a84ac61a625b11e340c000f8bc388360b5508 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Mon, 12 Jun 2023 20:42:29 +0200 Subject: [PATCH 121/233] =?UTF-8?q?[release-16.0]=C2=A0Remove=20indentatio?= =?UTF-8?q?n=20limit=20in=20the=20sqlparser=20(#13158)=20(#13166)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go/vt/sqlparser/parse_test.go | 12 +- go/vt/sqlparser/sql.go | 2851 ++++++++++++++++----------------- go/vt/sqlparser/sql.y | 17 - go/vt/sqlparser/token.go | 2 - 4 files changed, 1418 insertions(+), 1464 deletions(-) diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index ac3050667b8..89113f61836 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -5480,17 +5480,7 @@ var ( "(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(" + "F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F" + "(F(F(F(F(F(F(F(F(F(F(F(F(", - output: "max nesting level reached at position 406", - }, { - input: "select(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F" + - "(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(" + - "F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F" + - "(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(" + - "F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F" + - "(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(" + - "F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F" + - "(F(F(F(F(F(F(F(F(F(F(F(", - output: "syntax error at position 404", + output: "syntax error at position 406", }, { // This construct is considered invalid due to a grammar conflict. input: "insert into a select * from b join c on duplicate key update d=e", diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 8bb9199121d..97bfdc33834 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -22,18 +22,6 @@ func setDDL(yylex yyLexer, node Statement) { yylex.(*Tokenizer).partialDDL = node } -func incNesting(yylex yyLexer) bool { - yylex.(*Tokenizer).nesting++ - if yylex.(*Tokenizer).nesting == 200 { - return true - } - return false -} - -func decNesting(yylex yyLexer) { - yylex.(*Tokenizer).nesting-- -} - // skipToEnd forces the lexer to end prematurely. Not all SQL statements // are supported by the Parser, thus calling skipToEnd will make the lexer // return EOF early. @@ -6705,7 +6693,7 @@ var yyPgo = [...]int{ 2473, 2465, 3469, 0, 127, 2433, 198, } -//line sql.y:7986 +//line sql.y:7969 type yySymType struct { union any empty struct{} @@ -8992,7 +8980,7 @@ yydefault: case 1: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:602 +//line sql.y:590 { stmt := yyDollar[2].statementUnion() // If the statement is empty and we have comments @@ -9006,58 +8994,58 @@ yydefault: } case 2: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:615 +//line sql.y:603 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:616 +//line sql.y:604 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:620 +//line sql.y:608 { yyLOCAL = yyDollar[1].selStmtUnion() } yyVAL.union = yyLOCAL case 38: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:657 +//line sql.y:645 { setParseTree(yylex, nil) } case 39: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:663 +//line sql.y:651 { yyLOCAL = NewVariableExpression(yyDollar[1].str, SingleAt) } yyVAL.union = yyLOCAL case 40: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:669 +//line sql.y:657 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 41: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:674 +//line sql.y:662 { yyVAL.identifierCI = NewIdentifierCI("") } case 42: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:678 +//line sql.y:666 { yyVAL.identifierCI = yyDollar[1].identifierCI } case 43: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:684 +//line sql.y:672 { yyLOCAL = NewVariableExpression(string(yyDollar[1].str), SingleAt) } @@ -9065,7 +9053,7 @@ yydefault: case 44: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:688 +//line sql.y:676 { yyLOCAL = NewVariableExpression(string(yyDollar[1].str), DoubleAt) } @@ -9073,7 +9061,7 @@ yydefault: case 45: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:694 +//line sql.y:682 { yyLOCAL = &OtherAdmin{} } @@ -9081,7 +9069,7 @@ yydefault: case 46: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:700 +//line sql.y:688 { yyLOCAL = &Load{} } @@ -9089,7 +9077,7 @@ yydefault: case 47: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *With -//line sql.y:706 +//line sql.y:694 { yyLOCAL = &With{ctes: yyDollar[2].ctesUnion(), Recursive: false} } @@ -9097,7 +9085,7 @@ yydefault: case 48: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *With -//line sql.y:710 +//line sql.y:698 { yyLOCAL = &With{ctes: yyDollar[3].ctesUnion(), Recursive: true} } @@ -9105,7 +9093,7 @@ yydefault: case 49: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *With -//line sql.y:715 +//line sql.y:703 { yyLOCAL = nil } @@ -9113,14 +9101,14 @@ yydefault: case 50: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *With -//line sql.y:719 +//line sql.y:707 { yyLOCAL = yyDollar[1].withUnion() } yyVAL.union = yyLOCAL case 51: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:725 +//line sql.y:713 { yySLICE := (*[]*CommonTableExpr)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].cteUnion()) @@ -9128,7 +9116,7 @@ yydefault: case 52: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*CommonTableExpr -//line sql.y:729 +//line sql.y:717 { yyLOCAL = []*CommonTableExpr{yyDollar[1].cteUnion()} } @@ -9136,7 +9124,7 @@ yydefault: case 53: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *CommonTableExpr -//line sql.y:735 +//line sql.y:723 { yyLOCAL = &CommonTableExpr{ID: yyDollar[1].identifierCS, Columns: yyDollar[2].columnsUnion(), Subquery: yyDollar[4].subqueryUnion()} } @@ -9144,7 +9132,7 @@ yydefault: case 54: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:741 +//line sql.y:729 { yyLOCAL = yyDollar[2].selStmtUnion() } @@ -9152,7 +9140,7 @@ yydefault: case 55: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:745 +//line sql.y:733 { yyLOCAL = yyDollar[2].selStmtUnion() } @@ -9160,7 +9148,7 @@ yydefault: case 56: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:749 +//line sql.y:737 { setLockInSelect(yyDollar[2].selStmtUnion(), yyDollar[3].lockUnion()) yyLOCAL = yyDollar[2].selStmtUnion() @@ -9169,7 +9157,7 @@ yydefault: case 57: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:772 +//line sql.y:760 { yyDollar[1].selStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) yyDollar[1].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -9179,7 +9167,7 @@ yydefault: case 58: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:778 +//line sql.y:766 { yyDollar[1].selStmtUnion().SetLimit(yyDollar[2].limitUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -9188,7 +9176,7 @@ yydefault: case 59: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:783 +//line sql.y:771 { yyDollar[1].selStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) yyDollar[1].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -9198,7 +9186,7 @@ yydefault: case 60: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:789 +//line sql.y:777 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].selStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) @@ -9209,7 +9197,7 @@ yydefault: case 61: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:796 +//line sql.y:784 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -9219,7 +9207,7 @@ yydefault: case 62: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:802 +//line sql.y:790 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].selStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) @@ -9229,14 +9217,14 @@ yydefault: yyVAL.union = yyLOCAL case 63: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:809 +//line sql.y:797 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) } case 64: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:813 +//line sql.y:801 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), SelectExprs{&Nextval{Expr: yyDollar[5].exprUnion()}}, []string{yyDollar[3].str} /*options*/, nil, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/, nil) } @@ -9244,7 +9232,7 @@ yydefault: case 65: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:819 +//line sql.y:807 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -9252,7 +9240,7 @@ yydefault: case 66: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:823 +//line sql.y:811 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -9260,7 +9248,7 @@ yydefault: case 67: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:827 +//line sql.y:815 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -9268,7 +9256,7 @@ yydefault: case 68: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:831 +//line sql.y:819 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -9276,7 +9264,7 @@ yydefault: case 69: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:835 +//line sql.y:823 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -9284,7 +9272,7 @@ yydefault: case 70: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:841 +//line sql.y:829 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -9292,7 +9280,7 @@ yydefault: case 71: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:845 +//line sql.y:833 { setLockInSelect(yyDollar[1].selStmtUnion(), yyDollar[2].lockUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -9301,7 +9289,7 @@ yydefault: case 72: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:850 +//line sql.y:838 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -9309,7 +9297,7 @@ yydefault: case 73: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:854 +//line sql.y:842 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -9317,7 +9305,7 @@ yydefault: case 74: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:860 +//line sql.y:848 { yyLOCAL = yyDollar[2].selStmtUnion() } @@ -9325,7 +9313,7 @@ yydefault: case 75: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:864 +//line sql.y:852 { yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -9334,7 +9322,7 @@ yydefault: case 76: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:869 +//line sql.y:857 { yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) yyDollar[1].selStmtUnion().SetLock(yyDollar[3].lockUnion()) @@ -9344,7 +9332,7 @@ yydefault: case 77: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:875 +//line sql.y:863 { yyDollar[1].selStmtUnion().SetInto(yyDollar[3].selectIntoUnion()) yyDollar[1].selStmtUnion().SetLock(yyDollar[2].lockUnion()) @@ -9354,7 +9342,7 @@ yydefault: case 78: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:881 +//line sql.y:869 { yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -9363,7 +9351,7 @@ yydefault: case 79: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:888 +//line sql.y:876 { yyLOCAL = &Stream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName} } @@ -9371,7 +9359,7 @@ yydefault: case 80: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:894 +//line sql.y:882 { yyLOCAL = &VStream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName, Where: NewWhere(WhereClause, yyDollar[6].exprUnion()), Limit: yyDollar[7].limitUnion()} } @@ -9379,7 +9367,7 @@ yydefault: case 81: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:902 +//line sql.y:890 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].selectIntoUnion() /*into*/, yyDollar[6].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[7].exprUnion()), GroupBy(yyDollar[8].exprsUnion()), NewWhere(HavingClause, yyDollar[9].exprUnion()), yyDollar[10].namedWindowsUnion()) } @@ -9387,7 +9375,7 @@ yydefault: case 82: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:906 +//line sql.y:894 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, nil, yyDollar[5].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[6].exprUnion()), GroupBy(yyDollar[7].exprsUnion()), NewWhere(HavingClause, yyDollar[8].exprUnion()), yyDollar[9].namedWindowsUnion()) } @@ -9395,7 +9383,7 @@ yydefault: case 83: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:912 +//line sql.y:900 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].insUnion() @@ -9411,7 +9399,7 @@ yydefault: case 84: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:924 +//line sql.y:912 { cols := make(Columns, 0, len(yyDollar[7].updateExprsUnion())) vals := make(ValTuple, 0, len(yyDollar[8].updateExprsUnion())) @@ -9425,7 +9413,7 @@ yydefault: case 85: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:936 +//line sql.y:924 { yyLOCAL = InsertAct } @@ -9433,7 +9421,7 @@ yydefault: case 86: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:940 +//line sql.y:928 { yyLOCAL = ReplaceAct } @@ -9441,7 +9429,7 @@ yydefault: case 87: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:946 +//line sql.y:934 { yyLOCAL = &Update{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: yyDollar[5].tableExprsUnion(), Exprs: yyDollar[7].updateExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion()), OrderBy: yyDollar[9].orderByUnion(), Limit: yyDollar[10].limitUnion()} } @@ -9449,7 +9437,7 @@ yydefault: case 88: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:952 +//line sql.y:940 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[6].tableName, As: yyDollar[7].identifierCS}}, Partitions: yyDollar[8].partitionsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion()), OrderBy: yyDollar[10].orderByUnion(), Limit: yyDollar[11].limitUnion()} } @@ -9457,7 +9445,7 @@ yydefault: case 89: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Statement -//line sql.y:956 +//line sql.y:944 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[6].tableNamesUnion(), TableExprs: yyDollar[8].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion())} } @@ -9465,7 +9453,7 @@ yydefault: case 90: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:960 +//line sql.y:948 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } @@ -9473,32 +9461,32 @@ yydefault: case 91: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:964 +//line sql.y:952 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } yyVAL.union = yyLOCAL case 92: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:969 +//line sql.y:957 { } case 93: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:970 +//line sql.y:958 { } case 94: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:974 +//line sql.y:962 { yyLOCAL = TableNames{yyDollar[1].tableName.ToViewName()} } yyVAL.union = yyLOCAL case 95: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:978 +//line sql.y:966 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName.ToViewName()) @@ -9506,14 +9494,14 @@ yydefault: case 96: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:984 +//line sql.y:972 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL case 97: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:988 +//line sql.y:976 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) @@ -9521,14 +9509,14 @@ yydefault: case 98: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:994 +//line sql.y:982 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL case 99: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:998 +//line sql.y:986 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) @@ -9536,7 +9524,7 @@ yydefault: case 100: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Partitions -//line sql.y:1003 +//line sql.y:991 { yyLOCAL = nil } @@ -9544,7 +9532,7 @@ yydefault: case 101: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Partitions -//line sql.y:1007 +//line sql.y:995 { yyLOCAL = yyDollar[3].partitionsUnion() } @@ -9552,7 +9540,7 @@ yydefault: case 102: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:1013 +//line sql.y:1001 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), yyDollar[3].setExprsUnion()) } @@ -9560,14 +9548,14 @@ yydefault: case 103: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:1019 +//line sql.y:1007 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL case 104: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1023 +//line sql.y:1011 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) @@ -9575,7 +9563,7 @@ yydefault: case 105: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1029 +//line sql.y:1017 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("on")} } @@ -9583,7 +9571,7 @@ yydefault: case 106: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1033 +//line sql.y:1021 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("off")} } @@ -9591,7 +9579,7 @@ yydefault: case 107: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1037 +//line sql.y:1025 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: yyDollar[3].exprUnion()} } @@ -9599,7 +9587,7 @@ yydefault: case 108: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1041 +//line sql.y:1029 { yyLOCAL = &SetExpr{Var: NewSetVariable(string(yyDollar[1].str), SessionScope), Expr: yyDollar[2].exprUnion()} } @@ -9607,7 +9595,7 @@ yydefault: case 109: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:1047 +//line sql.y:1035 { yyLOCAL = NewSetVariable(string(yyDollar[1].str), SessionScope) } @@ -9615,7 +9603,7 @@ yydefault: case 110: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:1051 +//line sql.y:1039 { yyLOCAL = yyDollar[1].variableUnion() } @@ -9623,7 +9611,7 @@ yydefault: case 111: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Variable -//line sql.y:1055 +//line sql.y:1043 { yyLOCAL = NewSetVariable(string(yyDollar[2].str), yyDollar[1].scopeUnion()) } @@ -9631,7 +9619,7 @@ yydefault: case 112: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:1061 +//line sql.y:1049 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), UpdateSetExprsScope(yyDollar[5].setExprsUnion(), yyDollar[3].scopeUnion())) } @@ -9639,7 +9627,7 @@ yydefault: case 113: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:1065 +//line sql.y:1053 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), yyDollar[4].setExprsUnion()) } @@ -9647,14 +9635,14 @@ yydefault: case 114: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:1071 +//line sql.y:1059 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL case 115: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1075 +//line sql.y:1063 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) @@ -9662,7 +9650,7 @@ yydefault: case 116: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1081 +//line sql.y:1069 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionIsolationStr, NextTxScope), Expr: NewStrLiteral(yyDollar[3].str)} } @@ -9670,7 +9658,7 @@ yydefault: case 117: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1085 +//line sql.y:1073 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionReadOnlyStr, NextTxScope), Expr: NewStrLiteral("off")} } @@ -9678,39 +9666,39 @@ yydefault: case 118: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1089 +//line sql.y:1077 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionReadOnlyStr, NextTxScope), Expr: NewStrLiteral("on")} } yyVAL.union = yyLOCAL case 119: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1095 +//line sql.y:1083 { yyVAL.str = RepeatableReadStr } case 120: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1099 +//line sql.y:1087 { yyVAL.str = ReadCommittedStr } case 121: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1103 +//line sql.y:1091 { yyVAL.str = ReadUncommittedStr } case 122: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1107 +//line sql.y:1095 { yyVAL.str = SerializableStr } case 123: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1113 +//line sql.y:1101 { yyLOCAL = SessionScope } @@ -9718,7 +9706,7 @@ yydefault: case 124: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1117 +//line sql.y:1105 { yyLOCAL = SessionScope } @@ -9726,7 +9714,7 @@ yydefault: case 125: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1121 +//line sql.y:1109 { yyLOCAL = GlobalScope } @@ -9734,7 +9722,7 @@ yydefault: case 126: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1127 +//line sql.y:1115 { yyDollar[1].createTableUnion().TableSpec = yyDollar[2].tableSpecUnion() yyDollar[1].createTableUnion().FullyParsed = true @@ -9744,7 +9732,7 @@ yydefault: case 127: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1133 +//line sql.y:1121 { // Create table [name] like [name] yyDollar[1].createTableUnion().OptLike = yyDollar[2].optLikeUnion() @@ -9755,7 +9743,7 @@ yydefault: case 128: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:1140 +//line sql.y:1128 { indexDef := yyDollar[1].alterTableUnion().AlterOptions[0].(*AddIndexDefinition).IndexDefinition indexDef.Columns = yyDollar[3].indexColumnsUnion() @@ -9768,7 +9756,7 @@ yydefault: case 129: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Statement -//line sql.y:1149 +//line sql.y:1137 { yyLOCAL = &CreateView{ViewName: yyDollar[8].tableName.ToViewName(), Comments: Comments(yyDollar[2].strs).Parsed(), IsReplace: yyDollar[3].booleanUnion(), Algorithm: yyDollar[4].str, Definer: yyDollar[5].definerUnion(), Security: yyDollar[6].str, Columns: yyDollar[9].columnsUnion(), Select: yyDollar[11].selStmtUnion(), CheckOption: yyDollar[12].str} } @@ -9776,7 +9764,7 @@ yydefault: case 130: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1153 +//line sql.y:1141 { yyDollar[1].createDatabaseUnion().FullyParsed = true yyDollar[1].createDatabaseUnion().CreateOptions = yyDollar[2].databaseOptionsUnion() @@ -9786,7 +9774,7 @@ yydefault: case 131: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1160 +//line sql.y:1148 { yyLOCAL = false } @@ -9794,33 +9782,33 @@ yydefault: case 132: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:1164 +//line sql.y:1152 { yyLOCAL = true } yyVAL.union = yyLOCAL case 133: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1169 +//line sql.y:1157 { yyVAL.identifierCI = NewIdentifierCI("") } case 134: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1173 +//line sql.y:1161 { yyVAL.identifierCI = yyDollar[2].identifierCI } case 135: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1179 +//line sql.y:1167 { yyVAL.identifierCI = yyDollar[1].identifierCI } case 136: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1184 +//line sql.y:1172 { var v []VindexParam yyLOCAL = v @@ -9829,7 +9817,7 @@ yydefault: case 137: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1189 +//line sql.y:1177 { yyLOCAL = yyDollar[2].vindexParamsUnion() } @@ -9837,7 +9825,7 @@ yydefault: case 138: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1195 +//line sql.y:1183 { yyLOCAL = make([]VindexParam, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].vindexParam) @@ -9845,21 +9833,21 @@ yydefault: yyVAL.union = yyLOCAL case 139: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1200 +//line sql.y:1188 { yySLICE := (*[]VindexParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].vindexParam) } case 140: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1206 +//line sql.y:1194 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].identifierCI, Val: yyDollar[3].str} } case 141: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1211 +//line sql.y:1199 { yyLOCAL = nil } @@ -9867,7 +9855,7 @@ yydefault: case 142: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1215 +//line sql.y:1203 { yyLOCAL = yyDollar[1].jsonObjectParamsUnion() } @@ -9875,28 +9863,28 @@ yydefault: case 143: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1221 +//line sql.y:1209 { yyLOCAL = []*JSONObjectParam{yyDollar[1].jsonObjectParam} } yyVAL.union = yyLOCAL case 144: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1225 +//line sql.y:1213 { yySLICE := (*[]*JSONObjectParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jsonObjectParam) } case 145: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1231 +//line sql.y:1219 { yyVAL.jsonObjectParam = &JSONObjectParam{Key: yyDollar[1].exprUnion(), Value: yyDollar[3].exprUnion()} } case 146: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *CreateTable -//line sql.y:1237 +//line sql.y:1225 { yyLOCAL = &CreateTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[6].tableName, IfNotExists: yyDollar[5].booleanUnion(), Temp: yyDollar[3].booleanUnion()} setDDL(yylex, yyLOCAL) @@ -9905,7 +9893,7 @@ yydefault: case 147: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1244 +//line sql.y:1232 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[4].tableName} setDDL(yylex, yyLOCAL) @@ -9914,7 +9902,7 @@ yydefault: case 148: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1251 +//line sql.y:1239 { yyLOCAL = &AlterTable{Table: yyDollar[7].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[4].identifierCI, Type: string(yyDollar[3].str)}, Options: yyDollar[5].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -9923,7 +9911,7 @@ yydefault: case 149: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1256 +//line sql.y:1244 { yyLOCAL = &AlterTable{Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: string(yyDollar[3].str) + " " + string(yyDollar[4].str), Fulltext: true}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -9932,7 +9920,7 @@ yydefault: case 150: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1261 +//line sql.y:1249 { yyLOCAL = &AlterTable{Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: string(yyDollar[3].str) + " " + string(yyDollar[4].str), Spatial: true}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -9941,7 +9929,7 @@ yydefault: case 151: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1266 +//line sql.y:1254 { yyLOCAL = &AlterTable{Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: string(yyDollar[3].str) + " " + string(yyDollar[4].str), Unique: true}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -9950,7 +9938,7 @@ yydefault: case 152: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *CreateDatabase -//line sql.y:1273 +//line sql.y:1261 { yyLOCAL = &CreateDatabase{Comments: Comments(yyDollar[4].strs).Parsed(), DBName: yyDollar[6].identifierCS, IfNotExists: yyDollar[5].booleanUnion()} setDDL(yylex, yyLOCAL) @@ -9959,7 +9947,7 @@ yydefault: case 153: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AlterDatabase -//line sql.y:1280 +//line sql.y:1268 { yyLOCAL = &AlterDatabase{} setDDL(yylex, yyLOCAL) @@ -9968,7 +9956,7 @@ yydefault: case 156: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1291 +//line sql.y:1279 { yyLOCAL = yyDollar[2].tableSpecUnion() yyLOCAL.Options = yyDollar[4].tableOptionsUnion() @@ -9978,7 +9966,7 @@ yydefault: case 157: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1298 +//line sql.y:1286 { yyLOCAL = nil } @@ -9986,7 +9974,7 @@ yydefault: case 158: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1302 +//line sql.y:1290 { yyLOCAL = yyDollar[1].databaseOptionsUnion() } @@ -9994,7 +9982,7 @@ yydefault: case 159: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1308 +//line sql.y:1296 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } @@ -10002,7 +9990,7 @@ yydefault: case 160: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1312 +//line sql.y:1300 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } @@ -10010,28 +9998,28 @@ yydefault: case 161: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1316 +//line sql.y:1304 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } yyVAL.union = yyLOCAL case 162: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1320 +//line sql.y:1308 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } case 163: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1324 +//line sql.y:1312 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } case 164: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1328 +//line sql.y:1316 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) @@ -10039,7 +10027,7 @@ yydefault: case 165: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1334 +//line sql.y:1322 { yyLOCAL = false } @@ -10047,51 +10035,51 @@ yydefault: case 166: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:1338 +//line sql.y:1326 { yyLOCAL = true } yyVAL.union = yyLOCAL case 167: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1344 +//line sql.y:1332 { yyVAL.databaseOption = DatabaseOption{Type: CharacterSetType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 168: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1348 +//line sql.y:1336 { yyVAL.databaseOption = DatabaseOption{Type: CharacterSetType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 169: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1354 +//line sql.y:1342 { yyVAL.databaseOption = DatabaseOption{Type: CollateType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 170: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1358 +//line sql.y:1346 { yyVAL.databaseOption = DatabaseOption{Type: CollateType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 171: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1364 +//line sql.y:1352 { yyVAL.databaseOption = DatabaseOption{Type: EncryptionType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 172: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1368 +//line sql.y:1356 { yyVAL.databaseOption = DatabaseOption{Type: EncryptionType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 173: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1374 +//line sql.y:1362 { yyLOCAL = &OptLike{LikeTable: yyDollar[2].tableName} } @@ -10099,7 +10087,7 @@ yydefault: case 174: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1378 +//line sql.y:1366 { yyLOCAL = &OptLike{LikeTable: yyDollar[3].tableName} } @@ -10107,14 +10095,14 @@ yydefault: case 175: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColumnDefinition -//line sql.y:1384 +//line sql.y:1372 { yyLOCAL = []*ColumnDefinition{yyDollar[1].columnDefinitionUnion()} } yyVAL.union = yyLOCAL case 176: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1388 +//line sql.y:1376 { yySLICE := (*[]*ColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].columnDefinitionUnion()) @@ -10122,7 +10110,7 @@ yydefault: case 177: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1394 +//line sql.y:1382 { yyLOCAL = &TableSpec{} yyLOCAL.AddColumn(yyDollar[1].columnDefinitionUnion()) @@ -10131,7 +10119,7 @@ yydefault: case 178: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1399 +//line sql.y:1387 { yyLOCAL = &TableSpec{} yyLOCAL.AddConstraint(yyDollar[1].constraintDefinitionUnion()) @@ -10139,39 +10127,39 @@ yydefault: yyVAL.union = yyLOCAL case 179: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1404 +//line sql.y:1392 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) } case 180: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1408 +//line sql.y:1396 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) yyVAL.tableSpecUnion().AddConstraint(yyDollar[4].constraintDefinitionUnion()) } case 181: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1413 +//line sql.y:1401 { yyVAL.tableSpecUnion().AddIndex(yyDollar[3].indexDefinitionUnion()) } case 182: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1417 +//line sql.y:1405 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } case 183: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1421 +//line sql.y:1409 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } case 184: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1432 +//line sql.y:1420 { yyDollar[2].columnType.Options = yyDollar[4].columnTypeOptionsUnion() if yyDollar[2].columnType.Options.Collate == "" { @@ -10184,7 +10172,7 @@ yydefault: case 185: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1441 +//line sql.y:1429 { yyDollar[2].columnType.Options = yyDollar[9].columnTypeOptionsUnion() yyDollar[2].columnType.Options.As = yyDollar[7].exprUnion() @@ -10195,20 +10183,20 @@ yydefault: yyVAL.union = yyLOCAL case 186: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1450 +//line sql.y:1438 { yyVAL.str = "" } case 187: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1454 +//line sql.y:1442 { yyVAL.str = "" } case 188: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1463 +//line sql.y:1451 { yyLOCAL = &ColumnTypeOptions{Null: nil, Default: nil, OnUpdate: nil, Autoincrement: false, KeyOpt: ColKeyNone, Comment: nil, As: nil, Invisible: nil, Format: UnspecifiedFormat, EngineAttribute: nil, SecondaryEngineAttribute: nil} } @@ -10216,7 +10204,7 @@ yydefault: case 189: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1467 +//line sql.y:1455 { val := true yyDollar[1].columnTypeOptionsUnion().Null = &val @@ -10226,7 +10214,7 @@ yydefault: case 190: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1473 +//line sql.y:1461 { val := false yyDollar[1].columnTypeOptionsUnion().Null = &val @@ -10236,7 +10224,7 @@ yydefault: case 191: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1479 +//line sql.y:1467 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10245,7 +10233,7 @@ yydefault: case 192: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1484 +//line sql.y:1472 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[3].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10254,7 +10242,7 @@ yydefault: case 193: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1489 +//line sql.y:1477 { yyDollar[1].columnTypeOptionsUnion().OnUpdate = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10263,7 +10251,7 @@ yydefault: case 194: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1494 +//line sql.y:1482 { yyDollar[1].columnTypeOptionsUnion().Autoincrement = true yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10272,7 +10260,7 @@ yydefault: case 195: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1499 +//line sql.y:1487 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10281,7 +10269,7 @@ yydefault: case 196: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1504 +//line sql.y:1492 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10289,14 +10277,14 @@ yydefault: yyVAL.union = yyLOCAL case 197: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1509 +//line sql.y:1497 { yyDollar[1].columnTypeOptionsUnion().Collate = encodeSQLString(yyDollar[3].str) } case 198: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1513 +//line sql.y:1501 { yyDollar[1].columnTypeOptionsUnion().Collate = string(yyDollar[3].identifierCI.String()) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10304,14 +10292,14 @@ yydefault: yyVAL.union = yyLOCAL case 199: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1518 +//line sql.y:1506 { yyDollar[1].columnTypeOptionsUnion().Format = yyDollar[3].columnFormatUnion() } case 200: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1522 +//line sql.y:1510 { yyDollar[1].columnTypeOptionsUnion().SRID = NewIntLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10320,7 +10308,7 @@ yydefault: case 201: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1527 +//line sql.y:1515 { val := false yyDollar[1].columnTypeOptionsUnion().Invisible = &val @@ -10330,7 +10318,7 @@ yydefault: case 202: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1533 +//line sql.y:1521 { val := true yyDollar[1].columnTypeOptionsUnion().Invisible = &val @@ -10339,20 +10327,20 @@ yydefault: yyVAL.union = yyLOCAL case 203: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1539 +//line sql.y:1527 { yyDollar[1].columnTypeOptionsUnion().EngineAttribute = NewStrLiteral(yyDollar[4].str) } case 204: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1543 +//line sql.y:1531 { yyDollar[1].columnTypeOptionsUnion().SecondaryEngineAttribute = NewStrLiteral(yyDollar[4].str) } case 205: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1549 +//line sql.y:1537 { yyLOCAL = FixedFormat } @@ -10360,7 +10348,7 @@ yydefault: case 206: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1553 +//line sql.y:1541 { yyLOCAL = DynamicFormat } @@ -10368,7 +10356,7 @@ yydefault: case 207: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1557 +//line sql.y:1545 { yyLOCAL = DefaultFormat } @@ -10376,7 +10364,7 @@ yydefault: case 208: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1563 +//line sql.y:1551 { yyLOCAL = VirtualStorage } @@ -10384,7 +10372,7 @@ yydefault: case 209: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1567 +//line sql.y:1555 { yyLOCAL = StoredStorage } @@ -10392,7 +10380,7 @@ yydefault: case 210: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1572 +//line sql.y:1560 { yyLOCAL = &ColumnTypeOptions{} } @@ -10400,7 +10388,7 @@ yydefault: case 211: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1576 +//line sql.y:1564 { yyDollar[1].columnTypeOptionsUnion().Storage = yyDollar[2].columnStorageUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10409,7 +10397,7 @@ yydefault: case 212: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1581 +//line sql.y:1569 { val := true yyDollar[1].columnTypeOptionsUnion().Null = &val @@ -10419,7 +10407,7 @@ yydefault: case 213: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1587 +//line sql.y:1575 { val := false yyDollar[1].columnTypeOptionsUnion().Null = &val @@ -10429,7 +10417,7 @@ yydefault: case 214: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1593 +//line sql.y:1581 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10438,7 +10426,7 @@ yydefault: case 215: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1598 +//line sql.y:1586 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -10447,7 +10435,7 @@ yydefault: case 216: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1603 +//line sql.y:1591 { val := false yyDollar[1].columnTypeOptionsUnion().Invisible = &val @@ -10457,7 +10445,7 @@ yydefault: case 217: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1609 +//line sql.y:1597 { val := true yyDollar[1].columnTypeOptionsUnion().Invisible = &val @@ -10467,7 +10455,7 @@ yydefault: case 218: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1617 +//line sql.y:1605 { yyLOCAL = yyDollar[1].exprUnion() } @@ -10475,7 +10463,7 @@ yydefault: case 220: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1624 +//line sql.y:1612 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_timestamp"), Fsp: yyDollar[2].exprUnion()} } @@ -10483,7 +10471,7 @@ yydefault: case 221: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1628 +//line sql.y:1616 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("localtime"), Fsp: yyDollar[2].exprUnion()} } @@ -10491,7 +10479,7 @@ yydefault: case 222: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1632 +//line sql.y:1620 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("localtimestamp"), Fsp: yyDollar[2].exprUnion()} } @@ -10499,7 +10487,7 @@ yydefault: case 223: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1636 +//line sql.y:1624 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_timestamp"), Fsp: yyDollar[2].exprUnion()} } @@ -10507,7 +10495,7 @@ yydefault: case 224: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1640 +//line sql.y:1628 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("now"), Fsp: yyDollar[2].exprUnion()} } @@ -10515,7 +10503,7 @@ yydefault: case 227: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1650 +//line sql.y:1638 { yyLOCAL = &NullVal{} } @@ -10523,7 +10511,7 @@ yydefault: case 229: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1657 +//line sql.y:1645 { yyLOCAL = yyDollar[2].exprUnion() } @@ -10531,7 +10519,7 @@ yydefault: case 230: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1661 +//line sql.y:1649 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } @@ -10539,7 +10527,7 @@ yydefault: case 231: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1667 +//line sql.y:1655 { yyLOCAL = yyDollar[1].exprUnion() } @@ -10547,7 +10535,7 @@ yydefault: case 232: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1671 +//line sql.y:1659 { yyLOCAL = yyDollar[1].exprUnion() } @@ -10555,7 +10543,7 @@ yydefault: case 233: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1675 +//line sql.y:1663 { yyLOCAL = yyDollar[1].boolValUnion() } @@ -10563,7 +10551,7 @@ yydefault: case 234: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1679 +//line sql.y:1667 { yyLOCAL = NewHexLiteral(yyDollar[1].str) } @@ -10571,7 +10559,7 @@ yydefault: case 235: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1683 +//line sql.y:1671 { yyLOCAL = NewHexNumLiteral(yyDollar[1].str) } @@ -10579,7 +10567,7 @@ yydefault: case 236: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1687 +//line sql.y:1675 { yyLOCAL = NewBitLiteral(yyDollar[1].str[2:]) } @@ -10587,7 +10575,7 @@ yydefault: case 237: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1691 +//line sql.y:1679 { yyLOCAL = NewBitLiteral(yyDollar[1].str) } @@ -10595,7 +10583,7 @@ yydefault: case 238: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1695 +//line sql.y:1683 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) @@ -10604,7 +10592,7 @@ yydefault: case 239: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1700 +//line sql.y:1688 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral(yyDollar[2].str)} } @@ -10612,7 +10600,7 @@ yydefault: case 240: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1704 +//line sql.y:1692 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexNumLiteral(yyDollar[2].str)} } @@ -10620,7 +10608,7 @@ yydefault: case 241: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1708 +//line sql.y:1696 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral(yyDollar[2].str[2:])} } @@ -10628,7 +10616,7 @@ yydefault: case 242: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1712 +//line sql.y:1700 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexLiteral(yyDollar[2].str)} } @@ -10636,7 +10624,7 @@ yydefault: case 243: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1716 +//line sql.y:1704 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: yyDollar[2].exprUnion()} } @@ -10644,7 +10632,7 @@ yydefault: case 244: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1720 +//line sql.y:1708 { bindVariable(yylex, yyDollar[2].str[1:]) yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewArgument(yyDollar[2].str[1:])} @@ -10653,7 +10641,7 @@ yydefault: case 245: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1725 +//line sql.y:1713 { yyLOCAL = NewDateLiteral(yyDollar[2].str) } @@ -10661,7 +10649,7 @@ yydefault: case 246: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1729 +//line sql.y:1717 { yyLOCAL = NewTimeLiteral(yyDollar[2].str) } @@ -10669,267 +10657,267 @@ yydefault: case 247: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1733 +//line sql.y:1721 { yyLOCAL = NewTimestampLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL case 248: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1739 +//line sql.y:1727 { yyVAL.str = Armscii8Str } case 249: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1743 +//line sql.y:1731 { yyVAL.str = ASCIIStr } case 250: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1747 +//line sql.y:1735 { yyVAL.str = Big5Str } case 251: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1751 +//line sql.y:1739 { yyVAL.str = UBinaryStr } case 252: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1755 +//line sql.y:1743 { yyVAL.str = Cp1250Str } case 253: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1759 +//line sql.y:1747 { yyVAL.str = Cp1251Str } case 254: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1763 +//line sql.y:1751 { yyVAL.str = Cp1256Str } case 255: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1767 +//line sql.y:1755 { yyVAL.str = Cp1257Str } case 256: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1771 +//line sql.y:1759 { yyVAL.str = Cp850Str } case 257: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1775 +//line sql.y:1763 { yyVAL.str = Cp852Str } case 258: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1779 +//line sql.y:1767 { yyVAL.str = Cp866Str } case 259: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1783 +//line sql.y:1771 { yyVAL.str = Cp932Str } case 260: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1787 +//line sql.y:1775 { yyVAL.str = Dec8Str } case 261: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1791 +//line sql.y:1779 { yyVAL.str = EucjpmsStr } case 262: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1795 +//line sql.y:1783 { yyVAL.str = EuckrStr } case 263: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1799 +//line sql.y:1787 { yyVAL.str = Gb18030Str } case 264: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1803 +//line sql.y:1791 { yyVAL.str = Gb2312Str } case 265: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1807 +//line sql.y:1795 { yyVAL.str = GbkStr } case 266: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1811 +//line sql.y:1799 { yyVAL.str = Geostd8Str } case 267: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1815 +//line sql.y:1803 { yyVAL.str = GreekStr } case 268: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1819 +//line sql.y:1807 { yyVAL.str = HebrewStr } case 269: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1823 +//line sql.y:1811 { yyVAL.str = Hp8Str } case 270: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1827 +//line sql.y:1815 { yyVAL.str = Keybcs2Str } case 271: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1831 +//line sql.y:1819 { yyVAL.str = Koi8rStr } case 272: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1835 +//line sql.y:1823 { yyVAL.str = Koi8uStr } case 273: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1839 +//line sql.y:1827 { yyVAL.str = Latin1Str } case 274: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1843 +//line sql.y:1831 { yyVAL.str = Latin2Str } case 275: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1847 +//line sql.y:1835 { yyVAL.str = Latin5Str } case 276: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1851 +//line sql.y:1839 { yyVAL.str = Latin7Str } case 277: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1855 +//line sql.y:1843 { yyVAL.str = MacceStr } case 278: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1859 +//line sql.y:1847 { yyVAL.str = MacromanStr } case 279: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1863 +//line sql.y:1851 { yyVAL.str = SjisStr } case 280: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1867 +//line sql.y:1855 { yyVAL.str = Swe7Str } case 281: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1871 +//line sql.y:1859 { yyVAL.str = Tis620Str } case 282: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1875 +//line sql.y:1863 { yyVAL.str = Ucs2Str } case 283: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1879 +//line sql.y:1867 { yyVAL.str = UjisStr } case 284: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1883 +//line sql.y:1871 { yyVAL.str = Utf16Str } case 285: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1887 +//line sql.y:1875 { yyVAL.str = Utf16leStr } case 286: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1891 +//line sql.y:1879 { yyVAL.str = Utf32Str } case 287: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1895 +//line sql.y:1883 { yyVAL.str = Utf8Str } case 288: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1899 +//line sql.y:1887 { yyVAL.str = Utf8mb4Str } case 289: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1903 +//line sql.y:1891 { yyVAL.str = Utf8Str } case 292: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1913 +//line sql.y:1901 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } @@ -10937,7 +10925,7 @@ yydefault: case 293: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1917 +//line sql.y:1905 { yyLOCAL = NewFloatLiteral(yyDollar[1].str) } @@ -10945,7 +10933,7 @@ yydefault: case 294: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1921 +//line sql.y:1909 { yyLOCAL = NewDecimalLiteral(yyDollar[1].str) } @@ -10953,7 +10941,7 @@ yydefault: case 295: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1927 +//line sql.y:1915 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } @@ -10961,7 +10949,7 @@ yydefault: case 296: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1931 +//line sql.y:1919 { yyLOCAL = &UnaryExpr{Operator: NStringOp, Expr: NewStrLiteral(yyDollar[1].str)} } @@ -10969,7 +10957,7 @@ yydefault: case 297: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1935 +//line sql.y:1923 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewStrLiteral(yyDollar[2].str)} } @@ -10977,7 +10965,7 @@ yydefault: case 298: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1941 +//line sql.y:1929 { yyLOCAL = yyDollar[1].exprUnion() } @@ -10985,7 +10973,7 @@ yydefault: case 299: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1945 +//line sql.y:1933 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) @@ -10994,7 +10982,7 @@ yydefault: case 300: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1952 +//line sql.y:1940 { yyLOCAL = ColKeyPrimary } @@ -11002,7 +10990,7 @@ yydefault: case 301: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1956 +//line sql.y:1944 { yyLOCAL = ColKeyUnique } @@ -11010,7 +10998,7 @@ yydefault: case 302: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1960 +//line sql.y:1948 { yyLOCAL = ColKeyUniqueKey } @@ -11018,14 +11006,14 @@ yydefault: case 303: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1964 +//line sql.y:1952 { yyLOCAL = ColKey } yyVAL.union = yyLOCAL case 304: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1970 +//line sql.y:1958 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].booleanUnion() @@ -11033,74 +11021,74 @@ yydefault: } case 308: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1981 +//line sql.y:1969 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].literalUnion() } case 309: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1986 +//line sql.y:1974 { yyVAL.columnType = yyDollar[1].columnType } case 310: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1992 +//line sql.y:1980 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 311: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1996 +//line sql.y:1984 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 312: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2000 +//line sql.y:1988 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 313: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2004 +//line sql.y:1992 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 314: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2008 +//line sql.y:1996 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 315: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2012 +//line sql.y:2000 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 316: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2016 +//line sql.y:2004 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 317: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2020 +//line sql.y:2008 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 318: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2024 +//line sql.y:2012 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 319: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2030 +//line sql.y:2018 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -11108,7 +11096,7 @@ yydefault: } case 320: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2036 +//line sql.y:2024 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -11116,7 +11104,7 @@ yydefault: } case 321: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2042 +//line sql.y:2030 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -11124,7 +11112,7 @@ yydefault: } case 322: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2048 +//line sql.y:2036 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -11132,7 +11120,7 @@ yydefault: } case 323: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2054 +//line sql.y:2042 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -11140,7 +11128,7 @@ yydefault: } case 324: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2060 +//line sql.y:2048 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -11148,7 +11136,7 @@ yydefault: } case 325: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2066 +//line sql.y:2054 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -11156,43 +11144,43 @@ yydefault: } case 326: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2074 +//line sql.y:2062 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 327: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2078 +//line sql.y:2066 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 328: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2082 +//line sql.y:2070 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 329: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2086 +//line sql.y:2074 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 330: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2090 +//line sql.y:2078 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 331: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2096 +//line sql.y:2084 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].columnCharset} } case 332: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2100 +//line sql.y:2088 { // CHAR BYTE is an alias for binary. See also: // https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html @@ -11200,153 +11188,153 @@ yydefault: } case 333: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2106 +//line sql.y:2094 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].columnCharset} } case 334: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2110 +//line sql.y:2098 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 335: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2114 +//line sql.y:2102 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 336: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2118 +//line sql.y:2106 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 337: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2122 +//line sql.y:2110 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 338: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2126 +//line sql.y:2114 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 339: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2130 +//line sql.y:2118 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 340: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2134 +//line sql.y:2122 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 341: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2138 +//line sql.y:2126 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 342: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2142 +//line sql.y:2130 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 343: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2146 +//line sql.y:2134 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 344: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2150 +//line sql.y:2138 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 345: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2154 +//line sql.y:2142 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} } case 346: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2159 +//line sql.y:2147 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} } case 347: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2165 +//line sql.y:2153 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 348: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2169 +//line sql.y:2157 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 349: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2173 +//line sql.y:2161 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 350: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2177 +//line sql.y:2165 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 351: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2181 +//line sql.y:2169 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 352: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2185 +//line sql.y:2173 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 353: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2189 +//line sql.y:2177 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 354: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2193 +//line sql.y:2181 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 355: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2199 +//line sql.y:2187 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, encodeSQLString(yyDollar[1].str)) } case 356: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2204 +//line sql.y:2192 { yyVAL.strs = append(yyDollar[1].strs, encodeSQLString(yyDollar[3].str)) } case 357: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Literal -//line sql.y:2209 +//line sql.y:2197 { yyLOCAL = nil } @@ -11354,20 +11342,20 @@ yydefault: case 358: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Literal -//line sql.y:2213 +//line sql.y:2201 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL case 359: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2218 +//line sql.y:2206 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 360: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2222 +//line sql.y:2210 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].str), @@ -11376,13 +11364,13 @@ yydefault: } case 361: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2231 +//line sql.y:2219 { yyVAL.LengthScaleOption = yyDollar[1].LengthScaleOption } case 362: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2235 +//line sql.y:2223 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].str), @@ -11390,13 +11378,13 @@ yydefault: } case 363: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2242 +//line sql.y:2230 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 364: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2246 +//line sql.y:2234 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].str), @@ -11404,7 +11392,7 @@ yydefault: } case 365: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2252 +//line sql.y:2240 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].str), @@ -11414,7 +11402,7 @@ yydefault: case 366: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2260 +//line sql.y:2248 { yyLOCAL = false } @@ -11422,7 +11410,7 @@ yydefault: case 367: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2264 +//line sql.y:2252 { yyLOCAL = true } @@ -11430,7 +11418,7 @@ yydefault: case 368: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2268 +//line sql.y:2256 { yyLOCAL = false } @@ -11438,7 +11426,7 @@ yydefault: case 369: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2273 +//line sql.y:2261 { yyLOCAL = false } @@ -11446,66 +11434,66 @@ yydefault: case 370: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2277 +//line sql.y:2265 { yyLOCAL = true } yyVAL.union = yyLOCAL case 371: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2282 +//line sql.y:2270 { yyVAL.columnCharset = ColumnCharset{} } case 372: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2286 +//line sql.y:2274 { yyVAL.columnCharset = ColumnCharset{Name: string(yyDollar[2].identifierCI.String()), Binary: yyDollar[3].booleanUnion()} } case 373: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2290 +//line sql.y:2278 { yyVAL.columnCharset = ColumnCharset{Name: encodeSQLString(yyDollar[2].str), Binary: yyDollar[3].booleanUnion()} } case 374: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2294 +//line sql.y:2282 { yyVAL.columnCharset = ColumnCharset{Name: string(yyDollar[2].str)} } case 375: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2298 +//line sql.y:2286 { // ASCII: Shorthand for CHARACTER SET latin1. yyVAL.columnCharset = ColumnCharset{Name: "latin1", Binary: yyDollar[2].booleanUnion()} } case 376: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2303 +//line sql.y:2291 { // UNICODE: Shorthand for CHARACTER SET ucs2. yyVAL.columnCharset = ColumnCharset{Name: "ucs2", Binary: yyDollar[2].booleanUnion()} } case 377: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2308 +//line sql.y:2296 { // BINARY: Shorthand for default CHARACTER SET but with binary collation yyVAL.columnCharset = ColumnCharset{Name: "", Binary: true} } case 378: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2313 +//line sql.y:2301 { // BINARY ASCII: Shorthand for CHARACTER SET latin1 with binary collation yyVAL.columnCharset = ColumnCharset{Name: "latin1", Binary: true} } case 379: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2318 +//line sql.y:2306 { // BINARY UNICODE: Shorthand for CHARACTER SET ucs2 with binary collation yyVAL.columnCharset = ColumnCharset{Name: "ucs2", Binary: true} @@ -11513,7 +11501,7 @@ yydefault: case 380: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2324 +//line sql.y:2312 { yyLOCAL = false } @@ -11521,33 +11509,33 @@ yydefault: case 381: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2328 +//line sql.y:2316 { yyLOCAL = true } yyVAL.union = yyLOCAL case 382: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2333 +//line sql.y:2321 { yyVAL.str = "" } case 383: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2337 +//line sql.y:2325 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } case 384: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2341 +//line sql.y:2329 { yyVAL.str = encodeSQLString(yyDollar[2].str) } case 385: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexDefinition -//line sql.y:2347 +//line sql.y:2335 { yyLOCAL = &IndexDefinition{Info: yyDollar[1].indexInfoUnion(), Columns: yyDollar[3].indexColumnsUnion(), Options: yyDollar[5].indexOptionsUnion()} } @@ -11555,7 +11543,7 @@ yydefault: case 386: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2352 +//line sql.y:2340 { yyLOCAL = nil } @@ -11563,7 +11551,7 @@ yydefault: case 387: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2356 +//line sql.y:2344 { yyLOCAL = yyDollar[1].indexOptionsUnion() } @@ -11571,14 +11559,14 @@ yydefault: case 388: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2362 +//line sql.y:2350 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL case 389: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2366 +//line sql.y:2354 { yySLICE := (*[]*IndexOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexOptionUnion()) @@ -11586,7 +11574,7 @@ yydefault: case 390: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2372 +//line sql.y:2360 { yyLOCAL = yyDollar[1].indexOptionUnion() } @@ -11594,7 +11582,7 @@ yydefault: case 391: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2376 +//line sql.y:2364 { // should not be string yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} @@ -11603,7 +11591,7 @@ yydefault: case 392: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2381 +//line sql.y:2369 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[2].str)} } @@ -11611,7 +11599,7 @@ yydefault: case 393: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2385 +//line sql.y:2373 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str)} } @@ -11619,7 +11607,7 @@ yydefault: case 394: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2389 +//line sql.y:2377 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str)} } @@ -11627,7 +11615,7 @@ yydefault: case 395: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2393 +//line sql.y:2381 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str) + " " + string(yyDollar[2].str), String: yyDollar[3].identifierCI.String()} } @@ -11635,7 +11623,7 @@ yydefault: case 396: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2397 +//line sql.y:2385 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -11643,27 +11631,27 @@ yydefault: case 397: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2401 +//line sql.y:2389 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL case 398: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2407 +//line sql.y:2395 { yyVAL.str = "" } case 399: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2411 +//line sql.y:2399 { yyVAL.str = string(yyDollar[1].str) } case 400: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2417 +//line sql.y:2405 { yyLOCAL = &IndexInfo{Type: string(yyDollar[2].str) + " " + string(yyDollar[3].str), ConstraintName: NewIdentifierCI(yyDollar[1].str), Name: NewIdentifierCI("PRIMARY"), Primary: true, Unique: true} } @@ -11671,7 +11659,7 @@ yydefault: case 401: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2421 +//line sql.y:2409 { yyLOCAL = &IndexInfo{Type: string(yyDollar[1].str) + " " + string(yyDollar[2].str), Name: NewIdentifierCI(yyDollar[3].str), Spatial: true, Unique: false} } @@ -11679,7 +11667,7 @@ yydefault: case 402: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2425 +//line sql.y:2413 { yyLOCAL = &IndexInfo{Type: string(yyDollar[1].str) + " " + string(yyDollar[2].str), Name: NewIdentifierCI(yyDollar[3].str), Fulltext: true, Unique: false} } @@ -11687,7 +11675,7 @@ yydefault: case 403: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2429 +//line sql.y:2417 { yyLOCAL = &IndexInfo{Type: string(yyDollar[2].str) + " " + string(yyDollar[3].str), ConstraintName: NewIdentifierCI(yyDollar[1].str), Name: NewIdentifierCI(yyDollar[4].str), Unique: true} } @@ -11695,100 +11683,100 @@ yydefault: case 404: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2433 +//line sql.y:2421 { yyLOCAL = &IndexInfo{Type: string(yyDollar[1].str), Name: NewIdentifierCI(yyDollar[2].str), Unique: false} } yyVAL.union = yyLOCAL case 405: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2438 +//line sql.y:2426 { yyVAL.str = "" } case 406: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2442 +//line sql.y:2430 { yyVAL.str = yyDollar[2].str } case 407: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2448 +//line sql.y:2436 { yyVAL.str = string(yyDollar[1].str) } case 408: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2452 +//line sql.y:2440 { yyVAL.str = string(yyDollar[1].str) } case 409: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2456 +//line sql.y:2444 { yyVAL.str = string(yyDollar[1].str) } case 410: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2462 +//line sql.y:2450 { yyVAL.str = string(yyDollar[1].str) } case 411: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2466 +//line sql.y:2454 { yyVAL.str = string(yyDollar[1].str) } case 412: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2471 +//line sql.y:2459 { yyVAL.str = "key" } case 413: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2475 +//line sql.y:2463 { yyVAL.str = yyDollar[1].str } case 414: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2481 +//line sql.y:2469 { yyVAL.str = string(yyDollar[1].str) } case 415: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2485 +//line sql.y:2473 { yyVAL.str = string(yyDollar[1].str) } case 416: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2490 +//line sql.y:2478 { yyVAL.str = "" } case 417: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2494 +//line sql.y:2482 { yyVAL.str = string(yyDollar[1].identifierCI.String()) } case 418: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexColumn -//line sql.y:2500 +//line sql.y:2488 { yyLOCAL = []*IndexColumn{yyDollar[1].indexColumnUnion()} } yyVAL.union = yyLOCAL case 419: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2504 +//line sql.y:2492 { yySLICE := (*[]*IndexColumn)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].indexColumnUnion()) @@ -11796,7 +11784,7 @@ yydefault: case 420: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2510 +//line sql.y:2498 { yyLOCAL = &IndexColumn{Column: yyDollar[1].identifierCI, Length: yyDollar[2].literalUnion(), Direction: yyDollar[3].orderDirectionUnion()} } @@ -11804,7 +11792,7 @@ yydefault: case 421: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2514 +//line sql.y:2502 { yyLOCAL = &IndexColumn{Expression: yyDollar[2].exprUnion(), Direction: yyDollar[4].orderDirectionUnion()} } @@ -11812,7 +11800,7 @@ yydefault: case 422: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2520 +//line sql.y:2508 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].identifierCI, Details: yyDollar[3].constraintInfoUnion()} } @@ -11820,7 +11808,7 @@ yydefault: case 423: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2524 +//line sql.y:2512 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } @@ -11828,7 +11816,7 @@ yydefault: case 424: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2530 +//line sql.y:2518 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].identifierCI, Details: yyDollar[3].constraintInfoUnion()} } @@ -11836,7 +11824,7 @@ yydefault: case 425: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2534 +//line sql.y:2522 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } @@ -11844,7 +11832,7 @@ yydefault: case 426: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2540 +//line sql.y:2528 { yyLOCAL = &ForeignKeyDefinition{IndexName: NewIdentifierCI(yyDollar[3].str), Source: yyDollar[5].columnsUnion(), ReferenceDefinition: yyDollar[7].referenceDefinitionUnion()} } @@ -11852,7 +11840,7 @@ yydefault: case 427: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2546 +//line sql.y:2534 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion()} } @@ -11860,7 +11848,7 @@ yydefault: case 428: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2550 +//line sql.y:2538 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnDelete: yyDollar[7].referenceActionUnion()} } @@ -11868,7 +11856,7 @@ yydefault: case 429: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2554 +//line sql.y:2542 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnUpdate: yyDollar[7].referenceActionUnion()} } @@ -11876,7 +11864,7 @@ yydefault: case 430: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2558 +//line sql.y:2546 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnDelete: yyDollar[7].referenceActionUnion(), OnUpdate: yyDollar[8].referenceActionUnion()} } @@ -11884,7 +11872,7 @@ yydefault: case 431: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2562 +//line sql.y:2550 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnUpdate: yyDollar[7].referenceActionUnion(), OnDelete: yyDollar[8].referenceActionUnion()} } @@ -11892,7 +11880,7 @@ yydefault: case 432: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2567 +//line sql.y:2555 { yyLOCAL = nil } @@ -11900,7 +11888,7 @@ yydefault: case 433: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2571 +//line sql.y:2559 { yyLOCAL = yyDollar[1].referenceDefinitionUnion() } @@ -11908,7 +11896,7 @@ yydefault: case 434: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2577 +//line sql.y:2565 { yyLOCAL = &CheckConstraintDefinition{Expr: yyDollar[3].exprUnion(), Enforced: yyDollar[5].booleanUnion()} } @@ -11916,7 +11904,7 @@ yydefault: case 435: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2583 +//line sql.y:2571 { yyLOCAL = yyDollar[2].matchActionUnion() } @@ -11924,7 +11912,7 @@ yydefault: case 436: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2589 +//line sql.y:2577 { yyLOCAL = Full } @@ -11932,7 +11920,7 @@ yydefault: case 437: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2593 +//line sql.y:2581 { yyLOCAL = Partial } @@ -11940,7 +11928,7 @@ yydefault: case 438: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2597 +//line sql.y:2585 { yyLOCAL = Simple } @@ -11948,7 +11936,7 @@ yydefault: case 439: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2602 +//line sql.y:2590 { yyLOCAL = DefaultMatch } @@ -11956,7 +11944,7 @@ yydefault: case 440: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2606 +//line sql.y:2594 { yyLOCAL = yyDollar[1].matchActionUnion() } @@ -11964,7 +11952,7 @@ yydefault: case 441: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2612 +//line sql.y:2600 { yyLOCAL = yyDollar[3].referenceActionUnion() } @@ -11972,7 +11960,7 @@ yydefault: case 442: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2618 +//line sql.y:2606 { yyLOCAL = yyDollar[3].referenceActionUnion() } @@ -11980,7 +11968,7 @@ yydefault: case 443: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2624 +//line sql.y:2612 { yyLOCAL = Restrict } @@ -11988,7 +11976,7 @@ yydefault: case 444: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2628 +//line sql.y:2616 { yyLOCAL = Cascade } @@ -11996,7 +11984,7 @@ yydefault: case 445: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2632 +//line sql.y:2620 { yyLOCAL = NoAction } @@ -12004,7 +11992,7 @@ yydefault: case 446: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2636 +//line sql.y:2624 { yyLOCAL = SetDefault } @@ -12012,33 +12000,33 @@ yydefault: case 447: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2640 +//line sql.y:2628 { yyLOCAL = SetNull } yyVAL.union = yyLOCAL case 448: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2645 +//line sql.y:2633 { yyVAL.str = "" } case 449: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2649 +//line sql.y:2637 { yyVAL.str = string(yyDollar[1].str) } case 450: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2653 +//line sql.y:2641 { yyVAL.str = string(yyDollar[1].str) } case 451: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2659 +//line sql.y:2647 { yyLOCAL = true } @@ -12046,7 +12034,7 @@ yydefault: case 452: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:2663 +//line sql.y:2651 { yyLOCAL = false } @@ -12054,7 +12042,7 @@ yydefault: case 453: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2668 +//line sql.y:2656 { yyLOCAL = true } @@ -12062,7 +12050,7 @@ yydefault: case 454: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2672 +//line sql.y:2660 { yyLOCAL = yyDollar[1].booleanUnion() } @@ -12070,7 +12058,7 @@ yydefault: case 455: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2677 +//line sql.y:2665 { yyLOCAL = nil } @@ -12078,7 +12066,7 @@ yydefault: case 456: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2681 +//line sql.y:2669 { yyLOCAL = yyDollar[1].tableOptionsUnion() } @@ -12086,21 +12074,21 @@ yydefault: case 457: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2687 +//line sql.y:2675 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL case 458: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2691 +//line sql.y:2679 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableOptionUnion()) } case 459: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2695 +//line sql.y:2683 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) @@ -12108,14 +12096,14 @@ yydefault: case 460: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2701 +//line sql.y:2689 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL case 461: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2705 +//line sql.y:2693 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) @@ -12123,7 +12111,7 @@ yydefault: case 462: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2711 +//line sql.y:2699 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12131,7 +12119,7 @@ yydefault: case 463: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2715 +//line sql.y:2703 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12139,7 +12127,7 @@ yydefault: case 464: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2719 +//line sql.y:2707 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12147,7 +12135,7 @@ yydefault: case 465: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2723 +//line sql.y:2711 { yyLOCAL = &TableOption{Name: (string(yyDollar[2].str)), String: yyDollar[4].str, CaseSensitive: true} } @@ -12155,7 +12143,7 @@ yydefault: case 466: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2727 +//line sql.y:2715 { yyLOCAL = &TableOption{Name: string(yyDollar[2].str), String: yyDollar[4].str, CaseSensitive: true} } @@ -12163,7 +12151,7 @@ yydefault: case 467: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2731 +//line sql.y:2719 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12171,7 +12159,7 @@ yydefault: case 468: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2735 +//line sql.y:2723 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -12179,7 +12167,7 @@ yydefault: case 469: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2739 +//line sql.y:2727 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -12187,7 +12175,7 @@ yydefault: case 470: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2743 +//line sql.y:2731 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -12195,7 +12183,7 @@ yydefault: case 471: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2747 +//line sql.y:2735 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } @@ -12203,7 +12191,7 @@ yydefault: case 472: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2751 +//line sql.y:2739 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } @@ -12211,7 +12199,7 @@ yydefault: case 473: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2755 +//line sql.y:2743 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12219,7 +12207,7 @@ yydefault: case 474: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2759 +//line sql.y:2747 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -12227,7 +12215,7 @@ yydefault: case 475: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2763 +//line sql.y:2751 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: yyDollar[3].identifierCS.String(), CaseSensitive: true} } @@ -12235,7 +12223,7 @@ yydefault: case 476: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2767 +//line sql.y:2755 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -12243,7 +12231,7 @@ yydefault: case 477: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2771 +//line sql.y:2759 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -12251,7 +12239,7 @@ yydefault: case 478: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2775 +//line sql.y:2763 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12259,7 +12247,7 @@ yydefault: case 479: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2779 +//line sql.y:2767 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12267,7 +12255,7 @@ yydefault: case 480: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2783 +//line sql.y:2771 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12275,7 +12263,7 @@ yydefault: case 481: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2787 +//line sql.y:2775 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12283,7 +12271,7 @@ yydefault: case 482: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2791 +//line sql.y:2779 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -12291,7 +12279,7 @@ yydefault: case 483: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2795 +//line sql.y:2783 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -12299,7 +12287,7 @@ yydefault: case 484: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2799 +//line sql.y:2787 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -12307,7 +12295,7 @@ yydefault: case 485: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2803 +//line sql.y:2791 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -12315,7 +12303,7 @@ yydefault: case 486: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2807 +//line sql.y:2795 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12323,7 +12311,7 @@ yydefault: case 487: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2811 +//line sql.y:2799 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -12331,7 +12319,7 @@ yydefault: case 488: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2815 +//line sql.y:2803 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12339,7 +12327,7 @@ yydefault: case 489: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2819 +//line sql.y:2807 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -12347,7 +12335,7 @@ yydefault: case 490: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2823 +//line sql.y:2811 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -12355,7 +12343,7 @@ yydefault: case 491: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2827 +//line sql.y:2815 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: (yyDollar[3].identifierCI.String() + yyDollar[4].str)} } @@ -12363,63 +12351,63 @@ yydefault: case 492: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2831 +//line sql.y:2819 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Tables: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL case 493: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2836 +//line sql.y:2824 { yyVAL.str = "" } case 494: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2840 +//line sql.y:2828 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 495: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2844 +//line sql.y:2832 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 505: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2863 +//line sql.y:2851 { yyVAL.str = String(TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}) } case 506: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2867 +//line sql.y:2855 { yyVAL.str = yyDollar[1].identifierCI.String() } case 507: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2871 +//line sql.y:2859 { yyVAL.str = encodeSQLString(yyDollar[1].str) } case 508: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2875 +//line sql.y:2863 { yyVAL.str = string(yyDollar[1].str) } case 509: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2880 +//line sql.y:2868 { yyVAL.str = "" } case 511: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2886 +//line sql.y:2874 { yyLOCAL = false } @@ -12427,7 +12415,7 @@ yydefault: case 512: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2890 +//line sql.y:2878 { yyLOCAL = true } @@ -12435,7 +12423,7 @@ yydefault: case 513: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColName -//line sql.y:2895 +//line sql.y:2883 { yyLOCAL = nil } @@ -12443,27 +12431,27 @@ yydefault: case 514: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColName -//line sql.y:2899 +//line sql.y:2887 { yyLOCAL = yyDollar[2].colNameUnion() } yyVAL.union = yyLOCAL case 515: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2904 +//line sql.y:2892 { yyVAL.str = "" } case 516: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2908 +//line sql.y:2896 { yyVAL.str = string(yyDollar[2].str) } case 517: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Literal -//line sql.y:2913 +//line sql.y:2901 { yyLOCAL = nil } @@ -12471,7 +12459,7 @@ yydefault: case 518: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2917 +//line sql.y:2905 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } @@ -12479,7 +12467,7 @@ yydefault: case 519: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2921 +//line sql.y:2909 { yyLOCAL = NewDecimalLiteral(yyDollar[2].str) } @@ -12487,7 +12475,7 @@ yydefault: case 520: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2926 +//line sql.y:2914 { yyLOCAL = nil } @@ -12495,14 +12483,14 @@ yydefault: case 521: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2930 +//line sql.y:2918 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL case 522: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2934 +//line sql.y:2922 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &OrderByOption{Cols: yyDollar[5].columnsUnion()}) @@ -12510,14 +12498,14 @@ yydefault: case 523: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2938 +//line sql.y:2926 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL case 524: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2942 +//line sql.y:2930 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionsUnion()...) @@ -12525,7 +12513,7 @@ yydefault: case 525: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2946 +//line sql.y:2934 { yyLOCAL = append(append(yyDollar[1].alterOptionsUnion(), yyDollar[3].alterOptionsUnion()...), &OrderByOption{Cols: yyDollar[7].columnsUnion()}) } @@ -12533,21 +12521,21 @@ yydefault: case 526: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2952 +//line sql.y:2940 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 527: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2956 +//line sql.y:2944 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } case 528: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2960 +//line sql.y:2948 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) @@ -12555,7 +12543,7 @@ yydefault: case 529: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2966 +//line sql.y:2954 { yyLOCAL = yyDollar[1].tableOptionsUnion() } @@ -12563,7 +12551,7 @@ yydefault: case 530: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2970 +//line sql.y:2958 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } @@ -12571,7 +12559,7 @@ yydefault: case 531: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2974 +//line sql.y:2962 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } @@ -12579,7 +12567,7 @@ yydefault: case 532: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2978 +//line sql.y:2966 { yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} } @@ -12587,7 +12575,7 @@ yydefault: case 533: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2982 +//line sql.y:2970 { yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} } @@ -12595,7 +12583,7 @@ yydefault: case 534: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2986 +//line sql.y:2974 { yyLOCAL = &AddColumns{Columns: []*ColumnDefinition{yyDollar[3].columnDefinitionUnion()}, First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } @@ -12603,7 +12591,7 @@ yydefault: case 535: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2990 +//line sql.y:2978 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} } @@ -12611,7 +12599,7 @@ yydefault: case 536: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2994 +//line sql.y:2982 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion()} } @@ -12619,7 +12607,7 @@ yydefault: case 537: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2998 +//line sql.y:2986 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[7].exprUnion()} } @@ -12627,7 +12615,7 @@ yydefault: case 538: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3002 +//line sql.y:2990 { val := false yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: &val} @@ -12636,7 +12624,7 @@ yydefault: case 539: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3007 +//line sql.y:2995 { val := true yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: &val} @@ -12645,7 +12633,7 @@ yydefault: case 540: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3012 +//line sql.y:3000 { yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} } @@ -12653,7 +12641,7 @@ yydefault: case 541: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3016 +//line sql.y:3004 { yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} } @@ -12661,7 +12649,7 @@ yydefault: case 542: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3020 +//line sql.y:3008 { yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: true} } @@ -12669,7 +12657,7 @@ yydefault: case 543: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3024 +//line sql.y:3012 { yyLOCAL = &ChangeColumn{OldColumn: yyDollar[3].colNameUnion(), NewColDefinition: yyDollar[4].columnDefinitionUnion(), First: yyDollar[5].booleanUnion(), After: yyDollar[6].colNameUnion()} } @@ -12677,7 +12665,7 @@ yydefault: case 544: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3028 +//line sql.y:3016 { yyLOCAL = &ModifyColumn{NewColDefinition: yyDollar[3].columnDefinitionUnion(), First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } @@ -12685,7 +12673,7 @@ yydefault: case 545: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3032 +//line sql.y:3020 { yyLOCAL = &RenameColumn{OldName: yyDollar[3].colNameUnion(), NewName: yyDollar[5].colNameUnion()} } @@ -12693,7 +12681,7 @@ yydefault: case 546: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3036 +//line sql.y:3024 { yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} } @@ -12701,7 +12689,7 @@ yydefault: case 547: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3040 +//line sql.y:3028 { yyLOCAL = &KeyState{Enable: false} } @@ -12709,7 +12697,7 @@ yydefault: case 548: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3044 +//line sql.y:3032 { yyLOCAL = &KeyState{Enable: true} } @@ -12717,7 +12705,7 @@ yydefault: case 549: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3048 +//line sql.y:3036 { yyLOCAL = &TablespaceOperation{Import: false} } @@ -12725,7 +12713,7 @@ yydefault: case 550: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3052 +//line sql.y:3040 { yyLOCAL = &TablespaceOperation{Import: true} } @@ -12733,7 +12721,7 @@ yydefault: case 551: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3056 +//line sql.y:3044 { yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} } @@ -12741,7 +12729,7 @@ yydefault: case 552: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3060 +//line sql.y:3048 { yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} } @@ -12749,7 +12737,7 @@ yydefault: case 553: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3064 +//line sql.y:3052 { yyLOCAL = &DropKey{Type: PrimaryKeyType} } @@ -12757,7 +12745,7 @@ yydefault: case 554: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3068 +//line sql.y:3056 { yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} } @@ -12765,7 +12753,7 @@ yydefault: case 555: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3072 +//line sql.y:3060 { yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } @@ -12773,7 +12761,7 @@ yydefault: case 556: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3076 +//line sql.y:3064 { yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } @@ -12781,7 +12769,7 @@ yydefault: case 557: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3080 +//line sql.y:3068 { yyLOCAL = &Force{} } @@ -12789,7 +12777,7 @@ yydefault: case 558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3084 +//line sql.y:3072 { yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} } @@ -12797,7 +12785,7 @@ yydefault: case 559: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3088 +//line sql.y:3076 { yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} } @@ -12805,14 +12793,14 @@ yydefault: case 560: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:3094 +//line sql.y:3082 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 561: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3098 +//line sql.y:3086 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) @@ -12820,7 +12808,7 @@ yydefault: case 562: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3104 +//line sql.y:3092 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -12828,7 +12816,7 @@ yydefault: case 563: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3108 +//line sql.y:3096 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -12836,7 +12824,7 @@ yydefault: case 564: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3112 +//line sql.y:3100 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -12844,7 +12832,7 @@ yydefault: case 565: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3116 +//line sql.y:3104 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -12852,7 +12840,7 @@ yydefault: case 566: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3120 +//line sql.y:3108 { yyLOCAL = &LockOption{Type: DefaultType} } @@ -12860,7 +12848,7 @@ yydefault: case 567: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3124 +//line sql.y:3112 { yyLOCAL = &LockOption{Type: NoneType} } @@ -12868,7 +12856,7 @@ yydefault: case 568: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3128 +//line sql.y:3116 { yyLOCAL = &LockOption{Type: SharedType} } @@ -12876,7 +12864,7 @@ yydefault: case 569: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3132 +//line sql.y:3120 { yyLOCAL = &LockOption{Type: ExclusiveType} } @@ -12884,7 +12872,7 @@ yydefault: case 570: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3136 +//line sql.y:3124 { yyLOCAL = &Validation{With: true} } @@ -12892,7 +12880,7 @@ yydefault: case 571: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3140 +//line sql.y:3128 { yyLOCAL = &Validation{With: false} } @@ -12900,7 +12888,7 @@ yydefault: case 572: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3146 +//line sql.y:3134 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12911,7 +12899,7 @@ yydefault: case 573: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3153 +//line sql.y:3141 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12922,7 +12910,7 @@ yydefault: case 574: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3160 +//line sql.y:3148 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12933,7 +12921,7 @@ yydefault: case 575: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3167 +//line sql.y:3155 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().PartitionSpec = yyDollar[2].partSpecUnion() @@ -12943,7 +12931,7 @@ yydefault: case 576: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:3173 +//line sql.y:3161 { 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} } @@ -12951,7 +12939,7 @@ yydefault: case 577: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3183 +//line sql.y:3171 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -12962,7 +12950,7 @@ yydefault: case 578: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3190 +//line sql.y:3178 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -12973,7 +12961,7 @@ yydefault: case 579: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3197 +//line sql.y:3185 { yyLOCAL = &AlterVschema{ Action: CreateVindexDDLAction, @@ -12989,7 +12977,7 @@ yydefault: case 580: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3209 +//line sql.y:3197 { yyLOCAL = &AlterVschema{ Action: DropVindexDDLAction, @@ -13003,7 +12991,7 @@ yydefault: case 581: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3219 +//line sql.y:3207 { yyLOCAL = &AlterVschema{Action: AddVschemaTableDDLAction, Table: yyDollar[6].tableName} } @@ -13011,7 +12999,7 @@ yydefault: case 582: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3223 +//line sql.y:3211 { yyLOCAL = &AlterVschema{Action: DropVschemaTableDDLAction, Table: yyDollar[6].tableName} } @@ -13019,7 +13007,7 @@ yydefault: case 583: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL Statement -//line sql.y:3227 +//line sql.y:3215 { yyLOCAL = &AlterVschema{ Action: AddColVindexDDLAction, @@ -13036,7 +13024,7 @@ yydefault: case 584: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3240 +//line sql.y:3228 { yyLOCAL = &AlterVschema{ Action: DropColVindexDDLAction, @@ -13050,7 +13038,7 @@ yydefault: case 585: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3250 +//line sql.y:3238 { yyLOCAL = &AlterVschema{Action: AddSequenceDDLAction, Table: yyDollar[6].tableName} } @@ -13058,7 +13046,7 @@ yydefault: case 586: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:3254 +//line sql.y:3242 { yyLOCAL = &AlterVschema{ Action: AddAutoIncDDLAction, @@ -13073,7 +13061,7 @@ yydefault: case 587: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3265 +//line sql.y:3253 { yyLOCAL = &AlterMigration{ Type: RetryMigrationType, @@ -13084,7 +13072,7 @@ yydefault: case 588: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3272 +//line sql.y:3260 { yyLOCAL = &AlterMigration{ Type: CleanupMigrationType, @@ -13095,7 +13083,7 @@ yydefault: case 589: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3279 +//line sql.y:3267 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -13106,7 +13094,7 @@ yydefault: case 590: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3286 +//line sql.y:3274 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -13118,7 +13106,7 @@ yydefault: case 591: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3294 +//line sql.y:3282 { yyLOCAL = &AlterMigration{ Type: LaunchAllMigrationType, @@ -13128,7 +13116,7 @@ yydefault: case 592: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3300 +//line sql.y:3288 { yyLOCAL = &AlterMigration{ Type: CompleteMigrationType, @@ -13139,7 +13127,7 @@ yydefault: case 593: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3307 +//line sql.y:3295 { yyLOCAL = &AlterMigration{ Type: CompleteAllMigrationType, @@ -13149,7 +13137,7 @@ yydefault: case 594: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3313 +//line sql.y:3301 { yyLOCAL = &AlterMigration{ Type: CancelMigrationType, @@ -13160,7 +13148,7 @@ yydefault: case 595: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3320 +//line sql.y:3308 { yyLOCAL = &AlterMigration{ Type: CancelAllMigrationType, @@ -13170,7 +13158,7 @@ yydefault: case 596: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3326 +//line sql.y:3314 { yyLOCAL = &AlterMigration{ Type: ThrottleMigrationType, @@ -13183,7 +13171,7 @@ yydefault: case 597: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3335 +//line sql.y:3323 { yyLOCAL = &AlterMigration{ Type: ThrottleAllMigrationType, @@ -13195,7 +13183,7 @@ yydefault: case 598: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3343 +//line sql.y:3331 { yyLOCAL = &AlterMigration{ Type: UnthrottleMigrationType, @@ -13206,7 +13194,7 @@ yydefault: case 599: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3350 +//line sql.y:3338 { yyLOCAL = &AlterMigration{ Type: UnthrottleAllMigrationType, @@ -13216,7 +13204,7 @@ yydefault: case 600: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3357 +//line sql.y:3345 { yyLOCAL = nil } @@ -13224,7 +13212,7 @@ yydefault: case 601: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3361 +//line sql.y:3349 { yyDollar[3].partitionOptionUnion().Partitions = yyDollar[4].integerUnion() yyDollar[3].partitionOptionUnion().SubPartition = yyDollar[5].subPartitionUnion() @@ -13235,7 +13223,7 @@ yydefault: case 602: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3370 +//line sql.y:3358 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -13247,7 +13235,7 @@ yydefault: case 603: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3378 +//line sql.y:3366 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -13260,7 +13248,7 @@ yydefault: case 604: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3387 +//line sql.y:3375 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -13271,7 +13259,7 @@ yydefault: case 605: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3394 +//line sql.y:3382 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -13282,7 +13270,7 @@ yydefault: case 606: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3402 +//line sql.y:3390 { yyLOCAL = nil } @@ -13290,7 +13278,7 @@ yydefault: case 607: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3406 +//line sql.y:3394 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -13303,7 +13291,7 @@ yydefault: case 608: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3415 +//line sql.y:3403 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -13317,7 +13305,7 @@ yydefault: case 609: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3426 +//line sql.y:3414 { yyLOCAL = nil } @@ -13325,7 +13313,7 @@ yydefault: case 610: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3430 +//line sql.y:3418 { yyLOCAL = yyDollar[2].partDefsUnion() } @@ -13333,7 +13321,7 @@ yydefault: case 611: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3435 +//line sql.y:3423 { yyLOCAL = false } @@ -13341,7 +13329,7 @@ yydefault: case 612: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3439 +//line sql.y:3427 { yyLOCAL = true } @@ -13349,7 +13337,7 @@ yydefault: case 613: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3444 +//line sql.y:3432 { yyLOCAL = 0 } @@ -13357,7 +13345,7 @@ yydefault: case 614: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3448 +//line sql.y:3436 { yyLOCAL = convertStringToInt(yyDollar[3].str) } @@ -13365,7 +13353,7 @@ yydefault: case 615: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL TableExpr -//line sql.y:3454 +//line sql.y:3442 { yyLOCAL = &JSONTableExpr{Expr: yyDollar[3].exprUnion(), Filter: yyDollar[5].exprUnion(), Columns: yyDollar[6].jtColumnListUnion(), Alias: yyDollar[8].identifierCS} } @@ -13373,7 +13361,7 @@ yydefault: case 616: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3460 +//line sql.y:3448 { yyLOCAL = yyDollar[3].jtColumnListUnion() } @@ -13381,14 +13369,14 @@ yydefault: case 617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3466 +//line sql.y:3454 { yyLOCAL = []*JtColumnDefinition{yyDollar[1].jtColumnDefinitionUnion()} } yyVAL.union = yyLOCAL case 618: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3470 +//line sql.y:3458 { yySLICE := (*[]*JtColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jtColumnDefinitionUnion()) @@ -13396,7 +13384,7 @@ yydefault: case 619: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3476 +//line sql.y:3464 { yyLOCAL = &JtColumnDefinition{JtOrdinal: &JtOrdinalColDef{Name: yyDollar[1].identifierCI}} } @@ -13404,7 +13392,7 @@ yydefault: case 620: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3480 +//line sql.y:3468 { 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()} @@ -13414,7 +13402,7 @@ yydefault: case 621: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3486 +//line sql.y:3474 { 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()} @@ -13424,7 +13412,7 @@ yydefault: case 622: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3492 +//line sql.y:3480 { 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()} @@ -13434,7 +13422,7 @@ yydefault: case 623: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3498 +//line sql.y:3486 { 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()} @@ -13444,7 +13432,7 @@ yydefault: case 624: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3504 +//line sql.y:3492 { jtNestedPath := &JtNestedPathColDef{Path: yyDollar[3].exprUnion(), Columns: yyDollar[4].jtColumnListUnion()} yyLOCAL = &JtColumnDefinition{JtNestedPath: jtNestedPath} @@ -13453,7 +13441,7 @@ yydefault: case 625: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3510 +//line sql.y:3498 { yyLOCAL = false } @@ -13461,7 +13449,7 @@ yydefault: case 626: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3514 +//line sql.y:3502 { yyLOCAL = true } @@ -13469,7 +13457,7 @@ yydefault: case 627: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3518 +//line sql.y:3506 { yyLOCAL = false } @@ -13477,7 +13465,7 @@ yydefault: case 628: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3522 +//line sql.y:3510 { yyLOCAL = true } @@ -13485,7 +13473,7 @@ yydefault: case 629: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3528 +//line sql.y:3516 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } @@ -13493,7 +13481,7 @@ yydefault: case 630: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3534 +//line sql.y:3522 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } @@ -13501,7 +13489,7 @@ yydefault: case 631: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3540 +//line sql.y:3528 { yyLOCAL = &JtOnResponse{ResponseType: ErrorJSONType} } @@ -13509,7 +13497,7 @@ yydefault: case 632: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3544 +//line sql.y:3532 { yyLOCAL = &JtOnResponse{ResponseType: NullJSONType} } @@ -13517,7 +13505,7 @@ yydefault: case 633: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3548 +//line sql.y:3536 { yyLOCAL = &JtOnResponse{ResponseType: DefaultJSONType, Expr: yyDollar[2].exprUnion()} } @@ -13525,7 +13513,7 @@ yydefault: case 634: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3554 +//line sql.y:3542 { yyLOCAL = RangeType } @@ -13533,7 +13521,7 @@ yydefault: case 635: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3558 +//line sql.y:3546 { yyLOCAL = ListType } @@ -13541,7 +13529,7 @@ yydefault: case 636: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3563 +//line sql.y:3551 { yyLOCAL = -1 } @@ -13549,7 +13537,7 @@ yydefault: case 637: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3567 +//line sql.y:3555 { yyLOCAL = convertStringToInt(yyDollar[2].str) } @@ -13557,7 +13545,7 @@ yydefault: case 638: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3572 +//line sql.y:3560 { yyLOCAL = -1 } @@ -13565,7 +13553,7 @@ yydefault: case 639: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3576 +//line sql.y:3564 { yyLOCAL = convertStringToInt(yyDollar[2].str) } @@ -13573,7 +13561,7 @@ yydefault: case 640: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3582 +//line sql.y:3570 { yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} } @@ -13581,7 +13569,7 @@ yydefault: case 641: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3586 +//line sql.y:3574 { yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} } @@ -13589,7 +13577,7 @@ yydefault: case 642: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3590 +//line sql.y:3578 { yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} } @@ -13597,7 +13585,7 @@ yydefault: case 643: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3594 +//line sql.y:3582 { yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} } @@ -13605,7 +13593,7 @@ yydefault: case 644: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3598 +//line sql.y:3586 { yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} } @@ -13613,7 +13601,7 @@ yydefault: case 645: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3602 +//line sql.y:3590 { yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} } @@ -13621,7 +13609,7 @@ yydefault: case 646: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3606 +//line sql.y:3594 { yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} } @@ -13629,7 +13617,7 @@ yydefault: case 647: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3610 +//line sql.y:3598 { yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} } @@ -13637,7 +13625,7 @@ yydefault: case 648: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3614 +//line sql.y:3602 { yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} } @@ -13645,7 +13633,7 @@ yydefault: case 649: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3618 +//line sql.y:3606 { yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} } @@ -13653,7 +13641,7 @@ yydefault: case 650: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3622 +//line sql.y:3610 { yyLOCAL = &PartitionSpec{Action: ExchangeAction, Names: Partitions{yyDollar[3].identifierCI}, TableName: yyDollar[6].tableName, WithoutValidation: yyDollar[7].booleanUnion()} } @@ -13661,7 +13649,7 @@ yydefault: case 651: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3626 +//line sql.y:3614 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} } @@ -13669,7 +13657,7 @@ yydefault: case 652: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3630 +//line sql.y:3618 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} } @@ -13677,7 +13665,7 @@ yydefault: case 653: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3634 +//line sql.y:3622 { yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} } @@ -13685,7 +13673,7 @@ yydefault: case 654: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3638 +//line sql.y:3626 { yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} } @@ -13693,7 +13681,7 @@ yydefault: case 655: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3642 +//line sql.y:3630 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} } @@ -13701,7 +13689,7 @@ yydefault: case 656: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3646 +//line sql.y:3634 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} } @@ -13709,7 +13697,7 @@ yydefault: case 657: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3650 +//line sql.y:3638 { yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} } @@ -13717,7 +13705,7 @@ yydefault: case 658: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3654 +//line sql.y:3642 { yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} } @@ -13725,7 +13713,7 @@ yydefault: case 659: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3658 +//line sql.y:3646 { yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} } @@ -13733,7 +13721,7 @@ yydefault: case 660: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3662 +//line sql.y:3650 { yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} } @@ -13741,7 +13729,7 @@ yydefault: case 661: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3666 +//line sql.y:3654 { yyLOCAL = &PartitionSpec{Action: UpgradeAction} } @@ -13749,7 +13737,7 @@ yydefault: case 662: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3671 +//line sql.y:3659 { yyLOCAL = false } @@ -13757,7 +13745,7 @@ yydefault: case 663: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3675 +//line sql.y:3663 { yyLOCAL = false } @@ -13765,7 +13753,7 @@ yydefault: case 664: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3679 +//line sql.y:3667 { yyLOCAL = true } @@ -13773,28 +13761,28 @@ yydefault: case 665: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3685 +//line sql.y:3673 { yyLOCAL = []*PartitionDefinition{yyDollar[1].partDefUnion()} } yyVAL.union = yyLOCAL case 666: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3689 +//line sql.y:3677 { yySLICE := (*[]*PartitionDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].partDefUnion()) } case 667: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3695 +//line sql.y:3683 { yyVAL.partDefUnion().Options = yyDollar[2].partitionDefinitionOptionsUnion() } case 668: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3700 +//line sql.y:3688 { yyLOCAL = &PartitionDefinitionOptions{} } @@ -13802,7 +13790,7 @@ yydefault: case 669: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3704 +//line sql.y:3692 { yyDollar[1].partitionDefinitionOptionsUnion().ValueRange = yyDollar[2].partitionValueRangeUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -13811,7 +13799,7 @@ yydefault: case 670: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3709 +//line sql.y:3697 { yyDollar[1].partitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -13820,7 +13808,7 @@ yydefault: case 671: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3714 +//line sql.y:3702 { yyDollar[1].partitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -13829,7 +13817,7 @@ yydefault: case 672: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3719 +//line sql.y:3707 { yyDollar[1].partitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -13838,7 +13826,7 @@ yydefault: case 673: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3724 +//line sql.y:3712 { yyDollar[1].partitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -13847,7 +13835,7 @@ yydefault: case 674: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3729 +//line sql.y:3717 { val := yyDollar[2].integerUnion() yyDollar[1].partitionDefinitionOptionsUnion().MaxRows = &val @@ -13857,7 +13845,7 @@ yydefault: case 675: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3735 +//line sql.y:3723 { val := yyDollar[2].integerUnion() yyDollar[1].partitionDefinitionOptionsUnion().MinRows = &val @@ -13867,7 +13855,7 @@ yydefault: case 676: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3741 +//line sql.y:3729 { yyDollar[1].partitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -13876,7 +13864,7 @@ yydefault: case 677: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3746 +//line sql.y:3734 { yyDollar[1].partitionDefinitionOptionsUnion().SubPartitionDefinitions = yyDollar[2].subPartitionDefinitionsUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -13885,7 +13873,7 @@ yydefault: case 678: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3752 +//line sql.y:3740 { yyLOCAL = yyDollar[2].subPartitionDefinitionsUnion() } @@ -13893,14 +13881,14 @@ yydefault: case 679: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3758 +//line sql.y:3746 { yyLOCAL = SubPartitionDefinitions{yyDollar[1].subPartitionDefinitionUnion()} } yyVAL.union = yyLOCAL case 680: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3762 +//line sql.y:3750 { yySLICE := (*SubPartitionDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].subPartitionDefinitionUnion()) @@ -13908,7 +13896,7 @@ yydefault: case 681: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SubPartitionDefinition -//line sql.y:3768 +//line sql.y:3756 { yyLOCAL = &SubPartitionDefinition{Name: yyDollar[2].identifierCI, Options: yyDollar[3].subPartitionDefinitionOptionsUnion()} } @@ -13916,7 +13904,7 @@ yydefault: case 682: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3773 +//line sql.y:3761 { yyLOCAL = &SubPartitionDefinitionOptions{} } @@ -13924,7 +13912,7 @@ yydefault: case 683: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3777 +//line sql.y:3765 { yyDollar[1].subPartitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -13933,7 +13921,7 @@ yydefault: case 684: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3782 +//line sql.y:3770 { yyDollar[1].subPartitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -13942,7 +13930,7 @@ yydefault: case 685: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3787 +//line sql.y:3775 { yyDollar[1].subPartitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -13951,7 +13939,7 @@ yydefault: case 686: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3792 +//line sql.y:3780 { yyDollar[1].subPartitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -13960,7 +13948,7 @@ yydefault: case 687: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3797 +//line sql.y:3785 { val := yyDollar[2].integerUnion() yyDollar[1].subPartitionDefinitionOptionsUnion().MaxRows = &val @@ -13970,7 +13958,7 @@ yydefault: case 688: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3803 +//line sql.y:3791 { val := yyDollar[2].integerUnion() yyDollar[1].subPartitionDefinitionOptionsUnion().MinRows = &val @@ -13980,7 +13968,7 @@ yydefault: case 689: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3809 +//line sql.y:3797 { yyDollar[1].subPartitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -13989,7 +13977,7 @@ yydefault: case 690: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3816 +//line sql.y:3804 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -14000,7 +13988,7 @@ yydefault: case 691: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3823 +//line sql.y:3811 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -14011,7 +13999,7 @@ yydefault: case 692: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3830 +//line sql.y:3818 { yyLOCAL = &PartitionValueRange{ Type: InType, @@ -14022,7 +14010,7 @@ yydefault: case 693: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3838 +//line sql.y:3826 { yyLOCAL = false } @@ -14030,7 +14018,7 @@ yydefault: case 694: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3842 +//line sql.y:3830 { yyLOCAL = true } @@ -14038,7 +14026,7 @@ yydefault: case 695: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionEngine -//line sql.y:3848 +//line sql.y:3836 { yyLOCAL = &PartitionEngine{Storage: yyDollar[1].booleanUnion(), Name: yyDollar[4].identifierCS.String()} } @@ -14046,7 +14034,7 @@ yydefault: case 696: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Literal -//line sql.y:3854 +//line sql.y:3842 { yyLOCAL = NewStrLiteral(yyDollar[3].str) } @@ -14054,7 +14042,7 @@ yydefault: case 697: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3860 +//line sql.y:3848 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } @@ -14062,7 +14050,7 @@ yydefault: case 698: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3866 +//line sql.y:3854 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } @@ -14070,7 +14058,7 @@ yydefault: case 699: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3872 +//line sql.y:3860 { yyLOCAL = convertStringToInt(yyDollar[3].str) } @@ -14078,41 +14066,41 @@ yydefault: case 700: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3878 +//line sql.y:3866 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL case 701: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3884 +//line sql.y:3872 { yyVAL.str = yyDollar[3].identifierCS.String() } case 702: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinition -//line sql.y:3890 +//line sql.y:3878 { yyLOCAL = &PartitionDefinition{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL case 703: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3896 +//line sql.y:3884 { yyVAL.str = "" } case 704: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3900 +//line sql.y:3888 { yyVAL.str = "" } case 705: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3906 +//line sql.y:3894 { yyLOCAL = &RenameTable{TablePairs: yyDollar[3].renameTablePairsUnion()} } @@ -14120,14 +14108,14 @@ yydefault: case 706: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*RenameTablePair -//line sql.y:3912 +//line sql.y:3900 { yyLOCAL = []*RenameTablePair{{FromTable: yyDollar[1].tableName, ToTable: yyDollar[3].tableName}} } yyVAL.union = yyLOCAL case 707: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3916 +//line sql.y:3904 { yySLICE := (*[]*RenameTablePair)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &RenameTablePair{FromTable: yyDollar[3].tableName, ToTable: yyDollar[5].tableName}) @@ -14135,7 +14123,7 @@ yydefault: case 708: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3922 +//line sql.y:3910 { yyLOCAL = &DropTable{FromTables: yyDollar[6].tableNamesUnion(), IfExists: yyDollar[5].booleanUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Temp: yyDollar[3].booleanUnion()} } @@ -14143,7 +14131,7 @@ yydefault: case 709: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3926 +//line sql.y:3914 { // Change this to an alter statement if yyDollar[4].identifierCI.Lowered() == "primary" { @@ -14156,7 +14144,7 @@ yydefault: case 710: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3935 +//line sql.y:3923 { yyLOCAL = &DropView{FromTables: yyDollar[5].tableNamesUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), IfExists: yyDollar[4].booleanUnion()} } @@ -14164,7 +14152,7 @@ yydefault: case 711: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3939 +//line sql.y:3927 { yyLOCAL = &DropDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfExists: yyDollar[4].booleanUnion()} } @@ -14172,7 +14160,7 @@ yydefault: case 712: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3945 +//line sql.y:3933 { yyLOCAL = &TruncateTable{Table: yyDollar[3].tableName} } @@ -14180,7 +14168,7 @@ yydefault: case 713: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3949 +//line sql.y:3937 { yyLOCAL = &TruncateTable{Table: yyDollar[2].tableName} } @@ -14188,7 +14176,7 @@ yydefault: case 714: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3955 +//line sql.y:3943 { yyLOCAL = &OtherRead{} } @@ -14196,7 +14184,7 @@ yydefault: case 715: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3961 +//line sql.y:3949 { yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} } @@ -14204,7 +14192,7 @@ yydefault: case 716: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3965 +//line sql.y:3953 { yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} } @@ -14212,7 +14200,7 @@ yydefault: case 717: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3969 +//line sql.y:3957 { yyLOCAL = &Show{&ShowBasic{Full: yyDollar[2].booleanUnion(), Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } @@ -14220,7 +14208,7 @@ yydefault: case 718: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3973 +//line sql.y:3961 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } @@ -14228,7 +14216,7 @@ yydefault: case 719: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3977 +//line sql.y:3965 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } @@ -14236,7 +14224,7 @@ yydefault: case 720: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3981 +//line sql.y:3969 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } @@ -14244,7 +14232,7 @@ yydefault: case 721: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3985 +//line sql.y:3973 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } @@ -14252,7 +14240,7 @@ yydefault: case 722: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3989 +//line sql.y:3977 { yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} } @@ -14260,7 +14248,7 @@ yydefault: case 723: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3993 +//line sql.y:3981 { yyLOCAL = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } @@ -14268,7 +14256,7 @@ yydefault: case 724: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3997 +//line sql.y:3985 { yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } @@ -14276,7 +14264,7 @@ yydefault: case 725: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4001 +//line sql.y:3989 { yyLOCAL = &Show{&ShowBasic{Command: Privilege}} } @@ -14284,7 +14272,7 @@ yydefault: case 726: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4005 +//line sql.y:3993 { yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} } @@ -14292,7 +14280,7 @@ yydefault: case 727: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4009 +//line sql.y:3997 { yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} } @@ -14300,7 +14288,7 @@ yydefault: case 728: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4013 +//line sql.y:4001 { yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} } @@ -14308,7 +14296,7 @@ yydefault: case 729: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4017 +//line sql.y:4005 { yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} } @@ -14316,7 +14304,7 @@ yydefault: case 730: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4021 +//line sql.y:4009 { yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} } @@ -14324,7 +14312,7 @@ yydefault: case 731: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4025 +//line sql.y:4013 { yyLOCAL = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } @@ -14332,7 +14320,7 @@ yydefault: case 732: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4029 +//line sql.y:4017 { yyLOCAL = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].booleanUnion(), DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } @@ -14340,7 +14328,7 @@ yydefault: case 733: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4033 +//line sql.y:4021 { yyLOCAL = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].identifierCS, Filter: yyDollar[4].showFilterUnion()}} } @@ -14348,7 +14336,7 @@ yydefault: case 734: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4037 +//line sql.y:4025 { yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} } @@ -14356,7 +14344,7 @@ yydefault: case 735: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4041 +//line sql.y:4029 { yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} } @@ -14364,7 +14352,7 @@ yydefault: case 736: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4045 +//line sql.y:4033 { yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} } @@ -14372,7 +14360,7 @@ yydefault: case 737: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4049 +//line sql.y:4037 { yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} } @@ -14380,7 +14368,7 @@ yydefault: case 738: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4053 +//line sql.y:4041 { yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} } @@ -14388,7 +14376,7 @@ yydefault: case 739: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4057 +//line sql.y:4045 { yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} } @@ -14396,7 +14384,7 @@ yydefault: case 740: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4061 +//line sql.y:4049 { yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} } @@ -14404,7 +14392,7 @@ yydefault: case 741: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4065 +//line sql.y:4053 { yyLOCAL = &Show{&ShowBasic{Command: Engines}} } @@ -14412,7 +14400,7 @@ yydefault: case 742: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4069 +//line sql.y:4057 { yyLOCAL = &Show{&ShowBasic{Command: Plugins}} } @@ -14420,7 +14408,7 @@ yydefault: case 743: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4073 +//line sql.y:4061 { yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} } @@ -14428,7 +14416,7 @@ yydefault: case 744: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4077 +//line sql.y:4065 { yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} } @@ -14436,7 +14424,7 @@ yydefault: case 745: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4081 +//line sql.y:4069 { yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} } @@ -14444,7 +14432,7 @@ yydefault: case 746: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4085 +//line sql.y:4073 { yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].identifierCS}} } @@ -14452,7 +14440,7 @@ yydefault: case 747: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4089 +//line sql.y:4077 { yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} } @@ -14460,7 +14448,7 @@ yydefault: case 748: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4093 +//line sql.y:4081 { yyLOCAL = &ShowThrottledApps{} } @@ -14468,7 +14456,7 @@ yydefault: case 749: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4097 +//line sql.y:4085 { yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} } @@ -14476,7 +14464,7 @@ yydefault: case 750: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4101 +//line sql.y:4089 { yyLOCAL = &ShowThrottlerStatus{} } @@ -14484,7 +14472,7 @@ yydefault: case 751: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4105 +//line sql.y:4093 { yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} } @@ -14492,7 +14480,7 @@ yydefault: case 752: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4109 +//line sql.y:4097 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} } @@ -14500,7 +14488,7 @@ yydefault: case 753: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4113 +//line sql.y:4101 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} } @@ -14508,7 +14496,7 @@ yydefault: case 754: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4117 +//line sql.y:4105 { yyLOCAL = &Show{&ShowBasic{Command: Warnings}} } @@ -14516,7 +14504,7 @@ yydefault: case 755: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4121 +//line sql.y:4109 { yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} } @@ -14524,7 +14512,7 @@ yydefault: case 756: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4125 +//line sql.y:4113 { yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} } @@ -14532,7 +14520,7 @@ yydefault: case 757: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4129 +//line sql.y:4117 { yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} } @@ -14540,7 +14528,7 @@ yydefault: case 758: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4136 +//line sql.y:4124 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} } @@ -14548,7 +14536,7 @@ yydefault: case 759: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4140 +//line sql.y:4128 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } @@ -14556,7 +14544,7 @@ yydefault: case 760: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4144 +//line sql.y:4132 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} } @@ -14564,7 +14552,7 @@ yydefault: case 761: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4148 +//line sql.y:4136 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } @@ -14572,7 +14560,7 @@ yydefault: case 762: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4152 +//line sql.y:4140 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } @@ -14580,7 +14568,7 @@ yydefault: case 763: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4156 +//line sql.y:4144 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } @@ -14588,7 +14576,7 @@ yydefault: case 764: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4160 +//line sql.y:4148 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } @@ -14596,7 +14584,7 @@ yydefault: case 765: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4164 +//line sql.y:4152 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} } @@ -14604,27 +14592,27 @@ yydefault: case 766: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4168 +//line sql.y:4156 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL case 767: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4174 +//line sql.y:4162 { yyVAL.str = "" } case 768: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4178 +//line sql.y:4166 { yyVAL.str = "extended " } case 769: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4184 +//line sql.y:4172 { yyLOCAL = false } @@ -14632,45 +14620,45 @@ yydefault: case 770: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4188 +//line sql.y:4176 { yyLOCAL = true } yyVAL.union = yyLOCAL case 771: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4194 +//line sql.y:4182 { yyVAL.str = string(yyDollar[1].str) } case 772: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4198 +//line sql.y:4186 { yyVAL.str = string(yyDollar[1].str) } case 773: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4204 +//line sql.y:4192 { yyVAL.identifierCS = NewIdentifierCS("") } case 774: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4208 +//line sql.y:4196 { yyVAL.identifierCS = yyDollar[2].identifierCS } case 775: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4212 +//line sql.y:4200 { yyVAL.identifierCS = yyDollar[2].identifierCS } case 776: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4218 +//line sql.y:4206 { yyLOCAL = nil } @@ -14678,7 +14666,7 @@ yydefault: case 777: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4222 +//line sql.y:4210 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } @@ -14686,7 +14674,7 @@ yydefault: case 778: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4226 +//line sql.y:4214 { yyLOCAL = &ShowFilter{Filter: yyDollar[2].exprUnion()} } @@ -14694,7 +14682,7 @@ yydefault: case 779: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4232 +//line sql.y:4220 { yyLOCAL = nil } @@ -14702,45 +14690,45 @@ yydefault: case 780: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4236 +//line sql.y:4224 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL case 781: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4242 +//line sql.y:4230 { yyVAL.empty = struct{}{} } case 782: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4246 +//line sql.y:4234 { yyVAL.empty = struct{}{} } case 783: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4250 +//line sql.y:4238 { yyVAL.empty = struct{}{} } case 784: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4256 +//line sql.y:4244 { yyVAL.str = string(yyDollar[1].str) } case 785: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4260 +//line sql.y:4248 { yyVAL.str = string(yyDollar[1].str) } case 786: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4266 +//line sql.y:4254 { yyLOCAL = &Use{DBName: yyDollar[2].identifierCS} } @@ -14748,7 +14736,7 @@ yydefault: case 787: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4270 +//line sql.y:4258 { yyLOCAL = &Use{DBName: IdentifierCS{v: ""}} } @@ -14756,39 +14744,39 @@ yydefault: case 788: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4274 +//line sql.y:4262 { yyLOCAL = &Use{DBName: NewIdentifierCS(yyDollar[2].identifierCS.String() + "@" + string(yyDollar[3].str))} } yyVAL.union = yyLOCAL case 789: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4281 +//line sql.y:4269 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 790: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4285 +//line sql.y:4273 { yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) } case 791: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4289 +//line sql.y:4277 { yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) } case 792: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4293 +//line sql.y:4281 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 793: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4300 +//line sql.y:4288 { yyLOCAL = &Begin{} } @@ -14796,7 +14784,7 @@ yydefault: case 794: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4304 +//line sql.y:4292 { yyLOCAL = &Begin{TxAccessModes: yyDollar[3].txAccessModesUnion()} } @@ -14804,7 +14792,7 @@ yydefault: case 795: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4309 +//line sql.y:4297 { yyLOCAL = nil } @@ -14812,7 +14800,7 @@ yydefault: case 796: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4313 +//line sql.y:4301 { yyLOCAL = yyDollar[1].txAccessModesUnion() } @@ -14820,14 +14808,14 @@ yydefault: case 797: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4319 +//line sql.y:4307 { yyLOCAL = []TxAccessMode{yyDollar[1].txAccessModeUnion()} } yyVAL.union = yyLOCAL case 798: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4323 +//line sql.y:4311 { yySLICE := (*[]TxAccessMode)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].txAccessModeUnion()) @@ -14835,7 +14823,7 @@ yydefault: case 799: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4329 +//line sql.y:4317 { yyLOCAL = WithConsistentSnapshot } @@ -14843,7 +14831,7 @@ yydefault: case 800: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4333 +//line sql.y:4321 { yyLOCAL = ReadWrite } @@ -14851,7 +14839,7 @@ yydefault: case 801: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4337 +//line sql.y:4325 { yyLOCAL = ReadOnly } @@ -14859,7 +14847,7 @@ yydefault: case 802: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4344 +//line sql.y:4332 { yyLOCAL = &Commit{} } @@ -14867,7 +14855,7 @@ yydefault: case 803: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4350 +//line sql.y:4338 { yyLOCAL = &Rollback{} } @@ -14875,39 +14863,39 @@ yydefault: case 804: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4354 +//line sql.y:4342 { yyLOCAL = &SRollback{Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL case 805: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4359 +//line sql.y:4347 { yyVAL.empty = struct{}{} } case 806: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4361 +//line sql.y:4349 { yyVAL.empty = struct{}{} } case 807: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4364 +//line sql.y:4352 { yyVAL.empty = struct{}{} } case 808: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4366 +//line sql.y:4354 { yyVAL.empty = struct{}{} } case 809: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4370 +//line sql.y:4358 { yyLOCAL = &Savepoint{Name: yyDollar[2].identifierCI} } @@ -14915,7 +14903,7 @@ yydefault: case 810: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4376 +//line sql.y:4364 { yyLOCAL = &Release{Name: yyDollar[3].identifierCI} } @@ -14923,7 +14911,7 @@ yydefault: case 811: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4381 +//line sql.y:4369 { yyLOCAL = EmptyType } @@ -14931,7 +14919,7 @@ yydefault: case 812: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4385 +//line sql.y:4373 { yyLOCAL = JSONType } @@ -14939,7 +14927,7 @@ yydefault: case 813: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4389 +//line sql.y:4377 { yyLOCAL = TreeType } @@ -14947,7 +14935,7 @@ yydefault: case 814: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4393 +//line sql.y:4381 { yyLOCAL = VitessType } @@ -14955,7 +14943,7 @@ yydefault: case 815: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4397 +//line sql.y:4385 { yyLOCAL = VTExplainType } @@ -14963,7 +14951,7 @@ yydefault: case 816: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4401 +//line sql.y:4389 { yyLOCAL = TraditionalType } @@ -14971,7 +14959,7 @@ yydefault: case 817: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4405 +//line sql.y:4393 { yyLOCAL = AnalyzeType } @@ -14979,7 +14967,7 @@ yydefault: case 818: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4410 +//line sql.y:4398 { yyLOCAL = PlanVExplainType } @@ -14987,7 +14975,7 @@ yydefault: case 819: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4414 +//line sql.y:4402 { yyLOCAL = PlanVExplainType } @@ -14995,7 +14983,7 @@ yydefault: case 820: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4418 +//line sql.y:4406 { yyLOCAL = AllVExplainType } @@ -15003,33 +14991,33 @@ yydefault: case 821: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4422 +//line sql.y:4410 { yyLOCAL = QueriesVExplainType } yyVAL.union = yyLOCAL case 822: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4428 +//line sql.y:4416 { yyVAL.str = yyDollar[1].str } case 823: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4432 +//line sql.y:4420 { yyVAL.str = yyDollar[1].str } case 824: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4436 +//line sql.y:4424 { yyVAL.str = yyDollar[1].str } case 825: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4442 +//line sql.y:4430 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -15037,7 +15025,7 @@ yydefault: case 826: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4446 +//line sql.y:4434 { yyLOCAL = yyDollar[1].statementUnion() } @@ -15045,7 +15033,7 @@ yydefault: case 827: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4450 +//line sql.y:4438 { yyLOCAL = yyDollar[1].statementUnion() } @@ -15053,33 +15041,33 @@ yydefault: case 828: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4454 +//line sql.y:4442 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL case 829: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4459 +//line sql.y:4447 { yyVAL.str = "" } case 830: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4463 +//line sql.y:4451 { yyVAL.str = yyDollar[1].identifierCI.val } case 831: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4467 +//line sql.y:4455 { yyVAL.str = encodeSQLString(yyDollar[1].str) } case 832: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4473 +//line sql.y:4461 { yyLOCAL = &ExplainTab{Table: yyDollar[3].tableName, Wild: yyDollar[4].str} } @@ -15087,7 +15075,7 @@ yydefault: case 833: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4477 +//line sql.y:4465 { yyLOCAL = &ExplainStmt{Type: yyDollar[3].explainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } @@ -15095,7 +15083,7 @@ yydefault: case 834: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4483 +//line sql.y:4471 { yyLOCAL = &VExplainStmt{Type: yyDollar[3].vexplainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } @@ -15103,7 +15091,7 @@ yydefault: case 835: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4489 +//line sql.y:4477 { yyLOCAL = &OtherAdmin{} } @@ -15111,7 +15099,7 @@ yydefault: case 836: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4493 +//line sql.y:4481 { yyLOCAL = &OtherAdmin{} } @@ -15119,7 +15107,7 @@ yydefault: case 837: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4499 +//line sql.y:4487 { yyLOCAL = &LockTables{Tables: yyDollar[3].tableAndLockTypesUnion()} } @@ -15127,14 +15115,14 @@ yydefault: case 838: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableAndLockTypes -//line sql.y:4505 +//line sql.y:4493 { yyLOCAL = TableAndLockTypes{yyDollar[1].tableAndLockTypeUnion()} } yyVAL.union = yyLOCAL case 839: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4509 +//line sql.y:4497 { yySLICE := (*TableAndLockTypes)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableAndLockTypeUnion()) @@ -15142,7 +15130,7 @@ yydefault: case 840: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *TableAndLockType -//line sql.y:4515 +//line sql.y:4503 { yyLOCAL = &TableAndLockType{Table: yyDollar[1].aliasedTableNameUnion(), Lock: yyDollar[2].lockTypeUnion()} } @@ -15150,7 +15138,7 @@ yydefault: case 841: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4521 +//line sql.y:4509 { yyLOCAL = Read } @@ -15158,7 +15146,7 @@ yydefault: case 842: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4525 +//line sql.y:4513 { yyLOCAL = ReadLocal } @@ -15166,7 +15154,7 @@ yydefault: case 843: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4529 +//line sql.y:4517 { yyLOCAL = Write } @@ -15174,7 +15162,7 @@ yydefault: case 844: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4533 +//line sql.y:4521 { yyLOCAL = LowPriorityWrite } @@ -15182,7 +15170,7 @@ yydefault: case 845: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4539 +//line sql.y:4527 { yyLOCAL = &UnlockTables{} } @@ -15190,7 +15178,7 @@ yydefault: case 846: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4545 +//line sql.y:4533 { yyLOCAL = &RevertMigration{Comments: Comments(yyDollar[2].strs).Parsed(), UUID: string(yyDollar[4].str)} } @@ -15198,7 +15186,7 @@ yydefault: case 847: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4551 +//line sql.y:4539 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), FlushOptions: yyDollar[3].strs} } @@ -15206,7 +15194,7 @@ yydefault: case 848: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4555 +//line sql.y:4543 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion()} } @@ -15214,7 +15202,7 @@ yydefault: case 849: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4559 +//line sql.y:4547 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), WithLock: true} } @@ -15222,7 +15210,7 @@ yydefault: case 850: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4563 +//line sql.y:4551 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion()} } @@ -15230,7 +15218,7 @@ yydefault: case 851: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4567 +//line sql.y:4555 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), WithLock: true} } @@ -15238,99 +15226,99 @@ yydefault: case 852: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4571 +//line sql.y:4559 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), ForExport: true} } yyVAL.union = yyLOCAL case 853: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4577 +//line sql.y:4565 { yyVAL.strs = []string{yyDollar[1].str} } case 854: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4581 +//line sql.y:4569 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } case 855: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4587 +//line sql.y:4575 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 856: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4591 +//line sql.y:4579 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 857: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4595 +//line sql.y:4583 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 858: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4599 +//line sql.y:4587 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 859: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4603 +//line sql.y:4591 { yyVAL.str = string(yyDollar[1].str) } case 860: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4607 +//line sql.y:4595 { yyVAL.str = string(yyDollar[1].str) } case 861: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4611 +//line sql.y:4599 { yyVAL.str = string(yyDollar[1].str) } case 862: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4615 +//line sql.y:4603 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str } case 863: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4619 +//line sql.y:4607 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 864: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4623 +//line sql.y:4611 { yyVAL.str = string(yyDollar[1].str) } case 865: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4627 +//line sql.y:4615 { yyVAL.str = string(yyDollar[1].str) } case 866: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4631 +//line sql.y:4619 { yyVAL.str = string(yyDollar[1].str) } case 867: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4636 +//line sql.y:4624 { yyLOCAL = false } @@ -15338,7 +15326,7 @@ yydefault: case 868: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4640 +//line sql.y:4628 { yyLOCAL = true } @@ -15346,52 +15334,52 @@ yydefault: case 869: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4644 +//line sql.y:4632 { yyLOCAL = true } yyVAL.union = yyLOCAL case 870: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4649 +//line sql.y:4637 { yyVAL.str = "" } case 871: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4653 +//line sql.y:4641 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String() } case 872: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4658 +//line sql.y:4646 { setAllowComments(yylex, true) } case 873: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4662 +//line sql.y:4650 { yyVAL.strs = yyDollar[2].strs setAllowComments(yylex, false) } case 874: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4668 +//line sql.y:4656 { yyVAL.strs = nil } case 875: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4672 +//line sql.y:4660 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } case 876: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4678 +//line sql.y:4666 { yyLOCAL = true } @@ -15399,7 +15387,7 @@ yydefault: case 877: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4682 +//line sql.y:4670 { yyLOCAL = false } @@ -15407,33 +15395,33 @@ yydefault: case 878: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4686 +//line sql.y:4674 { yyLOCAL = true } yyVAL.union = yyLOCAL case 879: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4691 +//line sql.y:4679 { yyVAL.str = "" } case 880: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4695 +//line sql.y:4683 { yyVAL.str = SQLNoCacheStr } case 881: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4699 +//line sql.y:4687 { yyVAL.str = SQLCacheStr } case 882: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4704 +//line sql.y:4692 { yyLOCAL = false } @@ -15441,7 +15429,7 @@ yydefault: case 883: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4708 +//line sql.y:4696 { yyLOCAL = true } @@ -15449,7 +15437,7 @@ yydefault: case 884: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4712 +//line sql.y:4700 { yyLOCAL = true } @@ -15457,7 +15445,7 @@ yydefault: case 885: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4718 +//line sql.y:4706 { yyLOCAL = &PrepareStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Statement: yyDollar[5].exprUnion()} } @@ -15465,7 +15453,7 @@ yydefault: case 886: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4722 +//line sql.y:4710 { yyLOCAL = &PrepareStmt{ Name: yyDollar[3].identifierCI, @@ -15477,7 +15465,7 @@ yydefault: case 887: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4732 +//line sql.y:4720 { yyLOCAL = &ExecuteStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Arguments: yyDollar[4].variablesUnion()} } @@ -15485,7 +15473,7 @@ yydefault: case 888: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4737 +//line sql.y:4725 { yyLOCAL = nil } @@ -15493,7 +15481,7 @@ yydefault: case 889: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4741 +//line sql.y:4729 { yyLOCAL = yyDollar[2].variablesUnion() } @@ -15501,7 +15489,7 @@ yydefault: case 890: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4747 +//line sql.y:4735 { yyLOCAL = &DeallocateStmt{Type: DeallocateType, Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } @@ -15509,7 +15497,7 @@ yydefault: case 891: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4751 +//line sql.y:4739 { yyLOCAL = &DeallocateStmt{Type: DropType, Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } @@ -15517,7 +15505,7 @@ yydefault: case 892: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4756 +//line sql.y:4744 { yyLOCAL = nil } @@ -15525,94 +15513,94 @@ yydefault: case 893: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4760 +//line sql.y:4748 { yyLOCAL = yyDollar[1].selectExprsUnion() } yyVAL.union = yyLOCAL case 894: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4765 +//line sql.y:4753 { yyVAL.strs = nil } case 895: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4769 +//line sql.y:4757 { yyVAL.strs = []string{yyDollar[1].str} } case 896: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4773 +//line sql.y:4761 { // 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 897: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4777 +//line sql.y:4765 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } case 898: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4781 +//line sql.y:4769 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } case 899: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4787 +//line sql.y:4775 { yyVAL.str = SQLNoCacheStr } case 900: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4791 +//line sql.y:4779 { yyVAL.str = SQLCacheStr } case 901: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4795 +//line sql.y:4783 { yyVAL.str = DistinctStr } case 902: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4799 +//line sql.y:4787 { yyVAL.str = DistinctStr } case 903: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4803 +//line sql.y:4791 { yyVAL.str = StraightJoinHint } case 904: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4807 +//line sql.y:4795 { yyVAL.str = SQLCalcFoundRowsStr } case 905: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4811 +//line sql.y:4799 { 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 906: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4817 +//line sql.y:4805 { yyLOCAL = SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL case 907: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4821 +//line sql.y:4809 { yySLICE := (*SelectExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].selectExprUnion()) @@ -15620,7 +15608,7 @@ yydefault: case 908: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4827 +//line sql.y:4815 { yyLOCAL = &StarExpr{} } @@ -15628,7 +15616,7 @@ yydefault: case 909: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4831 +//line sql.y:4819 { yyLOCAL = &AliasedExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].identifierCI} } @@ -15636,7 +15624,7 @@ yydefault: case 910: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4835 +//line sql.y:4823 { yyLOCAL = &StarExpr{TableName: TableName{Name: yyDollar[1].identifierCS}} } @@ -15644,39 +15632,39 @@ yydefault: case 911: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4839 +//line sql.y:4827 { yyLOCAL = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL case 912: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4844 +//line sql.y:4832 { yyVAL.identifierCI = IdentifierCI{} } case 913: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4848 +//line sql.y:4836 { yyVAL.identifierCI = yyDollar[1].identifierCI } case 914: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4852 +//line sql.y:4840 { yyVAL.identifierCI = yyDollar[2].identifierCI } case 916: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4859 +//line sql.y:4847 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 917: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4864 +//line sql.y:4852 { yyLOCAL = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewIdentifierCS("dual")}}} } @@ -15684,7 +15672,7 @@ yydefault: case 918: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4868 +//line sql.y:4856 { yyLOCAL = yyDollar[1].tableExprsUnion() } @@ -15692,7 +15680,7 @@ yydefault: case 919: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4874 +//line sql.y:4862 { yyLOCAL = yyDollar[2].tableExprsUnion() } @@ -15700,14 +15688,14 @@ yydefault: case 920: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4880 +//line sql.y:4868 { yyLOCAL = TableExprs{yyDollar[1].tableExprUnion()} } yyVAL.union = yyLOCAL case 921: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4884 +//line sql.y:4872 { yySLICE := (*TableExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableExprUnion()) @@ -15715,7 +15703,7 @@ yydefault: case 924: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4894 +//line sql.y:4882 { yyLOCAL = yyDollar[1].aliasedTableNameUnion() } @@ -15723,7 +15711,7 @@ yydefault: case 925: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4898 +//line sql.y:4886 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].derivedTableUnion(), As: yyDollar[3].identifierCS, Columns: yyDollar[4].columnsUnion()} } @@ -15731,7 +15719,7 @@ yydefault: case 926: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4902 +//line sql.y:4890 { yyLOCAL = &ParenTableExpr{Exprs: yyDollar[2].tableExprsUnion()} } @@ -15739,7 +15727,7 @@ yydefault: case 927: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4906 +//line sql.y:4894 { yyLOCAL = yyDollar[1].tableExprUnion() } @@ -15747,7 +15735,7 @@ yydefault: case 928: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4912 +//line sql.y:4900 { yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].selStmtUnion()} } @@ -15755,7 +15743,7 @@ yydefault: case 929: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4916 +//line sql.y:4904 { yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].selStmtUnion()} } @@ -15763,7 +15751,7 @@ yydefault: case 930: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4922 +//line sql.y:4910 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].identifierCS, Hints: yyDollar[3].indexHintsUnion()} } @@ -15771,7 +15759,7 @@ yydefault: case 931: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4926 +//line sql.y:4914 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitionsUnion(), As: yyDollar[6].identifierCS, Hints: yyDollar[7].indexHintsUnion()} } @@ -15779,7 +15767,7 @@ yydefault: case 932: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4931 +//line sql.y:4919 { yyLOCAL = nil } @@ -15787,7 +15775,7 @@ yydefault: case 933: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:4935 +//line sql.y:4923 { yyLOCAL = yyDollar[2].columnsUnion() } @@ -15795,7 +15783,7 @@ yydefault: case 934: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4940 +//line sql.y:4928 { yyLOCAL = nil } @@ -15803,7 +15791,7 @@ yydefault: case 935: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4944 +//line sql.y:4932 { yyLOCAL = yyDollar[1].columnsUnion() } @@ -15811,14 +15799,14 @@ yydefault: case 936: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4950 +//line sql.y:4938 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL case 937: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4954 +//line sql.y:4942 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) @@ -15826,14 +15814,14 @@ yydefault: case 938: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4960 +//line sql.y:4948 { yyLOCAL = []*Variable{yyDollar[1].variableUnion()} } yyVAL.union = yyLOCAL case 939: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4964 +//line sql.y:4952 { yySLICE := (*[]*Variable)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].variableUnion()) @@ -15841,7 +15829,7 @@ yydefault: case 940: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4970 +//line sql.y:4958 { yyLOCAL = Columns{yyDollar[1].identifierCI} } @@ -15849,21 +15837,21 @@ yydefault: case 941: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4974 +//line sql.y:4962 { yyLOCAL = Columns{NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL case 942: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4978 +//line sql.y:4966 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } case 943: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4982 +//line sql.y:4970 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewIdentifierCI(string(yyDollar[3].str))) @@ -15871,14 +15859,14 @@ yydefault: case 944: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Partitions -//line sql.y:4988 +//line sql.y:4976 { yyLOCAL = Partitions{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL case 945: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4992 +//line sql.y:4980 { yySLICE := (*Partitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) @@ -15886,7 +15874,7 @@ yydefault: case 946: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5005 +//line sql.y:4993 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } @@ -15894,7 +15882,7 @@ yydefault: case 947: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5009 +//line sql.y:4997 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } @@ -15902,7 +15890,7 @@ yydefault: case 948: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5013 +//line sql.y:5001 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } @@ -15910,87 +15898,87 @@ yydefault: case 949: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5017 +//line sql.y:5005 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion()} } yyVAL.union = yyLOCAL case 950: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5023 +//line sql.y:5011 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } case 951: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:5025 +//line sql.y:5013 { yyVAL.joinCondition = &JoinCondition{Using: yyDollar[3].columnsUnion()} } case 952: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5029 +//line sql.y:5017 { yyVAL.joinCondition = &JoinCondition{} } case 953: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5031 +//line sql.y:5019 { yyVAL.joinCondition = yyDollar[1].joinCondition } case 954: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5035 +//line sql.y:5023 { yyVAL.joinCondition = &JoinCondition{} } case 955: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5037 +//line sql.y:5025 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } case 956: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5040 +//line sql.y:5028 { yyVAL.empty = struct{}{} } case 957: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5042 +//line sql.y:5030 { yyVAL.empty = struct{}{} } case 958: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5045 +//line sql.y:5033 { yyVAL.identifierCS = NewIdentifierCS("") } case 959: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5049 +//line sql.y:5037 { yyVAL.identifierCS = yyDollar[1].identifierCS } case 960: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5053 +//line sql.y:5041 { yyVAL.identifierCS = yyDollar[2].identifierCS } case 962: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5060 +//line sql.y:5048 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 963: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5066 +//line sql.y:5054 { yyLOCAL = NormalJoinType } @@ -15998,7 +15986,7 @@ yydefault: case 964: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5070 +//line sql.y:5058 { yyLOCAL = NormalJoinType } @@ -16006,7 +15994,7 @@ yydefault: case 965: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5074 +//line sql.y:5062 { yyLOCAL = NormalJoinType } @@ -16014,7 +16002,7 @@ yydefault: case 966: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5080 +//line sql.y:5068 { yyLOCAL = StraightJoinType } @@ -16022,7 +16010,7 @@ yydefault: case 967: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5086 +//line sql.y:5074 { yyLOCAL = LeftJoinType } @@ -16030,7 +16018,7 @@ yydefault: case 968: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5090 +//line sql.y:5078 { yyLOCAL = LeftJoinType } @@ -16038,7 +16026,7 @@ yydefault: case 969: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5094 +//line sql.y:5082 { yyLOCAL = RightJoinType } @@ -16046,7 +16034,7 @@ yydefault: case 970: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5098 +//line sql.y:5086 { yyLOCAL = RightJoinType } @@ -16054,7 +16042,7 @@ yydefault: case 971: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5104 +//line sql.y:5092 { yyLOCAL = NaturalJoinType } @@ -16062,7 +16050,7 @@ yydefault: case 972: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5108 +//line sql.y:5096 { if yyDollar[2].joinTypeUnion() == LeftJoinType { yyLOCAL = NaturalLeftJoinType @@ -16073,38 +16061,38 @@ yydefault: yyVAL.union = yyLOCAL case 973: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5118 +//line sql.y:5106 { yyVAL.tableName = yyDollar[2].tableName } case 974: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5122 +//line sql.y:5110 { yyVAL.tableName = yyDollar[1].tableName } case 975: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5128 +//line sql.y:5116 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } case 976: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5132 +//line sql.y:5120 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS} } case 977: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5138 +//line sql.y:5126 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } case 978: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5143 +//line sql.y:5131 { yyLOCAL = nil } @@ -16112,7 +16100,7 @@ yydefault: case 979: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5147 +//line sql.y:5135 { yyLOCAL = yyDollar[1].indexHintsUnion() } @@ -16120,14 +16108,14 @@ yydefault: case 980: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5153 +//line sql.y:5141 { yyLOCAL = IndexHints{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL case 981: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5157 +//line sql.y:5145 { yySLICE := (*IndexHints)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexHintUnion()) @@ -16135,7 +16123,7 @@ yydefault: case 982: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5163 +//line sql.y:5151 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } @@ -16143,7 +16131,7 @@ yydefault: case 983: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5167 +//line sql.y:5155 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion()} } @@ -16151,7 +16139,7 @@ yydefault: case 984: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5171 +//line sql.y:5159 { yyLOCAL = &IndexHint{Type: IgnoreOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } @@ -16159,7 +16147,7 @@ yydefault: case 985: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5175 +//line sql.y:5163 { yyLOCAL = &IndexHint{Type: ForceOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } @@ -16167,7 +16155,7 @@ yydefault: case 986: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5180 +//line sql.y:5168 { yyLOCAL = NoForType } @@ -16175,7 +16163,7 @@ yydefault: case 987: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5184 +//line sql.y:5172 { yyLOCAL = JoinForType } @@ -16183,7 +16171,7 @@ yydefault: case 988: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5188 +//line sql.y:5176 { yyLOCAL = OrderByForType } @@ -16191,7 +16179,7 @@ yydefault: case 989: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5192 +//line sql.y:5180 { yyLOCAL = GroupByForType } @@ -16199,7 +16187,7 @@ yydefault: case 990: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5198 +//line sql.y:5186 { yyLOCAL = nil } @@ -16207,7 +16195,7 @@ yydefault: case 991: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5202 +//line sql.y:5190 { yyLOCAL = yyDollar[2].exprUnion() } @@ -16215,7 +16203,7 @@ yydefault: case 992: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5209 +//line sql.y:5197 { yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } @@ -16223,7 +16211,7 @@ yydefault: case 993: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5213 +//line sql.y:5201 { yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } @@ -16231,7 +16219,7 @@ yydefault: case 994: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5217 +//line sql.y:5205 { yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } @@ -16239,7 +16227,7 @@ yydefault: case 995: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5221 +//line sql.y:5209 { yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} } @@ -16247,7 +16235,7 @@ yydefault: case 996: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5225 +//line sql.y:5213 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} } @@ -16255,7 +16243,7 @@ yydefault: case 997: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5229 +//line sql.y:5217 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16263,7 +16251,7 @@ yydefault: case 998: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5233 +//line sql.y:5221 { yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} } @@ -16271,7 +16259,7 @@ yydefault: case 999: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5239 +//line sql.y:5227 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} } @@ -16279,7 +16267,7 @@ yydefault: case 1000: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5243 +//line sql.y:5231 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} } @@ -16287,7 +16275,7 @@ yydefault: case 1001: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5247 +//line sql.y:5235 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} } @@ -16295,7 +16283,7 @@ yydefault: case 1002: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5251 +//line sql.y:5239 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16303,7 +16291,7 @@ yydefault: case 1003: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5257 +//line sql.y:5245 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} } @@ -16311,7 +16299,7 @@ yydefault: case 1004: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5261 +//line sql.y:5249 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} } @@ -16319,7 +16307,7 @@ yydefault: case 1005: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5265 +//line sql.y:5253 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} } @@ -16327,7 +16315,7 @@ yydefault: case 1006: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5269 +//line sql.y:5257 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} } @@ -16335,7 +16323,7 @@ yydefault: case 1007: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5273 +//line sql.y:5261 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} } @@ -16343,7 +16331,7 @@ yydefault: case 1008: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5277 +//line sql.y:5265 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} } @@ -16351,7 +16339,7 @@ yydefault: case 1009: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5281 +//line sql.y:5269 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} } @@ -16359,7 +16347,7 @@ yydefault: case 1010: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5285 +//line sql.y:5273 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} } @@ -16367,7 +16355,7 @@ yydefault: case 1011: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5289 +//line sql.y:5277 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} } @@ -16375,7 +16363,7 @@ yydefault: case 1012: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5293 +//line sql.y:5281 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} } @@ -16383,25 +16371,25 @@ yydefault: case 1013: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5297 +//line sql.y:5285 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1014: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5303 +//line sql.y:5291 { } case 1015: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5306 +//line sql.y:5294 { } case 1016: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5312 +//line sql.y:5300 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } @@ -16409,7 +16397,7 @@ yydefault: case 1017: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5316 +//line sql.y:5304 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} } @@ -16417,7 +16405,7 @@ yydefault: case 1018: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5320 +//line sql.y:5308 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} } @@ -16425,7 +16413,7 @@ yydefault: case 1019: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5324 +//line sql.y:5312 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} } @@ -16433,7 +16421,7 @@ yydefault: case 1020: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5328 +//line sql.y:5316 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} } @@ -16441,7 +16429,7 @@ yydefault: case 1021: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5332 +//line sql.y:5320 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} } @@ -16449,7 +16437,7 @@ yydefault: case 1022: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5336 +//line sql.y:5324 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} } @@ -16457,7 +16445,7 @@ yydefault: case 1023: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5340 +//line sql.y:5328 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} } @@ -16465,7 +16453,7 @@ yydefault: case 1024: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5344 +//line sql.y:5332 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } @@ -16473,7 +16461,7 @@ yydefault: case 1025: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5348 +//line sql.y:5336 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} } @@ -16481,7 +16469,7 @@ yydefault: case 1026: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5352 +//line sql.y:5340 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } @@ -16489,7 +16477,7 @@ yydefault: case 1027: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5356 +//line sql.y:5344 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} } @@ -16497,7 +16485,7 @@ yydefault: case 1028: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5360 +//line sql.y:5348 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16505,7 +16493,7 @@ yydefault: case 1029: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5366 +//line sql.y:5354 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16513,7 +16501,7 @@ yydefault: case 1030: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5370 +//line sql.y:5358 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16521,7 +16509,7 @@ yydefault: case 1031: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5374 +//line sql.y:5362 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16529,7 +16517,7 @@ yydefault: case 1032: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5378 +//line sql.y:5366 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16537,7 +16525,7 @@ yydefault: case 1033: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5382 +//line sql.y:5370 { yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } @@ -16545,7 +16533,7 @@ yydefault: case 1034: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5386 +//line sql.y:5374 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16553,7 +16541,7 @@ yydefault: case 1035: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5390 +//line sql.y:5378 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16561,7 +16549,7 @@ yydefault: case 1036: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5394 +//line sql.y:5382 { yyLOCAL = yyDollar[1].variableUnion() } @@ -16569,7 +16557,7 @@ yydefault: case 1037: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5398 +//line sql.y:5386 { yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? } @@ -16577,7 +16565,7 @@ yydefault: case 1038: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5402 +//line sql.y:5390 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } @@ -16585,7 +16573,7 @@ yydefault: case 1039: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5406 +//line sql.y:5394 { yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} } @@ -16593,7 +16581,7 @@ yydefault: case 1040: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5410 +//line sql.y:5398 { yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} } @@ -16601,7 +16589,7 @@ yydefault: case 1041: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5414 +//line sql.y:5402 { yyLOCAL = yyDollar[1].subqueryUnion() } @@ -16609,7 +16597,7 @@ yydefault: case 1042: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5418 +//line sql.y:5406 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16617,7 +16605,7 @@ yydefault: case 1043: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5422 +//line sql.y:5410 { yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} } @@ -16625,7 +16613,7 @@ yydefault: case 1044: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5426 +//line sql.y:5414 { yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} } @@ -16633,7 +16621,7 @@ yydefault: case 1045: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5430 +//line sql.y:5418 { yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} } @@ -16641,7 +16629,7 @@ yydefault: case 1046: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5434 +//line sql.y:5422 { yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } @@ -16649,7 +16637,7 @@ yydefault: case 1047: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5438 +//line sql.y:5426 { yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} } @@ -16657,7 +16645,7 @@ yydefault: case 1048: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5442 +//line sql.y:5430 { // 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: @@ -16669,7 +16657,7 @@ yydefault: case 1049: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5450 +//line sql.y:5438 { yyLOCAL = &Default{ColName: yyDollar[2].str} } @@ -16677,7 +16665,7 @@ yydefault: case 1050: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5454 +//line sql.y:5442 { // INTERVAL can trigger a shift / reduce conflict. We want // to shift here for the interval rule. In case we do have @@ -16689,7 +16677,7 @@ yydefault: case 1051: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5462 +//line sql.y:5450 { yyLOCAL = &IntervalFuncExpr{Expr: yyDollar[3].exprUnion(), Exprs: yyDollar[5].exprsUnion()} } @@ -16697,7 +16685,7 @@ yydefault: case 1052: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5466 +//line sql.y:5454 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONExtractOp, Right: yyDollar[3].exprUnion()} } @@ -16705,7 +16693,7 @@ yydefault: case 1053: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5470 +//line sql.y:5458 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONUnquoteExtractOp, Right: yyDollar[3].exprUnion()} } @@ -16713,7 +16701,7 @@ yydefault: case 1054: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5476 +//line sql.y:5464 { yyLOCAL = &IntervalExpr{Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].identifierCI.String()} } @@ -16721,7 +16709,7 @@ yydefault: case 1055: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5482 +//line sql.y:5470 { yyLOCAL = yyDollar[1].colNamesUnion() } @@ -16729,7 +16717,7 @@ yydefault: case 1056: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5486 +//line sql.y:5474 { yyLOCAL = yyDollar[2].colNamesUnion() } @@ -16737,14 +16725,14 @@ yydefault: case 1057: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5492 +//line sql.y:5480 { yyLOCAL = []*ColName{yyDollar[1].colNameUnion()} } yyVAL.union = yyLOCAL case 1058: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5496 +//line sql.y:5484 { yySLICE := (*[]*ColName)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colNameUnion()) @@ -16752,7 +16740,7 @@ yydefault: case 1059: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5502 +//line sql.y:5490 { yyLOCAL = BothTrimType } @@ -16760,7 +16748,7 @@ yydefault: case 1060: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5506 +//line sql.y:5494 { yyLOCAL = LeadingTrimType } @@ -16768,7 +16756,7 @@ yydefault: case 1061: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5510 +//line sql.y:5498 { yyLOCAL = TrailingTrimType } @@ -16776,7 +16764,7 @@ yydefault: case 1062: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FrameUnitType -//line sql.y:5516 +//line sql.y:5504 { yyLOCAL = FrameRowsType } @@ -16784,7 +16772,7 @@ yydefault: case 1063: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FrameUnitType -//line sql.y:5520 +//line sql.y:5508 { yyLOCAL = FrameRangeType } @@ -16792,7 +16780,7 @@ yydefault: case 1064: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5527 +//line sql.y:5515 { yyLOCAL = CumeDistExprType } @@ -16800,7 +16788,7 @@ yydefault: case 1065: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5531 +//line sql.y:5519 { yyLOCAL = DenseRankExprType } @@ -16808,7 +16796,7 @@ yydefault: case 1066: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5535 +//line sql.y:5523 { yyLOCAL = PercentRankExprType } @@ -16816,7 +16804,7 @@ yydefault: case 1067: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5539 +//line sql.y:5527 { yyLOCAL = RankExprType } @@ -16824,7 +16812,7 @@ yydefault: case 1068: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5543 +//line sql.y:5531 { yyLOCAL = RowNumberExprType } @@ -16832,7 +16820,7 @@ yydefault: case 1069: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5549 +//line sql.y:5537 { yyLOCAL = &FramePoint{Type: CurrentRowType} } @@ -16840,7 +16828,7 @@ yydefault: case 1070: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5553 +//line sql.y:5541 { yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} } @@ -16848,7 +16836,7 @@ yydefault: case 1071: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5557 +//line sql.y:5545 { yyLOCAL = &FramePoint{Type: UnboundedFollowingType} } @@ -16856,7 +16844,7 @@ yydefault: case 1072: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5561 +//line sql.y:5549 { yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} } @@ -16864,7 +16852,7 @@ yydefault: case 1073: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5565 +//line sql.y:5553 { yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} } @@ -16872,7 +16860,7 @@ yydefault: case 1074: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5571 +//line sql.y:5559 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16880,7 +16868,7 @@ yydefault: case 1075: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5575 +//line sql.y:5563 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16888,7 +16876,7 @@ yydefault: case 1076: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5580 +//line sql.y:5568 { yyLOCAL = nil } @@ -16896,7 +16884,7 @@ yydefault: case 1077: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5584 +//line sql.y:5572 { yyLOCAL = yyDollar[1].frameClauseUnion() } @@ -16904,7 +16892,7 @@ yydefault: case 1078: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5590 +//line sql.y:5578 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[2].framePointUnion()} } @@ -16912,7 +16900,7 @@ yydefault: case 1079: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5594 +//line sql.y:5582 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[3].framePointUnion(), End: yyDollar[5].framePointUnion()} } @@ -16920,7 +16908,7 @@ yydefault: case 1080: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:5599 +//line sql.y:5587 { yyLOCAL = nil } @@ -16928,26 +16916,26 @@ yydefault: case 1081: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:5603 +//line sql.y:5591 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL case 1082: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5608 +//line sql.y:5596 { } case 1083: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5611 +//line sql.y:5599 { yyVAL.identifierCI = yyDollar[1].identifierCI } case 1084: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *WindowSpecification -//line sql.y:5617 +//line sql.y:5605 { yyLOCAL = &WindowSpecification{Name: yyDollar[1].identifierCI, PartitionClause: yyDollar[2].exprsUnion(), OrderClause: yyDollar[3].orderByUnion(), FrameClause: yyDollar[4].frameClauseUnion()} } @@ -16955,7 +16943,7 @@ yydefault: case 1085: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5623 +//line sql.y:5611 { yyLOCAL = &OverClause{WindowSpec: yyDollar[3].windowSpecificationUnion()} } @@ -16963,7 +16951,7 @@ yydefault: case 1086: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5627 +//line sql.y:5615 { yyLOCAL = &OverClause{WindowName: yyDollar[2].identifierCI} } @@ -16971,7 +16959,7 @@ yydefault: case 1087: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5632 +//line sql.y:5620 { yyLOCAL = nil } @@ -16979,7 +16967,7 @@ yydefault: case 1089: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5639 +//line sql.y:5627 { yyLOCAL = &NullTreatmentClause{yyDollar[1].nullTreatmentTypeUnion()} } @@ -16987,7 +16975,7 @@ yydefault: case 1090: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5645 +//line sql.y:5633 { yyLOCAL = RespectNullsType } @@ -16995,7 +16983,7 @@ yydefault: case 1091: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5649 +//line sql.y:5637 { yyLOCAL = IgnoreNullsType } @@ -17003,7 +16991,7 @@ yydefault: case 1092: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5655 +//line sql.y:5643 { yyLOCAL = FirstValueExprType } @@ -17011,7 +16999,7 @@ yydefault: case 1093: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5659 +//line sql.y:5647 { yyLOCAL = LastValueExprType } @@ -17019,7 +17007,7 @@ yydefault: case 1094: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5665 +//line sql.y:5653 { yyLOCAL = FromFirstType } @@ -17027,7 +17015,7 @@ yydefault: case 1095: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5669 +//line sql.y:5657 { yyLOCAL = FromLastType } @@ -17035,7 +17023,7 @@ yydefault: case 1096: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5674 +//line sql.y:5662 { yyLOCAL = nil } @@ -17043,7 +17031,7 @@ yydefault: case 1098: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5681 +//line sql.y:5669 { yyLOCAL = &FromFirstLastClause{yyDollar[1].fromFirstLastTypeUnion()} } @@ -17051,7 +17039,7 @@ yydefault: case 1099: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5687 +//line sql.y:5675 { yyLOCAL = LagExprType } @@ -17059,7 +17047,7 @@ yydefault: case 1100: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5691 +//line sql.y:5679 { yyLOCAL = LeadExprType } @@ -17067,7 +17055,7 @@ yydefault: case 1101: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *WindowDefinition -//line sql.y:5697 +//line sql.y:5685 { yyLOCAL = &WindowDefinition{Name: yyDollar[1].identifierCI, WindowSpec: yyDollar[4].windowSpecificationUnion()} } @@ -17075,34 +17063,34 @@ yydefault: case 1102: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL WindowDefinitions -//line sql.y:5703 +//line sql.y:5691 { yyLOCAL = WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL case 1103: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5707 +//line sql.y:5695 { yySLICE := (*WindowDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].windowDefinitionUnion()) } case 1104: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5713 +//line sql.y:5701 { yyVAL.str = "" } case 1105: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5717 +//line sql.y:5705 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } case 1106: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5723 +//line sql.y:5711 { yyLOCAL = BoolVal(true) } @@ -17110,7 +17098,7 @@ yydefault: case 1107: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5727 +//line sql.y:5715 { yyLOCAL = BoolVal(false) } @@ -17118,7 +17106,7 @@ yydefault: case 1108: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5734 +//line sql.y:5722 { yyLOCAL = IsTrueOp } @@ -17126,7 +17114,7 @@ yydefault: case 1109: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5738 +//line sql.y:5726 { yyLOCAL = IsNotTrueOp } @@ -17134,7 +17122,7 @@ yydefault: case 1110: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5742 +//line sql.y:5730 { yyLOCAL = IsFalseOp } @@ -17142,7 +17130,7 @@ yydefault: case 1111: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5746 +//line sql.y:5734 { yyLOCAL = IsNotFalseOp } @@ -17150,7 +17138,7 @@ yydefault: case 1112: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5752 +//line sql.y:5740 { yyLOCAL = EqualOp } @@ -17158,7 +17146,7 @@ yydefault: case 1113: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5756 +//line sql.y:5744 { yyLOCAL = LessThanOp } @@ -17166,7 +17154,7 @@ yydefault: case 1114: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5760 +//line sql.y:5748 { yyLOCAL = GreaterThanOp } @@ -17174,7 +17162,7 @@ yydefault: case 1115: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5764 +//line sql.y:5752 { yyLOCAL = LessEqualOp } @@ -17182,7 +17170,7 @@ yydefault: case 1116: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5768 +//line sql.y:5756 { yyLOCAL = GreaterEqualOp } @@ -17190,7 +17178,7 @@ yydefault: case 1117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5772 +//line sql.y:5760 { yyLOCAL = NotEqualOp } @@ -17198,7 +17186,7 @@ yydefault: case 1118: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5776 +//line sql.y:5764 { yyLOCAL = NullSafeEqualOp } @@ -17206,7 +17194,7 @@ yydefault: case 1119: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5782 +//line sql.y:5770 { yyLOCAL = yyDollar[1].valTupleUnion() } @@ -17214,7 +17202,7 @@ yydefault: case 1120: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5786 +//line sql.y:5774 { yyLOCAL = yyDollar[1].subqueryUnion() } @@ -17222,7 +17210,7 @@ yydefault: case 1121: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5790 +//line sql.y:5778 { yyLOCAL = ListArg(yyDollar[1].str[2:]) bindVariable(yylex, yyDollar[1].str[2:]) @@ -17231,7 +17219,7 @@ yydefault: case 1122: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Subquery -//line sql.y:5797 +//line sql.y:5785 { yyLOCAL = &Subquery{yyDollar[1].selStmtUnion()} } @@ -17239,14 +17227,14 @@ yydefault: case 1123: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:5803 +//line sql.y:5791 { yyLOCAL = Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL case 1124: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5807 +//line sql.y:5795 { yySLICE := (*Exprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].exprUnion()) @@ -17254,7 +17242,7 @@ yydefault: case 1125: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5817 +//line sql.y:5805 { yyLOCAL = &FuncExpr{Name: yyDollar[1].identifierCI, Exprs: yyDollar[3].selectExprsUnion()} } @@ -17262,7 +17250,7 @@ yydefault: case 1126: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5821 +//line sql.y:5809 { yyLOCAL = &FuncExpr{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCI, Exprs: yyDollar[5].selectExprsUnion()} } @@ -17270,7 +17258,7 @@ yydefault: case 1127: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5831 +//line sql.y:5819 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].selectExprsUnion()} } @@ -17278,7 +17266,7 @@ yydefault: case 1128: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5835 +//line sql.y:5823 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].selectExprsUnion()} } @@ -17286,7 +17274,7 @@ yydefault: case 1129: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5839 +//line sql.y:5827 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } @@ -17294,7 +17282,7 @@ yydefault: case 1130: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5843 +//line sql.y:5831 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } @@ -17302,7 +17290,7 @@ yydefault: case 1131: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5847 +//line sql.y:5835 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } @@ -17310,7 +17298,7 @@ yydefault: case 1132: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5851 +//line sql.y:5839 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } @@ -17318,7 +17306,7 @@ yydefault: case 1133: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5855 +//line sql.y:5843 { yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} } @@ -17326,7 +17314,7 @@ yydefault: case 1134: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5859 +//line sql.y:5847 { yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} } @@ -17334,7 +17322,7 @@ yydefault: case 1135: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:5863 +//line sql.y:5851 { yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} } @@ -17342,7 +17330,7 @@ yydefault: case 1136: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5867 +//line sql.y:5855 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} } @@ -17350,7 +17338,7 @@ yydefault: case 1137: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5878 +//line sql.y:5866 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} } @@ -17358,7 +17346,7 @@ yydefault: case 1138: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5882 +//line sql.y:5870 { yyLOCAL = yyDollar[1].exprUnion() } @@ -17366,7 +17354,7 @@ yydefault: case 1139: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5888 +//line sql.y:5876 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} } @@ -17374,7 +17362,7 @@ yydefault: case 1140: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5892 +//line sql.y:5880 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].exprUnion()} } @@ -17382,7 +17370,7 @@ yydefault: case 1141: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5897 +//line sql.y:5885 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].exprUnion()} } @@ -17390,7 +17378,7 @@ yydefault: case 1142: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5901 +//line sql.y:5889 { yyLOCAL = &CountStar{} } @@ -17398,7 +17386,7 @@ yydefault: case 1143: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5905 +//line sql.y:5893 { yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion()} } @@ -17406,7 +17394,7 @@ yydefault: case 1144: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5909 +//line sql.y:5897 { yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } @@ -17414,7 +17402,7 @@ yydefault: case 1145: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5913 +//line sql.y:5901 { yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } @@ -17422,7 +17410,7 @@ yydefault: case 1146: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5917 +//line sql.y:5905 { yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } @@ -17430,7 +17418,7 @@ yydefault: case 1147: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5921 +//line sql.y:5909 { yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } @@ -17438,7 +17426,7 @@ yydefault: case 1148: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5925 +//line sql.y:5913 { yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion()} } @@ -17446,7 +17434,7 @@ yydefault: case 1149: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5929 +//line sql.y:5917 { yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion()} } @@ -17454,7 +17442,7 @@ yydefault: case 1150: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5933 +//line sql.y:5921 { yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion()} } @@ -17462,7 +17450,7 @@ yydefault: case 1151: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5937 +//line sql.y:5925 { yyLOCAL = &Std{Arg: yyDollar[3].exprUnion()} } @@ -17470,7 +17458,7 @@ yydefault: case 1152: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5941 +//line sql.y:5929 { yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion()} } @@ -17478,7 +17466,7 @@ yydefault: case 1153: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5945 +//line sql.y:5933 { yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion()} } @@ -17486,7 +17474,7 @@ yydefault: case 1154: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5949 +//line sql.y:5937 { yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion()} } @@ -17494,7 +17482,7 @@ yydefault: case 1155: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5953 +//line sql.y:5941 { yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion()} } @@ -17502,7 +17490,7 @@ yydefault: case 1156: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5957 +//line sql.y:5945 { yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion()} } @@ -17510,7 +17498,7 @@ yydefault: case 1157: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5961 +//line sql.y:5949 { yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion()} } @@ -17518,7 +17506,7 @@ yydefault: case 1158: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5965 +//line sql.y:5953 { yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} } @@ -17526,7 +17514,7 @@ yydefault: case 1159: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5969 +//line sql.y:5957 { yyLOCAL = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].identifierCI.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } @@ -17534,7 +17522,7 @@ yydefault: case 1160: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5973 +//line sql.y:5961 { yyLOCAL = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].identifierCI.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } @@ -17542,7 +17530,7 @@ yydefault: case 1161: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5977 +//line sql.y:5965 { yyLOCAL = &ExtractFuncExpr{IntervalTypes: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} } @@ -17550,7 +17538,7 @@ yydefault: case 1162: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5981 +//line sql.y:5969 { yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} } @@ -17558,7 +17546,7 @@ yydefault: case 1163: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5985 +//line sql.y:5973 { yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} } @@ -17566,7 +17554,7 @@ yydefault: case 1164: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5989 +//line sql.y:5977 { yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} } @@ -17574,7 +17562,7 @@ yydefault: case 1165: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5993 +//line sql.y:5981 { yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} } @@ -17582,7 +17570,7 @@ yydefault: case 1166: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5997 +//line sql.y:5985 { yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, StringArg: yyDollar[3].exprUnion()} } @@ -17590,7 +17578,7 @@ yydefault: case 1167: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6001 +//line sql.y:5989 { yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, StringArg: yyDollar[3].exprUnion()} } @@ -17598,7 +17586,7 @@ yydefault: case 1168: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6005 +//line sql.y:5993 { yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} } @@ -17606,7 +17594,7 @@ yydefault: case 1169: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6009 +//line sql.y:5997 { yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} } @@ -17614,7 +17602,7 @@ yydefault: case 1170: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6013 +//line sql.y:6001 { yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} } @@ -17622,7 +17610,7 @@ yydefault: case 1171: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6017 +//line sql.y:6005 { yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} } @@ -17630,7 +17618,7 @@ yydefault: case 1172: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6021 +//line sql.y:6009 { yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} } @@ -17638,7 +17626,7 @@ yydefault: case 1173: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6025 +//line sql.y:6013 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } @@ -17646,7 +17634,7 @@ yydefault: case 1174: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6029 +//line sql.y:6017 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} } @@ -17654,7 +17642,7 @@ yydefault: case 1175: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6033 +//line sql.y:6021 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } @@ -17662,7 +17650,7 @@ yydefault: case 1176: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6037 +//line sql.y:6025 { yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } @@ -17670,7 +17658,7 @@ yydefault: case 1177: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6041 +//line sql.y:6029 { yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} } @@ -17678,7 +17666,7 @@ yydefault: case 1178: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6045 +//line sql.y:6033 { yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} } @@ -17686,7 +17674,7 @@ yydefault: case 1179: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6049 +//line sql.y:6037 { yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} } @@ -17694,7 +17682,7 @@ yydefault: case 1180: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6053 +//line sql.y:6041 { yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} } @@ -17702,7 +17690,7 @@ yydefault: case 1181: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6057 +//line sql.y:6045 { yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } @@ -17710,7 +17698,7 @@ yydefault: case 1182: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6061 +//line sql.y:6049 { yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } @@ -17718,7 +17706,7 @@ yydefault: case 1183: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6065 +//line sql.y:6053 { yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} } @@ -17726,7 +17714,7 @@ yydefault: case 1184: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6069 +//line sql.y:6057 { yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} } @@ -17734,7 +17722,7 @@ yydefault: case 1185: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6073 +//line sql.y:6061 { yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} } @@ -17742,7 +17730,7 @@ yydefault: case 1186: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6077 +//line sql.y:6065 { yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} } @@ -17750,7 +17738,7 @@ yydefault: case 1187: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6081 +//line sql.y:6069 { yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} } @@ -17758,7 +17746,7 @@ yydefault: case 1188: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6085 +//line sql.y:6073 { yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } @@ -17766,7 +17754,7 @@ yydefault: case 1189: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6089 +//line sql.y:6077 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} } @@ -17774,7 +17762,7 @@ yydefault: case 1190: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6093 +//line sql.y:6081 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } @@ -17782,7 +17770,7 @@ yydefault: case 1191: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6097 +//line sql.y:6085 { yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} } @@ -17790,7 +17778,7 @@ yydefault: case 1192: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6101 +//line sql.y:6089 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} } @@ -17798,7 +17786,7 @@ yydefault: case 1193: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6105 +//line sql.y:6093 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} } @@ -17806,7 +17794,7 @@ yydefault: case 1194: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6109 +//line sql.y:6097 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} } @@ -17814,7 +17802,7 @@ yydefault: case 1195: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6113 +//line sql.y:6101 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} } @@ -17822,7 +17810,7 @@ yydefault: case 1196: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6117 +//line sql.y:6105 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} } @@ -17830,7 +17818,7 @@ yydefault: case 1197: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6121 +//line sql.y:6109 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} } @@ -17838,7 +17826,7 @@ yydefault: case 1198: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6125 +//line sql.y:6113 { yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } @@ -17846,7 +17834,7 @@ yydefault: case 1199: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6129 +//line sql.y:6117 { yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} } @@ -17854,7 +17842,7 @@ yydefault: case 1200: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6133 +//line sql.y:6121 { yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} } @@ -17862,7 +17850,7 @@ yydefault: case 1201: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6137 +//line sql.y:6125 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } @@ -17870,7 +17858,7 @@ yydefault: case 1202: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6141 +//line sql.y:6129 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } @@ -17878,7 +17866,7 @@ yydefault: case 1203: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6145 +//line sql.y:6133 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } @@ -17886,7 +17874,7 @@ yydefault: case 1204: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6149 +//line sql.y:6137 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } @@ -17894,7 +17882,7 @@ yydefault: case 1205: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6153 +//line sql.y:6141 { yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } @@ -17902,7 +17890,7 @@ yydefault: case 1206: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6157 +//line sql.y:6145 { yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } @@ -17910,7 +17898,7 @@ yydefault: case 1207: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6161 +//line sql.y:6149 { yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } @@ -17918,7 +17906,7 @@ yydefault: case 1208: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6165 +//line sql.y:6153 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } @@ -17926,7 +17914,7 @@ yydefault: case 1209: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6169 +//line sql.y:6157 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } @@ -17934,7 +17922,7 @@ yydefault: case 1210: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6173 +//line sql.y:6161 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } @@ -17942,7 +17930,7 @@ yydefault: case 1211: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6177 +//line sql.y:6165 { yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } @@ -17950,7 +17938,7 @@ yydefault: case 1212: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6181 +//line sql.y:6169 { yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} } @@ -17958,7 +17946,7 @@ yydefault: case 1213: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6185 +//line sql.y:6173 { yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} } @@ -17966,7 +17954,7 @@ yydefault: case 1214: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6189 +//line sql.y:6177 { yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } @@ -17974,7 +17962,7 @@ yydefault: case 1215: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6193 +//line sql.y:6181 { yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -17982,7 +17970,7 @@ yydefault: case 1216: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6197 +//line sql.y:6185 { yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } @@ -17990,7 +17978,7 @@ yydefault: case 1217: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6201 +//line sql.y:6189 { yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } @@ -17998,7 +17986,7 @@ yydefault: case 1218: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6205 +//line sql.y:6193 { 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()} } @@ -18006,7 +17994,7 @@ yydefault: case 1223: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6215 +//line sql.y:6203 { yyLOCAL = yyDollar[1].exprUnion() } @@ -18014,7 +18002,7 @@ yydefault: case 1224: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6219 +//line sql.y:6207 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } @@ -18022,7 +18010,7 @@ yydefault: case 1225: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6223 +//line sql.y:6211 { yyLOCAL = yyDollar[1].variableUnion() } @@ -18030,7 +18018,7 @@ yydefault: case 1226: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6227 +//line sql.y:6215 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) @@ -18039,7 +18027,7 @@ yydefault: case 1227: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6233 +//line sql.y:6221 { yyLOCAL = nil } @@ -18047,7 +18035,7 @@ yydefault: case 1228: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6237 +//line sql.y:6225 { yyLOCAL = yyDollar[2].exprUnion() } @@ -18055,7 +18043,7 @@ yydefault: case 1229: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6243 +//line sql.y:6231 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } @@ -18063,7 +18051,7 @@ yydefault: case 1230: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6247 +//line sql.y:6235 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } @@ -18071,7 +18059,7 @@ yydefault: case 1231: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6251 +//line sql.y:6239 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } @@ -18079,7 +18067,7 @@ yydefault: case 1232: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6255 +//line sql.y:6243 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion()} } @@ -18087,7 +18075,7 @@ yydefault: case 1233: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6259 +//line sql.y:6247 { // 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()} @@ -18096,7 +18084,7 @@ yydefault: case 1234: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6264 +//line sql.y:6252 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } @@ -18104,7 +18092,7 @@ yydefault: case 1235: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6268 +//line sql.y:6256 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), MatchType: yyDollar[7].exprUnion()} } @@ -18112,7 +18100,7 @@ yydefault: case 1236: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6272 +//line sql.y:6260 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion()} } @@ -18120,7 +18108,7 @@ yydefault: case 1237: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6276 +//line sql.y:6264 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion()} } @@ -18128,7 +18116,7 @@ yydefault: case 1238: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6280 +//line sql.y:6268 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion()} } @@ -18136,7 +18124,7 @@ yydefault: case 1239: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6284 +//line sql.y:6272 { // 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()} @@ -18145,7 +18133,7 @@ yydefault: case 1240: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6289 +//line sql.y:6277 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } @@ -18153,7 +18141,7 @@ yydefault: case 1241: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6293 +//line sql.y:6281 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } @@ -18161,7 +18149,7 @@ yydefault: case 1242: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6297 +//line sql.y:6285 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } @@ -18169,7 +18157,7 @@ yydefault: case 1243: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6301 +//line sql.y:6289 { // 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()} @@ -18178,7 +18166,7 @@ yydefault: case 1244: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6308 +//line sql.y:6296 { yyLOCAL = &ExtractValueExpr{Fragment: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion()} } @@ -18186,7 +18174,7 @@ yydefault: case 1245: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6312 +//line sql.y:6300 { yyLOCAL = &UpdateXMLExpr{Target: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion(), NewXML: yyDollar[7].exprUnion()} } @@ -18194,7 +18182,7 @@ yydefault: case 1246: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6318 +//line sql.y:6306 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatBytesType, Argument: yyDollar[3].exprUnion()} } @@ -18202,7 +18190,7 @@ yydefault: case 1247: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6322 +//line sql.y:6310 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatPicoTimeType, Argument: yyDollar[3].exprUnion()} } @@ -18210,7 +18198,7 @@ yydefault: case 1248: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6326 +//line sql.y:6314 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsCurrentThreadIDType} } @@ -18218,7 +18206,7 @@ yydefault: case 1249: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6330 +//line sql.y:6318 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsThreadIDType, Argument: yyDollar[3].exprUnion()} } @@ -18226,7 +18214,7 @@ yydefault: case 1250: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6336 +//line sql.y:6324 { yyLOCAL = >IDFuncExpr{Type: GTIDSubsetType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } @@ -18234,7 +18222,7 @@ yydefault: case 1251: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6340 +//line sql.y:6328 { yyLOCAL = >IDFuncExpr{Type: GTIDSubtractType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } @@ -18242,7 +18230,7 @@ yydefault: case 1252: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6344 +//line sql.y:6332 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion()} } @@ -18250,7 +18238,7 @@ yydefault: case 1253: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6348 +//line sql.y:6336 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } @@ -18258,7 +18246,7 @@ yydefault: case 1254: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6352 +//line sql.y:6340 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion()} } @@ -18266,7 +18254,7 @@ yydefault: case 1255: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6356 +//line sql.y:6344 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } @@ -18274,7 +18262,7 @@ yydefault: case 1256: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6360 +//line sql.y:6348 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion(), Channel: yyDollar[7].exprUnion()} } @@ -18282,7 +18270,7 @@ yydefault: case 1257: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6365 +//line sql.y:6353 { yyLOCAL = nil } @@ -18290,20 +18278,20 @@ yydefault: case 1258: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6369 +//line sql.y:6357 { yyLOCAL = yyDollar[2].convertTypeUnion() } yyVAL.union = yyLOCAL case 1259: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6375 +//line sql.y:6363 { } case 1260: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6377 +//line sql.y:6365 { yyLOCAL = IntervalDayHour } @@ -18311,7 +18299,7 @@ yydefault: case 1261: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6381 +//line sql.y:6369 { yyLOCAL = IntervalDayMicrosecond } @@ -18319,7 +18307,7 @@ yydefault: case 1262: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6385 +//line sql.y:6373 { yyLOCAL = IntervalDayMinute } @@ -18327,7 +18315,7 @@ yydefault: case 1263: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6389 +//line sql.y:6377 { yyLOCAL = IntervalDaySecond } @@ -18335,7 +18323,7 @@ yydefault: case 1264: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6393 +//line sql.y:6381 { yyLOCAL = IntervalHourMicrosecond } @@ -18343,7 +18331,7 @@ yydefault: case 1265: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6397 +//line sql.y:6385 { yyLOCAL = IntervalHourMinute } @@ -18351,7 +18339,7 @@ yydefault: case 1266: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6401 +//line sql.y:6389 { yyLOCAL = IntervalHourSecond } @@ -18359,7 +18347,7 @@ yydefault: case 1267: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6405 +//line sql.y:6393 { yyLOCAL = IntervalMinuteMicrosecond } @@ -18367,7 +18355,7 @@ yydefault: case 1268: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6409 +//line sql.y:6397 { yyLOCAL = IntervalMinuteSecond } @@ -18375,7 +18363,7 @@ yydefault: case 1269: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6413 +//line sql.y:6401 { yyLOCAL = IntervalSecondMicrosecond } @@ -18383,7 +18371,7 @@ yydefault: case 1270: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6417 +//line sql.y:6405 { yyLOCAL = IntervalYearMonth } @@ -18391,7 +18379,7 @@ yydefault: case 1271: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6423 +//line sql.y:6411 { yyLOCAL = IntervalDay } @@ -18399,7 +18387,7 @@ yydefault: case 1272: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6427 +//line sql.y:6415 { yyLOCAL = IntervalWeek } @@ -18407,7 +18395,7 @@ yydefault: case 1273: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6431 +//line sql.y:6419 { yyLOCAL = IntervalHour } @@ -18415,7 +18403,7 @@ yydefault: case 1274: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6435 +//line sql.y:6423 { yyLOCAL = IntervalMinute } @@ -18423,7 +18411,7 @@ yydefault: case 1275: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6439 +//line sql.y:6427 { yyLOCAL = IntervalMonth } @@ -18431,7 +18419,7 @@ yydefault: case 1276: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6443 +//line sql.y:6431 { yyLOCAL = IntervalQuarter } @@ -18439,7 +18427,7 @@ yydefault: case 1277: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6447 +//line sql.y:6435 { yyLOCAL = IntervalSecond } @@ -18447,7 +18435,7 @@ yydefault: case 1278: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6451 +//line sql.y:6439 { yyLOCAL = IntervalMicrosecond } @@ -18455,7 +18443,7 @@ yydefault: case 1279: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6455 +//line sql.y:6443 { yyLOCAL = IntervalYear } @@ -18463,7 +18451,7 @@ yydefault: case 1282: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6465 +//line sql.y:6453 { yyLOCAL = nil } @@ -18471,7 +18459,7 @@ yydefault: case 1283: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6469 +//line sql.y:6457 { yyLOCAL = nil } @@ -18479,7 +18467,7 @@ yydefault: case 1284: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6473 +//line sql.y:6461 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } @@ -18487,7 +18475,7 @@ yydefault: case 1285: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6477 +//line sql.y:6465 { yyLOCAL = NewArgument(yyDollar[2].str[1:]) bindVariable(yylex, yyDollar[2].str[1:]) @@ -18496,7 +18484,7 @@ yydefault: case 1286: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6488 +//line sql.y:6476 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].selectExprsUnion()} } @@ -18504,7 +18492,7 @@ yydefault: case 1287: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6492 +//line sql.y:6480 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].selectExprsUnion()} } @@ -18512,7 +18500,7 @@ yydefault: case 1288: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6496 +//line sql.y:6484 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].selectExprsUnion()} } @@ -18520,7 +18508,7 @@ yydefault: case 1289: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6500 +//line sql.y:6488 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].selectExprsUnion()} } @@ -18528,7 +18516,7 @@ yydefault: case 1290: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6504 +//line sql.y:6492 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].selectExprsUnion()} } @@ -18536,7 +18524,7 @@ yydefault: case 1291: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:6510 +//line sql.y:6498 { yyLOCAL = NoOption } @@ -18544,7 +18532,7 @@ yydefault: case 1292: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:6514 +//line sql.y:6502 { yyLOCAL = BooleanModeOpt } @@ -18552,7 +18540,7 @@ yydefault: case 1293: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:6518 +//line sql.y:6506 { yyLOCAL = NaturalLanguageModeOpt } @@ -18560,7 +18548,7 @@ yydefault: case 1294: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:6522 +//line sql.y:6510 { yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt } @@ -18568,33 +18556,33 @@ yydefault: case 1295: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:6526 +//line sql.y:6514 { yyLOCAL = QueryExpansionOpt } yyVAL.union = yyLOCAL case 1296: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6532 +//line sql.y:6520 { yyVAL.str = string(yyDollar[1].identifierCI.String()) } case 1297: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6536 +//line sql.y:6524 { yyVAL.str = string(yyDollar[1].str) } case 1298: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6540 +//line sql.y:6528 { yyVAL.str = string(yyDollar[1].str) } case 1299: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6546 +//line sql.y:6534 { yyLOCAL = nil } @@ -18602,7 +18590,7 @@ yydefault: case 1300: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6550 +//line sql.y:6538 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} } @@ -18610,7 +18598,7 @@ yydefault: case 1301: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6554 +//line sql.y:6542 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} } @@ -18618,7 +18606,7 @@ yydefault: case 1302: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6560 +//line sql.y:6548 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } @@ -18626,7 +18614,7 @@ yydefault: case 1303: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6564 +//line sql.y:6552 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].columnCharset} } @@ -18634,7 +18622,7 @@ yydefault: case 1304: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6568 +//line sql.y:6556 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -18642,7 +18630,7 @@ yydefault: case 1305: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6572 +//line sql.y:6560 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } @@ -18650,7 +18638,7 @@ yydefault: case 1306: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6576 +//line sql.y:6564 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length @@ -18660,7 +18648,7 @@ yydefault: case 1307: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6582 +//line sql.y:6570 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -18668,7 +18656,7 @@ yydefault: case 1308: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6586 +//line sql.y:6574 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } @@ -18676,7 +18664,7 @@ yydefault: case 1309: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6590 +//line sql.y:6578 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -18684,7 +18672,7 @@ yydefault: case 1310: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6594 +//line sql.y:6582 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -18692,7 +18680,7 @@ yydefault: case 1311: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6598 +//line sql.y:6586 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } @@ -18700,7 +18688,7 @@ yydefault: case 1312: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6602 +//line sql.y:6590 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -18708,7 +18696,7 @@ yydefault: case 1313: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6606 +//line sql.y:6594 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -18716,7 +18704,7 @@ yydefault: case 1314: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6610 +//line sql.y:6598 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } @@ -18724,7 +18712,7 @@ yydefault: case 1315: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6614 +//line sql.y:6602 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -18732,7 +18720,7 @@ yydefault: case 1316: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6618 +//line sql.y:6606 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -18740,7 +18728,7 @@ yydefault: case 1317: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:6624 +//line sql.y:6612 { yyLOCAL = false } @@ -18748,7 +18736,7 @@ yydefault: case 1318: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:6628 +//line sql.y:6616 { yyLOCAL = true } @@ -18756,7 +18744,7 @@ yydefault: case 1319: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6633 +//line sql.y:6621 { yyLOCAL = nil } @@ -18764,34 +18752,34 @@ yydefault: case 1320: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6637 +//line sql.y:6625 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1321: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6642 +//line sql.y:6630 { yyVAL.str = string("") } case 1322: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6646 +//line sql.y:6634 { yyVAL.str = " separator " + encodeSQLString(yyDollar[2].str) } case 1323: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*When -//line sql.y:6652 +//line sql.y:6640 { yyLOCAL = []*When{yyDollar[1].whenUnion()} } yyVAL.union = yyLOCAL case 1324: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6656 +//line sql.y:6644 { yySLICE := (*[]*When)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].whenUnion()) @@ -18799,7 +18787,7 @@ yydefault: case 1325: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *When -//line sql.y:6662 +//line sql.y:6650 { yyLOCAL = &When{Cond: yyDollar[2].exprUnion(), Val: yyDollar[4].exprUnion()} } @@ -18807,7 +18795,7 @@ yydefault: case 1326: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6667 +//line sql.y:6655 { yyLOCAL = nil } @@ -18815,7 +18803,7 @@ yydefault: case 1327: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6671 +//line sql.y:6659 { yyLOCAL = yyDollar[2].exprUnion() } @@ -18823,7 +18811,7 @@ yydefault: case 1328: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:6677 +//line sql.y:6665 { yyLOCAL = &ColName{Name: yyDollar[1].identifierCI} } @@ -18831,7 +18819,7 @@ yydefault: case 1329: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:6681 +//line sql.y:6669 { yyLOCAL = &ColName{Name: NewIdentifierCI(string(yyDollar[1].str))} } @@ -18839,7 +18827,7 @@ yydefault: case 1330: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColName -//line sql.y:6685 +//line sql.y:6673 { yyLOCAL = &ColName{Qualifier: TableName{Name: yyDollar[1].identifierCS}, Name: yyDollar[3].identifierCI} } @@ -18847,7 +18835,7 @@ yydefault: case 1331: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColName -//line sql.y:6689 +//line sql.y:6677 { yyLOCAL = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}, Name: yyDollar[5].identifierCI} } @@ -18855,7 +18843,7 @@ yydefault: case 1332: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6695 +//line sql.y:6683 { yyLOCAL = yyDollar[1].colNameUnion() } @@ -18863,7 +18851,7 @@ yydefault: case 1333: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6699 +//line sql.y:6687 { yyLOCAL = &Offset{V: convertStringToInt(yyDollar[1].str)} } @@ -18871,7 +18859,7 @@ yydefault: case 1334: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6705 +//line sql.y:6693 { // TODO(sougou): Deprecate this construct. if yyDollar[1].identifierCI.Lowered() != "value" { @@ -18884,7 +18872,7 @@ yydefault: case 1335: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6714 +//line sql.y:6702 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } @@ -18892,7 +18880,7 @@ yydefault: case 1336: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6718 +//line sql.y:6706 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) @@ -18901,7 +18889,7 @@ yydefault: case 1337: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:6724 +//line sql.y:6712 { yyLOCAL = nil } @@ -18909,7 +18897,7 @@ yydefault: case 1338: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:6728 +//line sql.y:6716 { yyLOCAL = yyDollar[3].exprsUnion() } @@ -18917,7 +18905,7 @@ yydefault: case 1339: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6733 +//line sql.y:6721 { yyLOCAL = nil } @@ -18925,7 +18913,7 @@ yydefault: case 1340: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6737 +//line sql.y:6725 { yyLOCAL = yyDollar[2].exprUnion() } @@ -18933,7 +18921,7 @@ yydefault: case 1341: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *NamedWindow -//line sql.y:6743 +//line sql.y:6731 { yyLOCAL = &NamedWindow{yyDollar[2].windowDefinitionsUnion()} } @@ -18941,14 +18929,14 @@ yydefault: case 1342: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6749 +//line sql.y:6737 { yyLOCAL = NamedWindows{yyDollar[1].namedWindowUnion()} } yyVAL.union = yyLOCAL case 1343: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6753 +//line sql.y:6741 { yySLICE := (*NamedWindows)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].namedWindowUnion()) @@ -18956,7 +18944,7 @@ yydefault: case 1344: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6758 +//line sql.y:6746 { yyLOCAL = nil } @@ -18964,7 +18952,7 @@ yydefault: case 1345: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6762 +//line sql.y:6750 { yyLOCAL = yyDollar[1].namedWindowsUnion() } @@ -18972,7 +18960,7 @@ yydefault: case 1346: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6767 +//line sql.y:6755 { yyLOCAL = nil } @@ -18980,7 +18968,7 @@ yydefault: case 1347: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6771 +//line sql.y:6759 { yyLOCAL = yyDollar[1].orderByUnion() } @@ -18988,7 +18976,7 @@ yydefault: case 1348: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6777 +//line sql.y:6765 { yyLOCAL = yyDollar[3].orderByUnion() } @@ -18996,14 +18984,14 @@ yydefault: case 1349: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6783 +//line sql.y:6771 { yyLOCAL = OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL case 1350: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6787 +//line sql.y:6775 { yySLICE := (*OrderBy)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].orderUnion()) @@ -19011,7 +18999,7 @@ yydefault: case 1351: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Order -//line sql.y:6793 +//line sql.y:6781 { yyLOCAL = &Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].orderDirectionUnion()} } @@ -19019,7 +19007,7 @@ yydefault: case 1352: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6798 +//line sql.y:6786 { yyLOCAL = AscOrder } @@ -19027,7 +19015,7 @@ yydefault: case 1353: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6802 +//line sql.y:6790 { yyLOCAL = AscOrder } @@ -19035,7 +19023,7 @@ yydefault: case 1354: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6806 +//line sql.y:6794 { yyLOCAL = DescOrder } @@ -19043,7 +19031,7 @@ yydefault: case 1355: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Limit -//line sql.y:6811 +//line sql.y:6799 { yyLOCAL = nil } @@ -19051,7 +19039,7 @@ yydefault: case 1356: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Limit -//line sql.y:6815 +//line sql.y:6803 { yyLOCAL = yyDollar[1].limitUnion() } @@ -19059,7 +19047,7 @@ yydefault: case 1357: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Limit -//line sql.y:6821 +//line sql.y:6809 { yyLOCAL = &Limit{Rowcount: yyDollar[2].exprUnion()} } @@ -19067,7 +19055,7 @@ yydefault: case 1358: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:6825 +//line sql.y:6813 { yyLOCAL = &Limit{Offset: yyDollar[2].exprUnion(), Rowcount: yyDollar[4].exprUnion()} } @@ -19075,7 +19063,7 @@ yydefault: case 1359: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:6829 +//line sql.y:6817 { yyLOCAL = &Limit{Offset: yyDollar[4].exprUnion(), Rowcount: yyDollar[2].exprUnion()} } @@ -19083,7 +19071,7 @@ yydefault: case 1360: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:6834 +//line sql.y:6822 { yyLOCAL = nil } @@ -19091,7 +19079,7 @@ yydefault: case 1361: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:6838 +//line sql.y:6826 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } @@ -19099,7 +19087,7 @@ yydefault: case 1362: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:6842 +//line sql.y:6830 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } @@ -19107,7 +19095,7 @@ yydefault: case 1363: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:6846 +//line sql.y:6834 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } @@ -19115,7 +19103,7 @@ yydefault: case 1364: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:6850 +//line sql.y:6838 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } @@ -19123,7 +19111,7 @@ yydefault: case 1365: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6857 +//line sql.y:6845 { yyLOCAL = &LockOption{Type: DefaultType} } @@ -19131,7 +19119,7 @@ yydefault: case 1366: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6861 +//line sql.y:6849 { yyLOCAL = &LockOption{Type: NoneType} } @@ -19139,7 +19127,7 @@ yydefault: case 1367: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6865 +//line sql.y:6853 { yyLOCAL = &LockOption{Type: SharedType} } @@ -19147,7 +19135,7 @@ yydefault: case 1368: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6869 +//line sql.y:6857 { yyLOCAL = &LockOption{Type: ExclusiveType} } @@ -19155,7 +19143,7 @@ yydefault: case 1369: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6875 +//line sql.y:6863 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } @@ -19163,7 +19151,7 @@ yydefault: case 1370: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6879 +//line sql.y:6867 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } @@ -19171,7 +19159,7 @@ yydefault: case 1371: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6883 +//line sql.y:6871 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } @@ -19179,93 +19167,93 @@ yydefault: case 1372: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6887 +//line sql.y:6875 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL case 1373: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6892 +//line sql.y:6880 { yyVAL.str = "" } case 1374: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6896 +//line sql.y:6884 { yyVAL.str = string(yyDollar[3].str) } case 1375: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6900 +//line sql.y:6888 { yyVAL.str = string(yyDollar[3].str) } case 1376: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6904 +//line sql.y:6892 { yyVAL.str = string(yyDollar[3].str) } case 1377: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6909 +//line sql.y:6897 { yyVAL.str = "" } case 1378: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6913 +//line sql.y:6901 { yyVAL.str = yyDollar[3].str } case 1379: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6919 +//line sql.y:6907 { yyVAL.str = string(yyDollar[1].str) } case 1380: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6923 +//line sql.y:6911 { yyVAL.str = string(yyDollar[1].str) } case 1381: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6928 +//line sql.y:6916 { yyVAL.str = "" } case 1382: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:6932 +//line sql.y:6920 { yyVAL.str = yyDollar[2].str } case 1383: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6937 +//line sql.y:6925 { yyVAL.str = "cascaded" } case 1384: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6941 +//line sql.y:6929 { yyVAL.str = string(yyDollar[1].str) } case 1385: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6945 +//line sql.y:6933 { yyVAL.str = string(yyDollar[1].str) } case 1386: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Definer -//line sql.y:6950 +//line sql.y:6938 { yyLOCAL = nil } @@ -19273,7 +19261,7 @@ yydefault: case 1387: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:6954 +//line sql.y:6942 { yyLOCAL = yyDollar[3].definerUnion() } @@ -19281,7 +19269,7 @@ yydefault: case 1388: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Definer -//line sql.y:6960 +//line sql.y:6948 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), @@ -19291,7 +19279,7 @@ yydefault: case 1389: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:6966 +//line sql.y:6954 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), @@ -19301,7 +19289,7 @@ yydefault: case 1390: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Definer -//line sql.y:6972 +//line sql.y:6960 { yyLOCAL = &Definer{ Name: yyDollar[1].str, @@ -19311,32 +19299,32 @@ yydefault: yyVAL.union = yyLOCAL case 1391: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6981 +//line sql.y:6969 { yyVAL.str = encodeSQLString(yyDollar[1].str) } case 1392: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6985 +//line sql.y:6973 { yyVAL.str = formatIdentifier(yyDollar[1].str) } case 1393: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6990 +//line sql.y:6978 { yyVAL.str = "" } case 1394: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6994 +//line sql.y:6982 { yyVAL.str = formatAddress(yyDollar[1].str) } case 1395: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:7000 +//line sql.y:6988 { yyLOCAL = ForUpdateLock } @@ -19344,7 +19332,7 @@ yydefault: case 1396: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7004 +//line sql.y:6992 { yyLOCAL = ShareModeLock } @@ -19352,7 +19340,7 @@ yydefault: case 1397: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7010 +//line sql.y:6998 { 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} } @@ -19360,7 +19348,7 @@ yydefault: case 1398: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7014 +//line sql.y:7002 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } @@ -19368,177 +19356,177 @@ yydefault: case 1399: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7018 +//line sql.y:7006 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL case 1400: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7023 +//line sql.y:7011 { yyVAL.str = "" } case 1401: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7027 +//line sql.y:7015 { yyVAL.str = " format csv" + yyDollar[3].str } case 1402: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7031 +//line sql.y:7019 { yyVAL.str = " format text" + yyDollar[3].str } case 1403: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7036 +//line sql.y:7024 { yyVAL.str = "" } case 1404: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7040 +//line sql.y:7028 { yyVAL.str = " header" } case 1405: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7045 +//line sql.y:7033 { yyVAL.str = "" } case 1406: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7049 +//line sql.y:7037 { yyVAL.str = " manifest on" } case 1407: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7053 +//line sql.y:7041 { yyVAL.str = " manifest off" } case 1408: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7058 +//line sql.y:7046 { yyVAL.str = "" } case 1409: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7062 +//line sql.y:7050 { yyVAL.str = " overwrite on" } case 1410: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7066 +//line sql.y:7054 { yyVAL.str = " overwrite off" } case 1411: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7072 +//line sql.y:7060 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } case 1412: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7077 +//line sql.y:7065 { yyVAL.str = "" } case 1413: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7081 +//line sql.y:7069 { yyVAL.str = " lines" + yyDollar[2].str } case 1414: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7087 +//line sql.y:7075 { yyVAL.str = yyDollar[1].str } case 1415: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7091 +//line sql.y:7079 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } case 1416: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7097 +//line sql.y:7085 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } case 1417: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7101 +//line sql.y:7089 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } case 1418: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7106 +//line sql.y:7094 { yyVAL.str = "" } case 1419: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7110 +//line sql.y:7098 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } case 1420: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7116 +//line sql.y:7104 { yyVAL.str = yyDollar[1].str } case 1421: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7120 +//line sql.y:7108 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } case 1422: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7126 +//line sql.y:7114 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } case 1423: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7130 +//line sql.y:7118 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } case 1424: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7134 +//line sql.y:7122 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } case 1425: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7139 +//line sql.y:7127 { yyVAL.str = "" } case 1426: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7143 +//line sql.y:7131 { yyVAL.str = " optionally" } case 1427: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Insert -//line sql.y:7156 +//line sql.y:7144 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion()} } @@ -19546,7 +19534,7 @@ yydefault: case 1428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7160 +//line sql.y:7148 { yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} } @@ -19554,7 +19542,7 @@ yydefault: case 1429: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7164 +//line sql.y:7152 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion()} } @@ -19562,7 +19550,7 @@ yydefault: case 1430: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7168 +//line sql.y:7156 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion()} } @@ -19570,7 +19558,7 @@ yydefault: case 1431: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7172 +//line sql.y:7160 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} } @@ -19578,7 +19566,7 @@ yydefault: case 1432: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7178 +//line sql.y:7166 { yyLOCAL = Columns{yyDollar[1].identifierCI} } @@ -19586,21 +19574,21 @@ yydefault: case 1433: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7182 +//line sql.y:7170 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL case 1434: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7186 +//line sql.y:7174 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } case 1435: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7190 +//line sql.y:7178 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) @@ -19608,7 +19596,7 @@ yydefault: case 1436: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7195 +//line sql.y:7183 { yyLOCAL = nil } @@ -19616,7 +19604,7 @@ yydefault: case 1437: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7199 +//line sql.y:7187 { yyLOCAL = yyDollar[5].updateExprsUnion() } @@ -19624,14 +19612,14 @@ yydefault: case 1438: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7205 +//line sql.y:7193 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL case 1439: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7209 +//line sql.y:7197 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) @@ -19639,7 +19627,7 @@ yydefault: case 1440: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7215 +//line sql.y:7203 { yyLOCAL = yyDollar[1].valTupleUnion() } @@ -19647,7 +19635,7 @@ yydefault: case 1441: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7219 +//line sql.y:7207 { yyLOCAL = ValTuple{} } @@ -19655,7 +19643,7 @@ yydefault: case 1442: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7225 +//line sql.y:7213 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } @@ -19663,7 +19651,7 @@ yydefault: case 1443: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7229 +//line sql.y:7217 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } @@ -19671,7 +19659,7 @@ yydefault: case 1444: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7234 +//line sql.y:7222 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -19683,14 +19671,14 @@ yydefault: case 1445: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7244 +//line sql.y:7232 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL case 1446: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7248 +//line sql.y:7236 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) @@ -19698,21 +19686,21 @@ yydefault: case 1447: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7254 +//line sql.y:7242 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1449: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7261 +//line sql.y:7249 { yyVAL.str = "charset" } case 1452: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7271 +//line sql.y:7259 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } @@ -19720,7 +19708,7 @@ yydefault: case 1453: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7275 +//line sql.y:7263 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } @@ -19728,7 +19716,7 @@ yydefault: case 1454: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7279 +//line sql.y:7267 { yyLOCAL = &Default{} } @@ -19736,7 +19724,7 @@ yydefault: case 1457: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7288 +//line sql.y:7276 { yyLOCAL = false } @@ -19744,7 +19732,7 @@ yydefault: case 1458: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7290 +//line sql.y:7278 { yyLOCAL = true } @@ -19752,7 +19740,7 @@ yydefault: case 1459: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7293 +//line sql.y:7281 { yyLOCAL = false } @@ -19760,7 +19748,7 @@ yydefault: case 1460: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7295 +//line sql.y:7283 { yyLOCAL = true } @@ -19768,7 +19756,7 @@ yydefault: case 1461: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7298 +//line sql.y:7286 { yyLOCAL = false } @@ -19776,7 +19764,7 @@ yydefault: case 1462: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:7300 +//line sql.y:7288 { yyLOCAL = true } @@ -19784,7 +19772,7 @@ yydefault: case 1463: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:7303 +//line sql.y:7291 { yyLOCAL = false } @@ -19792,33 +19780,33 @@ yydefault: case 1464: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:7305 +//line sql.y:7293 { yyLOCAL = true } yyVAL.union = yyLOCAL case 1465: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7308 +//line sql.y:7296 { yyVAL.empty = struct{}{} } case 1466: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7310 +//line sql.y:7298 { yyVAL.empty = struct{}{} } case 1467: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7312 +//line sql.y:7300 { yyVAL.empty = struct{}{} } case 1468: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:7316 +//line sql.y:7304 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } @@ -19826,7 +19814,7 @@ yydefault: case 1469: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:7321 +//line sql.y:7309 { yyLOCAL = nil } @@ -19834,7 +19822,7 @@ yydefault: case 1470: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:7325 +//line sql.y:7313 { yyLOCAL = yyDollar[1].exprsUnion() } @@ -19842,7 +19830,7 @@ yydefault: case 1471: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7330 +//line sql.y:7318 { yyLOCAL = nil } @@ -19850,7 +19838,7 @@ yydefault: case 1472: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7332 +//line sql.y:7320 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } @@ -19858,95 +19846,90 @@ yydefault: case 1473: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:7336 +//line sql.y:7324 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL case 1474: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7342 +//line sql.y:7330 { yyVAL.identifierCI = yyDollar[1].identifierCI } case 1475: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7346 +//line sql.y:7334 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1477: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7353 +//line sql.y:7341 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1478: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7359 +//line sql.y:7347 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 1479: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7363 +//line sql.y:7351 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 1480: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7369 +//line sql.y:7357 { yyVAL.identifierCS = NewIdentifierCS("") } case 1481: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7373 +//line sql.y:7361 { yyVAL.identifierCS = yyDollar[1].identifierCS } case 1483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7380 +//line sql.y:7368 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 2033: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7956 +//line sql.y:7944 { - if incNesting(yylex) { - yylex.Error("max nesting level reached") - return 1 - } } case 2034: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7965 +//line sql.y:7949 { - decNesting(yylex) } case 2035: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7970 +//line sql.y:7953 { skipToEnd(yylex) } case 2036: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7975 +//line sql.y:7958 { skipToEnd(yylex) } case 2037: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7979 +//line sql.y:7962 { skipToEnd(yylex) } case 2038: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7983 +//line sql.y:7966 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index add7976ecb4..f77a92a4443 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -28,18 +28,6 @@ func setDDL(yylex yyLexer, node Statement) { yylex.(*Tokenizer).partialDDL = node } -func incNesting(yylex yyLexer) bool { - yylex.(*Tokenizer).nesting++ - if yylex.(*Tokenizer).nesting == 200 { - return true - } - return false -} - -func decNesting(yylex yyLexer) { - yylex.(*Tokenizer).nesting-- -} - // skipToEnd forces the lexer to end prematurely. Not all SQL statements // are supported by the Parser, thus calling skipToEnd will make the lexer // return EOF early. @@ -7954,16 +7942,11 @@ non_reserved_keyword: openb: '(' { - if incNesting(yylex) { - yylex.Error("max nesting level reached") - return 1 - } } closeb: ')' { - decNesting(yylex) } skip_to_end: diff --git a/go/vt/sqlparser/token.go b/go/vt/sqlparser/token.go index 16cda39dd46..148f4d44616 100644 --- a/go/vt/sqlparser/token.go +++ b/go/vt/sqlparser/token.go @@ -41,7 +41,6 @@ type Tokenizer struct { lastToken string posVarIndex int partialDDL Statement - nesting int multi bool specialComment *Tokenizer @@ -703,7 +702,6 @@ func (tkn *Tokenizer) reset() { tkn.partialDDL = nil tkn.specialComment = nil tkn.posVarIndex = 0 - tkn.nesting = 0 tkn.SkipToEnd = false } From 60baf513a2a45ef9178a73cd9564cd8909fd8e79 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 15:07:57 -0400 Subject: [PATCH 122/233] [release-16.0] VReplication: Fix VDiff2 DeleteByUUID Query (#13255) (#13282) * Fix VDiff2 DeleteByUUID Query It was incorrect and thus deleting every row in the vdiff table. IIRC, this was a mistake on my part as I was first using a WHERE based query and then had to move to LEFT JOIN usage as there may not always be vdiff_table records. When doing so, however, I left the last AND clause in place when it should have become the sole predicate in a new WHERE clause after the LEFT JOIN condition. Signed-off-by: Matt Lord * Add unit test as well Signed-off-by: Matt Lord * Minor changes after review Signed-off-by: Matt Lord --------- Signed-off-by: Matt Lord Co-authored-by: Matt Lord --- go/test/endtoend/vreplication/vdiff2_test.go | 42 +++++++++++++-- .../vreplication/vdiff_helper_test.go | 27 +++++----- .../tabletmanager/vdiff/action_test.go | 53 ++++++++++++++++--- go/vt/vttablet/tabletmanager/vdiff/schema.go | 2 +- 4 files changed, 98 insertions(+), 26 deletions(-) diff --git a/go/test/endtoend/vreplication/vdiff2_test.go b/go/test/endtoend/vreplication/vdiff2_test.go index 06eddf95c9b..82e2b24f4b3 100644 --- a/go/test/endtoend/vreplication/vdiff2_test.go +++ b/go/test/endtoend/vreplication/vdiff2_test.go @@ -23,6 +23,7 @@ import ( "time" "github.com/stretchr/testify/require" + "github.com/tidwall/gjson" "vitess.io/vitess/go/test/endtoend/cluster" ) @@ -234,16 +235,47 @@ func testCLIErrors(t *testing.T, ksWorkflow, cells string) { func testDelete(t *testing.T, ksWorkflow, cells string) { t.Run("Delete", func(t *testing.T) { - // test show verbose too as a side effect + // Let's be sure that we have at least 3 unique VDiffs. + // We have one record in the SHOW output per VDiff, per + // shard. So we want to get a count of the unique VDiffs + // by UUID. + uuidCount := func(uuids []gjson.Result) int64 { + seen := make(map[string]struct{}) + for _, uuid := range uuids { + seen[uuid.String()] = struct{}{} + } + return int64(len(seen)) + } + _, output := performVDiff2Action(t, ksWorkflow, cells, "show", "all", false) + initialVDiffCount := uuidCount(gjson.Get(output, "#.UUID").Array()) + for ; initialVDiffCount < 3; initialVDiffCount++ { + _, _ = performVDiff2Action(t, ksWorkflow, cells, "create", "", false) + } + + // Now let's confirm that we have at least 3 unique VDiffs. + _, output = performVDiff2Action(t, ksWorkflow, cells, "show", "all", false) + require.GreaterOrEqual(t, uuidCount(gjson.Get(output, "#.UUID").Array()), int64(3)) + // And that our initial count is what we expect. + require.Equal(t, initialVDiffCount, uuidCount(gjson.Get(output, "#.UUID").Array())) + + // Test show last with verbose too as a side effect. uuid, output := performVDiff2Action(t, ksWorkflow, cells, "show", "last", false, "--verbose") - // only present with --verbose + // The TableSummary is only present with --verbose. require.Contains(t, output, `"TableSummary":`) + + // Now let's delete one of the VDiffs. _, output = performVDiff2Action(t, ksWorkflow, cells, "delete", uuid, false) - require.Contains(t, output, `"Status": "completed"`) + require.Equal(t, "completed", gjson.Get(output, "Status").String()) + // And confirm that our unique VDiff count has only decreased by one. + _, output = performVDiff2Action(t, ksWorkflow, cells, "show", "all", false) + require.Equal(t, initialVDiffCount-1, uuidCount(gjson.Get(output, "#.UUID").Array())) + + // Now let's delete all of them. _, output = performVDiff2Action(t, ksWorkflow, cells, "delete", "all", false) - require.Contains(t, output, `"Status": "completed"`) + require.Equal(t, "completed", gjson.Get(output, "Status").String()) + // And finally confirm that we have no more VDiffs. _, output = performVDiff2Action(t, ksWorkflow, cells, "show", "all", false) - require.Equal(t, "[]\n", output) + require.Equal(t, int64(0), gjson.Get(output, "#").Int()) }) } diff --git a/go/test/endtoend/vreplication/vdiff_helper_test.go b/go/test/endtoend/vreplication/vdiff_helper_test.go index 4a7e5cb8902..9dc2648f574 100644 --- a/go/test/endtoend/vreplication/vdiff_helper_test.go +++ b/go/test/endtoend/vreplication/vdiff_helper_test.go @@ -23,8 +23,8 @@ import ( "testing" "time" - "github.com/buger/jsonparser" "github.com/stretchr/testify/require" + "github.com/tidwall/gjson" "vitess.io/vitess/go/sqlescape" "vitess.io/vitess/go/sqltypes" @@ -174,7 +174,7 @@ func performVDiff2Action(t *testing.T, ksWorkflow, cells, action, actionArg stri log.Infof("vdiff2 output: %+v (err: %+v)", output, err) if !expectError { require.Nil(t, err) - uuid, err = jsonparser.GetString([]byte(output), "UUID") + uuid = gjson.Get(output, "UUID").String() if action != "delete" && !(action == "show" && actionArg == "all") { // a UUID is not required require.NoError(t, err) require.NotEmpty(t, uuid) @@ -193,19 +193,18 @@ type vdiffInfo struct { Progress vdiff2.ProgressReport } -func getVDiffInfo(jsonStr string) *vdiffInfo { +func getVDiffInfo(json string) *vdiffInfo { var info vdiffInfo - json := []byte(jsonStr) - info.Workflow, _ = jsonparser.GetString(json, "Workflow") - info.Keyspace, _ = jsonparser.GetString(json, "Keyspace") - info.State, _ = jsonparser.GetString(json, "State") - info.Shards, _ = jsonparser.GetString(json, "Shards") - info.RowsCompared, _ = jsonparser.GetInt(json, "RowsCompared") - info.StartedAt, _ = jsonparser.GetString(json, "StartedAt") - info.CompletedAt, _ = jsonparser.GetString(json, "CompletedAt") - info.HasMismatch, _ = jsonparser.GetBoolean(json, "HasMismatch") - info.Progress.Percentage, _ = jsonparser.GetFloat(json, "Progress", "Percentage") - info.Progress.ETA, _ = jsonparser.GetString(json, "Progress", "ETA") + info.Workflow = gjson.Get(json, "Workflow").String() + info.Keyspace = gjson.Get(json, "Keyspace").String() + info.State = gjson.Get(json, "State").String() + info.Shards = gjson.Get(json, "Shards").String() + info.RowsCompared = gjson.Get(json, "RowsCompared").Int() + info.StartedAt = gjson.Get(json, "StartedAt").String() + info.CompletedAt = gjson.Get(json, "CompletedAt").String() + info.HasMismatch = gjson.Get(json, "HasMismatch").Bool() + info.Progress.Percentage = gjson.Get(json, "Progress.Percentage").Float() + info.Progress.ETA = gjson.Get(json, "Progress.ETA").String() return &info } diff --git a/go/vt/vttablet/tabletmanager/vdiff/action_test.go b/go/vt/vttablet/tabletmanager/vdiff/action_test.go index 7c06f5b6f2f..b6ad3d65775 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/action_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/action_test.go @@ -18,10 +18,14 @@ package vdiff import ( "context" + "fmt" "reflect" "testing" "time" + "github.com/google/uuid" + + "vitess.io/vitess/go/sqltypes" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vterrors" @@ -30,27 +34,64 @@ import ( func TestPerformVDiffAction(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() + vdiffenv := newTestVDiffEnv(t) + defer vdiffenv.close() + keyspace := "ks" + workflow := "wf" + uuid := uuid.New().String() tests := []struct { - name string - vde *Engine - req *tabletmanagerdatapb.VDiffRequest - want *tabletmanagerdatapb.VDiffResponse - wantErr error + name string + vde *Engine + req *tabletmanagerdatapb.VDiffRequest + want *tabletmanagerdatapb.VDiffResponse + expectQueries []string + wantErr error }{ { name: "engine not open", vde: &Engine{isOpen: false}, wantErr: vterrors.New(vtrpcpb.Code_UNAVAILABLE, "vdiff engine is closed"), }, + { + name: "delete by uuid", + req: &tabletmanagerdatapb.VDiffRequest{ + Action: string(DeleteAction), + ActionArg: uuid, + }, + expectQueries: []string{ + fmt.Sprintf(`delete from vd, vdt using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) + where vd.vdiff_uuid = %s`, encodeString(uuid)), + }, + }, + { + name: "delete all", + req: &tabletmanagerdatapb.VDiffRequest{ + Action: string(DeleteAction), + ActionArg: "all", + Keyspace: keyspace, + Workflow: workflow, + }, + expectQueries: []string{ + fmt.Sprintf(`delete from vd, vdt, vdl using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) + left join _vt.vdiff_log as vdl on (vd.id = vdl.vdiff_id) + where vd.keyspace = %s and vd.workflow = %s`, encodeString(keyspace), encodeString(workflow)), + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + if tt.vde == nil { + tt.vde = vdiffenv.vde + } + for _, query := range tt.expectQueries { + vdiffenv.dbClient.ExpectRequest(query, &sqltypes.Result{}, nil) + } got, err := tt.vde.PerformVDiffAction(ctx, tt.req) if tt.wantErr != nil && !vterrors.Equals(err, tt.wantErr) { t.Errorf("Engine.PerformVDiffAction() error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { + if tt.want != nil && !reflect.DeepEqual(got, tt.want) { t.Errorf("Engine.PerformVDiffAction() = %v, want %v", got, tt.want) } }) diff --git a/go/vt/vttablet/tabletmanager/vdiff/schema.go b/go/vt/vttablet/tabletmanager/vdiff/schema.go index 6524ccdd0f2..fa226aa2c74 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/schema.go +++ b/go/vt/vttablet/tabletmanager/vdiff/schema.go @@ -30,7 +30,7 @@ const ( left join _vt.vdiff_log as vdl on (vd.id = vdl.vdiff_id) where vd.keyspace = %s and vd.workflow = %s` sqlDeleteVDiffByUUID = `delete from vd, vdt using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) - and vd.vdiff_uuid = %s` + where vd.vdiff_uuid = %s` sqlVDiffSummary = `select vd.state as vdiff_state, vd.last_error as last_error, vdt.table_name as table_name, vd.vdiff_uuid as 'uuid', vdt.state as table_state, vdt.table_rows as table_rows, vd.started_at as started_at, vdt.rows_compared as rows_compared, vd.completed_at as completed_at, From 2b26d57dd9fa6353389685cc91b195da8f1d497c Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 17:18:42 +0530 Subject: [PATCH 123/233] [release-16.0] Bug fix: SQL queries erroring with message `unknown aggregation random` (#13330) (#13334) * fixed unknown aggregation random bug Signed-off-by: Arvind Murty <10248018+arvind-murty@users.noreply.github.com> * fixed schema.sql formatting Signed-off-by: Arvind Murty <10248018+arvind-murty@users.noreply.github.com> --------- Signed-off-by: Arvind Murty <10248018+arvind-murty@users.noreply.github.com> Co-authored-by: Arvind Murty <10248018+arvind-murty@users.noreply.github.com> --- .../queries/aggregation/aggregation_test.go | 3 +++ .../vtgate/queries/aggregation/schema.sql | 23 ++++++++++++++++++- .../vtgate/queries/aggregation/vschema.json | 16 +++++++++++++ go/vt/vtgate/engine/scalar_aggregation.go | 3 ++- 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go index f07fb734df8..db29644988e 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go @@ -383,6 +383,9 @@ func TestAggregateRandom(t *testing.T) { mcmp.Exec("insert into t2(id, shardKey) values (1, 10), (2, 20)") 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)]]`) + + mcmp.Exec("set sql_mode=''") + mcmp.AssertMatches("select /*vt+ PLANNER=Gen4 */ tbl0.comm, count(*) from emp as tbl0, emp as tbl1 where tbl0.empno = tbl1.deptno", `[[NULL INT64(0)]]`) } // TestAggregateLeftJoin tests that aggregates work with left joins and does not ignore the count when column value does not match the right side table. diff --git a/go/test/endtoend/vtgate/queries/aggregation/schema.sql b/go/test/endtoend/vtgate/queries/aggregation/schema.sql index 0375bdb8499..e1489b4bd21 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/schema.sql +++ b/go/test/endtoend/vtgate/queries/aggregation/schema.sql @@ -75,4 +75,25 @@ CREATE TABLE t10 ( k BIGINT PRIMARY KEY, a INT, b INT -); \ No newline at end of file +); + +CREATE TABLE emp ( + empno bigint NOT NULL, + ename VARCHAR(10), + job VARCHAR(9), + mgr bigint, + hiredate DATE, + sal bigint, + comm bigint, + deptno bigint, + PRIMARY KEY (empno) +) Engine = InnoDB + COLLATE = utf8mb4_general_ci; + +CREATE TABLE dept ( + deptno bigint, + dname VARCHAR(14), + loc VARCHAR(13), + PRIMARY KEY (deptno) +) Engine = InnoDB + COLLATE = utf8mb4_general_ci; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/aggregation/vschema.json b/go/test/endtoend/vtgate/queries/aggregation/vschema.json index 4d1623d5633..050202aed81 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/vschema.json +++ b/go/test/endtoend/vtgate/queries/aggregation/vschema.json @@ -131,6 +131,22 @@ "name": "hash" } ] + }, + "emp": { + "column_vindexes": [ + { + "column": "deptno", + "name": "hash" + } + ] + }, + "dept": { + "column_vindexes": [ + { + "column": "deptno", + "name": "hash" + } + ] } } } \ No newline at end of file diff --git a/go/vt/vtgate/engine/scalar_aggregation.go b/go/vt/vtgate/engine/scalar_aggregation.go index a1a76091689..2b66073ac5e 100644 --- a/go/vt/vtgate/engine/scalar_aggregation.go +++ b/go/vt/vtgate/engine/scalar_aggregation.go @@ -213,7 +213,8 @@ func createEmptyValueFor(opcode AggregateOpcode) (sqltypes.Value, error) { AggregateSumDistinct, AggregateSum, AggregateMin, - AggregateMax: + AggregateMax, + AggregateRandom: return sqltypes.NULL, nil } From 2702da2fb2ed717c47f3971bc2e9c75aa7700ce0 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 17:19:22 +0530 Subject: [PATCH 124/233] [release-16.0] mysqlctl: Correctly encode database and table names (#13312) (#13323) * mysqlctl: Correctly encode database and table names These need to be escaped as SQL strings for queries against the `information_schema` or otherwise any names that need quotes will break. Signed-off-by: Dirkjan Bussink * Trigger CI Signed-off-by: Dirkjan Bussink --------- Signed-off-by: Dirkjan Bussink Co-authored-by: Dirkjan Bussink --- go/vt/mysqlctl/schema.go | 26 ++++++++++++++------------ go/vt/mysqlctl/schema_test.go | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/go/vt/mysqlctl/schema.go b/go/vt/mysqlctl/schema.go index d6d629bc3bf..23874f803e8 100644 --- a/go/vt/mysqlctl/schema.go +++ b/go/vt/mysqlctl/schema.go @@ -52,9 +52,9 @@ func (mysqld *Mysqld) executeSchemaCommands(sql string) error { return mysqld.executeMysqlScript(params, strings.NewReader(sql)) } -func encodeTableName(tableName string) string { +func encodeEntityName(name string) string { var buf strings.Builder - sqltypes.NewVarChar(tableName).EncodeSQL(&buf) + sqltypes.NewVarChar(name).EncodeSQL(&buf) return buf.String() } @@ -66,7 +66,7 @@ func tableListSQL(tables []string) (string, error) { encodedTables := make([]string, len(tables)) for i, tableName := range tables { - encodedTables[i] = encodeTableName(tableName) + encodedTables[i] = encodeEntityName(tableName) } return "(" + strings.Join(encodedTables, ", ") + ")", nil @@ -282,7 +282,7 @@ func ResolveTables(ctx context.Context, mysqld MysqlDaemon, dbName string, table const ( GetColumnNamesQuery = `SELECT COLUMN_NAME as column_name FROM INFORMATION_SCHEMA.COLUMNS - WHERE TABLE_SCHEMA = %s AND TABLE_NAME = '%s' + WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s ORDER BY ORDINAL_POSITION` GetFieldsQuery = "SELECT %s FROM %s WHERE 1 != 1" ) @@ -292,9 +292,9 @@ func GetColumnsList(dbName, tableName string, exec func(string, int, bool) (*sql if dbName == "" { dbName2 = "database()" } else { - dbName2 = fmt.Sprintf("'%s'", dbName) + dbName2 = encodeEntityName(dbName) } - query := fmt.Sprintf(GetColumnNamesQuery, dbName2, sqlescape.UnescapeID(tableName)) + query := fmt.Sprintf(GetColumnNamesQuery, dbName2, encodeEntityName(sqlescape.UnescapeID(tableName))) qr, err := exec(query, -1, true) if err != nil { return "", err @@ -379,9 +379,9 @@ func (mysqld *Mysqld) getPrimaryKeyColumns(ctx context.Context, dbName string, t sql := ` SELECT TABLE_NAME as table_name, COLUMN_NAME as column_name FROM information_schema.STATISTICS - WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME IN %s AND LOWER(INDEX_NAME) = 'primary' + WHERE TABLE_SCHEMA = %s AND TABLE_NAME IN %s AND LOWER(INDEX_NAME) = 'primary' ORDER BY table_name, SEQ_IN_INDEX` - sql = fmt.Sprintf(sql, dbName, tableList) + sql = fmt.Sprintf(sql, encodeEntityName(dbName), tableList) qr, err := conn.ExecuteFetch(sql, len(tables)*100, true) if err != nil { return nil, err @@ -601,16 +601,18 @@ func (mysqld *Mysqld) GetPrimaryKeyEquivalentColumns(ctx context.Context, dbName END ) AS type_cost, COUNT(stats.COLUMN_NAME) AS col_count FROM information_schema.STATISTICS AS stats INNER JOIN information_schema.COLUMNS AS cols ON stats.TABLE_SCHEMA = cols.TABLE_SCHEMA AND stats.TABLE_NAME = cols.TABLE_NAME AND stats.COLUMN_NAME = cols.COLUMN_NAME - WHERE stats.TABLE_SCHEMA = '%s' AND stats.TABLE_NAME = '%s' AND stats.INDEX_NAME NOT IN + WHERE stats.TABLE_SCHEMA = %s AND stats.TABLE_NAME = %s AND stats.INDEX_NAME NOT IN ( SELECT DISTINCT INDEX_NAME FROM information_schema.STATISTICS - WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s' AND (NON_UNIQUE = 1 OR NULLABLE = 'YES') + WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s AND (NON_UNIQUE = 1 OR NULLABLE = 'YES') ) GROUP BY INDEX_NAME ORDER BY type_cost ASC, col_count ASC LIMIT 1 ) AS pke ON index_cols.INDEX_NAME = pke.INDEX_NAME - WHERE index_cols.TABLE_SCHEMA = '%s' AND index_cols.TABLE_NAME = '%s' AND NON_UNIQUE = 0 AND NULLABLE != 'YES' + WHERE index_cols.TABLE_SCHEMA = %s AND index_cols.TABLE_NAME = %s AND NON_UNIQUE = 0 AND NULLABLE != 'YES' ORDER BY SEQ_IN_INDEX ASC` - sql = fmt.Sprintf(sql, dbName, table, dbName, table, dbName, table) + encodedDbName := encodeEntityName(dbName) + encodedTable := encodeEntityName(table) + sql = fmt.Sprintf(sql, encodedDbName, encodedTable, encodedDbName, encodedTable, encodedDbName, encodedTable) qr, err := conn.ExecuteFetch(sql, 1000, true) if err != nil { return nil, err diff --git a/go/vt/mysqlctl/schema_test.go b/go/vt/mysqlctl/schema_test.go index 5ec02be9960..fb64f8ca8ee 100644 --- a/go/vt/mysqlctl/schema_test.go +++ b/go/vt/mysqlctl/schema_test.go @@ -15,7 +15,7 @@ var queryMap map[string]*sqltypes.Result func mockExec(query string, maxRows int, wantFields bool) (*sqltypes.Result, error) { queryMap = make(map[string]*sqltypes.Result) - getColsQuery := fmt.Sprintf(GetColumnNamesQuery, "'test'", "t1") + getColsQuery := fmt.Sprintf(GetColumnNamesQuery, "'test'", "'t1'") queryMap[getColsQuery] = &sqltypes.Result{ Fields: []*querypb.Field{{ Name: "column_name", @@ -40,7 +40,7 @@ func mockExec(query string, maxRows int, wantFields bool) (*sqltypes.Result, err Type: sqltypes.VarBinary, }}, } - getColsQuery = fmt.Sprintf(GetColumnNamesQuery, "database()", "t2") + getColsQuery = fmt.Sprintf(GetColumnNamesQuery, "database()", "'t2'") queryMap[getColsQuery] = &sqltypes.Result{ Fields: []*querypb.Field{{ Name: "column_name", @@ -61,6 +61,29 @@ func mockExec(query string, maxRows int, wantFields bool) (*sqltypes.Result, err if ok { return result, nil } + + getColsQuery = fmt.Sprintf(GetColumnNamesQuery, "database()", "'with \\' quote'") + queryMap[getColsQuery] = &sqltypes.Result{ + Fields: []*querypb.Field{{ + Name: "column_name", + Type: sqltypes.VarChar, + }}, + Rows: [][]sqltypes.Value{ + {sqltypes.NewVarChar("col1")}, + }, + } + + queryMap["SELECT `col1` FROM `with ' quote` WHERE 1 != 1"] = &sqltypes.Result{ + Fields: []*querypb.Field{{ + Name: "col1", + Type: sqltypes.VarChar, + }}, + } + result, ok = queryMap[query] + if ok { + return result, nil + } + return nil, fmt.Errorf("query %s not found in mock setup", query) } @@ -74,4 +97,9 @@ func TestColumnList(t *testing.T) { fields, _, err = GetColumns("", "t2", mockExec) require.NoError(t, err) require.Equal(t, `[name:"col1" type:VARCHAR]`, fmt.Sprintf("%+v", fields)) + + fields, _, err = GetColumns("", "with ' quote", mockExec) + require.NoError(t, err) + require.Equal(t, `[name:"col1" type:VARCHAR]`, fmt.Sprintf("%+v", fields)) + } From 57fd5c2b1b25e1be06b4ccd48c4d7dc828ef3e4e Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 22 Jun 2023 06:49:54 -0400 Subject: [PATCH 125/233] update link for reparenting guide (#13356) Signed-off-by: Andrew Mason Co-authored-by: Andrew Mason --- go/cmd/vtctldclient/command/reparents.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/cmd/vtctldclient/command/reparents.go b/go/cmd/vtctldclient/command/reparents.go index f755c051bee..6483d699457 100644 --- a/go/cmd/vtctldclient/command/reparents.go +++ b/go/cmd/vtctldclient/command/reparents.go @@ -80,7 +80,7 @@ EmergencyReparentShard should be used instead. Short: "Updates the topology record for the tablet's shard to acknowledge that an external tool made this tablet the primary.", Long: `Updates the topology record for the tablet's shard to acknowledge that an external tool made this tablet the primary. -See the Reparenting guide for more information: https://vitess.io/docs/user-guides/reparenting/#external-reparenting. +See the Reparenting guide for more information: https://vitess.io/docs/user-guides/configuration-advanced/reparenting/#external-reparenting. `, DisableFlagsInUseLine: true, Args: cobra.ExactArgs(1), From ee4fe7cf1dd1a7e573d35e62ca6fa99298b4615f Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 28 Jun 2023 09:24:39 +0200 Subject: [PATCH 126/233] [release-16.0] Set the number of threads for release notes generation with a flag (#13316) * Set the number of threads for release notes generation with a flag (#13273) * Set the number of threads for release notes generation by a flag Signed-off-by: Florent Poinsard * Add the flag to the release instructions and remove the make commande for release notes Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard * remove os.Exit (#13310) Signed-off-by: Florent Poinsard * remove unwanted makefile rule Signed-off-by: Florent Poinsard --------- Signed-off-by: Florent Poinsard --- Makefile | 3 --- doc/internal/ReleaseInstructions.md | 8 ++++++-- go/tools/release-notes/release_notes.go | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 58536683902..a61df12ffa9 100644 --- a/Makefile +++ b/Makefile @@ -460,8 +460,5 @@ vtadmin_authz_testgen: generate_ci_workflows: cd test && go run ci_workflow_gen.go && cd .. -release-notes: - go run ./go/tools/release-notes --from "$(FROM)" --to "$(TO)" --version "$(VERSION)" --summary "$(SUMMARY)" - install_kubectl_kind: ./tools/get_kubectl_kind.sh diff --git a/doc/internal/ReleaseInstructions.md b/doc/internal/ReleaseInstructions.md index ed6ee84d510..f45b9fb5902 100644 --- a/doc/internal/ReleaseInstructions.md +++ b/doc/internal/ReleaseInstructions.md @@ -256,12 +256,16 @@ We need to verify that _arewefastyet_ has finished the benchmark too. 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 + go run ./go/tools/release-notes --from "v14.0.3" --to "HEAD" --version "v15.0.0-rc1" --summary "./changelog/15.0/15.0.0/summary.md" [--threads=[0-9.]] ``` 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 + go run ./go/tools/release-notes --from "v14.0.3" --to "HEAD" --version "v15.0.0" --summary "./changelog/15.0/15.0.0/summary.md" [--threads=[0-9.]] ``` + + > Important note: The release note generation fetches a lot of data from the GitHub API. You might reach the API request limit. + In which case you should use the `--threads=` flag and set an integer value lower than 10 (the default). + 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. diff --git a/go/tools/release-notes/release_notes.go b/go/tools/release-notes/release_notes.go index 72211dd88f2..cd9f163e0ff 100644 --- a/go/tools/release-notes/release_notes.go +++ b/go/tools/release-notes/release_notes.go @@ -82,6 +82,7 @@ type ( var ( releaseNotesPath = `changelog/` + numberOfThreads = 10 ) const ( @@ -134,7 +135,6 @@ The entire changelog for this release can be found [here]({{ .PathToChangeLogFil prefixType = "Type: " prefixComponent = "Component: " - numberOfThreads = 10 lengthOfSingleSHA = 40 ) @@ -499,6 +499,7 @@ func main() { pflag.StringVarP(&to, "to", "t", to, "to sha/tag/branch") pflag.StringVarP(&versionName, "version", "v", "", "name of the version (has to be the following format: v11.0.0)") pflag.StringVarP(&summaryFile, "summary", "s", "", "readme file on which there is a summary of the release") + pflag.IntVar(&numberOfThreads, "threads", numberOfThreads, "Define the number of threads used to fetch data from GitHub's API. Lower this number if you hit request limit errors.") pflag.Parse() // The -version flag must be of a valid format. From 1714d1771b25c077728b929314ab9bf3d38d93c5 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 28 Jun 2023 20:24:57 +0530 Subject: [PATCH 127/233] [release-16.0] Prevent resetting replication every time we set replication source (#13377) (#13392) --- .../fakemysqldaemon/fakemysqldaemon.go | 1 - go/vt/mysqlctl/replication.go | 8 --- .../endtoend/init_shard_primary_test.go | 6 -- .../vttablet/tabletmanager/rpc_replication.go | 18 ++--- go/vt/vttablet/tabletmanager/tm_init_test.go | 1 - go/vt/wrangler/testlib/backup_test.go | 25 ++----- .../testlib/copy_schema_shard_test.go | 3 +- .../testlib/emergency_reparent_shard_test.go | 13 +--- .../testlib/external_reparent_test.go | 14 +--- go/vt/wrangler/testlib/permissions_test.go | 3 +- .../testlib/planned_reparent_shard_test.go | 68 ++++-------------- go/vt/wrangler/testlib/reparent_utils_test.go | 71 +++++++++++++++++-- go/vt/wrangler/testlib/version_test.go | 3 +- 13 files changed, 101 insertions(+), 133 deletions(-) diff --git a/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go b/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go index 3bc1c984a15..dfa24555f25 100644 --- a/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go +++ b/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go @@ -452,7 +452,6 @@ func (fmd *FakeMysqlDaemon) SetReplicationSource(ctx context.Context, host strin if stopReplicationBefore { cmds = append(cmds, "STOP SLAVE") } - cmds = append(cmds, "RESET SLAVE ALL") cmds = append(cmds, "FAKE SET MASTER") if startReplicationAfter { cmds = append(cmds, "START SLAVE") diff --git a/go/vt/mysqlctl/replication.go b/go/vt/mysqlctl/replication.go index 1f9ca28af7c..bcad45012d1 100644 --- a/go/vt/mysqlctl/replication.go +++ b/go/vt/mysqlctl/replication.go @@ -407,14 +407,6 @@ func (mysqld *Mysqld) SetReplicationSource(ctx context.Context, host string, por if replicationStopBefore { cmds = append(cmds, conn.StopReplicationCommand()) } - // Reset replication parameters commands makes the instance forget the source host port - // This is required because sometimes MySQL gets stuck due to improper initialization of - // master info structure or related failures and throws errors like - // ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log - // These errors can only be resolved by resetting the replication parameters, otherwise START SLAVE fails. - // Therefore, we have elected to always reset the replication parameters whenever we try to set the source host port - // Since there is no real overhead, but it makes this function robust enough to also handle failures like these. - cmds = append(cmds, conn.ResetReplicationParametersCommands()...) smc := conn.SetReplicationSourceCommand(params, host, port, int(replicationConnectRetry.Seconds())) cmds = append(cmds, smc) if replicationStartAfter { 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 c1e5899aac6..fb1f1f5b40e 100644 --- a/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go +++ b/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go @@ -61,13 +61,11 @@ func TestInitShardPrimary(t *testing.T) { tablet2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // These come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", // These come from InitShardPrimary "FAKE RESET ALL REPLICATION", "FAKE SET SLAVE POSITION", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -75,12 +73,10 @@ func TestInitShardPrimary(t *testing.T) { tablet3.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "FAKE RESET ALL REPLICATION", "FAKE SET SLAVE POSITION", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -125,7 +121,6 @@ func TestInitShardPrimaryNoFormerPrimary(t *testing.T) { tablet2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE RESET ALL REPLICATION", "FAKE SET SLAVE POSITION", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -134,7 +129,6 @@ func TestInitShardPrimaryNoFormerPrimary(t *testing.T) { tablet3.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE RESET ALL REPLICATION", "FAKE SET SLAVE POSITION", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index 47d49309972..d7f0fe91f0c 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -674,14 +674,8 @@ func (tm *TabletManager) setReplicationSourceLocked(ctx context.Context, parentA } host := parent.Tablet.MysqlHostname port := int(parent.Tablet.MysqlPort) - // We want to reset the replication parameters and set replication source again when forceStartReplication is provided - // because sometimes MySQL gets stuck due to improper initialization of master info structure or related failures and throws errors like - // ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log - // These errors can only be resolved by resetting the replication parameters, otherwise START SLAVE fails. So when this RPC - // gets called from VTOrc or replication manager to fix the replication in these cases with forceStartReplication, we should also - // reset the replication parameters and set the source port information again. - if status.SourceHost != host || status.SourcePort != port || forceStartReplication { - // This handles reseting the replication parameters, changing the address and then starting the replication. + if status.SourceHost != host || status.SourcePort != port { + // This handles both changing the address and starting replication. if err := tm.MysqlDaemon.SetReplicationSource(ctx, host, port, wasReplicating, shouldbeReplicating); err != nil { if err := tm.handleRelayLogError(err); err != nil { return err @@ -932,11 +926,17 @@ func (tm *TabletManager) fixSemiSyncAndReplication(tabletType topodatapb.TabletT return nil } +// handleRelayLogError resets replication of the instance. +// This is required because sometimes MySQL gets stuck due to improper initialization of +// master info structure or related failures and throws errors like +// ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log +// These errors can only be resolved by resetting the replication, otherwise START SLAVE fails. func (tm *TabletManager) handleRelayLogError(err error) error { // attempt to fix this error: // Slave failed to initialize relay log info structure from the repository (errno 1872) (sqlstate HY000) during query: START SLAVE // see https://bugs.mysql.com/bug.php?id=83713 or https://github.com/vitessio/vitess/issues/5067 - if strings.Contains(err.Error(), "Slave failed to initialize relay log info structure from the repository") { + // The same fix also works for https://github.com/vitessio/vitess/issues/10955. + if strings.Contains(err.Error(), "Slave failed to initialize relay log info structure from the repository") || strings.Contains(err.Error(), "Could not initialize master info structure") { // Stop, reset and start replication again to resolve this error if err := tm.MysqlDaemon.RestartReplication(tm.hookExtraEnv()); err != nil { return err diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index 1773a7fab50..e479ec7d42c 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -383,7 +383,6 @@ func TestCheckPrimaryShip(t *testing.T) { 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 5956add57f6..976437a2e06 100644 --- a/go/vt/wrangler/testlib/backup_test.go +++ b/go/vt/wrangler/testlib/backup_test.go @@ -175,9 +175,8 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { }, } sourceTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", // This first set of STOP and START commands come from @@ -188,7 +187,6 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { // These commands come from SetReplicationSource RPC called // to set the correct primary and semi-sync after Backup has concluded "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -225,16 +223,14 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { }, } destTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 4 statements come from tablet startup + // These 3 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", } @@ -287,7 +283,6 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET SLAVE POSITION", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -408,9 +403,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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", // This first set of STOP and START commands come from @@ -421,7 +415,6 @@ func TestBackupRestoreLagged(t *testing.T) { // These commands come from SetReplicationSource RPC called // to set the correct primary and semi-sync after Backup has concluded "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -479,16 +472,14 @@ func TestBackupRestoreLagged(t *testing.T) { }, } destTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 4 statements come from tablet startup + // These 3 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", } @@ -627,9 +618,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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", // This first set of STOP and START commands come from @@ -640,7 +630,6 @@ func TestRestoreUnreachablePrimary(t *testing.T) { // These commands come from SetReplicationSource RPC called // to set the correct primary and semi-sync after Backup has concluded "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -670,16 +659,14 @@ func TestRestoreUnreachablePrimary(t *testing.T) { }, } destTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 4 statements come from tablet startup + // These 3 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 b32e2c3d937..c3e574fea42 100644 --- a/go/vt/wrangler/testlib/copy_schema_shard_test.go +++ b/go/vt/wrangler/testlib/copy_schema_shard_test.go @@ -72,9 +72,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 4 statements come from tablet startup + // These 3 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 de7b6f45930..6d498f0fbf6 100644 --- a/go/vt/wrangler/testlib/emergency_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/emergency_reparent_shard_test.go @@ -134,14 +134,12 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE IO_THREAD", "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -167,12 +165,10 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", } goodReplica2.StartActionLoop(t, wr) @@ -234,7 +230,6 @@ func TestEmergencyReparentShardPrimaryElectNotBest(t *testing.T) { newPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "STOP SLAVE IO_THREAD", "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", @@ -267,14 +262,12 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE IO_THREAD", "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 2acc250faa0..00fd10f703f 100644 --- a/go/vt/wrangler/testlib/external_reparent_test.go +++ b/go/vt/wrangler/testlib/external_reparent_test.go @@ -90,7 +90,6 @@ func TestTabletExternallyReparentedBasic(t *testing.T) { oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START Replica", } @@ -170,7 +169,6 @@ func TestTabletExternallyReparentedToReplica(t *testing.T) { // primary is still good to go. oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START Replica", } @@ -249,7 +247,6 @@ func TestTabletExternallyReparentedWithDifferentMysqlPort(t *testing.T) { oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START Replica", } @@ -262,9 +259,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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -339,7 +335,6 @@ func TestTabletExternallyReparentedContinueOnUnexpectedPrimary(t *testing.T) { oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START Replica", } @@ -352,9 +347,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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -425,7 +419,6 @@ func TestTabletExternallyReparentedRerun(t *testing.T) { oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START Replica", } @@ -438,9 +431,8 @@ func TestTabletExternallyReparentedRerun(t *testing.T) { // On the good replica, we will respond to // TabletActionReplicaWasRestarted. goodReplica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 4 statements come from tablet startup + // These 3 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 fec85ca3124..9d2a950c8e3 100644 --- a/go/vt/wrangler/testlib/permissions_test.go +++ b/go/vt/wrangler/testlib/permissions_test.go @@ -563,9 +563,8 @@ func TestPermissions(t *testing.T) { } replica.FakeMysqlDaemon.SetReplicationSourceInputs = append(replica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) replica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - // These 4 statements come from tablet startup + // These 3 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 e3b13f48958..f3eaa987ac4 100644 --- a/go/vt/wrangler/testlib/planned_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/planned_reparent_shard_test.go @@ -81,7 +81,6 @@ func TestPlannedReparentShardNoPrimaryProvided(t *testing.T) { } newPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", @@ -96,11 +95,9 @@ func TestPlannedReparentShardNoPrimaryProvided(t *testing.T) { oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", // we end up calling SetReplicationSource twice on the old primary - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -116,13 +113,11 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -198,7 +193,6 @@ func TestPlannedReparentShardNoError(t *testing.T) { } newPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", @@ -213,11 +207,9 @@ func TestPlannedReparentShardNoError(t *testing.T) { oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", // we end up calling SetReplicationSource twice on the old primary - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -233,13 +225,11 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -250,12 +240,10 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", } goodReplica2.StartActionLoop(t, wr) @@ -337,7 +325,6 @@ func TestPlannedReparentInitialization(t *testing.T) { goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica1.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -350,7 +337,6 @@ func TestPlannedReparentInitialization(t *testing.T) { goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs = append(goodReplica2.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) goodReplica2.StartActionLoop(t, wr) goodReplica2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", } defer goodReplica2.StopActionLoop(t) @@ -421,7 +407,6 @@ func TestPlannedReparentShardWaitForPositionFail(t *testing.T) { } newPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", @@ -436,7 +421,6 @@ func TestPlannedReparentShardWaitForPositionFail(t *testing.T) { oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.PromoteResult oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -451,13 +435,11 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -468,12 +450,10 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", } goodReplica2.StartActionLoop(t, wr) @@ -534,7 +514,6 @@ func TestPlannedReparentShardWaitForPositionTimeout(t *testing.T) { } newPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", @@ -548,7 +527,6 @@ func TestPlannedReparentShardWaitForPositionTimeout(t *testing.T) { oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -563,13 +541,11 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -580,12 +556,10 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", } goodReplica2.StartActionLoop(t, wr) @@ -643,9 +617,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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", // simulate error that will trigger a call to RestartReplication @@ -726,9 +699,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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", // In SetReplicationSource, we find that the source host and port was already set correctly, @@ -807,7 +779,6 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { } newPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", @@ -822,7 +793,6 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -837,13 +807,11 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -854,12 +822,10 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", } goodReplica2.StartActionLoop(t, wr) @@ -880,22 +846,18 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { newPrimary.FakeMysqlDaemon.PromoteError = nil newPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", // extra commands because of retry "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", } oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", // extra commands because of retry - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -954,13 +916,11 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -971,12 +931,10 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", } goodReplica2.StartActionLoop(t, wr) diff --git a/go/vt/wrangler/testlib/reparent_utils_test.go b/go/vt/wrangler/testlib/reparent_utils_test.go index 482705c1fe4..f0971a6886b 100644 --- a/go/vt/wrangler/testlib/reparent_utils_test.go +++ b/go/vt/wrangler/testlib/reparent_utils_test.go @@ -17,6 +17,8 @@ limitations under the License. package testlib import ( + "context" + "errors" "testing" "time" @@ -25,8 +27,6 @@ import ( "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/vtctl/reparentutil" - "context" - "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/topo" @@ -91,9 +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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -161,13 +160,11 @@ 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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } @@ -185,3 +182,63 @@ func TestReparentTablet(t *testing.T) { } checkSemiSyncEnabled(t, false, true, replica) } + +// TestSetReplicationSourceRelayLogError tests that SetReplicationSource works as intended when we receive a relay log error while starting replication. +func TestSetReplicationSourceRelayLogError(t *testing.T) { + ctx := context.Background() + ts := memorytopo.NewServer("cell1", "cell2") + wr := wrangler.New(logutil.NewConsoleLogger(), ts, tmclient.NewTabletManagerClient()) + + // create shard and tablets + if _, err := ts.GetOrCreateShard(ctx, "test_keyspace", "0"); err != nil { + t.Fatalf("CreateShard failed: %v", err) + } + primary := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_PRIMARY, nil) + replica := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, nil) + reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") + + // mark the primary inside the shard + if _, err := ts.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { + si.PrimaryAlias = primary.Tablet.Alias + return nil + }); err != nil { + t.Fatalf("UpdateShardFields failed: %v", err) + } + + // primary action loop (to initialize host and port) + primary.StartActionLoop(t, wr) + defer primary.StopActionLoop(t) + + // replica loop + // We have to set the settings as replicating. Otherwise, + // the replication manager intervenes and tries to fix replication, + // which ends up making this test unpredictable. + replica.FakeMysqlDaemon.Replicating = true + 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 + "STOP SLAVE", + "FAKE SET MASTER", + "START SLAVE", + // We stop and reset the replication parameters because of relay log issues. + "STOP SLAVE", + "RESET SLAVE", + "START SLAVE", + } + replica.StartActionLoop(t, wr) + defer replica.StopActionLoop(t) + + // Set the correct error message that indicates we have received a relay log error. + replica.FakeMysqlDaemon.SetReplicationSourceError = errors.New("ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log") + // run ReparentTablet + if err := wr.SetReplicationSource(ctx, replica.Tablet); err != nil { + t.Fatalf("SetReplicationSource failed: %v", err) + } + + // check what was run + if err := replica.FakeMysqlDaemon.CheckSuperQueryList(); err != nil { + t.Fatalf("replica.FakeMysqlDaemon.CheckSuperQueryList failed: %v", err) + } + checkSemiSyncEnabled(t, false, true, replica) +} diff --git a/go/vt/wrangler/testlib/version_test.go b/go/vt/wrangler/testlib/version_test.go index 18b29d61ac2..c54a0811948 100644 --- a/go/vt/wrangler/testlib/version_test.go +++ b/go/vt/wrangler/testlib/version_test.go @@ -93,9 +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 4 statements come from tablet startup + // These 3 statements come from tablet startup "STOP SLAVE", - "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", } From 3161143e9ef61be2366c90ab9f14779d5552ecb8 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 29 Jun 2023 11:34:42 +0530 Subject: [PATCH 128/233] [release-16.0] BaseShowTablesWithSizes: optimize MySQL 8.0 query (#13375) (#13389) * BaseShowTablesWithSizes: optimize MySQL 8.0 query Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * adapt regular expression Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * adapt regular expression, 2 Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * refactored query again to combat the many unit test query format assumptions Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * use t.table_schema in GROUP BY. Although not strictly necessary this may be faster Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * Support views in BaseShowTablesWithSizes for MySQL 8.0 (#13394) * Support views in BaseShowTablesWithSizes for MySQL 8.0 Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * added test Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * fixed test Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> * schema tracker: use null safe comparison Signed-off-by: Andres Taylor --------- Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Signed-off-by: Andres Taylor Co-authored-by: Andres Taylor --------- Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Signed-off-by: Andres Taylor Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: Andres Taylor --- go/mysql/flavor_mysql.go | 44 ++++++++++++++++++------ go/vt/vttablet/endtoend/misc_test.go | 50 ++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/go/mysql/flavor_mysql.go b/go/mysql/flavor_mysql.go index 407c14e34b0..3650d085960 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -356,17 +356,41 @@ GROUP BY t.table_name, t.table_type, t.create_time, t.table_comment` // We join with a subquery that materializes the data from `information_schema.innodb_sys_tablespaces` // early for performance reasons. This effectively causes only a single read of `information_schema.innodb_tablespaces` // per query. +// Note the following: +// - We use UNION ALL to deal differently with partitioned tables vs. non-partitioned tables. +// Originally, the query handled both, but that introduced "WHERE ... OR" conditions that led to poor query +// optimization. By separating to UNION ALL we remove all "OR" conditions. +// - We utilize `INFORMATION_SCHEMA`.`TABLES`.`CREATE_OPTIONS` column to do early pruning before the JOIN. +// - `TABLES`.`TABLE_NAME` has `utf8mb4_0900_ai_ci` collation. `INNODB_TABLESPACES`.`NAME` has `utf8mb3_general_ci`. +// We normalize the collation to get better query performance (we force the casting at the time of our choosing) +// - `create_options` is NULL for views, and therefore we need an additional UNION ALL to include views const TablesWithSize80 = `SELECT t.table_name, - t.table_type, - UNIX_TIMESTAMP(t.create_time), - t.table_comment, - SUM(i.file_size), - SUM(i.allocated_size) -FROM information_schema.tables t -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` + t.table_type, + UNIX_TIMESTAMP(t.create_time), + t.table_comment, + i.file_size, + i.allocated_size + FROM information_schema.tables t + LEFT JOIN information_schema.innodb_tablespaces i + ON i.name = CONCAT(t.table_schema, '/', t.table_name) COLLATE utf8_general_ci + WHERE + t.table_schema = database() AND not t.create_options <=> 'partitioned' +UNION ALL + SELECT + t.table_name, + t.table_type, + UNIX_TIMESTAMP(t.create_time), + t.table_comment, + SUM(i.file_size), + SUM(i.allocated_size) + FROM information_schema.tables t + LEFT JOIN information_schema.innodb_tablespaces i + ON i.name LIKE (CONCAT(t.table_schema, '/', t.table_name, '#p#%') COLLATE utf8_general_ci ) + WHERE + t.table_schema = database() AND t.create_options <=> 'partitioned' + GROUP BY + t.table_schema, t.table_name, t.table_type, t.create_time, t.table_comment +` // baseShowTablesWithSizes is part of the Flavor interface. func (mysqlFlavor56) baseShowTablesWithSizes() string { diff --git a/go/vt/vttablet/endtoend/misc_test.go b/go/vt/vttablet/endtoend/misc_test.go index 913af99fc4f..455376576ab 100644 --- a/go/vt/vttablet/endtoend/misc_test.go +++ b/go/vt/vttablet/endtoend/misc_test.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "io" + "math" "net/http" "reflect" "strings" @@ -943,3 +944,52 @@ func TestHexAndBitBindVar(t *testing.T) { require.NoError(t, err) assert.Equal(t, `[[INT64(10) UINT64(10) INT64(2480) UINT64(2480)]]`, fmt.Sprintf("%v", qr.Rows)) } + +// Test will validate drop view ddls. +func TestShowTablesWithSizes(t *testing.T) { + ctx := context.Background() + conn, err := mysql.Connect(ctx, &connParams) + require.NoError(t, err) + defer conn.Close() + + setupQueries := []string{ + `drop view if exists show_tables_with_sizes_v1`, + `drop table if exists show_tables_with_sizes_t1`, + `drop table if exists show_tables_with_sizes_employees`, + `create table show_tables_with_sizes_t1 (id int primary key)`, + `create view show_tables_with_sizes_v1 as select * from show_tables_with_sizes_t1`, + `CREATE TABLE show_tables_with_sizes_employees (id INT NOT NULL, store_id INT) PARTITION BY HASH(store_id) PARTITIONS 4`, + } + + defer func() { + _, _ = conn.ExecuteFetch(`drop view if exists show_tables_with_sizes_v1`, 1, false) + _, _ = conn.ExecuteFetch(`drop table if exists show_tables_with_sizes_t1`, 1, false) + _, _ = conn.ExecuteFetch(`drop table if exists show_tables_with_sizes_employees`, 1, false) + }() + for _, query := range setupQueries { + _, err := conn.ExecuteFetch(query, 1, false) + require.NoError(t, err) + } + expectTables := map[string]([]string){ // TABLE_TYPE, TABLE_COMMENT + "show_tables_with_sizes_t1": {"BASE TABLE", ""}, + "show_tables_with_sizes_v1": {"VIEW", "VIEW"}, + "show_tables_with_sizes_employees": {"BASE TABLE", ""}, + } + + rs, err := conn.ExecuteFetch(conn.BaseShowTablesWithSizes(), math.MaxInt, false) + require.NoError(t, err) + require.NotEmpty(t, rs.Rows) + + assert.GreaterOrEqual(t, len(rs.Rows), len(expectTables)) + matchedTables := map[string]bool{} + for _, row := range rs.Rows { + tableName := row[0].ToString() + vals, ok := expectTables[tableName] + if ok { + assert.Equal(t, vals[0], row[1].ToString()) // TABLE_TYPE + assert.Equal(t, vals[1], row[3].ToString()) // TABLE_COMMENT + matchedTables[tableName] = true + } + } + assert.Equalf(t, len(expectTables), len(matchedTables), "%v", matchedTables) +} From 2d41d38f85658c72cc208fd4ccb3fc9a2011332f Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 29 Jun 2023 11:49:50 +0530 Subject: [PATCH 129/233] feat: don't run any reparent commands if the host is empty (#13396) (#13402) Signed-off-by: Manan Gupta --- .../vttablet/tabletmanager/rpc_replication.go | 4 + go/vt/wrangler/testlib/fake_tablet.go | 2 +- go/vt/wrangler/testlib/reparent_utils_test.go | 121 ++++++++++++------ 3 files changed, 84 insertions(+), 43 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index d7f0fe91f0c..21c502bfa1e 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -674,6 +674,10 @@ func (tm *TabletManager) setReplicationSourceLocked(ctx context.Context, parentA } host := parent.Tablet.MysqlHostname port := int(parent.Tablet.MysqlPort) + // If host is empty, then we shouldn't even attempt the reparent. That tablet has already shutdown. + if host == "" { + return vterrors.New(vtrpc.Code_FAILED_PRECONDITION, "Shard primary has empty mysql hostname") + } if status.SourceHost != host || status.SourcePort != port { // This handles both changing the address and starting replication. if err := tm.MysqlDaemon.SetReplicationSource(ctx, host, port, wasReplicating, shouldbeReplicating); err != nil { diff --git a/go/vt/wrangler/testlib/fake_tablet.go b/go/vt/wrangler/testlib/fake_tablet.go index ff8d0457517..99c43015d3e 100644 --- a/go/vt/wrangler/testlib/fake_tablet.go +++ b/go/vt/wrangler/testlib/fake_tablet.go @@ -245,7 +245,7 @@ func (ft *FakeTablet) StartActionLoop(t *testing.T, wr *wrangler.Wrangler) { // StopActionLoop will stop the Action Loop for the given FakeTablet func (ft *FakeTablet) StopActionLoop(t *testing.T) { if ft.TM == nil { - t.Fatalf("TM for %v is not running", ft.Tablet.Alias) + return } if ft.StartHTTPServer { ft.HTTPListener.Close() diff --git a/go/vt/wrangler/testlib/reparent_utils_test.go b/go/vt/wrangler/testlib/reparent_utils_test.go index f0971a6886b..5e97e1e9be8 100644 --- a/go/vt/wrangler/testlib/reparent_utils_test.go +++ b/go/vt/wrangler/testlib/reparent_utils_test.go @@ -22,6 +22,8 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "vitess.io/vitess/go/vt/vtctl/reparentutil/reparenttestutil" "vitess.io/vitess/go/vt/discovery" @@ -183,62 +185,97 @@ func TestReparentTablet(t *testing.T) { checkSemiSyncEnabled(t, false, true, replica) } -// TestSetReplicationSourceRelayLogError tests that SetReplicationSource works as intended when we receive a relay log error while starting replication. -func TestSetReplicationSourceRelayLogError(t *testing.T) { +// TestSetReplicationSource tests that SetReplicationSource works as intended under various circumstances. +func TestSetReplicationSource(t *testing.T) { ctx := context.Background() ts := memorytopo.NewServer("cell1", "cell2") wr := wrangler.New(logutil.NewConsoleLogger(), ts, tmclient.NewTabletManagerClient()) // create shard and tablets - if _, err := ts.GetOrCreateShard(ctx, "test_keyspace", "0"); err != nil { - t.Fatalf("CreateShard failed: %v", err) - } + _, err := ts.GetOrCreateShard(ctx, "test_keyspace", "0") + require.NoError(t, err, "CreateShard failed") + primary := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_PRIMARY, nil) - replica := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, nil) reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") // mark the primary inside the shard - if _, err := ts.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { + _, err = ts.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { si.PrimaryAlias = primary.Tablet.Alias return nil - }); err != nil { - t.Fatalf("UpdateShardFields failed: %v", err) - } + }) + require.NoError(t, err, "UpdateShardFields failed") // primary action loop (to initialize host and port) primary.StartActionLoop(t, wr) defer primary.StopActionLoop(t) - // replica loop - // We have to set the settings as replicating. Otherwise, - // the replication manager intervenes and tries to fix replication, - // which ends up making this test unpredictable. - replica.FakeMysqlDaemon.Replicating = true - 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 - "STOP SLAVE", - "FAKE SET MASTER", - "START SLAVE", - // We stop and reset the replication parameters because of relay log issues. - "STOP SLAVE", - "RESET SLAVE", - "START SLAVE", - } - replica.StartActionLoop(t, wr) - defer replica.StopActionLoop(t) - - // Set the correct error message that indicates we have received a relay log error. - replica.FakeMysqlDaemon.SetReplicationSourceError = errors.New("ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log") - // run ReparentTablet - if err := wr.SetReplicationSource(ctx, replica.Tablet); err != nil { - t.Fatalf("SetReplicationSource failed: %v", err) - } - - // check what was run - if err := replica.FakeMysqlDaemon.CheckSuperQueryList(); err != nil { - t.Fatalf("replica.FakeMysqlDaemon.CheckSuperQueryList failed: %v", err) - } - checkSemiSyncEnabled(t, false, true, replica) + // test when we receive a relay log error while starting replication + t.Run("Relay log error", func(t *testing.T) { + replica := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, nil) + // replica loop + // We have to set the settings as replicating. Otherwise, + // the replication manager intervenes and tries to fix replication, + // which ends up making this test unpredictable. + replica.FakeMysqlDaemon.Replicating = true + 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 + "STOP SLAVE", + "FAKE SET MASTER", + "START SLAVE", + // We stop and reset the replication parameters because of relay log issues. + "STOP SLAVE", + "RESET SLAVE", + "START SLAVE", + } + replica.StartActionLoop(t, wr) + defer replica.StopActionLoop(t) + + // Set the correct error message that indicates we have received a relay log error. + replica.FakeMysqlDaemon.SetReplicationSourceError = errors.New("ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log") + // run ReparentTablet + err = wr.SetReplicationSource(ctx, replica.Tablet) + require.NoError(t, err, "SetReplicationSource failed") + + // check what was run + err = replica.FakeMysqlDaemon.CheckSuperQueryList() + require.NoError(t, err, "CheckSuperQueryList failed") + checkSemiSyncEnabled(t, false, true, replica) + }) + + // test setting an empty hostname because of primary shutdown + t.Run("Primary tablet already shutdown", func(t *testing.T) { + replica := NewFakeTablet(t, wr, "cell1", 3, topodatapb.TabletType_REPLICA, nil) + // replica loop + replica.FakeMysqlDaemon.Replicating = true + 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 + "STOP SLAVE", + "FAKE SET MASTER", + "START SLAVE", + // For the SetReplicationSource call, we shouldn't get any queries at all! + } + replica.StartActionLoop(t, wr) + defer replica.StopActionLoop(t) + + // stop the primary + primary.StopActionLoop(t) + // update the primary topo record + wr.TopoServer().UpdateTabletFields(ctx, primary.Tablet.Alias, func(tablet *topodatapb.Tablet) error { + tablet.MysqlHostname = "" + return nil + }) + + // run SetReplicationSource + err = wr.SetReplicationSource(ctx, replica.Tablet) + require.ErrorContains(t, err, "Shard primary has empty mysql hostname") + + // check what was run + err = replica.FakeMysqlDaemon.CheckSuperQueryList() + require.NoError(t, err, "CheckSuperQueryList failed") + checkSemiSyncEnabled(t, false, true, replica) + }) } From f3b7479b55341f7d7db534b3c0520e1c1966d387 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 29 Jun 2023 15:15:29 +0530 Subject: [PATCH 130/233] [release-16.0] Deflake `TestQueryTimeoutWithDual` test (#13405) (#13409) * test: deflake TestQueryTimeoutWithDual test Signed-off-by: Manan Gupta * empty commit to kick CI Signed-off-by: Manan Gupta --------- Signed-off-by: Manan Gupta Co-authored-by: Manan Gupta --- go/test/endtoend/vtgate/queries/misc/misc_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index be322667fa0..39b047015a7 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -115,7 +115,7 @@ func TestQueryTimeoutWithDual(t *testing.T) { assert.NoError(t, err) _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=10 */ sleep(0.04) from dual") assert.Error(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=10 */ sleep(0.001) from dual") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=15 */ sleep(0.001) from dual") assert.NoError(t, err) } From 7251cb3962376f2961e43a846e28da589c8d919a Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 29 Jun 2023 18:23:39 +0530 Subject: [PATCH 131/233] TestFix: `Upgrade Downgrade Testing - Backups - Manual` (#13408) --- examples/common/scripts/vttablet-up.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/common/scripts/vttablet-up.sh b/examples/common/scripts/vttablet-up.sh index d22fd33ab48..0e70837d235 100755 --- a/examples/common/scripts/vttablet-up.sh +++ b/examples/common/scripts/vttablet-up.sh @@ -46,6 +46,7 @@ vttablet \ --init_shard $shard \ --init_tablet_type $tablet_type \ --health_check_interval 5s \ + --enable_replication_reporter \ --backup_storage_implementation file \ --file_backup_storage_root $VTDATAROOT/backups \ --restore_from_backup \ @@ -55,7 +56,6 @@ vttablet \ --pid_file $VTDATAROOT/$tablet_dir/vttablet.pid \ --vtctld_addr http://$hostname:$vtctld_web_port/ \ --disable_active_reparents \ - --throttler-config-via-topo --heartbeat_enable --heartbeat_interval=250ms --heartbeat_on_demand_duration=5s \ > $VTDATAROOT/$tablet_dir/vttablet.out 2>&1 & # Block waiting for the tablet to be listening From 99d39f9b1347d7a19a3db14d8b9650fb95de2fe6 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 5 Jul 2023 18:50:09 +0530 Subject: [PATCH 132/233] [release-16.0] Upgrade-Downgrade Fix: Schema-initialization stuck on semi-sync ACKs while upgrading (#13411) (#13441) --- .../upgrade_downgrade_test_backups_manual.yml | 12 +- ...grade_test_backups_manual_next_release.yml | 12 +- examples/backups/restart_tablets.sh | 6 +- examples/backups/start_cluster.sh | 10 +- examples/backups/upgrade_cluster.sh | 97 ++++ examples/common/scripts/vttablet-up.sh | 1 - .../vtctl/reparentutil/planned_reparenter.go | 86 ++- .../planned_reparenter_flaky_test.go | 511 ++++++------------ .../testlib/planned_reparent_shard_test.go | 45 +- 9 files changed, 347 insertions(+), 433 deletions(-) create mode 100755 examples/backups/upgrade_cluster.sh diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index cefa6833d2a..079943f1925 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -269,14 +269,6 @@ jobs: source build.env ; cd examples/backups ./take_backups.sh - # Stopping the tablets so we can perform the upgrade. - - name: Stop tablets - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 10 - run: | - source build.env ; cd examples/backups - ./stop_tablets.sh - # We upgrade: we swap binaries and use the version N of the tablet. - name: Upgrade - Swap binaries, use VTTablet N if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -293,9 +285,7 @@ jobs: timeout-minutes: 10 run: | source build.env ; cd examples/backups - ./restart_tablets.sh - # give enough time to the tablets to restore the backup - sleep 90 + ./upgrade_cluster.sh # We count the number of rows in every table to check that the restore step was successful. - name: Assert the number of rows in every table 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 9cd64760afc..7148834efe7 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -272,14 +272,6 @@ jobs: source build.env ; cd examples/backups ./take_backups.sh - # Stopping the tablets so we can perform the upgrade. - - name: Stop tablets - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 10 - run: | - source build.env ; cd examples/backups - ./stop_tablets.sh - # We upgrade: we swap binaries and use the version N of the tablet. - name: Upgrade - Swap binaries, use VTTablet N if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -296,9 +288,7 @@ jobs: timeout-minutes: 10 run: | source build.env ; cd examples/backups - ./restart_tablets.sh - # give enough time to the tablets to restore the backup - sleep 90 + ./upgrade_cluster.sh # We count the number of rows in every table to check that the restore step was successful. - name: Assert the number of rows in every table diff --git a/examples/backups/restart_tablets.sh b/examples/backups/restart_tablets.sh index 13c4ed0cfb6..bfafcf26d4f 100755 --- a/examples/backups/restart_tablets.sh +++ b/examples/backups/restart_tablets.sh @@ -58,6 +58,6 @@ for i in 101 201 301; do exit 1 done -vtctldclient InitShardPrimary --force commerce/0 zone1-100 -vtctldclient InitShardPrimary --force customer/-80 zone1-200 -vtctldclient InitShardPrimary --force customer/80- zone1-300 +vtctldclient PlannedReparentShard commerce/0 --new-primary "zone1-100" +vtctldclient PlannedReparentShard customer/-80 --new-primary "zone1-200" +vtctldclient PlannedReparentShard customer/80- --new-primary "zone1-300" diff --git a/examples/backups/start_cluster.sh b/examples/backups/start_cluster.sh index a9e2de606cb..9855171ea4d 100755 --- a/examples/backups/start_cluster.sh +++ b/examples/backups/start_cluster.sh @@ -31,6 +31,8 @@ fi # start vtctld CELL=zone1 ../common/scripts/vtctld-up.sh +# Create keyspace and set the semi_sync durability policy. +vtctldclient CreateKeyspace --durability-policy=semi_sync commerce || fail "Failed to create and configure the commerce keyspace" # start vttablets for keyspace commerce for i in 100 101 102; do @@ -39,12 +41,14 @@ for i in 100 101 102; do done # set one of the replicas to primary -vtctldclient InitShardPrimary --force commerce/0 zone1-100 +vtctldclient PlannedReparentShard commerce/0 --new-primary "zone1-100" # create the schema for commerce vtctlclient ApplySchema -- --sql-file ./create_commerce_schema.sql commerce || fail "Could not apply schema for the commerce keyspace" vtctlclient ApplyVSchema -- --vschema_file ../local/vschema_commerce_seq.json commerce || fail "Could not apply vschema for the commerce keyspace" +# Create keyspace and set the semi_sync durability policy. +vtctldclient CreateKeyspace --durability-policy=semi_sync customer || fail "Failed to create and configure the customer keyspace" # start vttablets for keyspace customer for i in 200 201 202; do @@ -57,8 +61,8 @@ for i in 300 301 302; do done # set one of the replicas to primary -vtctldclient InitShardPrimary --force customer/-80 zone1-200 -vtctldclient InitShardPrimary --force customer/80- zone1-300 +vtctldclient PlannedReparentShard customer/-80 --new-primary "zone1-200" +vtctldclient PlannedReparentShard customer/80- --new-primary "zone1-300" for shard in "-80" "80-"; do wait_for_healthy_shard customer "${shard}" || exit 1 diff --git a/examples/backups/upgrade_cluster.sh b/examples/backups/upgrade_cluster.sh new file mode 100755 index 00000000000..0144dc94579 --- /dev/null +++ b/examples/backups/upgrade_cluster.sh @@ -0,0 +1,97 @@ +#!/bin/bash + +# 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. + +# this script brings up new tablets for the two new shards that we will +# be creating in the customer keyspace and copies the schema + +source ../common/env.sh + +# Restart the replica tablets so that they come up with new vttablet versions +for i in 101 102; do + echo "Shutting down tablet zone1-$i" + CELL=zone1 TABLET_UID=$i ../common/scripts/vttablet-down.sh + echo "Shutting down mysql zone1-$i" + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-down.sh + echo "Removing tablet directory zone1-$i" + vtctlclient DeleteTablet -- --allow_primary=true zone1-$i + rm -Rf $VTDATAROOT/vt_0000000$i + echo "Starting tablet zone1-$i again" + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + CELL=zone1 KEYSPACE=commerce TABLET_UID=$i ../common/scripts/vttablet-up.sh +done + +for i in 201 202; do + echo "Shutting down tablet zone1-$i" + CELL=zone1 TABLET_UID=$i ../common/scripts/vttablet-down.sh + echo "Shutting down mysql zone1-$i" + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-down.sh + echo "Removing tablet directory zone1-$i" + vtctlclient DeleteTablet -- --allow_primary=true zone1-$i + rm -Rf $VTDATAROOT/vt_0000000$i + echo "Starting tablet zone1-$i again" + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + SHARD=-80 CELL=zone1 KEYSPACE=customer TABLET_UID=$i ../common/scripts/vttablet-up.sh +done + +for i in 301 302; do + echo "Shutting down tablet zone1-$i" + CELL=zone1 TABLET_UID=$i ../common/scripts/vttablet-down.sh + echo "Shutting down mysql zone1-$i" + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-down.sh + echo "Removing tablet directory zone1-$i" + vtctlclient DeleteTablet -- --allow_primary=true zone1-$i + rm -Rf $VTDATAROOT/vt_0000000$i + echo "Starting tablet zone1-$i again" + CELL=zone1 TABLET_UID=$i ../common/scripts/mysqlctl-up.sh + SHARD=80- CELL=zone1 KEYSPACE=customer TABLET_UID=$i ../common/scripts/vttablet-up.sh +done + +# Wait for all the replica tablets to be in the serving state before reparenting to them. +totalTime=600 +for i in 101 201 301; do + while [ $totalTime -gt 0 ]; do + status=$(curl "http://$hostname:15$i/debug/status_details") + echo "$status" | grep "REPLICA: Serving" && break + totalTime=$((totalTime-1)) + sleep 0.1 + done +done + +# Check that all the replica tablets have reached REPLICA: Serving state +for i in 101 201 301; do + status=$(curl "http://$hostname:15$i/debug/status_details") + echo "$status" | grep "REPLICA: Serving" && continue + echo "tablet-$i did not reach REPLICA: Serving state. Exiting due to failure." + exit 1 +done + +# Promote the replica tablets to primary +vtctldclient PlannedReparentShard commerce/0 --new-primary "zone1-101" +vtctldclient PlannedReparentShard customer/-80 --new-primary "zone1-201" +vtctldclient PlannedReparentShard customer/80- --new-primary "zone1-301" + +# Restart the old primary tablets so that they are on the latest version of vttablet too. +echo "Restarting tablet zone1-100" +CELL=zone1 TABLET_UID=100 ../common/scripts/vttablet-down.sh +CELL=zone1 KEYSPACE=commerce TABLET_UID=100 ../common/scripts/vttablet-up.sh + +echo "Restarting tablet zone1-200" +CELL=zone1 TABLET_UID=200 ../common/scripts/vttablet-down.sh +SHARD=-80 CELL=zone1 KEYSPACE=customer TABLET_UID=200 ../common/scripts/vttablet-up.sh + +echo "Restarting tablet zone1-300" +CELL=zone1 TABLET_UID=300 ../common/scripts/vttablet-down.sh +SHARD=80- CELL=zone1 KEYSPACE=customer TABLET_UID=300 ../common/scripts/vttablet-up.sh \ No newline at end of file diff --git a/examples/common/scripts/vttablet-up.sh b/examples/common/scripts/vttablet-up.sh index 0e70837d235..21c15b8d547 100755 --- a/examples/common/scripts/vttablet-up.sh +++ b/examples/common/scripts/vttablet-up.sh @@ -55,7 +55,6 @@ vttablet \ --service_map 'grpc-queryservice,grpc-tabletmanager,grpc-updatestream' \ --pid_file $VTDATAROOT/$tablet_dir/vttablet.pid \ --vtctld_addr http://$hostname:$vtctld_web_port/ \ - --disable_active_reparents \ > $VTDATAROOT/$tablet_dir/vttablet.out 2>&1 & # Block waiting for the tablet to be listening diff --git a/go/vt/vtctl/reparentutil/planned_reparenter.go b/go/vt/vtctl/reparentutil/planned_reparenter.go index fc0e1c80a06..8633afa13d0 100644 --- a/go/vt/vtctl/reparentutil/planned_reparenter.go +++ b/go/vt/vtctl/reparentutil/planned_reparenter.go @@ -213,7 +213,7 @@ func (pr *PlannedReparenter) performGracefulPromotion( primaryElect *topodatapb.Tablet, tabletMap map[string]*topo.TabletInfo, opts PlannedReparentOptions, -) (string, error) { +) error { primaryElectAliasStr := topoproto.TabletAliasString(primaryElect.Alias) ev.OldPrimary = proto.Clone(currentPrimary.Tablet).(*topodatapb.Tablet) @@ -231,7 +231,7 @@ func (pr *PlannedReparenter) performGracefulPromotion( snapshotPos, err := pr.tmc.PrimaryPosition(snapshotCtx, currentPrimary.Tablet) if err != nil { - return "", vterrors.Wrapf(err, "cannot get replication position on current primary %v; current primary must be healthy to perform PlannedReparent", currentPrimary.AliasString()) + return vterrors.Wrapf(err, "cannot get replication position on current primary %v; current primary must be healthy to perform PlannedReparent", currentPrimary.AliasString()) } // Next, we wait for the primary-elect to catch up to that snapshot point. @@ -246,12 +246,12 @@ func (pr *PlannedReparenter) performGracefulPromotion( defer setSourceCancel() if err := pr.tmc.SetReplicationSource(setSourceCtx, primaryElect, currentPrimary.Alias, 0, snapshotPos, true, IsReplicaSemiSync(opts.durability, currentPrimary.Tablet, primaryElect)); err != nil { - return "", vterrors.Wrapf(err, "replication on primary-elect %v did not catch up in time; replication must be healthy to perform PlannedReparent", primaryElectAliasStr) + return vterrors.Wrapf(err, "replication on primary-elect %v did not catch up in time; replication must be healthy to perform PlannedReparent", primaryElectAliasStr) } // Verify we still have the topology lock before doing the demotion. if err := topo.CheckShardLocked(ctx, keyspace, shard); err != nil { - return "", vterrors.Wrap(err, "lost topology lock; aborting") + return vterrors.Wrap(err, "lost topology lock; aborting") } // Next up, demote the current primary and get its replication position. @@ -265,7 +265,7 @@ func (pr *PlannedReparenter) performGracefulPromotion( primaryStatus, err := pr.tmc.DemotePrimary(demoteCtx, currentPrimary.Tablet) if err != nil { - return "", vterrors.Wrapf(err, "failed to DemotePrimary on current primary %v: %v", currentPrimary.AliasString(), err) + return vterrors.Wrapf(err, "failed to DemotePrimary on current primary %v: %v", currentPrimary.AliasString(), err) } // Wait for the primary-elect to catch up to the position we demoted the @@ -298,26 +298,10 @@ func (pr *PlannedReparenter) performGracefulPromotion( finalWaitErr = vterrors.Wrapf(finalWaitErr, "encountered error while performing UndoDemotePrimary(%v): %v", currentPrimary.AliasString(), undoErr) } - return "", finalWaitErr - } - - // Primary-elect is caught up to the current primary. We can do the - // promotion now. - promoteCtx, promoteCancel := context.WithTimeout(ctx, opts.WaitReplicasTimeout) - defer promoteCancel() - - rp, err := pr.tmc.PromoteReplica(promoteCtx, primaryElect, SemiSyncAckers(opts.durability, primaryElect) > 0) - if err != nil { - return "", vterrors.Wrapf(err, "primary-elect tablet %v failed to be promoted to primary; please try again", primaryElectAliasStr) - } - - if ctx.Err() == context.DeadlineExceeded { - // PromoteReplica succeeded, but we ran out of time. PRS needs to be - // re-run to complete fully. - return "", vterrors.Errorf(vtrpc.Code_DEADLINE_EXCEEDED, "PLannedReparent timed out after successfully promoting primary-elect %v; please re-run to fix up the replicas", primaryElectAliasStr) + return finalWaitErr } - return rp, nil + return nil } func (pr *PlannedReparenter) performInitialPromotion( @@ -383,7 +367,7 @@ func (pr *PlannedReparenter) performPotentialPromotion( primaryElect *topodatapb.Tablet, tabletMap map[string]*topo.TabletInfo, opts PlannedReparentOptions, -) (string, error) { +) error { primaryElectAliasStr := topoproto.TabletAliasString(primaryElect.Alias) pr.logger.Infof("no clear winner found for current primary term; checking if it's safe to recover by electing %v", primaryElectAliasStr) @@ -457,7 +441,7 @@ func (pr *PlannedReparenter) performPotentialPromotion( close(positions) if rec.HasErrors() { - return "", vterrors.Wrap(rec.Error(), "failed to demote all tablets") + return vterrors.Wrap(rec.Error(), "failed to demote all tablets") } // Construct a mapping of alias to tablet position. @@ -478,7 +462,7 @@ func (pr *PlannedReparenter) performPotentialPromotion( // if the candidate primary is behind that tablet. tp, ok := tabletPosMap[primaryElectAliasStr] if !ok { - return "", vterrors.Errorf(vtrpc.Code_FAILED_PRECONDITION, "primary-elect tablet %v not found in tablet map", primaryElectAliasStr) + return vterrors.Errorf(vtrpc.Code_FAILED_PRECONDITION, "primary-elect tablet %v not found in tablet map", primaryElectAliasStr) } primaryElectPos := tp.pos @@ -487,7 +471,7 @@ func (pr *PlannedReparenter) performPotentialPromotion( // The primary-elect pos has to be at least as advanced as every tablet // in the shard. if !primaryElectPos.AtLeast(tp.pos) { - return "", vterrors.Errorf( + return vterrors.Errorf( vtrpc.Code_FAILED_PRECONDITION, "tablet %v (position: %v) contains transactions not found in primary-elect %v (position: %v)", tp.alias, tp.pos, primaryElectAliasStr, primaryElectPos, @@ -497,19 +481,9 @@ func (pr *PlannedReparenter) performPotentialPromotion( // Check that we still have the topology lock. if err := topo.CheckShardLocked(ctx, keyspace, shard); err != nil { - return "", vterrors.Wrap(err, "lost topology lock; aborting") - } - - // Promote the candidate primary to type:PRIMARY. - promoteCtx, promoteCancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) - defer promoteCancel() - - rp, err := pr.tmc.PromoteReplica(promoteCtx, primaryElect, SemiSyncAckers(opts.durability, primaryElect) > 0) - if err != nil { - return "", vterrors.Wrapf(err, "failed to promote %v to primary", primaryElectAliasStr) + return vterrors.Wrap(err, "lost topology lock; aborting") } - - return rp, nil + return nil } func (pr *PlannedReparenter) reparentShardLocked( @@ -553,6 +527,11 @@ func (pr *PlannedReparenter) reparentShardLocked( currentPrimary := FindCurrentPrimary(tabletMap, pr.logger) reparentJournalPos := "" + // promoteReplicaRequired is a boolean that is used to store whether we need to call + // `PromoteReplica` when we reparent the tablets. This is required to be done when we are doing + // a potential or a graceful promotion. + // InitialPromotion calls `InitPrimary` and for partial promotion, the tablet is already a primary. + promoteReplicaRequired := false // needsRefresh is used to keep track of whether we need to refresh the state // of the new primary tablet. The only case that we need to reload the state // is when we are initializing the new primary. The reason is that the first @@ -601,7 +580,9 @@ func (pr *PlannedReparenter) reparentShardLocked( case currentPrimary == nil && ev.ShardInfo.PrimaryAlias != nil: // Case (2): no clear current primary. Try to find a safe promotion // candidate, and promote to it. - reparentJournalPos, err = pr.performPotentialPromotion(ctx, keyspace, shard, ev.NewPrimary, tabletMap, opts) + err = pr.performPotentialPromotion(ctx, keyspace, shard, ev.NewPrimary, tabletMap, opts) + // We need to call `PromoteReplica` when we reparent the tablets. + promoteReplicaRequired = true case topoproto.TabletAliasEqual(currentPrimary.Alias, opts.NewPrimaryAlias): // Case (3): desired new primary is the current primary. Attempt to fix // up replicas to recover from a previous partial promotion. @@ -609,7 +590,9 @@ func (pr *PlannedReparenter) reparentShardLocked( default: // Case (4): desired primary and current primary differ. Do a graceful // demotion-then-promotion. - reparentJournalPos, err = pr.performGracefulPromotion(ctx, ev, keyspace, shard, currentPrimary, ev.NewPrimary, tabletMap, opts) + err = pr.performGracefulPromotion(ctx, ev, keyspace, shard, currentPrimary, ev.NewPrimary, tabletMap, opts) + // We need to call `PromoteReplica` when we reparent the tablets. + promoteReplicaRequired = true } if err != nil { @@ -620,7 +603,7 @@ func (pr *PlannedReparenter) reparentShardLocked( return vterrors.Wrap(err, "lost topology lock, aborting") } - if err := pr.reparentTablets(ctx, ev, reparentJournalPos, tabletMap, opts); err != nil { + if err := pr.reparentTablets(ctx, ev, reparentJournalPos, promoteReplicaRequired, tabletMap, opts); err != nil { return err } @@ -637,6 +620,7 @@ func (pr *PlannedReparenter) reparentTablets( ctx context.Context, ev *events.Reparent, reparentJournalPosition string, + promoteReplicaRequired bool, tabletMap map[string]*topo.TabletInfo, opts PlannedReparentOptions, ) error { @@ -645,7 +629,7 @@ func (pr *PlannedReparenter) reparentTablets( replCtx, replCancel := context.WithTimeout(ctx, opts.WaitReplicasTimeout) defer replCancel() - // Go thorugh all the tablets. + // Go through all the tablets. // - New primary: populate the reparent journal. // - Everybody else: reparent to the new primary; wait for the reparent // journal row. @@ -660,7 +644,7 @@ func (pr *PlannedReparenter) reparentTablets( // Point all replicas at the new primary and check that they receive the // reparent journal entry, proving that they are replicating from the new - // primary. We do this concurrently with adding the journal entry (after + // primary. We do this concurrently with adding the journal entry (after // this loop), because if semi-sync is enabled, the update to the journal // table will block until at least one replica is successfully attached to // the new primary. @@ -688,6 +672,20 @@ func (pr *PlannedReparenter) reparentTablets( }(alias, tabletInfo.Tablet) } + // If `PromoteReplica` call is required, we should call it and use the position that it returns. + if promoteReplicaRequired { + // Promote the candidate primary to type:PRIMARY. + primaryPosition, err := pr.tmc.PromoteReplica(replCtx, ev.NewPrimary, SemiSyncAckers(opts.durability, ev.NewPrimary) > 0) + if err != nil { + pr.logger.Warningf("primary %v failed to PromoteReplica; cancelling replica reparent attempts", primaryElectAliasStr) + replCancel() + replicasWg.Wait() + + return vterrors.Wrapf(err, "failed PromoteReplica(primary=%v, ts=%v): %v", primaryElectAliasStr, reparentJournalTimestamp, err) + } + reparentJournalPosition = primaryPosition + } + // Add a reparent journal entry on the new primary. If semi-sync is enabled, // this blocks until at least one replica is reparented (above) and // successfully replicating from the new primary. diff --git a/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go b/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go index 5c79caeadb7..20815db3dfc 100644 --- a/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go +++ b/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go @@ -18,6 +18,7 @@ package reparentutil import ( "context" + "errors" "fmt" "strings" "testing" @@ -963,13 +964,12 @@ func TestPlannedReparenter_performGracefulPromotion(t *testing.T) { tabletMap map[string]*topo.TabletInfo opts PlannedReparentOptions - expectedPos string expectedEvent *events.Reparent shouldErr bool // Optional function to run some additional post-test assertions. Will // be run in the main test body before the common assertions are run, // regardless of the value of tt.shouldErr for that test case. - extraAssertions func(t *testing.T, pos string, err error) + extraAssertions func(t *testing.T, err error) }{ { name: "successful promotion", @@ -998,15 +998,6 @@ func TestPlannedReparenter_performGracefulPromotion(t *testing.T) { Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10", }, }, - PromoteReplicaResults: map[string]struct { - Result string - Error error - }{ - "zone1-0000000200": { - Result: "successful reparent journal position", - Error: nil, - }, - }, SetReplicationSourceResults: map[string]error{ "zone1-0000000200": nil, }, @@ -1033,10 +1024,9 @@ func TestPlannedReparenter_performGracefulPromotion(t *testing.T) { Uid: 200, }, }, - tabletMap: map[string]*topo.TabletInfo{}, - opts: PlannedReparentOptions{}, - expectedPos: "successful reparent journal position", - shouldErr: false, + tabletMap: map[string]*topo.TabletInfo{}, + opts: PlannedReparentOptions{}, + shouldErr: false, }, { name: "cannot get snapshot of current primary", @@ -1376,20 +1366,6 @@ func TestPlannedReparenter_performGracefulPromotion(t *testing.T) { Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10", }, }, - PromoteReplicaResults: map[string]struct { - Result string - Error error - }{ - // This being present means that if we don't encounter a - // a case where either WaitForPosition errors, or the parent - // context times out, then we will fail the test, since it - // will cause the overall function under test to return no - // error. - "zone1-0000000200": { - Result: "success!", - Error: nil, - }, - }, SetReplicationSourceResults: map[string]error{ "zone1-0000000200": nil, }, @@ -1483,7 +1459,7 @@ func TestPlannedReparenter_performGracefulPromotion(t *testing.T) { tabletMap: map[string]*topo.TabletInfo{}, opts: PlannedReparentOptions{}, shouldErr: true, - extraAssertions: func(t *testing.T, pos string, err error) { + extraAssertions: func(t *testing.T, err error) { assert.Contains(t, err.Error(), "UndoDemotePrimary", "expected error to include information about failed demotion rollback") }, }, @@ -1546,144 +1522,10 @@ func TestPlannedReparenter_performGracefulPromotion(t *testing.T) { tabletMap: map[string]*topo.TabletInfo{}, opts: PlannedReparentOptions{}, shouldErr: true, - extraAssertions: func(t *testing.T, pos string, err error) { + extraAssertions: func(t *testing.T, err error) { assert.NotContains(t, err.Error(), "UndoDemotePrimary", "expected error to not include information about failed demotion rollback") }, }, - { - name: "primary-elect fails to promote", - ts: memorytopo.NewServer("zone1"), - tmc: &testutil.TabletManagerClient{ - DemotePrimaryResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error - }{ - "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{ - // value of Position doesn't strictly matter for - // this test case, as long as it matches the inner - // key of the WaitForPositionResults map for the - // primary-elect. - Position: "position1", - }, - Error: nil, - }, - }, - PrimaryPositionResults: map[string]struct { - Position string - Error error - }{ - "zone1-0000000100": { - Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10", - }, - }, - PromoteReplicaResults: map[string]struct { - Result string - Error error - }{ - "zone1-0000000200": { - Error: assert.AnError, - }, - }, - SetReplicationSourceResults: map[string]error{ - "zone1-0000000200": nil, - }, - WaitForPositionResults: map[string]map[string]error{ - "zone1-0000000200": { - "position1": nil, - }, - }, - }, - ev: &events.Reparent{}, - keyspace: "testkeyspace", - shard: "-", - currentPrimary: &topo.TabletInfo{ - Tablet: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 100, - }, - }, - }, - primaryElect: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 200, - }, - }, - tabletMap: map[string]*topo.TabletInfo{}, - opts: PlannedReparentOptions{}, - shouldErr: true, - }, - { - name: "promotion succeeds but parent context times out", - ts: memorytopo.NewServer("zone1"), - tmc: &testutil.TabletManagerClient{ - DemotePrimaryResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error - }{ - "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{ - // value of Position doesn't strictly matter for - // this test case, as long as it matches the inner - // key of the WaitForPositionResults map for the - // primary-elect. - Position: "position1", - }, - Error: nil, - }, - }, - PrimaryPositionResults: map[string]struct { - Position string - Error error - }{ - "zone1-0000000100": { - Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10", - }, - }, - PromoteReplicaPostDelays: map[string]time.Duration{ - "zone1-0000000200": time.Millisecond * 100, // 10x the parent context timeout - }, - PromoteReplicaResults: map[string]struct { - Result string - Error error - }{ - "zone1-0000000200": { - Error: nil, - }, - }, - SetReplicationSourceResults: map[string]error{ - "zone1-0000000200": nil, - }, - WaitForPositionResults: map[string]map[string]error{ - "zone1-0000000200": { - "position1": nil, - }, - }, - }, - ctxTimeout: time.Millisecond * 10, - ev: &events.Reparent{}, - keyspace: "testkeyspace", - shard: "-", - currentPrimary: &topo.TabletInfo{ - Tablet: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 100, - }, - }, - }, - primaryElect: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 200, - }, - }, - tabletMap: map[string]*topo.TabletInfo{}, - opts: PlannedReparentOptions{}, - shouldErr: true, - }, } ctx := context.Background() @@ -1727,7 +1569,7 @@ func TestPlannedReparenter_performGracefulPromotion(t *testing.T) { require.NoError(t, err) tt.opts.durability = durability - pos, err := pr.performGracefulPromotion( + err = pr.performGracefulPromotion( ctx, tt.ev, tt.keyspace, @@ -1739,7 +1581,7 @@ func TestPlannedReparenter_performGracefulPromotion(t *testing.T) { ) if tt.extraAssertions != nil { - tt.extraAssertions(t, pos, err) + tt.extraAssertions(t, err) } if tt.shouldErr { @@ -1749,7 +1591,6 @@ func TestPlannedReparenter_performGracefulPromotion(t *testing.T) { } assert.NoError(t, err) - assert.Equal(t, tt.expectedPos, pos) }) } } @@ -2066,8 +1907,7 @@ func TestPlannedReparenter_performPotentialPromotion(t *testing.T) { primaryElect *topodatapb.Tablet tabletMap map[string]*topo.TabletInfo - expectedPos string - shouldErr bool + shouldErr bool }{ { name: "success", @@ -2096,15 +1936,6 @@ func TestPlannedReparenter_performPotentialPromotion(t *testing.T) { Error: nil, }, }, - PromoteReplicaResults: map[string]struct { - Result string - Error error - }{ - "zone1-0000000100": { - Result: "reparent journal position", - Error: nil, - }, - }, }, unlockTopo: false, keyspace: "testkeyspace", @@ -2141,8 +1972,7 @@ func TestPlannedReparenter_performPotentialPromotion(t *testing.T) { }, }, }, - expectedPos: "reparent journal position", - shouldErr: false, + shouldErr: false, }, { name: "failed to DemotePrimary on a tablet", @@ -2403,158 +2233,6 @@ func TestPlannedReparenter_performPotentialPromotion(t *testing.T) { }, shouldErr: true, }, - { - name: "failed to promote primary-elect", - ts: memorytopo.NewServer("zone1"), - tmc: &testutil.TabletManagerClient{ - DemotePrimaryResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error - }{ - "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{ - Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10", - }, - Error: nil, - }, - "zone1-0000000101": { - Status: &replicationdatapb.PrimaryStatus{ - Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10", - }, - Error: nil, - }, - "zone1-0000000102": { - Status: &replicationdatapb.PrimaryStatus{ - Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5", - }, - Error: nil, - }, - }, - PromoteReplicaResults: map[string]struct { - Result string - Error error - }{ - "zone1-0000000100": { - Result: "", - Error: assert.AnError, - }, - }, - }, - unlockTopo: false, - keyspace: "testkeyspace", - shard: "-", - primaryElect: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 100, - }, - }, - tabletMap: map[string]*topo.TabletInfo{ - "zone1-0000000100": { - Tablet: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 100, - }, - }, - }, - "zone1-0000000101": { - Tablet: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 101, - }, - }, - }, - "zone1-0000000102": { - Tablet: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 102, - }, - }, - }, - }, - shouldErr: true, - }, - { - name: "timed out while promoting primary-elect", - ts: memorytopo.NewServer("zone1"), - tmc: &testutil.TabletManagerClient{ - DemotePrimaryResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error - }{ - "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{ - Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10", - }, - Error: nil, - }, - "zone1-0000000101": { - Status: &replicationdatapb.PrimaryStatus{ - Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10", - }, - Error: nil, - }, - "zone1-0000000102": { - Status: &replicationdatapb.PrimaryStatus{ - Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5", - }, - Error: nil, - }, - }, - PromoteReplicaDelays: map[string]time.Duration{ - "zone1-0000000100": time.Millisecond * 100, - }, - PromoteReplicaResults: map[string]struct { - Result string - Error error - }{ - "zone1-0000000100": { - Result: "reparent journal position", - Error: nil, - }, - }, - }, - timeout: time.Millisecond * 50, - unlockTopo: false, - keyspace: "testkeyspace", - shard: "-", - primaryElect: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 100, - }, - }, - tabletMap: map[string]*topo.TabletInfo{ - "zone1-0000000100": { - Tablet: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 100, - }, - }, - }, - "zone1-0000000101": { - Tablet: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 101, - }, - }, - }, - "zone1-0000000102": { - Tablet: &topodatapb.Tablet{ - Alias: &topodatapb.TabletAlias{ - Cell: "zone1", - Uid: 102, - }, - }, - }, - }, - shouldErr: true, - }, } ctx := context.Background() @@ -2595,7 +2273,7 @@ func TestPlannedReparenter_performPotentialPromotion(t *testing.T) { durability, err := GetDurabilityPolicy("none") require.NoError(t, err) - rp, err := pr.performPotentialPromotion(ctx, tt.keyspace, tt.shard, tt.primaryElect, tt.tabletMap, PlannedReparentOptions{durability: durability}) + err = pr.performPotentialPromotion(ctx, tt.keyspace, tt.shard, tt.primaryElect, tt.tabletMap, PlannedReparentOptions{durability: durability}) if tt.shouldErr { assert.Error(t, err) @@ -2603,7 +2281,6 @@ func TestPlannedReparenter_performPotentialPromotion(t *testing.T) { } assert.NoError(t, err) - assert.Equal(t, tt.expectedPos, rp) }) } } @@ -3335,10 +3012,12 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { durability string ev *events.Reparent reparentJournalPosition string + promoteReplicaRequired bool tabletMap map[string]*topo.TabletInfo opts PlannedReparentOptions shouldErr bool + wantErr string }{ { name: "success - durability = none", @@ -3473,6 +3152,158 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { }, }, shouldErr: false, + }, { + name: "success - promote replica required", + durability: "semi_sync", + promoteReplicaRequired: true, + tmc: &testutil.TabletManagerClient{ + PromoteReplicaResults: map[string]struct { + Result string + Error error + }{ + "zone1-0000000100": { + Result: "successful reparent journal position", + Error: nil, + }, + }, + PopulateReparentJournalResults: map[string]error{ + "zone1-0000000100": nil, + }, + SetReplicationSourceResults: map[string]error{ + "zone1-0000000200": nil, + "zone1-0000000201": nil, + "zone1-0000000202": nil, + }, + SetReplicationSourceSemiSync: map[string]bool{ + "zone1-0000000200": true, + "zone1-0000000201": true, + "zone1-0000000202": false, + }, + }, + ev: &events.Reparent{ + NewPrimary: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000100": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + "zone1-0000000200": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 200, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000201": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 201, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000202": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 202, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + shouldErr: false, + }, { + name: "Promote replica failed", + durability: "semi_sync", + promoteReplicaRequired: true, + tmc: &testutil.TabletManagerClient{ + PromoteReplicaResults: map[string]struct { + Result string + Error error + }{ + "zone1-0000000100": { + Error: errors.New("failed promote replica"), + }, + }, + PopulateReparentJournalResults: map[string]error{ + "zone1-0000000100": nil, + }, + SetReplicationSourceResults: map[string]error{ + "zone1-0000000200": nil, + "zone1-0000000201": nil, + "zone1-0000000202": nil, + }, + SetReplicationSourceSemiSync: map[string]bool{ + "zone1-0000000200": true, + "zone1-0000000201": true, + "zone1-0000000202": false, + }, + }, + ev: &events.Reparent{ + NewPrimary: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000100": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + "zone1-0000000200": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 200, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000201": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 201, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000202": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 202, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + shouldErr: true, + wantErr: "failed PromoteReplica(primary=zone1-0000000100,", }, { name: "SetReplicationSource failed on replica", @@ -3534,6 +3365,7 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { }, }, shouldErr: true, + wantErr: "retry failed replicas: tablet zone1-0000000201 failed to SetReplicationSource(zone1-0000000100): assert.AnError general error for testing", }, { name: "SetReplicationSource timed out on replica", @@ -3601,6 +3433,7 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { WaitReplicasTimeout: time.Millisecond * 10, }, shouldErr: true, + wantErr: "retry failed replicas: tablet zone1-0000000201 failed to SetReplicationSource(zone1-0000000100): context deadline exceeded", }, { name: "PopulateReparentJournal failed out on new primary", @@ -3662,6 +3495,7 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { }, }, shouldErr: true, + wantErr: "failed PopulateReparentJournal(primary=zone1-0000000100", }, { name: "PopulateReparentJournal timed out on new primary", @@ -3729,6 +3563,7 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { WaitReplicasTimeout: time.Millisecond * 10, }, shouldErr: true, + wantErr: "failed PopulateReparentJournal(primary=zone1-0000000100", }, } @@ -3749,10 +3584,12 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { durability, err := GetDurabilityPolicy(durabilityPolicy) require.NoError(t, err) tt.opts.durability = durability - err = pr.reparentTablets(ctx, tt.ev, tt.reparentJournalPosition, tt.tabletMap, tt.opts) + err = pr.reparentTablets(ctx, tt.ev, tt.reparentJournalPosition, tt.promoteReplicaRequired, tt.tabletMap, tt.opts) if tt.shouldErr { assert.Error(t, err) - + if tt.wantErr != "" { + require.ErrorContains(t, err, tt.wantErr) + } return } diff --git a/go/vt/wrangler/testlib/planned_reparent_shard_test.go b/go/vt/wrangler/testlib/planned_reparent_shard_test.go index f3eaa987ac4..3c025a8c7f1 100644 --- a/go/vt/wrangler/testlib/planned_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/planned_reparent_shard_test.go @@ -97,7 +97,9 @@ func TestPlannedReparentShardNoPrimaryProvided(t *testing.T) { oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE SET MASTER", "START SLAVE", - // we end up calling SetReplicationSource twice on the old primary + // We might end up calling SetReplicationSource twice on the old primary + // one coming from `PlannedReparentShard` and one coming from `endPrimaryTerm`. + // This is a race though between SetReplicationSource on this tablet and `PromoteReplica` on the new primary. "FAKE SET MASTER", "START SLAVE", } @@ -132,8 +134,9 @@ func TestPlannedReparentShardNoPrimaryProvided(t *testing.T) { err = newPrimary.FakeMysqlDaemon.CheckSuperQueryList() require.NoError(t, err) - err = oldPrimary.FakeMysqlDaemon.CheckSuperQueryList() - require.NoError(t, err) + // Because of the race we can either end up using all the queries, or 2 might be left. + queriesLeft := len(oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList) - oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryCurrent + require.True(t, queriesLeft == 0 || queriesLeft == 2) err = goodReplica1.FakeMysqlDaemon.CheckSuperQueryList() require.NoError(t, err) @@ -209,7 +212,9 @@ func TestPlannedReparentShardNoError(t *testing.T) { oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE SET MASTER", "START SLAVE", - // we end up calling SetReplicationSource twice on the old primary + // We might end up calling SetReplicationSource twice on the old primary + // one coming from `PlannedReparentShard` and one coming from `endPrimaryTerm`. + // This is a race though between SetReplicationSource on this tablet and `PromoteReplica` on the new primary. "FAKE SET MASTER", "START SLAVE", } @@ -258,8 +263,9 @@ func TestPlannedReparentShardNoError(t *testing.T) { // check what was run err = newPrimary.FakeMysqlDaemon.CheckSuperQueryList() require.NoError(t, err) - err = oldPrimary.FakeMysqlDaemon.CheckSuperQueryList() - require.NoError(t, err) + // Because of the race we can either end up using all the queries, or 2 might be left. + queriesLeft := len(oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList) - oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryCurrent + require.True(t, queriesLeft == 0 || queriesLeft == 2) err = goodReplica1.FakeMysqlDaemon.CheckSuperQueryList() require.NoError(t, err) err = goodReplica2.FakeMysqlDaemon.CheckSuperQueryList() @@ -795,6 +801,9 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE SET MASTER", "START SLAVE", + // extra SetReplicationSource call due to retry + "FAKE SET MASTER", + "START SLAVE", } oldPrimary.StartActionLoop(t, wr) defer oldPrimary.StopActionLoop(t) @@ -814,6 +823,10 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { "STOP SLAVE", "FAKE SET MASTER", "START SLAVE", + // extra SetReplicationSource call due to retry + "STOP SLAVE", + "FAKE SET MASTER", + "START SLAVE", } goodReplica1.StartActionLoop(t, wr) defer goodReplica1.StopActionLoop(t) @@ -827,6 +840,8 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { "FAKE SET MASTER", "START SLAVE", "FAKE SET MASTER", + // extra SetReplicationSource call due to retry + "FAKE SET MASTER", } goodReplica2.StartActionLoop(t, wr) goodReplica2.FakeMysqlDaemon.Replicating = false @@ -844,23 +859,7 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { // retrying should work newPrimary.FakeMysqlDaemon.PromoteError = nil - newPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "STOP SLAVE", - "FAKE SET MASTER", - "START SLAVE", - // extra commands because of retry - "STOP SLAVE", - "FAKE SET MASTER", - "START SLAVE", - "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", - } - oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ - "FAKE SET MASTER", - "START SLAVE", - // extra commands because of retry - "FAKE SET MASTER", - "START SLAVE", - } + newPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] // run PlannedReparentShard err = vp.Run([]string{"PlannedReparentShard", "--wait_replicas_timeout", "10s", "--keyspace_shard", newPrimary.Tablet.Keyspace + "/" + newPrimary.Tablet.Shard, "--new_primary", topoproto.TabletAliasString(newPrimary.Tablet.Alias)}) From b6755ae43a4de930b32587f9aa2aed8703f83c37 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Fri, 7 Jul 2023 12:48:21 +0530 Subject: [PATCH 133/233] Ignore error while reading table data in Schema.Engine reload (#13421) (#13424) * ignore views load error * added unit test --------- Signed-off-by: Harshit Gangal --- go/event/syslogger/fake_logger.go | 85 +++++++++++++++++++ go/event/syslogger/syslogger_test.go | 57 +------------ go/vt/vttablet/tabletserver/schema/engine.go | 9 +- .../tabletserver/schema/engine_test.go | 48 ++++++----- 4 files changed, 115 insertions(+), 84 deletions(-) create mode 100644 go/event/syslogger/fake_logger.go diff --git a/go/event/syslogger/fake_logger.go b/go/event/syslogger/fake_logger.go new file mode 100644 index 00000000000..a3eeaf307c1 --- /dev/null +++ b/go/event/syslogger/fake_logger.go @@ -0,0 +1,85 @@ +/* +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 agreedto in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package syslogger + +import ( + "fmt" + + "vitess.io/vitess/go/vt/log" +) + +type loggerMsg struct { + msg string + level string +} +type TestLogger struct { + logs []loggerMsg + savedInfof func(format string, args ...any) + savedWarningf func(format string, args ...any) + savedErrorf func(format string, args ...any) +} + +func NewTestLogger() *TestLogger { + tl := &TestLogger{ + savedInfof: log.Infof, + savedWarningf: log.Warningf, + savedErrorf: log.Errorf, + } + log.Infof = tl.recordInfof + log.Warningf = tl.recordWarningf + log.Errorf = tl.recordErrorf + return tl +} + +func (tl *TestLogger) Close() { + log.Infof = tl.savedInfof + log.Warningf = tl.savedWarningf + log.Errorf = tl.savedErrorf +} + +func (tl *TestLogger) recordInfof(format string, args ...any) { + msg := fmt.Sprintf(format, args...) + tl.logs = append(tl.logs, loggerMsg{msg, "INFO"}) + tl.savedInfof(msg) +} + +func (tl *TestLogger) recordWarningf(format string, args ...any) { + msg := fmt.Sprintf(format, args...) + tl.logs = append(tl.logs, loggerMsg{msg, "WARNING"}) + tl.savedWarningf(msg) +} + +func (tl *TestLogger) recordErrorf(format string, args ...any) { + msg := fmt.Sprintf(format, args...) + tl.logs = append(tl.logs, loggerMsg{msg, "ERROR"}) + tl.savedErrorf(msg) +} + +func (tl *TestLogger) getLog() loggerMsg { + if len(tl.logs) > 0 { + return tl.logs[len(tl.logs)-1] + } + return loggerMsg{"no logs!", "ERROR"} +} + +func (tl *TestLogger) GetAllLogs() []string { + var logs []string + for _, l := range tl.logs { + logs = append(logs, l.level+":"+l.msg) + } + return logs +} diff --git a/go/event/syslogger/syslogger_test.go b/go/event/syslogger/syslogger_test.go index 6549e4ca8bb..4847fecac2a 100644 --- a/go/event/syslogger/syslogger_test.go +++ b/go/event/syslogger/syslogger_test.go @@ -23,7 +23,6 @@ import ( "testing" "vitess.io/vitess/go/event" - "vitess.io/vitess/go/vt/log" ) type TestEvent struct { @@ -63,60 +62,6 @@ func (fw *fakeWriter) Info(msg string) error { return fw.write(syslog.LOG_INF func (fw *fakeWriter) Notice(msg string) error { return fw.write(syslog.LOG_NOTICE, msg) } func (fw *fakeWriter) Warning(msg string) error { return fw.write(syslog.LOG_WARNING, msg) } -type loggerMsg struct { - msg string - level string -} -type testLogger struct { - logs []loggerMsg - savedInfof func(format string, args ...any) - savedWarningf func(format string, args ...any) - savedErrorf func(format string, args ...any) -} - -func newTestLogger() *testLogger { - tl := &testLogger{ - savedInfof: log.Infof, - savedWarningf: log.Warningf, - savedErrorf: log.Errorf, - } - log.Infof = tl.recordInfof - log.Warningf = tl.recordWarningf - log.Errorf = tl.recordErrorf - return tl -} - -func (tl *testLogger) Close() { - log.Infof = tl.savedInfof - log.Warningf = tl.savedWarningf - log.Errorf = tl.savedErrorf -} - -func (tl *testLogger) recordInfof(format string, args ...any) { - msg := fmt.Sprintf(format, args...) - tl.logs = append(tl.logs, loggerMsg{msg, "INFO"}) - tl.savedInfof(msg) -} - -func (tl *testLogger) recordWarningf(format string, args ...any) { - msg := fmt.Sprintf(format, args...) - tl.logs = append(tl.logs, loggerMsg{msg, "WARNING"}) - tl.savedWarningf(msg) -} - -func (tl *testLogger) recordErrorf(format string, args ...any) { - msg := fmt.Sprintf(format, args...) - tl.logs = append(tl.logs, loggerMsg{msg, "ERROR"}) - tl.savedErrorf(msg) -} - -func (tl *testLogger) getLog() loggerMsg { - if len(tl.logs) > 0 { - return tl.logs[len(tl.logs)-1] - } - return loggerMsg{"no logs!", "ERROR"} -} - // TestSyslog checks that our callback works. func TestSyslog(t *testing.T) { writer = &fakeWriter{} @@ -132,7 +77,7 @@ func TestSyslog(t *testing.T) { // TestBadWriter verifies we are still triggering (to normal logs) if // the syslog connection failed func TestBadWriter(t *testing.T) { - tl := newTestLogger() + tl := NewTestLogger() defer tl.Close() writer = nil diff --git a/go/vt/vttablet/tabletserver/schema/engine.go b/go/vt/vttablet/tabletserver/schema/engine.go index 3e6fd16c019..573bd7a6ce3 100644 --- a/go/vt/vttablet/tabletserver/schema/engine.go +++ b/go/vt/vttablet/tabletserver/schema/engine.go @@ -37,7 +37,6 @@ import ( "vitess.io/vitess/go/acl" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/timer" - "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/sqlparser" @@ -66,7 +65,7 @@ type Engine struct { tables map[string]*Table lastChange int64 reloadTime time.Duration - //the position at which the schema was last loaded. it is only used in conjunction with ReloadAt + // the position at which the schema was last loaded. it is only used in conjunction with ReloadAt reloadAtPos mysql.Position notifierMu sync.Mutex notifiers map[string]notifier @@ -413,7 +412,6 @@ func (se *Engine) reload(ctx context.Context, includeStats bool) error { return err } - rec := concurrency.AllErrorRecorder{} // curTables keeps track of tables in the new snapshot so we can detect what was dropped. curTables := map[string]bool{"dual": true} // changedTables keeps track of tables that have changed so we can reload their pk info. @@ -456,7 +454,7 @@ func (se *Engine) reload(ctx context.Context, includeStats bool) error { log.V(2).Infof("Reading schema for table: %s", tableName) table, err := LoadTable(conn, se.cp.DBName(), tableName, row[3].ToString()) if err != nil { - rec.RecordError(vterrors.Wrapf(err, "in Engine.reload(), reading table %s", tableName)) + log.Warningf("Failed reading schema for the table: %s, error: %v", tableName, err) continue } if includeStats { @@ -471,9 +469,6 @@ func (se *Engine) reload(ctx context.Context, includeStats bool) error { created = append(created, tableName) } } - if rec.HasErrors() { - return rec.Error() - } // Compute and handle dropped tables. var dropped []string diff --git a/go/vt/vttablet/tabletserver/schema/engine_test.go b/go/vt/vttablet/tabletserver/schema/engine_test.go index c38a63e2481..5339887b5c2 100644 --- a/go/vt/vttablet/tabletserver/schema/engine_test.go +++ b/go/vt/vttablet/tabletserver/schema/engine_test.go @@ -18,6 +18,7 @@ package schema import ( "context" + "errors" "expvar" "fmt" "net/http" @@ -27,20 +28,19 @@ import ( "testing" "time" - "vitess.io/vitess/go/test/utils" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/event/syslogger" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/dbconfigs" + querypb "vitess.io/vitess/go/vt/proto/query" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vttablet/tabletserver/schema/schematest" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" - - querypb "vitess.io/vitess/go/vt/proto/query" ) const baseShowTablesPattern = `SELECT t\.table_name.*` @@ -201,7 +201,7 @@ func TestOpenAndReload(t *testing.T) { assert.Equal(t, int64(0), se.tableAllocatedSizeGauge.Counts()["msg"]) assert.Equal(t, int64(0), se.tableFileSizeGauge.Counts()["msg"]) - //ReloadAt tests + // ReloadAt tests pos1, err := mysql.DecodePosition("MariaDB/0-41983-20") require.NoError(t, err) pos2, err := mysql.DecodePosition("MariaDB/0-41983-40") @@ -423,7 +423,10 @@ func TestOpenFailedDueToExecErr(t *testing.T) { } } -func TestOpenFailedDueToTableErr(t *testing.T) { +// TestOpenFailedDueToLoadTableErr tests that schema engine load should not fail instead should log the failures. +func TestOpenFailedDueToLoadTableErr(t *testing.T) { + tl := syslogger.NewTestLogger() + defer tl.Close() db := fakesqldb.New(t) defer db.Close() schematest.AddDefaultQueries(db) @@ -431,27 +434,30 @@ func TestOpenFailedDueToTableErr(t *testing.T) { Fields: mysql.BaseShowTablesFields, Rows: [][]sqltypes.Value{ mysql.BaseShowTablesRow("test_table", false, ""), + mysql.BaseShowTablesRow("test_view", true, "VIEW"), }, }) - db.MockQueriesForTable("test_table", &sqltypes.Result{ - // this will cause NewTable error, as it expects zero rows. - Fields: []*querypb.Field{ - { - Type: querypb.Type_VARCHAR, - }, - }, - Rows: [][]sqltypes.Value{ - {sqltypes.NewVarBinary("")}, - }, - }) + // this will cause NewTable error, as it expects zero rows. + db.MockQueriesForTable("test_table", sqltypes.MakeTestResult(sqltypes.MakeTestFields("foo", "varchar"), "")) + + // adding column query for table_view + db.AddQueryPattern(fmt.Sprintf(mysql.GetColumnNamesQueryPatternForTable, "test_view"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("column_name", "varchar"), "")) + // rejecting the impossible query + db.AddRejectedQuery("SELECT * FROM `fakesqldb`.`test_view` WHERE 1 != 1", errors.New("The user specified as a definer ('root'@'%') does not exist (errno 1449) (sqlstate HY000)")) AddFakeInnoDBReadRowsResult(db, 0) se := newEngine(10, 1*time.Second, 1*time.Second, db) err := se.Open() - want := "Row count exceeded" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("se.Open: %v, want %s", err, want) - } + // failed load should not return any error, instead should be logged. + require.NoError(t, err) + + logs := tl.GetAllLogs() + logOutput := strings.Join(logs, ":::") + assert.Contains(t, logOutput, "WARNING:Failed reading schema for the table: test_table") + assert.Contains(t, logOutput, "Row count exceeded") + assert.Contains(t, logOutput, "WARNING:Failed reading schema for the table: test_view") + assert.Contains(t, logOutput, "The user specified as a definer ('root'@'%') does not exist (errno 1449) (sqlstate HY000)") } func TestExportVars(t *testing.T) { From deacad1a313612519a740f117d12e95da2735937 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Fri, 7 Jul 2023 17:16:28 +0300 Subject: [PATCH 134/233] resolved conflict (#13456) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/mysql/constants.go | 1 + go/vt/mysqlctl/schema.go | 16 ++++++++++-- go/vt/vttablet/tabletserver/schema/engine.go | 26 ++++++++++++++++++- .../tabletserver/schema/engine_test.go | 8 +++--- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/go/mysql/constants.go b/go/mysql/constants.go index 8befcc6294c..ad5f4c0221e 100644 --- a/go/mysql/constants.go +++ b/go/mysql/constants.go @@ -541,6 +541,7 @@ const ( ERIllegalValueForType = 1367 ERDataTooLong = 1406 ErrWrongValueForType = 1411 + ERNoSuchUser = 1449 ERForbidSchemaChange = 1450 ERWrongValue = 1525 ERDataOutOfRange = 1690 diff --git a/go/vt/mysqlctl/schema.go b/go/vt/mysqlctl/schema.go index 23874f803e8..406b5c59499 100644 --- a/go/vt/mysqlctl/schema.go +++ b/go/vt/mysqlctl/schema.go @@ -41,6 +41,14 @@ import ( var autoIncr = regexp.MustCompile(` AUTO_INCREMENT=\d+`) +type EmptyColumnsErr struct { + dbName, tableName, query string +} + +func (e EmptyColumnsErr) Error() string { + return fmt.Sprintf("unable to get columns for table %s.%s using query %s", e.dbName, e.tableName, e.query) +} + // executeSchemaCommands executes some SQL commands, using the mysql // command line tool. It uses the dba connection parameters, with credentials. func (mysqld *Mysqld) executeSchemaCommands(sql string) error { @@ -287,6 +295,10 @@ const ( GetFieldsQuery = "SELECT %s FROM %s WHERE 1 != 1" ) +// GetColumnsList returns the column names for a given table/view, using a query generating function. +// Returned values: +// - selectColumns: a string of comma delimited qualified names to be used in a SELECT query. e.g. "`id`, `name`, `val`" +// - err: error func GetColumnsList(dbName, tableName string, exec func(string, int, bool) (*sqltypes.Result, error)) (string, error) { var dbName2 string if dbName == "" { @@ -300,8 +312,8 @@ func GetColumnsList(dbName, tableName string, exec func(string, int, bool) (*sql return "", err } if qr == nil || len(qr.Rows) == 0 { - err = fmt.Errorf("unable to get columns for table %s.%s using query %s", dbName, tableName, query) - log.Errorf("%s", fmt.Errorf("unable to get columns for table %s.%s using query %s", dbName, tableName, query)) + err := &EmptyColumnsErr{dbName: dbName, tableName: tableName, query: query} + log.Error(err.Error()) return "", err } selectColumns := "" diff --git a/go/vt/vttablet/tabletserver/schema/engine.go b/go/vt/vttablet/tabletserver/schema/engine.go index 573bd7a6ce3..81f10235727 100644 --- a/go/vt/vttablet/tabletserver/schema/engine.go +++ b/go/vt/vttablet/tabletserver/schema/engine.go @@ -20,12 +20,17 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "net/http" + "strings" "sync" "time" "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/concurrency" + "vitess.io/vitess/go/vt/mysqlctl" + "vitess.io/vitess/go/vt/mysqlctl/tmutils" "vitess.io/vitess/go/vt/sidecardb" "vitess.io/vitess/go/stats" @@ -412,6 +417,7 @@ func (se *Engine) reload(ctx context.Context, includeStats bool) error { return err } + rec := concurrency.AllErrorRecorder{} // curTables keeps track of tables in the new snapshot so we can detect what was dropped. curTables := map[string]bool{"dual": true} // changedTables keeps track of tables that have changed so we can reload their pk info. @@ -452,9 +458,24 @@ func (se *Engine) reload(ctx context.Context, includeStats bool) error { } log.V(2).Infof("Reading schema for table: %s", tableName) + tableType := row[1].String() table, err := LoadTable(conn, se.cp.DBName(), tableName, row[3].ToString()) if err != nil { - log.Warningf("Failed reading schema for the table: %s, error: %v", tableName, err) + isView := strings.Contains(tableType, tmutils.TableView) + var emptyColumnsError mysqlctl.EmptyColumnsErr + if errors.As(err, &emptyColumnsError) && isView { + log.Warningf("Failed reading schema for the table: %s, error: %v", tableName, err) + continue + } + sqlErr, isSQLErr := mysql.NewSQLErrorFromError(err).(*mysql.SQLError) + if isSQLErr && sqlErr != nil && sqlErr.Number() == mysql.ERNoSuchUser && isView { + // A VIEW that has an invalid DEFINER, leading to: + // ERROR 1449 (HY000): The user specified as a definer (...) does not exist + log.Warningf("Failed reading schema for the table: %s, error: %v", tableName, err) + continue + } + // Non recoverable error: + rec.RecordError(vterrors.Wrapf(err, "in Engine.reload(), reading table %s", tableName)) continue } if includeStats { @@ -469,6 +490,9 @@ func (se *Engine) reload(ctx context.Context, includeStats bool) error { created = append(created, tableName) } } + if rec.HasErrors() { + return rec.Error() + } // Compute and handle dropped tables. var dropped []string diff --git a/go/vt/vttablet/tabletserver/schema/engine_test.go b/go/vt/vttablet/tabletserver/schema/engine_test.go index 5339887b5c2..29a74a28021 100644 --- a/go/vt/vttablet/tabletserver/schema/engine_test.go +++ b/go/vt/vttablet/tabletserver/schema/engine_test.go @@ -444,18 +444,16 @@ func TestOpenFailedDueToLoadTableErr(t *testing.T) { db.AddQueryPattern(fmt.Sprintf(mysql.GetColumnNamesQueryPatternForTable, "test_view"), sqltypes.MakeTestResult(sqltypes.MakeTestFields("column_name", "varchar"), "")) // rejecting the impossible query - db.AddRejectedQuery("SELECT * FROM `fakesqldb`.`test_view` WHERE 1 != 1", errors.New("The user specified as a definer ('root'@'%') does not exist (errno 1449) (sqlstate HY000)")) + db.AddRejectedQuery("SELECT * FROM `fakesqldb`.`test_view` WHERE 1 != 1", mysql.NewSQLErrorFromError(errors.New("The user specified as a definer ('root'@'%') does not exist (errno 1449) (sqlstate HY000)"))) AddFakeInnoDBReadRowsResult(db, 0) se := newEngine(10, 1*time.Second, 1*time.Second, db) err := se.Open() - // failed load should not return any error, instead should be logged. - require.NoError(t, err) + // failed load should return an error because of test_table + assert.ErrorContains(t, err, "Row count exceeded") logs := tl.GetAllLogs() logOutput := strings.Join(logs, ":::") - assert.Contains(t, logOutput, "WARNING:Failed reading schema for the table: test_table") - assert.Contains(t, logOutput, "Row count exceeded") assert.Contains(t, logOutput, "WARNING:Failed reading schema for the table: test_view") assert.Contains(t, logOutput, "The user specified as a definer ('root'@'%') does not exist (errno 1449) (sqlstate HY000)") } From af3cd0a423e43f5cf5cea2d4a5356a36c541794f Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Mon, 10 Jul 2023 20:01:43 +0530 Subject: [PATCH 135/233] [release-16.0] Remove excessive logging in VTOrc APIs (#13459) (#13462) --- go/vt/vtorc/server/api.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/go/vt/vtorc/server/api.go b/go/vt/vtorc/server/api.go index 1a7f0a1c1da..d488633f376 100644 --- a/go/vt/vtorc/server/api.go +++ b/go/vt/vtorc/server/api.go @@ -23,7 +23,6 @@ import ( "net/http" "vitess.io/vitess/go/acl" - "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/vtorc/inst" "vitess.io/vitess/go/vt/vtorc/logic" "vitess.io/vitess/go/vt/vtorc/process" @@ -59,7 +58,6 @@ var ( // ServeHTTP implements the http.Handler interface. This is the entry point for all the api commands of VTOrc func (v *vtorcAPI) ServeHTTP(response http.ResponseWriter, request *http.Request) { apiPath := request.URL.Path - log.Infof("HTTP API Request received: %v", apiPath) if err := acl.CheckAccessHTTP(request, getACLPermissionLevelForAPI(apiPath)); err != nil { acl.SendError(response, err) return From 9ebc7bed50e4c1a920f1807d6909aa307496aa45 Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Mon, 10 Jul 2023 17:24:20 +0000 Subject: [PATCH 136/233] compose: fix `consul:latest` error Signed-off-by: Tim Vaillancourt --- examples/compose/docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index 001f4a75ea1..a3e06959bae 100644 --- a/examples/compose/docker-compose.yml +++ b/examples/compose/docker-compose.yml @@ -2,7 +2,7 @@ services: consul1: command: agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0 hostname: consul1 - image: consul:latest + image: hashicorp/consul:latest ports: - 8400:8400 - 8500:8500 @@ -16,7 +16,7 @@ services: - "8500" - "8600" hostname: consul2 - image: consul:latest + image: hashicorp/consul:latest consul3: command: agent -server -retry-join consul1 -disable-host-node-id depends_on: @@ -26,7 +26,7 @@ services: - "8500" - "8600" hostname: consul3 - image: consul:latest + image: hashicorp/consul:latest external_db_host: build: context: ./external_db/mysql From 73c6d71071e9a8614786284f814db79e8cb4523d Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Mon, 10 Jul 2023 17:54:58 +0000 Subject: [PATCH 137/233] Update docker-compose.beginners.yml too Signed-off-by: Tim Vaillancourt --- examples/compose/.env | 1 + examples/compose/docker-compose.beginners.yml | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/compose/.env b/examples/compose/.env index 0f008404ea9..3d88b5f83e5 100644 --- a/examples/compose/.env +++ b/examples/compose/.env @@ -7,6 +7,7 @@ CELL=local KEYSPACE=commerce DB=commerce +VITESS_TAG:v14.0.5 EXTERNAL_DB=0 DB_HOST=external_db_host DB_PORT=3306 diff --git a/examples/compose/docker-compose.beginners.yml b/examples/compose/docker-compose.beginners.yml index 51cd9eae3b8..29ceca7ff25 100644 --- a/examples/compose/docker-compose.beginners.yml +++ b/examples/compose/docker-compose.beginners.yml @@ -1,7 +1,7 @@ version: "2.1" services: consul1: - image: consul:latest + image: hashicorp/consul:latest hostname: "consul1" ports: - "8400:8400" @@ -9,7 +9,7 @@ services: - "8600:8600" command: "agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0" consul2: - image: consul:latest + image: hashicorp/consul:latest hostname: "consul2" expose: - "8400" @@ -19,7 +19,7 @@ services: depends_on: - consul1 consul3: - image: consul:latest + image: hashicorp/consul:latest hostname: "consul3" expose: - "8400" From 7c495991b24d02c0b66b9f095d2dda99e39c798f Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Mon, 10 Jul 2023 17:55:34 +0000 Subject: [PATCH 138/233] rm mistaken commit Signed-off-by: Tim Vaillancourt --- examples/compose/.env | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/compose/.env b/examples/compose/.env index 3d88b5f83e5..0f008404ea9 100644 --- a/examples/compose/.env +++ b/examples/compose/.env @@ -7,7 +7,6 @@ CELL=local KEYSPACE=commerce DB=commerce -VITESS_TAG:v14.0.5 EXTERNAL_DB=0 DB_HOST=external_db_host DB_PORT=3306 From 19db42ea46148ec4630b9fa88b9674e0508c76d1 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Mon, 17 Jul 2023 13:33:48 +0530 Subject: [PATCH 139/233] [release-16.0] Fix `TestGatewayBufferingWhileReparenting` flakiness (#13469) (#13500) Fix `TestGatewayBufferingWhileReparenting` flakiness (#13469) --- go/vt/vtgate/tabletgateway_flaky_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/go/vt/vtgate/tabletgateway_flaky_test.go b/go/vt/vtgate/tabletgateway_flaky_test.go index 34bb65363be..ebad7d4aa90 100644 --- a/go/vt/vtgate/tabletgateway_flaky_test.go +++ b/go/vt/vtgate/tabletgateway_flaky_test.go @@ -185,7 +185,14 @@ func TestGatewayBufferingWhileReparenting(t *testing.T) { hc.Broadcast(primaryTablet) // set the serving type for the primary tablet false and broadcast it so that the buffering code registers this change hc.SetServing(primaryTablet, false) + // We call the broadcast twice to ensure that the change has been processed by the keyspace event watcher. + // The second broadcast call is blocking until the first one has been processed. hc.Broadcast(primaryTablet) + hc.Broadcast(primaryTablet) + + require.Len(t, tg.hc.GetHealthyTabletStats(target), 0, "GetHealthyTabletStats has tablets even though it shouldn't") + isNotServing := tg.kev.PrimaryIsNotServing(target) + require.True(t, isNotServing) // add a result to the sandbox connection of the new primary sbcReplica.SetResults([]*sqltypes.Result{sqlResult1}) From 721d2c3b053301ca426c9768240b2e6e4c1dd52a Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 19 Jul 2023 09:54:40 +0530 Subject: [PATCH 140/233] [release-16.0]: Fix flakiness in VTOrc tests (#13489) (#13528) Signed-off-by: Manan Gupta --- go/test/endtoend/cluster/vtorc_process.go | 22 ++++++++++-------- go/test/endtoend/vtorc/general/vtorc_test.go | 9 ++++++++ .../primaryfailure/primary_failure_test.go | 14 ++++++++++- .../vtorc/readtopologyinstance/main_test.go | 3 ++- go/test/endtoend/vtorc/utils/utils.go | 23 +++++++++++++++++++ 5 files changed, 60 insertions(+), 11 deletions(-) diff --git a/go/test/endtoend/cluster/vtorc_process.go b/go/test/endtoend/cluster/vtorc_process.go index 882b716208a..57347bb68e0 100644 --- a/go/test/endtoend/cluster/vtorc_process.go +++ b/go/test/endtoend/cluster/vtorc_process.go @@ -37,14 +37,15 @@ import ( // vtorc as a separate process for testing type VTOrcProcess struct { VtctlProcess - Port int - LogDir string - ExtraArgs []string - ConfigPath string - Config VTOrcConfiguration - WebPort int - proc *exec.Cmd - exit chan error + Port int + LogDir string + LogFileName string + ExtraArgs []string + ConfigPath string + Config VTOrcConfiguration + WebPort int + proc *exec.Cmd + exit chan error } type VTOrcConfiguration struct { @@ -124,7 +125,10 @@ func (orc *VTOrcProcess) Setup() (err error) { orc.proc.Args = append(orc.proc.Args, orc.ExtraArgs...) orc.proc.Args = append(orc.proc.Args, "--alsologtostderr") - errFile, _ := os.Create(path.Join(orc.LogDir, fmt.Sprintf("orc-stderr-%d.txt", timeNow))) + if orc.LogFileName == "" { + orc.LogFileName = fmt.Sprintf("orc-stderr-%d.txt", timeNow) + } + errFile, _ := os.Create(path.Join(orc.LogDir, orc.LogFileName)) orc.proc.Stderr = errFile orc.proc.Env = append(orc.proc.Env, os.Environ()...) diff --git a/go/test/endtoend/vtorc/general/vtorc_test.go b/go/test/endtoend/vtorc/general/vtorc_test.go index 4254606dd94..c0a845a5699 100644 --- a/go/test/endtoend/vtorc/general/vtorc_test.go +++ b/go/test/endtoend/vtorc/general/vtorc_test.go @@ -37,6 +37,7 @@ import ( // verify replication is setup // verify that with multiple vtorc instances, we still only have 1 PlannedReparentShard call func TestPrimaryElection(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, nil, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, @@ -64,6 +65,7 @@ func TestPrimaryElection(t *testing.T) { // verify rdonly is not elected, only replica // verify replication is setup func TestSingleKeyspace(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 1, 1, []string{"--clusters_to_watch", "ks"}, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, @@ -81,6 +83,7 @@ func TestSingleKeyspace(t *testing.T) { // verify rdonly is not elected, only replica // verify replication is setup func TestKeyspaceShard(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 1, 1, []string{"--clusters_to_watch", "ks/0"}, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, @@ -100,6 +103,7 @@ func TestKeyspaceShard(t *testing.T) { // 4. setup replication from non-primary, let vtorc repair // 5. make instance A replicates from B and B from A, wait for repair func TestVTOrcRepairs(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 3, 0, nil, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, @@ -216,6 +220,7 @@ func TestVTOrcRepairs(t *testing.T) { func TestRepairAfterTER(t *testing.T) { // test fails intermittently on CI, skip until it can be fixed. t.SkipNow() + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 0, nil, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, @@ -252,6 +257,7 @@ func TestSemiSync(t *testing.T) { // stop any vtorc instance running due to a previous test. utils.StopVTOrcs(t, clusterInfo) newCluster := utils.SetupNewClusterSemiSync(t) + defer utils.PrintVTOrcLogsOnFailure(t, newCluster.ClusterInstance) utils.StartVTOrcs(t, newCluster, nil, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, }, 1) @@ -316,6 +322,7 @@ func TestSemiSync(t *testing.T) { // TestVTOrcWithPrs tests that VTOrc works fine even when PRS is called from vtctld func TestVTOrcWithPrs(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 4, 0, nil, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, @@ -364,6 +371,7 @@ func TestVTOrcWithPrs(t *testing.T) { // TestMultipleDurabilities tests that VTOrc works with 2 keyspaces having 2 different durability policies func TestMultipleDurabilities(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) // Setup a normal cluster and start vtorc utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 1, 1, nil, cluster.VTOrcConfiguration{}, 1, "") @@ -388,6 +396,7 @@ func TestDurabilityPolicySetLater(t *testing.T) { // stop any vtorc instance running due to a previous test. utils.StopVTOrcs(t, clusterInfo) newCluster := utils.SetupNewClusterSemiSync(t) + defer utils.PrintVTOrcLogsOnFailure(t, newCluster.ClusterInstance) keyspace := &newCluster.ClusterInstance.Keyspaces[0] shard0 := &keyspace.Shards[0] // Before starting VTOrc we explicity want to set the durability policy of the keyspace to an empty string diff --git a/go/test/endtoend/vtorc/primaryfailure/primary_failure_test.go b/go/test/endtoend/vtorc/primaryfailure/primary_failure_test.go index 8e91028926c..0ac4129fd8b 100644 --- a/go/test/endtoend/vtorc/primaryfailure/primary_failure_test.go +++ b/go/test/endtoend/vtorc/primaryfailure/primary_failure_test.go @@ -32,8 +32,12 @@ import ( // covers the test case master-failover from orchestrator // Also tests that VTOrc can handle multiple failures, if the durability policies allow it func TestDownPrimary(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) - utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, []string{"--remote_operation_timeout=10s"}, cluster.VTOrcConfiguration{ + // We specify the --wait-replicas-timeout to a small value because we spawn a cross-cell replica later in the test. + // If that replica is more advanced than the same-cell-replica, then we try to promote the cross-cell replica as an intermediate source. + // If we don't specify a small value of --wait-replicas-timeout, then we would end up waiting for 30 seconds for the dead-primary to respond, failing this test. + utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, []string{"--remote_operation_timeout=10s", "--wait-replicas-timeout=5s"}, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, }, 1, "semi_sync") keyspace := &clusterInfo.ClusterInstance.Keyspaces[0] @@ -90,6 +94,7 @@ func TestDownPrimary(t *testing.T) { // Failover should not be cross data centers, according to the configuration file // covers part of the test case master-failover-lost-replicas from orchestrator func TestCrossDataCenterFailure(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, nil, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, @@ -135,6 +140,7 @@ func TestCrossDataCenterFailure(t *testing.T) { // Failover should not be cross data centers, according to the configuration file // In case of no viable candidates, we should error out func TestCrossDataCenterFailureError(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 1, 1, nil, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, @@ -181,6 +187,7 @@ func TestLostRdonlyOnPrimaryFailure(t *testing.T) { // Earlier any replicas that were not able to replicate from the previous primary // were detected by vtorc and could be configured to have their sources detached t.Skip() + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 2, nil, cluster.VTOrcConfiguration{ PreventCrossDataCenterPrimaryFailover: true, @@ -262,6 +269,7 @@ func TestLostRdonlyOnPrimaryFailure(t *testing.T) { // This test checks that the promotion of a tablet succeeds if it passes the promotion lag test // covers the test case master-failover-fail-promotion-lag-minutes-success from orchestrator func TestPromotionLagSuccess(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, nil, cluster.VTOrcConfiguration{ ReplicationLagQuery: "select 59", @@ -311,6 +319,7 @@ func TestPromotionLagFailure(t *testing.T) { // Earlier vtorc used to check that the promotion lag between the new primary and the old one // was smaller than the configured value, otherwise it would fail the promotion t.Skip() + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 3, 1, nil, cluster.VTOrcConfiguration{ ReplicationLagQuery: "select 61", @@ -363,6 +372,7 @@ func TestPromotionLagFailure(t *testing.T) { // We explicitly set one of the replicas to Prefer promotion rule. // That is the replica which should be promoted in case of primary failure func TestDownPrimaryPromotionRule(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, nil, cluster.VTOrcConfiguration{ LockShardTimeoutSeconds: 5, @@ -410,6 +420,7 @@ func TestDownPrimaryPromotionRule(t *testing.T) { // That is the replica which should be promoted in case of primary failure // It should also be caught up when it is promoted func TestDownPrimaryPromotionRuleWithLag(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, nil, cluster.VTOrcConfiguration{ LockShardTimeoutSeconds: 5, @@ -489,6 +500,7 @@ func TestDownPrimaryPromotionRuleWithLag(t *testing.T) { // We let a replica in our own cell lag. That is the replica which should be promoted in case of primary failure // It should also be caught up when it is promoted func TestDownPrimaryPromotionRuleWithLagCrossCenter(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) defer cluster.PanicHandler(t) utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, nil, cluster.VTOrcConfiguration{ LockShardTimeoutSeconds: 5, diff --git a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go index af05dbadc54..75ecbfd592c 100644 --- a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go +++ b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go @@ -40,6 +40,7 @@ func TestReadTopologyInstanceBufferable(t *testing.T) { defer func() { clusterInfo.ClusterInstance.Teardown() }() + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) keyspace := &clusterInfo.ClusterInstance.Keyspaces[0] shard0 := &keyspace.Shards[0] oldArgs := os.Args @@ -146,7 +147,7 @@ func TestReadTopologyInstanceBufferable(t *testing.T) { assert.Equal(t, replicaInstance.ReadBinlogCoordinates.LogFile, primaryInstance.SelfBinlogCoordinates.LogFile) assert.Greater(t, replicaInstance.ReadBinlogCoordinates.LogPos, int64(0)) assert.Equal(t, replicaInstance.ExecBinlogCoordinates.LogFile, primaryInstance.SelfBinlogCoordinates.LogFile) - assert.LessOrEqual(t, replicaInstance.ExecBinlogCoordinates.LogPos, replicaInstance.ReadBinlogCoordinates.LogPos) + assert.Greater(t, replicaInstance.ExecBinlogCoordinates.LogPos, int64(0)) assert.Contains(t, replicaInstance.RelaylogCoordinates.LogFile, fmt.Sprintf("vt-0000000%d-relay", replica.TabletUID)) assert.Greater(t, replicaInstance.RelaylogCoordinates.LogPos, int64(0)) assert.Empty(t, replicaInstance.LastIOError) diff --git a/go/test/endtoend/vtorc/utils/utils.go b/go/test/endtoend/vtorc/utils/utils.go index d4f23c0de70..8d30e477e2d 100644 --- a/go/test/endtoend/vtorc/utils/utils.go +++ b/go/test/endtoend/vtorc/utils/utils.go @@ -946,3 +946,26 @@ func WaitForSuccessfulRecoveryCount(t *testing.T, vtorcInstance *cluster.VTOrcPr successCount := successfulRecoveriesMap[recoveryName] assert.EqualValues(t, countExpected, successCount) } + +// PrintVTOrcLogsOnFailure prints the VTOrc logs on failure of the test. +// This function is supposed to be called as the first defer command from the vtorc tests. +func PrintVTOrcLogsOnFailure(t *testing.T, clusterInstance *cluster.LocalProcessCluster) { + // If the test has not failed, then we don't need to print anything. + if !t.Failed() { + return + } + + log.Errorf("Printing VTOrc logs") + for _, vtorc := range clusterInstance.VTOrcProcesses { + if vtorc == nil || vtorc.LogFileName == "" { + continue + } + filePath := path.Join(vtorc.LogDir, vtorc.LogFileName) + log.Errorf("Printing file - %s", filePath) + content, err := os.ReadFile(filePath) + if err != nil { + log.Errorf("Error while reading the file - %v", err) + } + log.Errorf("%s", string(content)) + } +} From 38d60a4375110cc0e97e2d2b495f76945dce4e41 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 19 Jul 2023 13:46:29 +0530 Subject: [PATCH 141/233] [release-16.0] Deflake `TestPlannedReparentShardPromoteReplicaFail` (#13548) (#13549) Signed-off-by: Manan Gupta Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- .../testlib/planned_reparent_shard_test.go | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/go/vt/wrangler/testlib/planned_reparent_shard_test.go b/go/vt/wrangler/testlib/planned_reparent_shard_test.go index 3c025a8c7f1..ee831fbf241 100644 --- a/go/vt/wrangler/testlib/planned_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/planned_reparent_shard_test.go @@ -799,6 +799,9 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ + "FAKE SET MASTER", + "START SLAVE", + // We call a SetReplicationSource explicitly "FAKE SET MASTER", "START SLAVE", // extra SetReplicationSource call due to retry @@ -857,6 +860,13 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { assert.True(t, newPrimary.FakeMysqlDaemon.ReadOnly, "newPrimary.FakeMysqlDaemon.ReadOnly") assert.True(t, oldPrimary.FakeMysqlDaemon.ReadOnly, "oldPrimary.FakeMysqlDaemon.ReadOnly") + // After the first call to PRS has failed, we don't know whether `SetReplicationSource` RPC has succeeded on the oldPrimary or not. + // This causes the test to become non-deterministic. To prevent this, we call `SetReplicationSource` on the oldPrimary again, and make sure it has succeeded. + // We also wait until the oldPrimary has demoted itself to a replica type. + err = wr.TabletManagerClient().SetReplicationSource(context.Background(), oldPrimary.Tablet, newPrimary.Tablet.Alias, 0, "", false, false) + require.NoError(t, err) + waitForTabletType(t, wr, oldPrimary.Tablet.Alias, topodatapb.TabletType_REPLICA) + // retrying should work newPrimary.FakeMysqlDaemon.PromoteError = nil newPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] @@ -870,6 +880,26 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { assert.True(t, oldPrimary.FakeMysqlDaemon.ReadOnly, "oldPrimary.FakeMysqlDaemon.ReadOnly") } +// waitForTabletType waits for the given tablet type to be reached. +func waitForTabletType(t *testing.T, wr *wrangler.Wrangler, tabletAlias *topodatapb.TabletAlias, tabletType topodatapb.TabletType) { + timeout := time.After(15 * time.Second) + for { + tablet, err := wr.TopoServer().GetTablet(context.Background(), tabletAlias) + require.NoError(t, err) + if tablet.Type == tabletType { + return + } + + select { + case <-timeout: + t.Fatalf("%s didn't reach the tablet type %v", topoproto.TabletAliasString(tabletAlias), tabletType.String()) + return + default: + time.Sleep(100 * time.Millisecond) + } + } +} + // TestPlannedReparentShardSamePrimary tests PRS with oldPrimary works correctly // Simulate failure of previous PRS and oldPrimary is ReadOnly // Verify that primary correctly gets set to ReadWrite From c15ecd029ea3e2df3b3b1c77064257a9b509b99c Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 19 Jul 2023 14:00:12 +0530 Subject: [PATCH 142/233] [release-16.0]: Fix `upgrade-downgrade` test setup and fix the `init_db.sql` (#13525) Signed-off-by: Manan Gupta --- ...owngrade_test_backups_e2e_next_release.yml | 4 +- config/init_db.sql | 12 +++ go/test/endtoend/backup/vtbackup/main_test.go | 7 +- go/test/endtoend/cluster/mysqlctl_process.go | 24 ++++- go/test/endtoend/utils/utils.go | 20 ++++ .../testdata/config/init_testserver_db.sql | 91 +++++++++++++++++++ 6 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 go/test/endtoend/vreplication/testdata/config/init_testserver_db.sql 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 38581eeb8d3..d97b677110b 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -185,8 +185,8 @@ jobs: source build.env rm -f $PWD/bin/vtbackup $PWD/bin/vttablet - cp /tmp/vitess-build-current/bin/vtbackup $PWD/bin/vtbackup - cp /tmp/vitess-build-other/bin/vttablet $PWD/bin/vttablet + cp /tmp/vitess-build-other/bin/vtbackup $PWD/bin/vtbackup + cp /tmp/vitess-build-current/bin/vttablet $PWD/bin/vttablet vtbackup --version vttablet --version diff --git a/config/init_db.sql b/config/init_db.sql index 7be4de6f7ea..47ac4a04749 100644 --- a/config/init_db.sql +++ b/config/init_db.sql @@ -11,6 +11,12 @@ ############################################################################### # Equivalent of mysql_secure_installation ############################################################################### +# We need to ensure that super_read_only is disabled so that we can execute +# these commands. Note that disabling it does NOT disable read_only. +# We save the current value so that we only re-enable it at the end if it was +# enabled before. +SET @original_super_read_only=IF(@@global.super_read_only=1, 'ON', 'OFF'); +SET GLOBAL super_read_only='OFF'; # Changes during the init db should not make it to the binlog. # They could potentially create errant transactions on replicas. @@ -77,3 +83,9 @@ FLUSH PRIVILEGES; RESET SLAVE ALL; RESET MASTER; + +# custom sql is used to add custom scripts like creating users/passwords. We use it in our tests +# {{custom_sql}} + +# We need to set super_read_only back to what it was before +SET GLOBAL super_read_only=IFNULL(@original_super_read_only, 'ON'); diff --git a/go/test/endtoend/backup/vtbackup/main_test.go b/go/test/endtoend/backup/vtbackup/main_test.go index 069f83fbba5..39dfc834728 100644 --- a/go/test/endtoend/backup/vtbackup/main_test.go +++ b/go/test/endtoend/backup/vtbackup/main_test.go @@ -25,6 +25,7 @@ import ( "testing" "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/test/endtoend/utils" "vitess.io/vitess/go/vt/log" ) @@ -89,8 +90,12 @@ func TestMain(m *testing.M) { dbCredentialFile = cluster.WriteDbCredentialToTmp(localCluster.TmpDirectory) initDb, _ := os.ReadFile(path.Join(os.Getenv("VTROOT"), "/config/init_db.sql")) sql := string(initDb) + // The original init_db.sql does not have any passwords. Here we update the init file with passwords + sql, err = utils.GetInitDBSQL(sql, cluster.GetPasswordUpdateSQL(localCluster), "") + if err != nil { + return 1, err + } newInitDBFile = path.Join(localCluster.TmpDirectory, "init_db_with_passwords.sql") - sql = sql + cluster.GetPasswordUpdateSQL(localCluster) err = os.WriteFile(newInitDBFile, []byte(sql), 0666) if err != nil { return 1, err diff --git a/go/test/endtoend/cluster/mysqlctl_process.go b/go/test/endtoend/cluster/mysqlctl_process.go index eafc8f6b98f..32e8f27e050 100644 --- a/go/test/endtoend/cluster/mysqlctl_process.go +++ b/go/test/endtoend/cluster/mysqlctl_process.go @@ -30,6 +30,7 @@ import ( "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/tlstest" ) @@ -236,11 +237,15 @@ func (mysqlctl *MysqlctlProcess) Connect(ctx context.Context, username string) ( // MysqlCtlProcessInstanceOptionalInit returns a Mysqlctl handle for mysqlctl process // configured with the given Config. func MysqlCtlProcessInstanceOptionalInit(tabletUID int, mySQLPort int, tmpDirectory string, initMySQL bool) *MysqlctlProcess { + initFile, err := getInitDBFileUsed() + if err != nil { + log.Errorf("Couldn't find init db file - %v", err) + } mysqlctl := &MysqlctlProcess{ Name: "mysqlctl", Binary: "mysqlctl", LogDirectory: tmpDirectory, - InitDBFile: path.Join(os.Getenv("VTROOT"), "/config/init_db.sql"), + InitDBFile: initFile, } mysqlctl.MySQLPort = mySQLPort mysqlctl.TabletUID = tabletUID @@ -249,6 +254,23 @@ func MysqlCtlProcessInstanceOptionalInit(tabletUID int, mySQLPort int, tmpDirect return mysqlctl } +func getInitDBFileUsed() (string, error) { + versionStr, err := mysqlctl.GetVersionString() + if err != nil { + return "", err + } + flavor, _, err := mysqlctl.ParseVersionString(versionStr) + if err != nil { + return "", err + } + if flavor == mysqlctl.FlavorMySQL || flavor == mysqlctl.FlavorPercona { + return path.Join(os.Getenv("VTROOT"), "/config/init_db.sql"), nil + } + // Non-MySQL instances for example MariaDB, will use init_testserver_db.sql which does not contain super_read_only global variable. + // Even though MariaDB support is deprecated (https://github.com/vitessio/vitess/issues/9518) but we still support migration scenario. + return path.Join(os.Getenv("VTROOT"), "go/test/endtoend/vreplication/testdata/config/init_testserver_db.sql"), nil +} + // MysqlCtlProcessInstance returns a Mysqlctl handle for mysqlctl process // configured with the given Config. func MysqlCtlProcessInstance(tabletUID int, mySQLPort int, tmpDirectory string) *MysqlctlProcess { diff --git a/go/test/endtoend/utils/utils.go b/go/test/endtoend/utils/utils.go index d2f4255f2bf..b78877f36ce 100644 --- a/go/test/endtoend/utils/utils.go +++ b/go/test/endtoend/utils/utils.go @@ -306,3 +306,23 @@ func TimeoutAction(t *testing.T, timeout time.Duration, errMsg string, action fu } } } + +func GetInitDBSQL(initDBSQL string, updatedPasswords string, oldAlterTableMode string) (string, error) { + // Since password update is DML we need to insert it before we disable + // super_read_only therefore doing the split below. + splitString := strings.Split(initDBSQL, "# {{custom_sql}}") + if len(splitString) != 2 { + return "", fmt.Errorf("missing `# {{custom_sql}}` in init_db.sql file") + } + var builder strings.Builder + builder.WriteString(splitString[0]) + builder.WriteString(updatedPasswords) + + // https://github.com/vitessio/vitess/issues/8315 + if oldAlterTableMode != "" { + builder.WriteString(oldAlterTableMode) + } + builder.WriteString(splitString[1]) + + return builder.String(), nil +} diff --git a/go/test/endtoend/vreplication/testdata/config/init_testserver_db.sql b/go/test/endtoend/vreplication/testdata/config/init_testserver_db.sql new file mode 100644 index 00000000000..03df754ea21 --- /dev/null +++ b/go/test/endtoend/vreplication/testdata/config/init_testserver_db.sql @@ -0,0 +1,91 @@ +# This file is for testing purpose only. +# This file is executed immediately after initializing a fresh data directory. +# It is equivalent of init_db.sql. Given init_db.sql is for mysql which has super_read_only +# related stuff therefore for testing purpose we avoid setting `super_read_only` during initialization. + +############################################################################### +# WARNING: Any change to init_db.sql should gets reflected in this file as well. +############################################################################### + +############################################################################### +# WARNING: This sql is *NOT* safe for production use, +# as it contains default well-known users and passwords. +# Care should be taken to change these users and passwords +# for production. +############################################################################### + +############################################################################### +# Equivalent of mysql_secure_installation +############################################################################### +# We need to ensure that read_only is disabled so that we can execute +# these commands. +SET GLOBAL read_only='OFF'; + +# Changes during the init db should not make it to the binlog. +# They could potentially create errant transactions on replicas. +SET sql_log_bin = 0; +# Remove anonymous users. +DELETE FROM mysql.user WHERE User = ''; + +# Disable remote root access (only allow UNIX socket). +DELETE FROM mysql.user WHERE User = 'root' AND Host != 'localhost'; + +# Remove test database. +DROP DATABASE IF EXISTS test; + +############################################################################### +# Vitess defaults +############################################################################### + +# Admin user with all privileges. +CREATE USER 'vt_dba'@'localhost'; +GRANT ALL ON *.* TO 'vt_dba'@'localhost'; +GRANT GRANT OPTION ON *.* TO 'vt_dba'@'localhost'; + +# User for app traffic, with global read-write access. +CREATE USER 'vt_app'@'localhost'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, + REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, + LOCK TABLES, EXECUTE, REPLICATION CLIENT, CREATE VIEW, + SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER + ON *.* TO 'vt_app'@'localhost'; + +# User for app debug traffic, with global read access. +CREATE USER 'vt_appdebug'@'localhost'; +GRANT SELECT, SHOW DATABASES, PROCESS ON *.* TO 'vt_appdebug'@'localhost'; + +# User for administrative operations that need to be executed as non-SUPER. +# Same permissions as vt_app here. +CREATE USER 'vt_allprivs'@'localhost'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, + REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, + LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, + SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER + ON *.* TO 'vt_allprivs'@'localhost'; + +# User for slave replication connections. +CREATE USER 'vt_repl'@'%'; +GRANT REPLICATION SLAVE ON *.* TO 'vt_repl'@'%'; + +# User for Vitess VReplication (base vstreamers and vplayer). +CREATE USER 'vt_filtered'@'localhost'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, + REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, + LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, + SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER + ON *.* TO 'vt_filtered'@'localhost'; + +# User for general MySQL monitoring. +CREATE USER 'vt_monitoring'@'localhost'; +GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD + ON *.* TO 'vt_monitoring'@'localhost'; +GRANT SELECT, UPDATE, DELETE, DROP + ON performance_schema.* TO 'vt_monitoring'@'localhost'; + +FLUSH PRIVILEGES; + +RESET SLAVE ALL; +RESET MASTER; + +# custom sql is used to add custom scripts like creating users/passwords. We use it in our tests +# {{custom_sql}} From c3e16583fa3754bc2f312e2b556a42d0c4dfde8c Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 20 Jul 2023 15:30:23 +0200 Subject: [PATCH 143/233] [release-16.0] Fix benchmarks in `plan_test.go` (#13096) (#13126) Co-authored-by: Florent Poinsard --- go/vt/vtgate/planbuilder/plan_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index 63498a9f184..e492abfae5a 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -386,7 +386,7 @@ func BenchmarkTPCH(b *testing.B) { func benchmarkWorkload(b *testing.B, name string) { vschemaWrapper := &vschemaWrapper{ - v: loadSchema(b, name+"vschemas/_schema.json", true), + v: loadSchema(b, "vschemas/"+name+"_schema.json", true), sysVarEnabled: true, } From 15f20dda44b62c2c284370e4970a8896bd9118bd Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 20 Jul 2023 21:12:26 +0530 Subject: [PATCH 144/233] [release-16.0] Flaky tests: Fix wrangler tests (#13568) (#13571) Signed-off-by: Manan Gupta Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- .../testlib/copy_schema_shard_test.go | 4 ++ .../testlib/external_reparent_test.go | 3 + .../testlib/planned_reparent_shard_test.go | 20 ------- go/vt/wrangler/testlib/utils.go | 57 +++++++++++++++++++ 4 files changed, 64 insertions(+), 20 deletions(-) create mode 100644 go/vt/wrangler/testlib/utils.go diff --git a/go/vt/wrangler/testlib/copy_schema_shard_test.go b/go/vt/wrangler/testlib/copy_schema_shard_test.go index c3e574fea42..af80203ea9e 100644 --- a/go/vt/wrangler/testlib/copy_schema_shard_test.go +++ b/go/vt/wrangler/testlib/copy_schema_shard_test.go @@ -155,6 +155,10 @@ func copySchema(t *testing.T, useShardAsSource bool) { if useShardAsSource { source = "ks/-80" } + + // PrimaryAlias in the shard record is updated asynchronously, so we should wait for it to succeed. + waitForShardPrimary(t, wr, destinationPrimary.Tablet) + if err := vp.Run([]string{"CopySchemaShard", "--include-views", source, "ks/-40"}); err != nil { t.Fatalf("CopySchemaShard failed: %v", err) } diff --git a/go/vt/wrangler/testlib/external_reparent_test.go b/go/vt/wrangler/testlib/external_reparent_test.go index 00fd10f703f..8d928926550 100644 --- a/go/vt/wrangler/testlib/external_reparent_test.go +++ b/go/vt/wrangler/testlib/external_reparent_test.go @@ -550,6 +550,9 @@ func TestRPCTabletExternallyReparentedDemotesPrimaryToConfiguredTabletType(t *te } } + // PrimaryAlias in the shard record is updated asynchronously, so we should wait for it to succeed. + waitForShardPrimary(t, wr, newPrimary.Tablet) + shardInfo, err := ts.GetShard(context.Background(), newPrimary.Tablet.Keyspace, newPrimary.Tablet.Shard) assert.NoError(t, err) diff --git a/go/vt/wrangler/testlib/planned_reparent_shard_test.go b/go/vt/wrangler/testlib/planned_reparent_shard_test.go index ee831fbf241..2e9860d75ee 100644 --- a/go/vt/wrangler/testlib/planned_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/planned_reparent_shard_test.go @@ -880,26 +880,6 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { assert.True(t, oldPrimary.FakeMysqlDaemon.ReadOnly, "oldPrimary.FakeMysqlDaemon.ReadOnly") } -// waitForTabletType waits for the given tablet type to be reached. -func waitForTabletType(t *testing.T, wr *wrangler.Wrangler, tabletAlias *topodatapb.TabletAlias, tabletType topodatapb.TabletType) { - timeout := time.After(15 * time.Second) - for { - tablet, err := wr.TopoServer().GetTablet(context.Background(), tabletAlias) - require.NoError(t, err) - if tablet.Type == tabletType { - return - } - - select { - case <-timeout: - t.Fatalf("%s didn't reach the tablet type %v", topoproto.TabletAliasString(tabletAlias), tabletType.String()) - return - default: - time.Sleep(100 * time.Millisecond) - } - } -} - // TestPlannedReparentShardSamePrimary tests PRS with oldPrimary works correctly // Simulate failure of previous PRS and oldPrimary is ReadOnly // Verify that primary correctly gets set to ReadWrite diff --git a/go/vt/wrangler/testlib/utils.go b/go/vt/wrangler/testlib/utils.go new file mode 100644 index 00000000000..ae32e5036bc --- /dev/null +++ b/go/vt/wrangler/testlib/utils.go @@ -0,0 +1,57 @@ +package testlib + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/wrangler" +) + +// waitForTabletType waits for the given tablet type to be reached. +func waitForTabletType(t *testing.T, wr *wrangler.Wrangler, tabletAlias *topodatapb.TabletAlias, tabletType topodatapb.TabletType) { + timeout := time.After(15 * time.Second) + for { + tablet, err := wr.TopoServer().GetTablet(context.Background(), tabletAlias) + require.NoError(t, err) + if tablet.Type == tabletType { + return + } + + select { + case <-timeout: + t.Fatalf("%s didn't reach the tablet type %v", topoproto.TabletAliasString(tabletAlias), tabletType.String()) + return + default: + time.Sleep(100 * time.Millisecond) + } + } +} + +// waitForShardPrimary waits for the shard record to be upto date such that it has the given primary. +func waitForShardPrimary(t *testing.T, wr *wrangler.Wrangler, primaryTablet *topodatapb.Tablet) { + timeout := time.After(15 * time.Second) + for { + si, err := wr.TopoServer().GetShard(context.Background(), primaryTablet.Keyspace, primaryTablet.Shard) + require.NoError(t, err) + if topoproto.TabletAliasEqual(si.PrimaryAlias, primaryTablet.Alias) { + return + } + + select { + case <-timeout: + t.Fatalf("%s/%s didn't see the tablet %v become the primary, instead it is %v", + primaryTablet.Keyspace, primaryTablet.Shard, + topoproto.TabletAliasString(primaryTablet.Alias), + topoproto.TabletAliasString(si.PrimaryAlias), + ) + return + default: + time.Sleep(100 * time.Millisecond) + } + } +} From 373d243007cb3f4e195f58d32be8351e983aad93 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 21 Jul 2023 11:55:34 -0400 Subject: [PATCH 145/233] [release-16.0] VReplication: Ensure ROW events are sent within a transaction (#13547) (#13580) Signed-off-by: Matt Lord Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- go/vt/vtgate/endtoend/vstream_test.go | 131 ++++++++++++++++++ go/vt/vttablet/tabletserver/vstreamer/copy.go | 16 +++ .../tabletserver/vstreamer/uvstreamer.go | 18 ++- 3 files changed, 158 insertions(+), 7 deletions(-) diff --git a/go/vt/vtgate/endtoend/vstream_test.go b/go/vt/vtgate/endtoend/vstream_test.go index 832799366b1..4a5f7bc46ab 100644 --- a/go/vt/vtgate/endtoend/vstream_test.go +++ b/go/vt/vtgate/endtoend/vstream_test.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "io" + "regexp" "sort" "sync" "testing" @@ -520,6 +521,136 @@ func TestVStreamSharded(t *testing.T) { } +// TestVStreamCopyTransactions tests that we are properly wrapping +// ROW events in the stream with BEGIN and COMMIT events. +func TestVStreamCopyTransactions(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + keyspace := "ks" + shards := []string{"-80", "80-"} + table := "t1_copy_basic" + beginEventSeen, commitEventSeen := false, false + numResultInTrx := 0 + vgtid := &binlogdatapb.VGtid{ + ShardGtids: []*binlogdatapb.ShardGtid{ + { + Keyspace: keyspace, + Shard: shards[0], + Gtid: "", // Start a vstream copy + }, + { + Keyspace: keyspace, + Shard: shards[1], + Gtid: "", // Start a vstream copy + }, + }, + } + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: table, + Filter: fmt.Sprintf("select * from %s", table), + }}, + } + + gconn, conn, _, closeConnections := initialize(ctx, t) + defer closeConnections() + + // Clear any existing data. + q := fmt.Sprintf("delete from %s", table) + _, err := conn.ExecuteFetch(q, -1, false) + require.NoError(t, err, "error clearing data: %v", err) + + // Generate some test data. Enough to cross the default + // vstream_packet_size threshold. + for i := 1; i <= 100000; i++ { + values := fmt.Sprintf("(%d, %d)", i, i) + q := fmt.Sprintf("insert into %s (id1, id2) values %s", table, values) + _, err := conn.ExecuteFetch(q, 1, false) + require.NoError(t, err, "error inserting data: %v", err) + } + + // Start a vstream. + reader, err := gconn.VStream(ctx, topodatapb.TabletType_PRIMARY, vgtid, filter, nil) + require.NoError(t, err, "error starting vstream: %v", err) + +recvLoop: + for { + vevents, err := reader.Recv() + numResultInTrx++ + eventCount := len(vevents) + t.Logf("------------------ Received %d events in response #%d for the transaction ------------------\n", + eventCount, numResultInTrx) + switch err { + case nil: + for _, event := range vevents { + switch event.Type { + case binlogdatapb.VEventType_BEGIN: + require.False(t, beginEventSeen, "received a second BEGIN event within the transaction: numResultInTrx=%d\n", + numResultInTrx) + beginEventSeen = true + t.Logf("Found BEGIN event, beginEventSeen=%t, commitEventSeen=%t, eventType=%v, numResultInTrx=%d\n", + beginEventSeen, commitEventSeen, event.Type, numResultInTrx) + require.False(t, commitEventSeen, "received a BEGIN event when expecting a COMMIT event: numResultInTrx=%d\n", + numResultInTrx) + case binlogdatapb.VEventType_VGTID: + t.Logf("Found VGTID event, beginEventSeen=%t, commitEventSeen=%t, eventType=%v, numResultInTrx=%d, event=%+v\n", + beginEventSeen, commitEventSeen, event.Type, numResultInTrx, event) + case binlogdatapb.VEventType_FIELD: + t.Logf("Found FIELD event, beginEventSeen=%t, commitEventSeen=%t, eventType=%v, numResultInTrx=%d, event=%+v\n", + beginEventSeen, commitEventSeen, event.Type, numResultInTrx, event) + case binlogdatapb.VEventType_ROW: + // Uncomment if you need to do more debugging. + // t.Logf("Found ROW event, beginEventSeen=%t, commitEventSeen=%t, eventType=%v, numResultInTrx=%d, event=%+v\n", + // beginEventSeen, commitEventSeen, event.Type, numResultInTrx, event) + case binlogdatapb.VEventType_COMMIT: + commitEventSeen = true + t.Logf("Found COMMIT event, beginEventSeen=%t, commitEventSeen=%t, eventType=%v, numResultInTrx=%d, event=%+v\n", + beginEventSeen, commitEventSeen, event.Type, numResultInTrx, event) + require.True(t, beginEventSeen, "received COMMIT event before receiving BEGIN event: numResultInTrx=%d\n", + numResultInTrx) + case binlogdatapb.VEventType_COPY_COMPLETED: + t.Logf("Finished vstream copy\n") + t.Logf("-------------------------------------------------------------------\n\n") + cancel() + break recvLoop + default: + t.Logf("Found extraneous event: %+v\n", event) + } + if beginEventSeen && commitEventSeen { + t.Logf("Received both BEGIN and COMMIT, so resetting transactional state\n") + beginEventSeen = false + commitEventSeen = false + numResultInTrx = 0 + } + } + case io.EOF: + t.Logf("vstream ended\n") + t.Logf("-------------------------------------------------------------------\n\n") + cancel() + return + default: + require.FailNowf(t, "unexpected error", "encountered error in vstream: %v", err) + return + } + } + // The last response, when the vstream copy completes, does not + // typically contain ROW events. + if beginEventSeen || commitEventSeen { + require.True(t, (beginEventSeen && commitEventSeen), "did not receive both BEGIN and COMMIT events in the final ROW event set") + } +} + +func removeAnyDeprecatedDisplayWidths(orig string) string { + var adjusted string + baseIntType := "int" + intRE := regexp.MustCompile(`(?i)int\(([0-9]*)?\)`) + adjusted = intRE.ReplaceAllString(orig, baseIntType) + baseYearType := "year" + yearRE := regexp.MustCompile(`(?i)year\(([0-9]*)?\)`) + adjusted = yearRE.ReplaceAllString(adjusted, baseYearType) + return adjusted +} + var printMu sync.Mutex func printEvents(evs []*binlogdatapb.VEvent) { diff --git a/go/vt/vttablet/tabletserver/vstreamer/copy.go b/go/vt/vttablet/tabletserver/vstreamer/copy.go index 0065555047d..c4a9f626f6b 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/copy.go +++ b/go/vt/vttablet/tabletserver/vstreamer/copy.go @@ -255,12 +255,26 @@ func (uvs *uvstreamer) copyTable(ctx context.Context, tableName string) error { log.Infof("sendFieldEvent returned error %v", err) return err } + // sendFieldEvent() sends a BEGIN event first. + uvs.inTransaction = true } + if len(rows.Rows) == 0 { log.V(2).Infof("0 rows returned for table %s", tableName) return nil } + // We are about to send ROW events, so we need to ensure + // that we do so within a transaction. The COMMIT event + // will be sent in sendEventsForRows() below. + if !uvs.inTransaction { + evs := []*binlogdatapb.VEvent{{ + Type: binlogdatapb.VEventType_BEGIN, + }} + uvs.send(evs) + uvs.inTransaction = true + } + newLastPK = sqltypes.CustomProto3ToResult(uvs.pkfields, &querypb.QueryResult{ Fields: rows.Fields, Rows: []*querypb.Row{rows.Lastpk}, @@ -271,6 +285,8 @@ func (uvs *uvstreamer) copyTable(ctx context.Context, tableName string) error { log.Infof("sendEventsForRows returned error %v", err) return err } + // sendEventsForRows() sends a COMMIT event last. + uvs.inTransaction = false uvs.setCopyState(tableName, qrLastPK) log.V(2).Infof("NewLastPK: %v", qrLastPK) diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go index 2584a166226..34f13268a06 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go @@ -51,13 +51,17 @@ type uvstreamer struct { cancel func() // input parameters - vse *Engine - send func([]*binlogdatapb.VEvent) error - cp dbconfigs.Connector - se *schema.Engine - startPos string - filter *binlogdatapb.Filter - inTablePKs []*binlogdatapb.TableLastPK + vse *Engine + send func([]*binlogdatapb.VEvent) error + cp dbconfigs.Connector + se *schema.Engine + startPos string + // Are we currently in an explicit transaction? + // If we are not, and we're about to send ROW + // events, then we need to send a BEGIN event first. + inTransaction bool + filter *binlogdatapb.Filter + inTablePKs []*binlogdatapb.TableLastPK vschema *localVSchema From bfc9ed915ba006760a6dff1705140386e1f1fd0b Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 25 Jul 2023 23:17:36 +0530 Subject: [PATCH 146/233] [release-16.0] ignore all error for views in engine reload (#13590) (#13593) Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- go/vt/vttablet/tabletserver/schema/engine.go | 15 +------- .../tabletserver/schema/engine_test.go | 38 ++++++++++++++++++- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/go/vt/vttablet/tabletserver/schema/engine.go b/go/vt/vttablet/tabletserver/schema/engine.go index 81f10235727..e29c57bbd73 100644 --- a/go/vt/vttablet/tabletserver/schema/engine.go +++ b/go/vt/vttablet/tabletserver/schema/engine.go @@ -20,7 +20,6 @@ import ( "bytes" "context" "encoding/json" - "errors" "fmt" "net/http" "strings" @@ -29,7 +28,6 @@ import ( "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/concurrency" - "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/mysqlctl/tmutils" "vitess.io/vitess/go/vt/sidecardb" @@ -461,17 +459,8 @@ func (se *Engine) reload(ctx context.Context, includeStats bool) error { tableType := row[1].String() table, err := LoadTable(conn, se.cp.DBName(), tableName, row[3].ToString()) if err != nil { - isView := strings.Contains(tableType, tmutils.TableView) - var emptyColumnsError mysqlctl.EmptyColumnsErr - if errors.As(err, &emptyColumnsError) && isView { - log.Warningf("Failed reading schema for the table: %s, error: %v", tableName, err) - continue - } - sqlErr, isSQLErr := mysql.NewSQLErrorFromError(err).(*mysql.SQLError) - if isSQLErr && sqlErr != nil && sqlErr.Number() == mysql.ERNoSuchUser && isView { - // A VIEW that has an invalid DEFINER, leading to: - // ERROR 1449 (HY000): The user specified as a definer (...) does not exist - log.Warningf("Failed reading schema for the table: %s, error: %v", tableName, err) + if isView := strings.Contains(tableType, tmutils.TableView); isView { + log.Warningf("Failed reading schema for the view: %s, error: %v", tableName, err) continue } // Non recoverable error: diff --git a/go/vt/vttablet/tabletserver/schema/engine_test.go b/go/vt/vttablet/tabletserver/schema/engine_test.go index 29a74a28021..79f3bf5d3b7 100644 --- a/go/vt/vttablet/tabletserver/schema/engine_test.go +++ b/go/vt/vttablet/tabletserver/schema/engine_test.go @@ -454,10 +454,46 @@ func TestOpenFailedDueToLoadTableErr(t *testing.T) { logs := tl.GetAllLogs() logOutput := strings.Join(logs, ":::") - assert.Contains(t, logOutput, "WARNING:Failed reading schema for the table: test_view") + assert.Contains(t, logOutput, "WARNING:Failed reading schema for the view: test_view") assert.Contains(t, logOutput, "The user specified as a definer ('root'@'%') does not exist (errno 1449) (sqlstate HY000)") } +// TestOpenNoErrorDueToInvalidViews tests that schema engine load does not fail instead should log the failures for the views +func TestOpenNoErrorDueToInvalidViews(t *testing.T) { + tl := syslogger.NewTestLogger() + defer tl.Close() + db := fakesqldb.New(t) + defer db.Close() + schematest.AddDefaultQueries(db) + db.AddQueryPattern(baseShowTablesPattern, &sqltypes.Result{ + Fields: mysql.BaseShowTablesFields, + Rows: [][]sqltypes.Value{ + mysql.BaseShowTablesRow("foo_view", true, "VIEW"), + mysql.BaseShowTablesRow("bar_view", true, "VIEW"), + }, + }) + + // adding column query for table_view + db.AddQueryPattern(fmt.Sprintf(mysql.GetColumnNamesQueryPatternForTable, "foo_view"), + &sqltypes.Result{}) + db.AddQueryPattern(fmt.Sprintf(mysql.GetColumnNamesQueryPatternForTable, "bar_view"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("column_name", "varchar"), "col1", "col2")) + // rejecting the impossible query + db.AddRejectedQuery("SELECT `col1`, `col2` FROM `fakesqldb`.`bar_view` WHERE 1 != 1", mysql.NewSQLError(mysql.ERWrongFieldWithGroup, mysql.SSClientError, "random error for table bar_view")) + + AddFakeInnoDBReadRowsResult(db, 0) + se := newEngine(10, 1*time.Second, 1*time.Second, db) + err := se.Open() + require.NoError(t, err) + + logs := tl.GetAllLogs() + logOutput := strings.Join(logs, ":::") + assert.Contains(t, logOutput, "WARNING:Failed reading schema for the view: foo_view") + assert.Contains(t, logOutput, "unable to get columns for table fakesqldb.foo_view") + assert.Contains(t, logOutput, "WARNING:Failed reading schema for the view: bar_view") + assert.Contains(t, logOutput, "random error for table bar_view") +} + func TestExportVars(t *testing.T) { db := fakesqldb.New(t) defer db.Close() From dff095748af3d26c9b74eec466bf008a698dee14 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 26 Jul 2023 00:02:17 +0530 Subject: [PATCH 147/233] [release-16.0] fix TestQueryTimeoutWithTables flaky test (#13579) (#13585) Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- .../endtoend/vtgate/queries/misc/main_test.go | 6 ++- .../endtoend/vtgate/queries/misc/misc_test.go | 39 ++++++------------- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/misc/main_test.go b/go/test/endtoend/vtgate/queries/misc/main_test.go index de2d00219b6..d71dc55ef46 100644 --- a/go/test/endtoend/vtgate/queries/misc/main_test.go +++ b/go/test/endtoend/vtgate/queries/misc/main_test.go @@ -61,7 +61,8 @@ func TestMain(m *testing.M) { return 1 } - clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--queryserver-config-max-result-size", "1000000", + clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, + "--queryserver-config-max-result-size", "1000000", "--queryserver-config-query-timeout", "200", "--queryserver-config-query-pool-timeout", "200") // Start Unsharded keyspace @@ -85,7 +86,8 @@ func TestMain(m *testing.M) { return 1 } - clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, "--enable_system_settings=true", "--query-timeout=100") + clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, + "--query-timeout", "100") // Start vtgate err = clusterInstance.StartVtgate() if err != nil { diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index 39b047015a7..2c8aece59fb 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -101,21 +101,21 @@ func TestQueryTimeoutWithDual(t *testing.T) { mcmp, closer := start(t) defer closer() - _, err := utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 */ sleep(0.04) from dual") + _, err := utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.04) from dual") assert.NoError(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 */ sleep(0.24) from dual") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.24) from dual") assert.Error(t, err) _, err = utils.ExecAllowError(t, mcmp.VtConn, "set @@session.query_timeout=20") require.NoError(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 */ sleep(0.04) from dual") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.04) from dual") assert.Error(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 */ sleep(0.01) from dual") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.01) from dual") assert.NoError(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=500 */ sleep(0.24) from dual") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=500 */ sleep(0.24) from dual") assert.NoError(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=10 */ sleep(0.04) from dual") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=10 */ sleep(0.04) from dual") assert.Error(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=15 */ sleep(0.001) from dual") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=15 */ sleep(0.001) from dual") assert.NoError(t, err) } @@ -139,28 +139,11 @@ func TestQueryTimeoutWithTables(t *testing.T) { assert.Contains(t, err.Error(), "(errno 1317) (sqlstate 70100)") // sharded - for i := 0; i < 300000; i += 1000 { - var str strings.Builder - for j := 1; j <= 1000; j++ { - if j == 1 { - str.WriteString(fmt.Sprintf("(%d)", i*1000+j)) - continue - } - str.WriteString(fmt.Sprintf(",(%d)", i*1000+j)) - } - utils.Exec(t, mcmp.VtConn, fmt.Sprintf("insert /*vt+ QUERY_TIMEOUT_MS=1000 */ into t1(id1) values %s", str.String())) - } - // too much data added in the loop, do drop and recreate the table. - defer func() { - mcmp.Exec("drop table t1") - mcmp.Exec(schemaSQL) - }() + utils.Exec(t, mcmp.VtConn, "insert /*vt+ QUERY_TIMEOUT_MS=1000 */ into ks_misc.t1(id1, id2) values (1,2),(2,4),(3,6),(4,8),(5,10)") - utils.Exec(t, mcmp.VtConn, "select count(*) from t1 where id1 > 31") - utils.Exec(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=100 */ count(*) from t1 where id1 > 31") - - // the query usually takes more than 5ms to return. So this should fail. - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=1 */ count(*) from t1 where id1 > 31") + // sleep take in seconds, so 0.1 is 100ms + utils.Exec(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=500 */ sleep(0.1) from t1 where id1 = 1") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=20 */ sleep(0.1) from t1 where id1 = 1") require.Error(t, err) assert.Contains(t, err.Error(), "context deadline exceeded") assert.Contains(t, err.Error(), "(errno 1317) (sqlstate 70100)") From b0a3cfede4a7a77518767a21af805e80ca036f37 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 27 Jul 2023 13:21:14 +0530 Subject: [PATCH 148/233] [release-16.0] Flaky tests: Fix race in memory topo (#13559) (#13576) Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Dirkjan Bussink --- go/vt/topo/memorytopo/election.go | 4 +--- go/vt/topo/memorytopo/memorytopo.go | 18 ++++++++++++++---- go/vt/topo/memorytopo/watch.go | 8 ++------ 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/go/vt/topo/memorytopo/election.go b/go/vt/topo/memorytopo/election.go index fd9830edb35..868a2c53287 100644 --- a/go/vt/topo/memorytopo/election.go +++ b/go/vt/topo/memorytopo/election.go @@ -153,9 +153,7 @@ func (mp *cLeaderParticipation) WaitForNewLeader(ctx context.Context) (<-chan st } notifications := make(chan string, 8) - watchIndex := nextWatchIndex - nextWatchIndex++ - n.watches[watchIndex] = watch{lock: notifications} + watchIndex := n.addWatch(watch{lock: notifications}) if n.lock != nil { notifications <- n.lockContents diff --git a/go/vt/topo/memorytopo/memorytopo.go b/go/vt/topo/memorytopo/memorytopo.go index cdad2ddbcdd..504f1d4bd39 100644 --- a/go/vt/topo/memorytopo/memorytopo.go +++ b/go/vt/topo/memorytopo/memorytopo.go @@ -49,10 +49,6 @@ const ( UnreachableServerAddr = "unreachable" ) -var ( - nextWatchIndex = 0 -) - // Factory is a memory-based implementation of topo.Factory. It // takes a file-system like approach, with directories at each level // being an actual directory node. This is meant to be closer to @@ -206,6 +202,20 @@ func (n *node) propagateRecursiveWatch(ev *topo.WatchDataRecursive) { } } +var ( + nextWatchIndex = 0 + nextWatchIndexMu sync.Mutex +) + +func (n *node) addWatch(w watch) int { + nextWatchIndexMu.Lock() + defer nextWatchIndexMu.Unlock() + watchIndex := nextWatchIndex + nextWatchIndex++ + n.watches[watchIndex] = w + return watchIndex +} + // PropagateWatchError propagates the given error to all watches on this node // and recursively applies to all children func (n *node) PropagateWatchError(err error) { diff --git a/go/vt/topo/memorytopo/watch.go b/go/vt/topo/memorytopo/watch.go index 14cb20bc09d..73b2d248434 100644 --- a/go/vt/topo/memorytopo/watch.go +++ b/go/vt/topo/memorytopo/watch.go @@ -50,9 +50,7 @@ func (c *Conn) Watch(ctx context.Context, filePath string) (*topo.WatchData, <-c } notifications := make(chan *topo.WatchData, 100) - watchIndex := nextWatchIndex - nextWatchIndex++ - n.watches[watchIndex] = watch{contents: notifications} + watchIndex := n.addWatch(watch{contents: notifications}) go func() { <-ctx.Done() @@ -105,9 +103,7 @@ func (c *Conn) WatchRecursive(ctx context.Context, dirpath string) ([]*topo.Watc }) notifications := make(chan *topo.WatchDataRecursive, 100) - watchIndex := nextWatchIndex - nextWatchIndex++ - n.watches[watchIndex] = watch{recursive: notifications} + watchIndex := n.addWatch(watch{recursive: notifications}) go func() { defer close(notifications) From 47a10429f847e5aed155a8f6da0c8fe6c98ad527 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Thu, 27 Jul 2023 10:24:36 +0200 Subject: [PATCH 149/233] [release-16.0] Optimize release notes generation to use GitHub Milestones (#13398) (#13621) Signed-off-by: Florent Poinsard --- go/tools/release-notes/release_notes.go | 236 +++---------------- go/tools/release-notes/release_notes_test.go | 69 +----- 2 files changed, 45 insertions(+), 260 deletions(-) diff --git a/go/tools/release-notes/release_notes.go b/go/tools/release-notes/release_notes.go index cd9f163e0ff..5bb03339245 100644 --- a/go/tools/release-notes/release_notes.go +++ b/go/tools/release-notes/release_notes.go @@ -27,7 +27,6 @@ import ( "regexp" "sort" "strings" - "sync" "text/template" "github.com/spf13/pflag" @@ -40,24 +39,24 @@ type ( labels []label - author struct { - Login string `json:"login"` + pullRequestAuthor struct { + Login string } - prInfo struct { - Labels labels `json:"labels"` - Number int `json:"number"` - Title string `json:"title"` - Author author `json:"author"` + pullRequestInformation struct { + Number int + Title string + Labels labels + Author pullRequestAuthor } - prsByComponent = map[string][]prInfo + prsByComponent = map[string][]pullRequestInformation prsByType = map[string]prsByComponent sortedPRComponent struct { Name string - PrInfos []prInfo + PrInfos []pullRequestInformation } sortedPRType struct { @@ -82,7 +81,6 @@ type ( var ( releaseNotesPath = `changelog/` - numberOfThreads = 10 ) const ( @@ -188,61 +186,27 @@ func loadKnownIssues(release string) ([]knownIssue, error) { return knownIssues, nil } -func loadMergedPRs(from, to string) (prs []string, authors []string, commitCount int, err error) { - // load the git log with "author \t title \t parents" - out, err := execCmd("git", "log", `--pretty=format:%ae%x09%s%x09%P%x09%h`, fmt.Sprintf("%s..%s", from, to)) - +func loadMergedPRsAndAuthors(name string) (pris []pullRequestInformation, authors []string, err error) { + out, err := execCmd("gh", "pr", "list", "-s", "merged", "-S", fmt.Sprintf("milestone:%s", name), "--json", "number,title,labels,author", "--limit", "5000") if err != nil { return } - return parseGitLog(string(out)) -} - -func parseGitLog(s string) (prs []string, authorCommits []string, commitCount int, err error) { - rx := regexp.MustCompile(`(.+)\t(.+)\t(.+)\t(.+)`) - mergePR := regexp.MustCompile(`Merge pull request #(\d+)`) - squashPR := regexp.MustCompile(`\(#(\d+)\)`) - authMap := map[string]string{} // here we will store email <-> gh user mappings - lines := strings.Split(s, "\n") - for _, line := range lines { - lineInfo := rx.FindStringSubmatch(line) - if len(lineInfo) != 5 { - log.Fatalf("failed to parse the output from git log: %s", line) - } - authorEmail := lineInfo[1] - title := lineInfo[2] - parents := lineInfo[3] - sha := lineInfo[4] - merged := mergePR.FindStringSubmatch(title) - if len(merged) == 2 { - // this is a merged PR. remember the PR # - prs = append(prs, merged[1]) - continue - } - - if len(parents) <= lengthOfSingleSHA { - // we have a single parent, and the commit counts - commitCount++ - if _, exists := authMap[authorEmail]; !exists { - authMap[authorEmail] = sha - } - } - - squashed := squashPR.FindStringSubmatch(title) - if len(squashed) == 2 { - // this is a merged PR. remember the PR # - prs = append(prs, squashed[1]) - continue - } + err = json.Unmarshal(out, &pris) + if err != nil { + return nil, nil, err } - for _, author := range authMap { - authorCommits = append(authorCommits, author) + // Get the full list of distinct PRs authors and sort them + authorMap := map[string]bool{} + for _, pri := range pris { + login := pri.Author.Login + if ok := authorMap[login]; !ok { + authors = append(authors, login) + authorMap[login] = true + } } - - sort.Strings(prs) - sort.Strings(authorCommits) // not really needed, but makes testing easier + sort.Strings(authors) return } @@ -262,133 +226,10 @@ func execCmd(name string, arg ...string) ([]byte, error) { return out, nil } -func loadPRInfo(pr string) (prInfo, error) { - out, err := execCmd("gh", "pr", "view", pr, "--json", "title,number,labels,author") - if err != nil { - return prInfo{}, err - } - var prInfo prInfo - err = json.Unmarshal(out, &prInfo) - return prInfo, err -} - -func loadAuthorInfo(sha string) (string, error) { - out, err := execCmd("gh", "api", "/repos/vitessio/vitess/commits/"+sha) - if err != nil { - return "", err - } - var prInfo prInfo - err = json.Unmarshal(out, &prInfo) - if err != nil { - return "", err - } - return prInfo.Author.Login, nil -} - -type req struct { - isPR bool - key string -} - -func loadAllPRs(prs, authorCommits []string) ([]prInfo, []string, error) { - errChan := make(chan error) - wgDone := make(chan bool) - prChan := make(chan req, len(prs)+len(authorCommits)) - // fill the work queue - for _, s := range prs { - prChan <- req{isPR: true, key: s} - } - for _, s := range authorCommits { - prChan <- req{isPR: false, key: s} - } - close(prChan) - - var prInfos []prInfo - var authors []string - fmt.Printf("Found %d merged PRs. Loading PR info", len(prs)) - wg := sync.WaitGroup{} - mu := sync.Mutex{} - - shouldLoad := func(in string) bool { - if in == "" { - return false - } - mu.Lock() - defer mu.Unlock() - - for _, existing := range authors { - if existing == in { - return false - } - } - return true - } - addAuthor := func(in string) { - mu.Lock() - defer mu.Unlock() - authors = append(authors, in) - } - addPR := func(in prInfo) { - mu.Lock() - defer mu.Unlock() - prInfos = append(prInfos, in) - } - - for i := 0; i < numberOfThreads; i++ { - wg.Add(1) - go func() { - // load meta data about PRs - defer wg.Done() - - for b := range prChan { - fmt.Print(".") - if b.isPR { - prInfo, err := loadPRInfo(b.key) - if err != nil { - errChan <- err - break - } - addPR(prInfo) - continue - } - author, err := loadAuthorInfo(b.key) - if err != nil { - errChan <- err - break - } - if shouldLoad(author) { - addAuthor(author) - } - - } - }() - } - - go func() { - // wait for the loading to finish - wg.Wait() - close(wgDone) - }() - - var err error - select { - case <-wgDone: - break - case err = <-errChan: - break - } - - fmt.Println() - - sort.Strings(authors) - - return prInfos, authors, err -} - -func groupPRs(prInfos []prInfo) prsByType { +func groupPRs(pris []pullRequestInformation) prsByType { prPerType := prsByType{} - for _, info := range prInfos { + for _, info := range pris { var typ, component string for _, lbl := range info.Labels { switch { @@ -478,11 +319,11 @@ func getStringForKnownIssues(issues []knownIssue) (string, error) { return buff.String(), nil } -func groupAndStringifyPullRequest(pr []prInfo) (string, error) { - if len(pr) == 0 { +func groupAndStringifyPullRequest(pris []pullRequestInformation) (string, error) { + if len(pris) == 0 { return "", nil } - prPerType := groupPRs(pr) + prPerType := groupPRs(pris) prStr, err := getStringForPullRequestInfos(prPerType) if err != nil { return "", err @@ -492,14 +333,10 @@ func groupAndStringifyPullRequest(pr []prInfo) (string, error) { func main() { var ( - from, versionName, summaryFile string - to = "HEAD" + versionName, summaryFile string ) - pflag.StringVarP(&from, "from", "f", "", "from sha/tag/branch") - pflag.StringVarP(&to, "to", "t", to, "to sha/tag/branch") pflag.StringVarP(&versionName, "version", "v", "", "name of the version (has to be the following format: v11.0.0)") pflag.StringVarP(&summaryFile, "summary", "s", "", "readme file on which there is a summary of the release") - pflag.IntVar(&numberOfThreads, "threads", numberOfThreads, "Define the number of threads used to fetch data from GitHub's API. Lower this number if you hit request limit errors.") pflag.Parse() // The -version flag must be of a valid format. @@ -547,26 +384,23 @@ func main() { releaseNotes.KnownIssues = knownIssuesStr // changelog with pull requests - prs, authorCommits, commits, err := loadMergedPRs(from, to) - if err != nil { - log.Fatal(err) - } - prInfos, authors, err := loadAllPRs(prs, authorCommits) + prs, authors, err := loadMergedPRsAndAuthors(versionName) if err != nil { log.Fatal(err) } - releaseNotes.ChangeLog, err = groupAndStringifyPullRequest(prInfos) + + releaseNotes.ChangeLog, err = groupAndStringifyPullRequest(prs) if err != nil { log.Fatal(err) } // changelog metrics - if commits > 0 && len(authors) > 0 { + if len(prs) > 0 && len(authors) > 0 { releaseNotes.ChangeMetrics = fmt.Sprintf(` -The release includes %d commits (excluding merges) +The release includes %d merged Pull Requests. Thanks to all our contributors: @%s -`, commits, strings.Join(authors, ", @")) +`, len(prs), strings.Join(authors, ", @")) } if err := releaseNotes.generate(nil, nil); err != nil { diff --git a/go/tools/release-notes/release_notes_test.go b/go/tools/release-notes/release_notes_test.go index f80ee9097f9..19f946525c3 100644 --- a/go/tools/release-notes/release_notes_test.go +++ b/go/tools/release-notes/release_notes_test.go @@ -20,7 +20,6 @@ import ( "os" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "vitess.io/vitess/go/test/utils" @@ -29,26 +28,26 @@ import ( func Test_groupPRs(t *testing.T) { tests := []struct { name string - prInfos []prInfo - want map[string]map[string][]prInfo + prInfos []pullRequestInformation + want map[string]map[string][]pullRequestInformation }{ { name: "Single PR info with no labels", - prInfos: []prInfo{{Title: "pr 1", Number: 1}}, - want: map[string]map[string][]prInfo{"Other": {"Other": []prInfo{{Title: "pr 1", Number: 1}}}}, + prInfos: []pullRequestInformation{{Title: "pr 1", Number: 1}}, + want: map[string]map[string][]pullRequestInformation{"Other": {"Other": []pullRequestInformation{{Title: "pr 1", Number: 1}}}}, }, { name: "Single PR info with type label", - prInfos: []prInfo{{Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}}}}, - want: map[string]map[string][]prInfo{"Bug fixes": {"Other": []prInfo{{Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}}}}}}}, + prInfos: []pullRequestInformation{{Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}}}}, + want: map[string]map[string][]pullRequestInformation{"Bug fixes": {"Other": []pullRequestInformation{{Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}}}}}}}, { name: "Single PR info with type and component labels", - prInfos: []prInfo{{Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}, {Name: prefixComponent + "VTGate"}}}}, - want: map[string]map[string][]prInfo{"Bug fixes": {"VTGate": []prInfo{{Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}, {Name: prefixComponent + "VTGate"}}}}}}}, + prInfos: []pullRequestInformation{{Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}, {Name: prefixComponent + "VTGate"}}}}, + want: map[string]map[string][]pullRequestInformation{"Bug fixes": {"VTGate": []pullRequestInformation{{Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}, {Name: prefixComponent + "VTGate"}}}}}}}, { - name: "Multiple PR infos with type and component labels", prInfos: []prInfo{ + name: "Multiple PR infos with type and component labels", prInfos: []pullRequestInformation{ {Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}, {Name: prefixComponent + "VTGate"}}}, {Title: "pr 2", Number: 2, Labels: []label{{Name: prefixType + "Feature"}, {Name: prefixComponent + "VTTablet"}}}}, - want: map[string]map[string][]prInfo{"Bug fixes": {"VTGate": []prInfo{{Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}, {Name: prefixComponent + "VTGate"}}}}}, "Feature": {"VTTablet": []prInfo{{Title: "pr 2", Number: 2, Labels: []label{{Name: prefixType + "Feature"}, {Name: prefixComponent + "VTTablet"}}}}}}}, + want: map[string]map[string][]pullRequestInformation{"Bug fixes": {"VTGate": []pullRequestInformation{{Title: "pr 1", Number: 1, Labels: []label{{Name: prefixType + "Bug"}, {Name: prefixComponent + "VTGate"}}}}}, "Feature": {"VTTablet": []pullRequestInformation{{Title: "pr 2", Number: 2, Labels: []label{{Name: prefixType + "Feature"}, {Name: prefixComponent + "VTTablet"}}}}}}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -58,54 +57,6 @@ func Test_groupPRs(t *testing.T) { } } -func TestParseGitLogOutput(t *testing.T) { - in := `harshTEST@planetscale.com Merge pull request #7968 from planetscale/bump_java_snapshot_v11 7e8ebbb5b79b65d2d45fd6c838efb51bdafc7c0b 195a09df191d3e86a32ebcc7a1f1dde168fe819e 168fe819e -deeptTEST@planetscale.com Merge pull request #7970 from planetscale/vttestserver-default-charset 887be6914690b6d106aba001c72deea80a4d8dab ff8c750eda4b30787e772547a451ed1f50931150 f50931150 -deeptTEST@planetscale.com Merge pull request #7943 from planetscale/fix-mysql80-container-image 01fb7e55ab92df7c3f300b85976fdf3fd5bd35b3 3cc94a10752014c9ce311d88af9e1aa18e7fa2d8 18e7fa2d8 -57520317+rohit-nayak-TEST@users.noreply.github.com Merge pull request #7831 from planetscale/rn-vr-log2 37c09d3be83922a8ef936fbc028a5031f96b7dbf f57350c3ea1720496e5f1cec35d58f069e4df515 69e4df515 -TEST@planetscale.com docker/vttestserver/run.sh: Add $CHARSET environment variable 482a7008117ee3215663aeb33cad981e5242a88a e5242a88a -rohTEST@planetscale.com Add ability to select from vreplication_log in VReplicationExec 427cac89cd6b143d3a1928ee682b3a9538709da5 538709da5 -rohTEST@planetscale.com Use withDDL for vreplication log queries 4a1ab946e3628ba8ef610ea4a158186a5fdd17ba a5fdd17ba -rohTEST@planetscale.com Add license file. Minor refactor fa9de690ce0d27a781befbc1866aca5cd447798f cd447798f -rohTEST@planetscale.com Added comments and refactored tests b6d39acb08939ba56e9e9587f34f3b8bcdcdc504 bcdcdc504 -rohTEST@planetscale.com Add logs for start and end of the copy phase 1cf72866ddfbd554700d6c9e32b9835ebb3b444c ebb3b444c -rohTEST@planetscale.com Fix test 0992d39c6d473b548679d012cfa5a889ffa448ef 9ffa448ef -rohTEST@planetscale.com Add test for vreplication log and fix string conversion bug b616143b14b75e7c23042c2eef4f6b27a275b0f7 7a275b0f7 -rohTEST@planetscale.com Ignore queries related to _vt.vreplication_log in tests e6926932c14da9a2213be246bc2de5f011668551 011668551 -rohTEST@planetscale.com Create log table. Util functions to insert logs. Insert logs in VReplicationExec and setMessage/State 37c09d3be83922a8ef936fbc028a5031f96b7dbf 1f96b7dbf -harshTEST@planetscale.com Merge pull request #7951 from vmg/vmg/vr-client-perf 7794c62651066970e1176181cb7000d385d0b327 172fac7dec8b11937a4efb26ebf4bedf1771f189 f1771f189 -alkin.tezuysTEST@gmail.com java: Bump SNAPSHOT version to 11.0.0-SNAPSHOT after Vitess release v10 7794c62651066970e1176181cb7000d385d0b327 385d0b327 -alkin.tezuysTEST@gmail.com Merge pull request #7964 from planetscale/10_0_RC1_release_notes 31d84d6ce8e233a053794ad0ffe5168d34d04450 b020dc71f5c7dc663d814563f1b6c97340f4411f 340f4411f -vTEST@strn.cat vstreamer: fix docs e7bf329da0029414c3b18e18e5cb2226b9a731a2 6b9a731a2 -amasTEST@slack-corp.com [workflow] extract migration targets from wrangler (#7934) 8bd5a7cb093369b50a0926bfa3a112b3b744e782 3b744e782 -alkin.tezuysTEST@gmail.com More spacing issues fixed 7509d47ba785e7a39b8726dc80f93955953ab98d 5953ab98d -alkin.tezuysTEST@gmail.com Minor spacing fixes d31362e76ac69fb2bc4083e22e7c87683099fecd 83099fecd -alkin.tezuysTEST@gmail.com Update 10_0_0_release_notes.md a7034bdf5d454a47738335ed2afc75f72bdbcf37 72bdbcf37 -alkin.tezuysTEST@gmail.com v10 GA Release Notes ad37320b2637620ee36d44d163399ecc2c1eea6c c2c1eea6c -andrTEST@planetscale.com Merge pull request #7912 from planetscale/show-databases-like 7e13d4bccca0325ca07a488334e77c4f2f964f6b 95eceb17d10c62d56f2e94e5478afb5a1b63e1c2 a1b63e1c2 -andrTEST@planetscale.com Merge pull request #7629 from planetscale/gen4-table-aliases 2e1b1e9322a6bfcfe792cca341b0d52860d3c66e 7ad14e3f3d26cb1780cdbf9c22029740e5aebde4 0e5aebde4 -andrTEST@planetscale.com Merge remote-tracking branch 'upstream/master' into show-databases-like 6b3ee1c31a939fc6628515f00087baa3e1e8acf7 2e1b1e9322a6bfcfe792cca341b0d52860d3c66e 860d3c66e -2607934+shlomi-noaTEST@users.noreply.github.com Merge pull request #7959 from Hellcatlk/master 6c826115937d28ef83f05a1f0d54db0fcb814db4 cdab3040aaaa11c51e291d6b1a7af6fadd83dedf add83dedf -zouy.fnTEST@cn.fujitsu.com Fix a gofmt warning 08038850a258d6de250cf9d864d6118616f5562c 616f5562c -vTEST@strn.cat mysql: allow reusing row storage when reading from a stream a2850bbf41100618cb1192067b16585ba7c6b0c7 ba7c6b0c7 -vTEST@strn.cat throttle: do not check for time constantly e0b90daebe9e6b98d969934a24899b41d25e3a68 1d25e3a68 -andrTEST@planetscale.com fix compilation error 18036f5fb5f58523dbf50726beb741cedac2baf8 edac2baf8 -andrTEST@planetscale.com better code comment c173c945cf0e75e8649e6fa621509b5fb4ebd6c9 fb4ebd6c9 -vTEST@strn.cat conn: do not let header escape to the heap d31fb23d8cb9463810ed9fc132df4060a6812f6e 0a6812f6e -vTEST@strn.cat vstreamer: do not allocate when filtering rows dafc1cb729d7be7dff2c05bd05a926005eb9a044 05eb9a044 -vTEST@strn.cat vstreamer: do not allocate when converting rows c5cd3067aeb9d952a2f45084c37634267e4f9062 67e4f9062 -andrTEST@planetscale.com Merge remote-tracking branch 'upstream/master' into gen4-table-aliases 8c01827ed8b748240f213d9476ee162306ab01eb b1f9000ddd166d49adda6581e7ca9e0aca10c252 aca10c252 -aquarapTEST@gmail.com Fix mysql80 docker build with dep. a28591577b8d432b9c5d78abf59ad494a0a943b0 4a0a943b0 -TEST@planetscale.com Revert "docker/lite/install_dependencies.sh: Upgrade MySQL 8 to 8.0.24" 7858ff46545cff749b3663c92ae90ef27a5dfbc2 27a5dfbc2 -TEST@planetscale.com docker/lite/install_dependencies.sh: Upgrade MySQL 8 to 8.0.24 c91d46782933292941a846fef2590ff1a6fa193f a6fa193f` - - prs, authorCommits, nonMergeCommits, err := parseGitLog(in) - require.NoError(t, err) - assert.Equal(t, prs, []string{"7629", "7831", "7912", "7934", "7943", "7951", "7959", "7964", "7968", "7970"}) - assert.Equal(t, authorCommits, []string{"385d0b327", "3b744e782", "4a0a943b0", "538709da5", "616f5562c", "6b9a731a2", "e5242a88a", "edac2baf8"}) - assert.Equal(t, 28, nonMergeCommits) -} - func TestLoadSummaryReadme(t *testing.T) { readmeFile, err := os.CreateTemp("", "*.md") require.NoError(t, err) From 9b9f425f90ad6522583c75ec10d0fc79d18a7289 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 27 Jul 2023 14:16:27 +0530 Subject: [PATCH 150/233] [release-16.0] check keyspace snapshot time if none specified for backup restores (#13557) (#13634) Signed-off-by: Priya Bibra Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- go/test/endtoend/recovery/recovery_util.go | 9 +- .../recovery/unshardedrecovery/recovery.go | 115 ++++++++++-------- go/vt/vttablet/tabletmanager/restore.go | 7 +- 3 files changed, 78 insertions(+), 53 deletions(-) diff --git a/go/test/endtoend/recovery/recovery_util.go b/go/test/endtoend/recovery/recovery_util.go index 66084e2f4b5..cffae6a5005 100644 --- a/go/test/endtoend/recovery/recovery_util.go +++ b/go/test/endtoend/recovery/recovery_util.go @@ -51,17 +51,20 @@ func VerifyQueriesUsingVtgate(t *testing.T, session *vtgateconn.VTGateSession, q } // RestoreTablet performs a PITR restore. -func RestoreTablet(t *testing.T, localCluster *cluster.LocalProcessCluster, tablet *cluster.Vttablet, restoreKSName string, shardName string, keyspaceName string, commonTabletArg []string) { +func RestoreTablet(t *testing.T, localCluster *cluster.LocalProcessCluster, tablet *cluster.Vttablet, restoreKSName string, shardName string, keyspaceName string, commonTabletArg []string, restoreTime time.Time) { tablet.ValidateTabletRestart(t) replicaTabletArgs := commonTabletArg _, err := localCluster.VtctlProcess.ExecuteCommandWithOutput("GetKeyspace", restoreKSName) + if restoreTime.IsZero() { + restoreTime = time.Now().UTC() + } + if err != nil { - tm := time.Now().UTC() _, err := localCluster.VtctlProcess.ExecuteCommandWithOutput("CreateKeyspace", "--", "--keyspace_type=SNAPSHOT", "--base_keyspace="+keyspaceName, - "--snapshot_time", tm.Format(time.RFC3339), restoreKSName) + "--snapshot_time", restoreTime.Format(time.RFC3339), restoreKSName) require.Nil(t, err) } diff --git a/go/test/endtoend/recovery/unshardedrecovery/recovery.go b/go/test/endtoend/recovery/unshardedrecovery/recovery.go index e42540ac7bc..6190530ca31 100644 --- a/go/test/endtoend/recovery/unshardedrecovery/recovery.go +++ b/go/test/endtoend/recovery/unshardedrecovery/recovery.go @@ -177,24 +177,29 @@ SET GLOBAL old_alter_table = ON; } // TestRecoveryImpl does following -// - create a shard with primary and replica1 only -// - run InitShardPrimary -// - insert some data -// - take a backup -// - insert more data on the primary -// - take another backup -// - create a recovery keyspace after first backup -// - bring up tablet_replica2 in the new keyspace -// - check that new tablet does not have data created after backup1 -// - create second recovery keyspace after second backup -// - bring up tablet_replica3 in second keyspace -// - check that new tablet has data created after backup1 but not data created after backup2 -// - check that vtgate queries work correctly +// 1. create a shard with primary and replica1 only +// - run InitShardPrimary +// - insert some data +// +// 2. take a backup +// 3.create a recovery keyspace after first backup +// - bring up tablet_replica2 in the new keyspace +// - check that new tablet has data from backup1 +// +// 4. insert more data on the primary +// +// 5. take another backup +// 6. create a recovery keyspace after second backup +// - bring up tablet_replica3 in the new keyspace +// - check that new tablet has data from backup2 +// +// 7. check that vtgate queries work correctly func TestRecoveryImpl(t *testing.T) { defer cluster.PanicHandler(t) defer tabletsTeardown() verifyInitialReplication(t) + // take first backup of value = test1 err := localCluster.VtctlclientProcess.ExecuteCommand("Backup", replica1.Alias) assert.NoError(t, err) @@ -202,10 +207,6 @@ func TestRecoveryImpl(t *testing.T) { require.Equal(t, len(backups), 1) assert.Contains(t, backups[0], replica1.Alias) - _, err = primary.VttabletProcess.QueryTablet("insert into vt_insert_test (msg) values ('test2')", keyspaceName, true) - assert.NoError(t, err) - cluster.VerifyRowsInTablet(t, replica1, keyspaceName, 2) - err = localCluster.VtctlclientProcess.ApplyVSchema(keyspaceName, vSchema) assert.NoError(t, err) @@ -213,64 +214,80 @@ func TestRecoveryImpl(t *testing.T) { assert.NoError(t, err) assert.Contains(t, output, "vt_insert_test") - recovery.RestoreTablet(t, localCluster, replica2, recoveryKS1, "0", keyspaceName, commonTabletArg) + // restore with latest backup + restoreTime := time.Now().UTC() + recovery.RestoreTablet(t, localCluster, replica2, recoveryKS1, "0", keyspaceName, commonTabletArg, restoreTime) output, err = localCluster.VtctlclientProcess.ExecuteCommandWithOutput("GetSrvVSchema", cell) assert.NoError(t, err) assert.Contains(t, output, keyspaceName) assert.Contains(t, output, recoveryKS1) - err = localCluster.VtctlclientProcess.ExecuteCommand("GetSrvKeyspace", cell, keyspaceName) - assert.NoError(t, err) - output, err = localCluster.VtctlclientProcess.ExecuteCommandWithOutput("GetVSchema", recoveryKS1) assert.NoError(t, err) assert.Contains(t, output, "vt_insert_test") cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 1) + // verify that restored replica has value = test1 + qr, err := replica2.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) + assert.NoError(t, err) + assert.Equal(t, "test1", qr.Rows[0][0].ToString()) + + // insert new row on primary + _, err = primary.VttabletProcess.QueryTablet("insert into vt_insert_test (msg) values ('test2')", keyspaceName, true) + assert.NoError(t, err) + cluster.VerifyRowsInTablet(t, replica1, keyspaceName, 2) + // update the original row in primary _, err = primary.VttabletProcess.QueryTablet("update vt_insert_test set msg = 'msgx1' where id = 1", keyspaceName, true) assert.NoError(t, err) // verify that primary has new value - qr, err := primary.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) + qr, err = primary.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) assert.NoError(t, err) assert.Equal(t, "msgx1", qr.Rows[0][0].ToString()) - // verify that restored replica has old value - qr, err = replica2.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) - assert.NoError(t, err) - assert.Equal(t, "test1", qr.Rows[0][0].ToString()) + // check that replica1, used for the backup, has the new value + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() - err = localCluster.VtctlclientProcess.ExecuteCommand("Backup", replica1.Alias) - assert.NoError(t, err) + ticker := time.NewTicker(time.Second) + defer ticker.Stop() - _, err = primary.VttabletProcess.QueryTablet("insert into vt_insert_test (msg) values ('test3')", keyspaceName, true) - assert.NoError(t, err) - cluster.VerifyRowsInTablet(t, replica1, keyspaceName, 3) + for { + qr, err = replica1.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) + assert.NoError(t, err) + if qr.Rows[0][0].ToString() == "msgx1" { + break + } - recovery.RestoreTablet(t, localCluster, replica3, recoveryKS2, "0", keyspaceName, commonTabletArg) + select { + case <-ctx.Done(): + t.Error("timeout waiting for new value to be replicated on replica 1") + break + case <-ticker.C: + } + } - output, err = localCluster.VtctlclientProcess.ExecuteCommandWithOutput("GetVSchema", recoveryKS2) + // take second backup of value = msgx1 + err = localCluster.VtctlclientProcess.ExecuteCommand("Backup", replica1.Alias) assert.NoError(t, err) - assert.Contains(t, output, "vt_insert_test") - cluster.VerifyRowsInTablet(t, replica3, keyspaceName, 2) + // restore to first backup + recovery.RestoreTablet(t, localCluster, replica3, recoveryKS2, "0", keyspaceName, commonTabletArg, restoreTime) - // update the original row in primary - _, err = primary.VttabletProcess.QueryTablet("update vt_insert_test set msg = 'msgx2' where id = 1", keyspaceName, true) + output, err = localCluster.VtctlclientProcess.ExecuteCommandWithOutput("GetVSchema", recoveryKS2) assert.NoError(t, err) + assert.Contains(t, output, "vt_insert_test") - // verify that primary has new value - qr, err = primary.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) - assert.NoError(t, err) - assert.Equal(t, "msgx2", qr.Rows[0][0].ToString()) + // only one row from first backup + cluster.VerifyRowsInTablet(t, replica3, keyspaceName, 1) - // verify that restored replica has old value + //verify that restored replica has value = test1 qr, err = replica3.VttabletProcess.QueryTablet("select msg from vt_insert_test where id = 1", keyspaceName, true) assert.NoError(t, err) - assert.Equal(t, "msgx1", qr.Rows[0][0].ToString()) + assert.Equal(t, "test1", qr.Rows[0][0].ToString()) vtgateInstance := localCluster.NewVtgateInstance() vtgateInstance.TabletTypesToWait = "REPLICA" @@ -291,26 +308,26 @@ func TestRecoveryImpl(t *testing.T) { session := vtgateConn.Session("@replica", nil) // check that vtgate doesn't route queries to new tablet - recovery.VerifyQueriesUsingVtgate(t, session, "select count(*) from vt_insert_test", "INT64(3)") - recovery.VerifyQueriesUsingVtgate(t, session, "select msg from vt_insert_test where id = 1", `VARCHAR("msgx2")`) + recovery.VerifyQueriesUsingVtgate(t, session, "select count(*) from vt_insert_test", "INT64(2)") + recovery.VerifyQueriesUsingVtgate(t, session, "select msg from vt_insert_test where id = 1", `VARCHAR("msgx1")`) recovery.VerifyQueriesUsingVtgate(t, session, fmt.Sprintf("select count(*) from %s.vt_insert_test", recoveryKS1), "INT64(1)") recovery.VerifyQueriesUsingVtgate(t, session, fmt.Sprintf("select msg from %s.vt_insert_test where id = 1", recoveryKS1), `VARCHAR("test1")`) - recovery.VerifyQueriesUsingVtgate(t, session, fmt.Sprintf("select count(*) from %s.vt_insert_test", recoveryKS2), "INT64(2)") - recovery.VerifyQueriesUsingVtgate(t, session, fmt.Sprintf("select msg from %s.vt_insert_test where id = 1", recoveryKS2), `VARCHAR("msgx1")`) + recovery.VerifyQueriesUsingVtgate(t, session, fmt.Sprintf("select count(*) from %s.vt_insert_test", recoveryKS2), "INT64(1)") + recovery.VerifyQueriesUsingVtgate(t, session, fmt.Sprintf("select msg from %s.vt_insert_test where id = 1", recoveryKS2), `VARCHAR("test1")`) // check that new keyspace is accessible with 'use ks' cluster.ExecuteQueriesUsingVtgate(t, session, "use "+recoveryKS1+"@replica") recovery.VerifyQueriesUsingVtgate(t, session, "select count(*) from vt_insert_test", "INT64(1)") cluster.ExecuteQueriesUsingVtgate(t, session, "use "+recoveryKS2+"@replica") - recovery.VerifyQueriesUsingVtgate(t, session, "select count(*) from vt_insert_test", "INT64(2)") + recovery.VerifyQueriesUsingVtgate(t, session, "select count(*) from vt_insert_test", "INT64(1)") // check that new tablet is accessible with use `ks:shard` cluster.ExecuteQueriesUsingVtgate(t, session, "use `"+recoveryKS1+":0@replica`") recovery.VerifyQueriesUsingVtgate(t, session, "select count(*) from vt_insert_test", "INT64(1)") cluster.ExecuteQueriesUsingVtgate(t, session, "use `"+recoveryKS2+":0@replica`") - recovery.VerifyQueriesUsingVtgate(t, session, "select count(*) from vt_insert_test", "INT64(2)") + recovery.VerifyQueriesUsingVtgate(t, session, "select count(*) from vt_insert_test", "INT64(1)") } // verifyInitialReplication will create schema in primary, insert some data to primary and verify the same data in replica. diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index 9d4b3b174f3..2c6cb3b82dc 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -176,6 +176,11 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L log.Infof("Using base_keyspace %v to restore keyspace %v using a backup time of %v", keyspace, tablet.Keyspace, logutil.ProtoToTime(request.BackupTime)) } + startTime := logutil.ProtoToTime(request.BackupTime) + if startTime.IsZero() { + startTime = logutil.ProtoToTime(keyspaceInfo.SnapshotTime) + } + params := mysqlctl.RestoreParams{ Cnf: tm.Cnf, Mysqld: tm.MysqlDaemon, @@ -186,7 +191,7 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L DbName: topoproto.TabletDbName(tablet), Keyspace: keyspace, Shard: tablet.Shard, - StartTime: logutil.ProtoToTime(request.BackupTime), + StartTime: startTime, DryRun: request.DryRun, } if request.RestoreToPos != "" { From 18746447a9d05d7046df77bf69e0aae72da103af Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 27 Jul 2023 14:12:31 +0200 Subject: [PATCH 151/233] [release-16.0] ignore ongoing backfill vindex from routing selection (#13523) (#13607) Co-authored-by: Harshit Gangal --- .../planbuilder/operators/dml_planning.go | 6 +- go/vt/vtgate/planbuilder/operators/route.go | 7 +- go/vt/vtgate/planbuilder/plan_test.go | 178 +------------ go/vt/vtgate/planbuilder/plan_test_vindex.go | 222 ++++++++++++++++ .../planbuilder/testdata/select_cases.json | 251 ++++++++++++++++++ .../planbuilder/testdata/vschemas/schema.json | 48 ++++ go/vt/vtgate/vindexes/vschema.go | 36 ++- 7 files changed, 560 insertions(+), 188 deletions(-) create mode 100644 go/vt/vtgate/planbuilder/plan_test_vindex.go diff --git a/go/vt/vtgate/planbuilder/operators/dml_planning.go b/go/vt/vtgate/planbuilder/operators/dml_planning.go index 4fc3965e112..5a875b78f36 100644 --- a/go/vt/vtgate/planbuilder/operators/dml_planning.go +++ b/go/vt/vtgate/planbuilder/operators/dml_planning.go @@ -45,9 +45,9 @@ func getVindexInformation( var vindexesAndPredicates []*VindexPlusPredicates for _, colVindex := range table.Ordered { - if lu, isLu := colVindex.Vindex.(vindexes.LookupBackfill); isLu && lu.IsBackfilling() { - // Checking if the Vindex is currently backfilling or not, if it isn't we can read from the vindex table - // and we will be able to do a delete equal. Otherwise, we continue to look for next best vindex. + // Checking if the Vindex is currently backfilling or not, if it isn't we can read from the vindex table, + // and we will be able to do a delete equal. Otherwise, we continue to look for next best vindex. + if colVindex.IsBackfilling() { continue } diff --git a/go/vt/vtgate/planbuilder/operators/route.go b/go/vt/vtgate/planbuilder/operators/route.go index 46d9515b707..1c1772220f0 100644 --- a/go/vt/vtgate/planbuilder/operators/route.go +++ b/go/vt/vtgate/planbuilder/operators/route.go @@ -25,7 +25,6 @@ import ( "vitess.io/vitess/go/vt/vtgate/evalengine" "vitess.io/vitess/go/vt/vtgate/planbuilder/operators/ops" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" - "vitess.io/vitess/go/vt/vtgate/semantics" "vitess.io/vitess/go/vt/vtgate/vindexes" ) @@ -795,6 +794,12 @@ func createRouteFromVSchemaTable( } for _, columnVindex := range vschemaTable.ColumnVindexes { + // Checking if the Vindex is currently backfilling or not, if it isn't we can read from the vindex table + // Otherwise, we ignore this vindex for selection. + if columnVindex.IsBackfilling() { + continue + } + plan.VindexPreds = append(plan.VindexPreds, &VindexPlusPredicates{ColVindex: columnVindex, TableID: solves}) } diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index e492abfae5a..283b8874b0d 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -18,7 +18,6 @@ package planbuilder import ( "bytes" - "context" "encoding/json" "fmt" "math/rand" @@ -31,185 +30,22 @@ import ( "github.com/nsf/jsondiff" "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" - vschemapb "vitess.io/vitess/go/vt/proto/vschema" - "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" - "vitess.io/vitess/go/mysql/collations" - "vitess.io/vitess/go/vt/vtgate/semantics" - - "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/key" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vschemapb "vitess.io/vitess/go/vt/proto/vschema" + "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/engine" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/semantics" "vitess.io/vitess/go/vt/vtgate/vindexes" - - topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) -// hashIndex is a functional, unique Vindex. -type hashIndex struct{ name string } - -func (v *hashIndex) String() string { return v.name } -func (*hashIndex) Cost() int { return 1 } -func (*hashIndex) IsUnique() bool { return true } -func (*hashIndex) NeedsVCursor() bool { return false } -func (*hashIndex) Verify(context.Context, vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) { - return []bool{}, nil -} -func (*hashIndex) Map(ctx context.Context, vcursor vindexes.VCursor, ids []sqltypes.Value) ([]key.Destination, error) { - return nil, nil -} - -func newHashIndex(name string, _ map[string]string) (vindexes.Vindex, error) { - return &hashIndex{name: name}, nil -} - -// lookupIndex is a unique Vindex, and satisfies Lookup. -type lookupIndex struct{ name string } - -func (v *lookupIndex) String() string { return v.name } -func (*lookupIndex) Cost() int { return 2 } -func (*lookupIndex) IsUnique() bool { return true } -func (*lookupIndex) NeedsVCursor() bool { return false } -func (*lookupIndex) Verify(context.Context, vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) { - return []bool{}, nil -} -func (*lookupIndex) Map(ctx context.Context, vcursor vindexes.VCursor, ids []sqltypes.Value) ([]key.Destination, error) { - return nil, nil -} -func (*lookupIndex) Create(context.Context, vindexes.VCursor, [][]sqltypes.Value, [][]byte, bool) error { - return nil -} -func (*lookupIndex) Delete(context.Context, vindexes.VCursor, [][]sqltypes.Value, []byte) error { - return nil -} -func (*lookupIndex) Update(context.Context, vindexes.VCursor, []sqltypes.Value, []byte, []sqltypes.Value) error { - return nil -} - -func newLookupIndex(name string, _ map[string]string) (vindexes.Vindex, error) { - return &lookupIndex{name: name}, nil -} - -var _ vindexes.Lookup = (*lookupIndex)(nil) - -// nameLkpIndex satisfies Lookup, NonUnique. -type nameLkpIndex struct{ name string } - -func (v *nameLkpIndex) String() string { return v.name } -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 -} -func (*nameLkpIndex) Map(ctx context.Context, vcursor vindexes.VCursor, ids []sqltypes.Value) ([]key.Destination, error) { - return nil, nil -} -func (*nameLkpIndex) Create(context.Context, vindexes.VCursor, [][]sqltypes.Value, [][]byte, bool) error { - return nil -} -func (*nameLkpIndex) Delete(context.Context, vindexes.VCursor, [][]sqltypes.Value, []byte) error { - return nil -} -func (*nameLkpIndex) Update(context.Context, vindexes.VCursor, []sqltypes.Value, []byte, []sqltypes.Value) error { - return nil -} -func (v *nameLkpIndex) Query() (string, []string) { - return "select name, keyspace_id from name_user_vdx where name in ::name", []string{"name"} -} -func (*nameLkpIndex) MapResult([]sqltypes.Value, []*sqltypes.Result) ([]key.Destination, error) { - return nil, nil -} - -func newNameLkpIndex(name string, _ map[string]string) (vindexes.Vindex, error) { - return &nameLkpIndex{name: name}, nil -} - -var _ vindexes.Vindex = (*nameLkpIndex)(nil) -var _ vindexes.Lookup = (*nameLkpIndex)(nil) -var _ vindexes.LookupPlanable = (*nameLkpIndex)(nil) - -// costlyIndex satisfies Lookup, NonUnique. -type costlyIndex struct{ name string } - -func (v *costlyIndex) String() string { return v.name } -func (*costlyIndex) Cost() int { return 10 } -func (*costlyIndex) IsUnique() bool { return false } -func (*costlyIndex) NeedsVCursor() bool { return false } -func (*costlyIndex) Verify(context.Context, vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) { - return []bool{}, nil -} -func (*costlyIndex) Map(ctx context.Context, vcursor vindexes.VCursor, ids []sqltypes.Value) ([]key.Destination, error) { - return nil, nil -} -func (*costlyIndex) Create(context.Context, vindexes.VCursor, [][]sqltypes.Value, [][]byte, bool) error { - return nil -} -func (*costlyIndex) Delete(context.Context, vindexes.VCursor, [][]sqltypes.Value, []byte) error { - return nil -} -func (*costlyIndex) Update(context.Context, vindexes.VCursor, []sqltypes.Value, []byte, []sqltypes.Value) error { - return nil -} - -func newCostlyIndex(name string, _ map[string]string) (vindexes.Vindex, error) { - return &costlyIndex{name: name}, nil -} - -var _ vindexes.Vindex = (*costlyIndex)(nil) -var _ vindexes.Lookup = (*costlyIndex)(nil) - -// multiColIndex satisfies multi column vindex. -type multiColIndex struct { - name string -} - -func newMultiColIndex(name string, _ map[string]string) (vindexes.Vindex, error) { - return &multiColIndex{name: name}, nil -} - -var _ vindexes.MultiColumn = (*multiColIndex)(nil) - -func (m *multiColIndex) String() string { return m.name } - -func (m *multiColIndex) Cost() int { return 1 } - -func (m *multiColIndex) IsUnique() bool { return true } - -func (m *multiColIndex) NeedsVCursor() bool { return false } - -func (m *multiColIndex) Map(ctx context.Context, vcursor vindexes.VCursor, rowsColValues [][]sqltypes.Value) ([]key.Destination, error) { - return nil, nil -} - -func (m *multiColIndex) Verify(ctx context.Context, vcursor vindexes.VCursor, rowsColValues [][]sqltypes.Value, ksids [][]byte) ([]bool, error) { - return []bool{}, nil -} - -func (m *multiColIndex) PartialVindex() bool { - return true -} - -func init() { - vindexes.Register("hash_test", newHashIndex) - vindexes.Register("lookup_test", newLookupIndex) - vindexes.Register("name_lkp_test", newNameLkpIndex) - vindexes.Register("costly", newCostlyIndex) - vindexes.Register("multiCol_test", newMultiColIndex) -} - func makeTestOutput(t *testing.T) string { testOutputTempDir := utils.MakeTestOutput(t, "testdata", "plan_test") diff --git a/go/vt/vtgate/planbuilder/plan_test_vindex.go b/go/vt/vtgate/planbuilder/plan_test_vindex.go new file mode 100644 index 00000000000..432ef7b8479 --- /dev/null +++ b/go/vt/vtgate/planbuilder/plan_test_vindex.go @@ -0,0 +1,222 @@ +/* +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 planbuilder + +import ( + "context" + "strconv" + + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/key" + vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" + "vitess.io/vitess/go/vt/vtgate/vindexes" +) + +// hashIndex is a functional, unique Vindex. +type hashIndex struct{ name string } + +func (v *hashIndex) String() string { return v.name } +func (*hashIndex) Cost() int { return 1 } +func (*hashIndex) IsUnique() bool { return true } +func (*hashIndex) NeedsVCursor() bool { return false } +func (*hashIndex) Verify(context.Context, vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) { + return []bool{}, nil +} +func (*hashIndex) Map(ctx context.Context, vcursor vindexes.VCursor, ids []sqltypes.Value) ([]key.Destination, error) { + return nil, nil +} +func newHashIndex(name string, _ map[string]string) (vindexes.Vindex, error) { + return &hashIndex{name: name}, nil +} + +// lookupIndex is a unique Vindex, and satisfies Lookup. +type lookupIndex struct{ name string } + +func (v *lookupIndex) String() string { return v.name } +func (*lookupIndex) Cost() int { return 2 } +func (*lookupIndex) IsUnique() bool { return true } +func (*lookupIndex) NeedsVCursor() bool { return false } +func (*lookupIndex) Verify(context.Context, vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) { + return []bool{}, nil +} +func (*lookupIndex) Map(ctx context.Context, vcursor vindexes.VCursor, ids []sqltypes.Value) ([]key.Destination, error) { + return nil, nil +} +func (*lookupIndex) Create(context.Context, vindexes.VCursor, [][]sqltypes.Value, [][]byte, bool) error { + return nil +} +func (*lookupIndex) Delete(context.Context, vindexes.VCursor, [][]sqltypes.Value, []byte) error { + return nil +} +func (*lookupIndex) Update(context.Context, vindexes.VCursor, []sqltypes.Value, []byte, []sqltypes.Value) error { + return nil +} +func newLookupIndex(name string, _ map[string]string) (vindexes.Vindex, error) { + return &lookupIndex{name: name}, nil +} + +var _ vindexes.Lookup = (*lookupIndex)(nil) + +// nameLkpIndex satisfies Lookup, NonUnique. +type nameLkpIndex struct{ name string } + +func (v *nameLkpIndex) String() string { return v.name } +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 +} +func (*nameLkpIndex) Map(ctx context.Context, vcursor vindexes.VCursor, ids []sqltypes.Value) ([]key.Destination, error) { + return nil, nil +} +func (*nameLkpIndex) Create(context.Context, vindexes.VCursor, [][]sqltypes.Value, [][]byte, bool) error { + return nil +} +func (*nameLkpIndex) Delete(context.Context, vindexes.VCursor, [][]sqltypes.Value, []byte) error { + return nil +} +func (*nameLkpIndex) Update(context.Context, vindexes.VCursor, []sqltypes.Value, []byte, []sqltypes.Value) error { + return nil +} +func (*nameLkpIndex) Query() (string, []string) { + return "select name, keyspace_id from name_user_vdx where name in ::name", []string{"name"} +} +func (*nameLkpIndex) MapResult([]sqltypes.Value, []*sqltypes.Result) ([]key.Destination, error) { + return nil, nil +} +func newNameLkpIndex(name string, _ map[string]string) (vindexes.Vindex, error) { + return &nameLkpIndex{name: name}, nil +} + +var _ vindexes.Vindex = (*nameLkpIndex)(nil) +var _ vindexes.Lookup = (*nameLkpIndex)(nil) +var _ vindexes.LookupPlanable = (*nameLkpIndex)(nil) + +// costlyIndex satisfies Lookup, NonUnique. +type costlyIndex struct{ name string } + +func (v *costlyIndex) String() string { return v.name } +func (*costlyIndex) Cost() int { return 10 } +func (*costlyIndex) IsUnique() bool { return false } +func (*costlyIndex) NeedsVCursor() bool { return false } +func (*costlyIndex) Verify(context.Context, vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) { + return []bool{}, nil +} +func (*costlyIndex) Map(ctx context.Context, vcursor vindexes.VCursor, ids []sqltypes.Value) ([]key.Destination, error) { + return nil, nil +} +func (*costlyIndex) Create(context.Context, vindexes.VCursor, [][]sqltypes.Value, [][]byte, bool) error { + return nil +} +func (*costlyIndex) Delete(context.Context, vindexes.VCursor, [][]sqltypes.Value, []byte) error { + return nil +} +func (*costlyIndex) Update(context.Context, vindexes.VCursor, []sqltypes.Value, []byte, []sqltypes.Value) error { + return nil +} +func newCostlyIndex(name string, _ map[string]string) (vindexes.Vindex, error) { + return &costlyIndex{name: name}, nil +} + +var _ vindexes.Vindex = (*costlyIndex)(nil) +var _ vindexes.Lookup = (*costlyIndex)(nil) + +// multiColIndex satisfies multi column vindex. +type multiColIndex struct{ name string } + +func (m *multiColIndex) String() string { return m.name } +func (*multiColIndex) Cost() int { return 1 } +func (*multiColIndex) IsUnique() bool { return true } +func (*multiColIndex) NeedsVCursor() bool { return false } +func (*multiColIndex) Map(ctx context.Context, vcursor vindexes.VCursor, rowsColValues [][]sqltypes.Value) ([]key.Destination, error) { + return nil, nil +} +func (*multiColIndex) Verify(ctx context.Context, vcursor vindexes.VCursor, rowsColValues [][]sqltypes.Value, ksids [][]byte) ([]bool, error) { + return []bool{}, nil +} +func (*multiColIndex) PartialVindex() bool { return true } +func newMultiColIndex(name string, _ map[string]string) (vindexes.Vindex, error) { + return &multiColIndex{name: name}, nil +} + +var _ vindexes.MultiColumn = (*multiColIndex)(nil) + +// unqLkpVdxBackfill satisfies Lookup, Unique. +type unqLkpVdxBackfill struct { + name string + inBackfill bool + cost int +} + +func (u *unqLkpVdxBackfill) String() string { return u.name } +func (u *unqLkpVdxBackfill) Cost() int { return u.cost } +func (*unqLkpVdxBackfill) IsUnique() bool { return false } +func (*unqLkpVdxBackfill) NeedsVCursor() bool { return false } +func (*unqLkpVdxBackfill) AllowBatch() bool { return true } +func (*unqLkpVdxBackfill) AutoCommitEnabled() bool { return false } +func (*unqLkpVdxBackfill) GetCommitOrder() vtgatepb.CommitOrder { return vtgatepb.CommitOrder_NORMAL } +func (*unqLkpVdxBackfill) Verify(context.Context, vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) { + return []bool{}, nil +} +func (*unqLkpVdxBackfill) Map(ctx context.Context, vcursor vindexes.VCursor, ids []sqltypes.Value) ([]key.Destination, error) { + return nil, nil +} +func (*unqLkpVdxBackfill) Create(context.Context, vindexes.VCursor, [][]sqltypes.Value, [][]byte, bool) error { + return nil +} +func (*unqLkpVdxBackfill) Delete(context.Context, vindexes.VCursor, [][]sqltypes.Value, []byte) error { + return nil +} +func (*unqLkpVdxBackfill) Update(context.Context, vindexes.VCursor, []sqltypes.Value, []byte, []sqltypes.Value) error { + return nil +} +func (*unqLkpVdxBackfill) Query() (string, []string) { + return "select unq_key, keyspace_id from unq_lkp_idx where unq_key in ::unq_key", []string{"unq_key"} +} +func (*unqLkpVdxBackfill) MapResult([]sqltypes.Value, []*sqltypes.Result) ([]key.Destination, error) { + return nil, nil +} +func (u *unqLkpVdxBackfill) IsBackfilling() bool { return u.inBackfill } + +func newUnqLkpVdxBackfill(name string, m map[string]string) (vindexes.Vindex, error) { + vdx := &unqLkpVdxBackfill{name: name} + if val, ok := m["write_only"]; ok { + vdx.inBackfill = val == "true" + } + if val, ok := m["cost"]; ok { + vdx.cost, _ = strconv.Atoi(val) + } + return vdx, nil +} + +var _ vindexes.Vindex = (*unqLkpVdxBackfill)(nil) +var _ vindexes.Lookup = (*unqLkpVdxBackfill)(nil) +var _ vindexes.LookupPlanable = (*unqLkpVdxBackfill)(nil) +var _ vindexes.LookupBackfill = (*unqLkpVdxBackfill)(nil) + +func init() { + vindexes.Register("hash_test", newHashIndex) + vindexes.Register("lookup_test", newLookupIndex) + vindexes.Register("name_lkp_test", newNameLkpIndex) + vindexes.Register("costly", newCostlyIndex) + vindexes.Register("multiCol_test", newMultiColIndex) + vindexes.Register("unq_lkp_test", newUnqLkpVdxBackfill) +} diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index 467421f7258..57e48630c0e 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -8105,5 +8105,256 @@ "user.user" ] } + }, + { + "comment": "pick email as vindex lookup", + "query": "select * from customer where email = 'a@mail.com'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from customer where email = 'a@mail.com'", + "Instructions": { + "OperatorType": "Route", + "Variant": "Equal", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from customer where 1 != 1", + "Query": "select * from customer where email = 'a@mail.com'", + "Table": "customer", + "Values": [ + "VARCHAR(\"a@mail.com\")" + ], + "Vindex": "unq_lkp_vdx" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select * from customer where email = 'a@mail.com'", + "Instructions": { + "OperatorType": "VindexLookup", + "Variant": "Equal", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "Values": [ + "VARCHAR(\"a@mail.com\")" + ], + "Vindex": "unq_lkp_vdx", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "IN", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select unq_key, keyspace_id from unq_lkp_idx where 1 != 1", + "Query": "select unq_key, keyspace_id from unq_lkp_idx where unq_key in ::__vals", + "Table": "unq_lkp_idx", + "Values": [ + ":unq_key" + ], + "Vindex": "shard_index" + }, + { + "OperatorType": "Route", + "Variant": "ByDestination", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from customer where 1 != 1", + "Query": "select * from customer where email = 'a@mail.com'", + "Table": "customer" + } + ] + }, + "TablesUsed": [ + "user.customer" + ] + } + }, + { + "comment": "phone is in backfill vindex - not selected for vindex lookup", + "query": "select * from customer where phone = 123456", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from customer where phone = 123456", + "Instructions": { + "OperatorType": "Route", + "Variant": "Equal", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from customer where 1 != 1", + "Query": "select * from customer where phone = 123456", + "Table": "customer", + "Values": [ + "INT64(123456)" + ], + "Vindex": "unq_lkp_bf_vdx" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select * from customer where phone = 123456", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from customer where 1 != 1", + "Query": "select * from customer where phone = 123456", + "Table": "customer" + }, + "TablesUsed": [ + "user.customer" + ] + } + }, + { + "comment": "email vindex is costly than phone vindex - but phone vindex is backfiling hence ignored", + "query": "select * from customer where email = 'a@mail.com' and phone = 123456", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from customer where email = 'a@mail.com' and phone = 123456", + "Instructions": { + "OperatorType": "Route", + "Variant": "Equal", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from customer where 1 != 1", + "Query": "select * from customer where email = 'a@mail.com' and phone = 123456", + "Table": "customer", + "Values": [ + "INT64(123456)" + ], + "Vindex": "unq_lkp_bf_vdx" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select * from customer where email = 'a@mail.com' and phone = 123456", + "Instructions": { + "OperatorType": "VindexLookup", + "Variant": "Equal", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "Values": [ + "VARCHAR(\"a@mail.com\")" + ], + "Vindex": "unq_lkp_vdx", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "IN", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select unq_key, keyspace_id from unq_lkp_idx where 1 != 1", + "Query": "select unq_key, keyspace_id from unq_lkp_idx where unq_key in ::__vals", + "Table": "unq_lkp_idx", + "Values": [ + ":unq_key" + ], + "Vindex": "shard_index" + }, + { + "OperatorType": "Route", + "Variant": "ByDestination", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from customer where 1 != 1", + "Query": "select * from customer where email = 'a@mail.com' and phone = 123456", + "Table": "customer" + } + ] + }, + "TablesUsed": [ + "user.customer" + ] + } + }, + { + "comment": "predicate order changed: email vindex is costly than phone vindex - but phone vindex is backfiling hence ignored", + "query": "select * from customer where phone = 123456 and email = 'a@mail.com'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from customer where phone = 123456 and email = 'a@mail.com'", + "Instructions": { + "OperatorType": "Route", + "Variant": "Equal", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from customer where 1 != 1", + "Query": "select * from customer where phone = 123456 and email = 'a@mail.com'", + "Table": "customer", + "Values": [ + "INT64(123456)" + ], + "Vindex": "unq_lkp_bf_vdx" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select * from customer where phone = 123456 and email = 'a@mail.com'", + "Instructions": { + "OperatorType": "VindexLookup", + "Variant": "Equal", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "Values": [ + "VARCHAR(\"a@mail.com\")" + ], + "Vindex": "unq_lkp_vdx", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "IN", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select unq_key, keyspace_id from unq_lkp_idx where 1 != 1", + "Query": "select unq_key, keyspace_id from unq_lkp_idx where unq_key in ::__vals", + "Table": "unq_lkp_idx", + "Values": [ + ":unq_key" + ], + "Vindex": "shard_index" + }, + { + "OperatorType": "Route", + "Variant": "ByDestination", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from customer where 1 != 1", + "Query": "select * from customer where phone = 123456 and email = 'a@mail.com'", + "Table": "customer" + } + ] + }, + "TablesUsed": [ + "user.customer" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json b/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json index 8c38997f06e..85e5051ce2a 100644 --- a/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json +++ b/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json @@ -124,6 +124,30 @@ "name_muticoltbl_map": { "type": "name_lkp_test", "owner": "multicol_tbl" + }, + "shard_index": { + "type": "xxhash" + }, + "unq_lkp_bf_vdx": { + "type": "unq_lkp_test", + "owner": "customer", + "params": { + "table": "unq_lkp_idx", + "from": " ", + "to": "keyspace_id", + "cost": "100", + "write_only": "true" + } + }, + "unq_lkp_vdx": { + "type": "unq_lkp_test", + "owner": "customer", + "params": { + "table": "unq_lkp_idx", + "from": "unq_key", + "to": "keyspace_id", + "cost": "300" + } } }, "tables": { @@ -376,6 +400,30 @@ "name": "user_index" } ] + }, + "customer": { + "column_vindexes": [ + { + "column": "id", + "name": "shard_index" + }, + { + "column": "email", + "name": "unq_lkp_vdx" + }, + { + "column": "phone", + "name": "unq_lkp_bf_vdx" + } + ] + }, + "unq_lkp_idx": { + "column_vindexes": [ + { + "column": "unq_key", + "name": "shard_index" + } + ] } } }, diff --git a/go/vt/vtgate/vindexes/vschema.go b/go/vt/vtgate/vindexes/vschema.go index 773a5d8466a..149103d66d2 100644 --- a/go/vt/vtgate/vindexes/vschema.go +++ b/go/vt/vtgate/vindexes/vschema.go @@ -24,17 +24,15 @@ import ( "sort" "strings" - "vitess.io/vitess/go/sqlescape" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" - "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/json2" + "vitess.io/vitess/go/sqlescape" "vitess.io/vitess/go/sqltypes" - "vitess.io/vitess/go/vt/sqlparser" - querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vschemapb "vitess.io/vitess/go/vt/proto/vschema" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" ) // TabletTypeSuffix maps the tablet type to its suffix string. @@ -128,6 +126,7 @@ type ColumnVindex struct { isUnique bool cost int partial bool + backfill bool } // IsUnique is used to tell whether the ColumnVindex @@ -148,6 +147,11 @@ func (c *ColumnVindex) IsPartialVindex() bool { return c.partial } +// IsBackfilling returns true if the vindex is in the process of backfilling the rows. +func (c *ColumnVindex) IsBackfilling() bool { + return c.backfill +} + // Column describes a column. type Column struct { Name sqlparser.IdentifierCI `json:"name"` @@ -558,6 +562,10 @@ func buildTables(ks *vschemapb.Keyspace, vschema *VSchema, ksvschema *KeyspaceSc columns = append(columns, sqlparser.NewIdentifierCI(indCol)) } } + backfill := false + if lkpBackfill, ok := vindex.(LookupBackfill); ok { + backfill = lkpBackfill.IsBackfilling() + } columnVindex := &ColumnVindex{ Columns: columns, Type: vindexInfo.Type, @@ -566,6 +574,7 @@ func buildTables(ks *vschemapb.Keyspace, vschema *VSchema, ksvschema *KeyspaceSc Vindex: vindex, isUnique: vindex.IsUnique(), cost: vindex.Cost(), + backfill: backfill, } if i == 0 { // Perform Primary vindex check. @@ -618,13 +627,14 @@ func buildTables(ks *vschemapb.Keyspace, vschema *VSchema, ksvschema *KeyspaceSc columnSubset := columns[:i] cost++ columnVindex = &ColumnVindex{ - Columns: columnSubset, - Type: vindexInfo.Type, - Name: ind.Name, - Owned: owned, - Vindex: vindex, - cost: cost, - partial: true, + Columns: columnSubset, + Type: vindexInfo.Type, + Name: ind.Name, + Owned: owned, + Vindex: vindex, + cost: cost, + partial: true, + backfill: backfill, } t.ColumnVindexes = append(t.ColumnVindexes, columnVindex) } From d395f71b01710958f1e6daf06f9e9aeb86200e00 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 27 Jul 2023 15:34:24 +0200 Subject: [PATCH 152/233] [release-16.0] Update known issues in `v16.x` and `v17.0.0` (#13618) (#13645) Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> --- changelog/16.0/16.0.0/release_notes.md | 26 +++++++++++++++++++++++++ changelog/16.0/16.0.0/summary.md | 27 +++++++++++++++++++++++++- changelog/16.0/16.0.1/release_notes.md | 25 +++++++++++++++++++++++- changelog/16.0/16.0.1/summary.md | 21 ++++++++++++++++++-- changelog/16.0/16.0.2/release_notes.md | 22 +++++++++++++++++++-- changelog/16.0/16.0.2/summary.md | 20 ++++++++++++++++++- 6 files changed, 134 insertions(+), 7 deletions(-) diff --git a/changelog/16.0/16.0.0/release_notes.md b/changelog/16.0/16.0.0/release_notes.md index 729f192d54b..e17a74a8d0f 100644 --- a/changelog/16.0/16.0.0/release_notes.md +++ b/changelog/16.0/16.0.0/release_notes.md @@ -5,6 +5,9 @@ - **[Known Issues](#known-issues)** - [MySQL & Xtrabackup known issue](#mysql-xtrabackup-ddl) + - [VTTablet Restore Metrics](#vttablet-restore-metrics) + - [Schema-initialization stuck on semi-sync ACKs while upgrading to v16.0.0](#schema-init-upgrade) + - [Broken downgrade from v17.x.x when super_read_only turned on by default](#init-db-sql-turned-on) - **[Major Changes](#major-changes)** - **[Breaking Changes](#breaking-changes)** - [VTGate Advertised MySQL Version](#advertised-mysql-version) @@ -100,6 +103,29 @@ or > ALTER TABLE your_table ENGINE=InnoDB; ``` +### VTTablet Restore Metrics + +As part of the VTTablet Sidecar Schema Maintenance Refactor in v16.0.0, we dropped the `local_metadata` table from the sidecar database schema. This table was storing a couple of metrics related to restores from backup, which have now been lost. +They have been re-introduced in v17.0.0 as metrics that can be accessed from `/debug/vars`. + +The original issue can be found [here](https://github.com/vitessio/vitess/issues/13336). + +### Schema-initialization stuck on semi-sync ACKs while upgrading to `v16.0.0` + +During upgrades from `<= v15.x.x` to `v16.0.0`, as part of `PromoteReplica` call, the schema-init realizes that there are schema diffs to apply and ends up writing to the database. +The issue is that if [semi-sync](https://vitess.io/docs/16.0/reference/features/mysql-replication/#semi-sync) is enabled, all of these writes get blocked indefinitely. +Eventually, `PromoteReplica` fails, and this fails the entire PRS call. + +A fix for this issue was merged on `release-16.0` in [PR#13441](https://github.com/vitessio/vitess/pull/13441), read the [corresponding bug report to learn more](https://github.com/vitessio/vitess/issues/13426). + +This issue is fixed in `v16.0.3` and later patch releases. + +### Broken downgrade from v17.x.x when super_read_only turned on by default + +In `v17.x.x` `super_read_only` is turned on by default meaning that downgrading from `v17` to `v16.0.0` breaks due to `init_db.sql` needing write access. + +This issue is fixed in `>= v16.0.3` thanks to [PR #13525](https://github.com/vitessio/vitess/pull/13525) + ## Major Changes ### Breaking Changes diff --git a/changelog/16.0/16.0.0/summary.md b/changelog/16.0/16.0.0/summary.md index ac2cb5a5b6c..c895a33130b 100644 --- a/changelog/16.0/16.0.0/summary.md +++ b/changelog/16.0/16.0.0/summary.md @@ -3,7 +3,10 @@ ### Table of Contents - **[Known Issues](#known-issues)** - - [MySQL & Xtrabackup known issue](#mysql-xtrabackup-ddl) + - [MySQL & Xtrabackup known issue](#mysql-xtrabackup-ddl) + - [VTTablet Restore Metrics](#vttablet-restore-metrics) + - [Schema-initialization stuck on semi-sync ACKs while upgrading to v16.0.0](#schema-init-upgrade) + - [Broken downgrade from v17.x.x when super_read_only turned on by default](#init-db-sql-turned-on) - **[Major Changes](#major-changes)** - **[Breaking Changes](#breaking-changes)** - [VTGate Advertised MySQL Version](#advertised-mysql-version) @@ -99,6 +102,28 @@ or > ALTER TABLE your_table ENGINE=InnoDB; ``` +### VTTablet Restore Metrics + +As part of the VTTablet Sidecar Schema Maintenance Refactor in v16.0.0, we dropped the `local_metadata` table from the sidecar database schema. This table was storing a couple of metrics related to restores from backup, which have now been lost. +They have been re-introduced in v17.0.0 as metrics that can be accessed from `/debug/vars`. + +The original issue can be found [here](https://github.com/vitessio/vitess/issues/13336). + +### Schema-initialization stuck on semi-sync ACKs while upgrading to `v16.0.0` + +During upgrades from `<= v15.x.x` to `v16.0.0`, as part of `PromoteReplica` call, the schema-init realizes that there are schema diffs to apply and ends up writing to the database if [semi-sync](https://vitess.io/docs/16.0/reference/features/mysql-replication/#semi-sync) is enabled, all of these writes get blocked indefinitely. +Eventually, `PromoteReplica` fails, and this fails the entire PRS call. + +A fix for this issue was merged on `release-16.0` in [PR#13441](https://github.com/vitessio/vitess/pull/13441), read the [corresponding bug report to learn more](https://github.com/vitessio/vitess/issues/13426). + +This issue is fixed in `v16.0.3` and later patch releases. + +### Broken downgrade from v17.x.x when super_read_only turned on by default + +In `v17.x.x` `super_read_only` is turned on by default meaning that downgrading from `v17` to `v16.0.0` breaks due to `init_db.sql` needing write access. + +This issue is fixed in `>= v16.0.3` thanks to [PR #13525](https://github.com/vitessio/vitess/pull/13525). + ## Major Changes ### Breaking Changes diff --git a/changelog/16.0/16.0.1/release_notes.md b/changelog/16.0/16.0.1/release_notes.md index 6d9ea0d2017..c1354eac4ee 100644 --- a/changelog/16.0/16.0.1/release_notes.md +++ b/changelog/16.0/16.0.1/release_notes.md @@ -1,5 +1,23 @@ # Release of Vitess v16.0.1 -## Summary + +## Known Issues + +### Schema-initialization stuck on semi-sync ACKs while upgrading to `v16.0.1` + +During upgrades from `<= v15.x.x` to `v16.0.1`, as part of `PromoteReplica` call, the schema-init realizes that there are schema diffs to apply and ends up writing to the database if [semi-sync](https://vitess.io/docs/16.0/reference/features/mysql-replication/#semi-sync) is enabled, all of these writes get blocked indefinitely. +Eventually, `PromoteReplica` fails, and this fails the entire PRS call. + +A fix for this issue was merged on `release-16.0` in [PR#13441](https://github.com/vitessio/vitess/pull/13441), read the [corresponding bug report to learn more](https://github.com/vitessio/vitess/issues/13426). + +This issue is fixed in `v16.0.3` and later patch releases. + +### Broken downgrade from v17.x.x when super_read_only turned on by default + +In `v17.x.x` `super_read_only` is turned on by default meaning that downgrading from `v17` to `v16.0.1` breaks due to `init_db.sql` needing write access. + +This issue is fixed in `>= v16.0.3` thanks to [PR #13525](https://github.com/vitessio/vitess/pull/13525) + +## Major Changes ### Upgrade to `go1.20.2` @@ -8,6 +26,11 @@ Below is a summary of this Go patch release. You can learn more [here](https://g > go1.20.2 (released 2023-03-07) includes a security fix to the crypto/elliptic package, as well as bug fixes to the compiler, the covdata command, the linker, the runtime, and the crypto/ecdh, crypto/rsa, crypto/x509, os, and syscall packages. +### Keyspace name validation in TopoServer + +Prior to v16.0.1, it was possible to create a keyspace with invalid characters, which would then be inaccessible to various cluster management operations. + +Keyspace names may no longer contain the forward slash ("/") character, and TopoServer's `GetKeyspace` and `CreateKeyspace` methods return an error if given such a name. ------------ The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/16.0/16.0.1/changelog.md). diff --git a/changelog/16.0/16.0.1/summary.md b/changelog/16.0/16.0.1/summary.md index 05381d735bc..f9af9672ea1 100644 --- a/changelog/16.0/16.0.1/summary.md +++ b/changelog/16.0/16.0.1/summary.md @@ -1,4 +1,21 @@ -## Summary +## Known Issues + +### Schema-initialization stuck on semi-sync ACKs while upgrading to `v16.0.1` + +During upgrades from `<= v15.x.x` to `v16.0.1`, as part of `PromoteReplica` call, the schema-init realizes that there are schema diffs to apply and ends up writing to the database if [semi-sync](https://vitess.io/docs/16.0/reference/features/mysql-replication/#semi-sync) is enabled, all of these writes get blocked indefinitely. +Eventually, `PromoteReplica` fails, and this fails the entire PRS call. + +A fix for this issue was merged on `release-16.0` in [PR#13441](https://github.com/vitessio/vitess/pull/13441), read the [corresponding bug report to learn more](https://github.com/vitessio/vitess/issues/13426). + +This issue is fixed in `v16.0.3` and later patch releases. + +### Broken downgrade from v17.x.x when super_read_only turned on by default + +In `v17.x.x` `super_read_only` is turned on by default meaning that downgrading from `v17` to `v16.0.1` breaks due to `init_db.sql` needing write access. + +This issue is fixed in `>= v16.0.3` thanks to [PR #13525](https://github.com/vitessio/vitess/pull/13525) + +## Major Changes ### Upgrade to `go1.20.2` @@ -11,5 +28,5 @@ Below is a summary of this Go patch release. You can learn more [here](https://g Prior to v16.0.1, it was possible to create a keyspace with invalid characters, which would then be inaccessible to various cluster management operations. - Keyspace names may no longer contain the forward slash ("/") character, and TopoServer's `GetKeyspace` and `CreateKeyspace` methods return an error if given such a name. +Keyspace names may no longer contain the forward slash ("/") character, and TopoServer's `GetKeyspace` and `CreateKeyspace` methods return an error if given such a name. diff --git a/changelog/16.0/16.0.2/release_notes.md b/changelog/16.0/16.0.2/release_notes.md index fd32cf7493d..806cf87d208 100644 --- a/changelog/16.0/16.0.2/release_notes.md +++ b/changelog/16.0/16.0.2/release_notes.md @@ -1,5 +1,23 @@ # Release of Vitess v16.0.2 -## Summary + +## Known Issues + +### Schema-initialization stuck on semi-sync ACKs while upgrading to `v16.0.2` + +During upgrades from `<= v15.x.x` to `v16.0.2`, as part of `PromoteReplica` call, the schema-init realizes that there are schema diffs to apply and ends up writing to the database if [semi-sync](https://vitess.io/docs/16.0/reference/features/mysql-replication/#semi-sync) is enabled, all of these writes get blocked indefinitely. +Eventually, `PromoteReplica` fails, and this fails the entire PRS call. + +A fix for this issue was merged on `release-16.0` in [PR#13441](https://github.com/vitessio/vitess/pull/13441), read the [corresponding bug report to learn more](https://github.com/vitessio/vitess/issues/13426). + +This issue is fixed in `v16.0.3` and later patch releases. + +### Broken downgrade from v17.x.x when super_read_only turned on by default + +In `v17.x.x` `super_read_only` is turned on by default meaning that downgrading from `v17` to `v16.0.2` breaks due to `init_db.sql` needing write access. + +This issue is fixed in `>= v16.0.3` thanks to [PR #13525](https://github.com/vitessio/vitess/pull/13525) + +## Major Changes ### Upgrade to `go1.20.3` @@ -11,7 +29,7 @@ Below is a summary of this Go patch release. You can learn more [here](https://g ### EffectiveCallerId in Vtgate gRPC calls A new flag `grpc-use-static-authentication-callerid` is added to gate the behavior introduced in https://github.com/vitessio/vitess/pull/12050. -Earlier, we used to automatically set immediateCallerID to user from static authentication context that overrode the EffectiveCallerId. +Earlier, we used to automatically set immediateCallerID to user from static authentication context that overrode the EffectiveCallerId. ### Shard name validation in TopoServer diff --git a/changelog/16.0/16.0.2/summary.md b/changelog/16.0/16.0.2/summary.md index d8fbbc966d9..faef0207921 100644 --- a/changelog/16.0/16.0.2/summary.md +++ b/changelog/16.0/16.0.2/summary.md @@ -1,4 +1,22 @@ -## Summary +## Known Issues + +### Schema-initialization stuck on semi-sync ACKs while upgrading to `v16.0.2` + +During upgrades from `<= v15.x.x` to `v16.0.2`, as part of `PromoteReplica` call, the schema-init realizes that there are schema diffs to apply and ends up writing to the database if [semi-sync](https://vitess.io/docs/16.0/reference/features/mysql-replication/#semi-sync) is enabled, all of these writes get blocked indefinitely. +Eventually, `PromoteReplica` fails, and this fails the entire PRS call. + +A fix for this issue was merged on `release-16.0` in [PR#13441](https://github.com/vitessio/vitess/pull/13441), read the [corresponding bug report to learn more](https://github.com/vitessio/vitess/issues/13426). + +This issue is fixed in `v16.0.3` and later patch releases. + +### Broken downgrade from v17.x.x when super_read_only turned on by default + +In `v17.x.x` `super_read_only` is turned on by default meaning that downgrading from `v17` to `v16.0.2` breaks due to `init_db.sql` needing write access. + +This issue is fixed in `>= v16.0.3` thanks to [PR #13525](https://github.com/vitessio/vitess/pull/13525) + + +## Major Changes ### Upgrade to `go1.20.3` From 66e1b175a1d7fae3417d0b8d55781a9dc8f3037d Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 27 Jul 2023 19:13:17 +0530 Subject: [PATCH 153/233] Code freeze of release-16.0 for release of v16.0.3 (#13648) Signed-off-by: Manan Gupta --- .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 efe1d6e8856..1bb74feee50 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 a93cb55331d63eeb4a0dc6ed1b5f98429c350f04 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 28 Jul 2023 18:54:10 +0530 Subject: [PATCH 154/233] Release of v16.0.3 (#13651) Signed-off-by: Manan Gupta --- .github/workflows/code_freeze.yml | 2 +- changelog/16.0/16.0.3/changelog.md | 67 +++++++++++++++++++ changelog/16.0/16.0.3/release_notes.md | 7 ++ changelog/16.0/16.0.3/summary.md | 0 changelog/16.0/README.md | 4 ++ 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 | 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 +- 21 files changed, 160 insertions(+), 82 deletions(-) create mode 100644 changelog/16.0/16.0.3/changelog.md create mode 100644 changelog/16.0/16.0.3/release_notes.md create mode 100644 changelog/16.0/16.0.3/summary.md diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 1bb74feee50..efe1d6e8856 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/16.0/16.0.3/changelog.md b/changelog/16.0/16.0.3/changelog.md new file mode 100644 index 00000000000..3f43d9b6049 --- /dev/null +++ b/changelog/16.0/16.0.3/changelog.md @@ -0,0 +1,67 @@ +# Changelog of Vitess v16.0.3 + +### Bug fixes +#### Cluster management + * [release-16.0] Prevent resetting replication every time we set replication source (#13377) [#13392](https://github.com/vitessio/vitess/pull/13392) + * [release-16.0] Don't run any reparent commands if the host is empty (#13396) [#13402](https://github.com/vitessio/vitess/pull/13402) + * [release-16.0] Upgrade-Downgrade Fix: Schema-initialization stuck on semi-sync ACKs while upgrading (#13411) [#13441](https://github.com/vitessio/vitess/pull/13441) + * [release-16.0] Flaky tests: Fix race in memory topo (#13559) [#13576](https://github.com/vitessio/vitess/pull/13576) + * [release-16.0] ignore all error for views in engine reload (#13590) [#13593](https://github.com/vitessio/vitess/pull/13593) + * [release-16.0] check keyspace snapshot time if none specified for backup restores (#13557) [#13634](https://github.com/vitessio/vitess/pull/13634) +#### Examples + * [release-16.0] `examples/compose`: fix `consul:latest` error w/`docker-compose up -d` (#13468) [#13472](https://github.com/vitessio/vitess/pull/13472) +#### Operator + * [release-16.0] Upgrade mysqld memory limits to 1024Mi (#13122) [#13204](https://github.com/vitessio/vitess/pull/13204) +#### Query Serving + * [release-16.0] Fix the resilientQuery to give correct results during initialization (#13080) [#13087](https://github.com/vitessio/vitess/pull/13087) + * [16.0] evalengine: TypeOf for Columns should only use value type when we have a value [#13154](https://github.com/vitessio/vitess/pull/13154) + * [release-16.0] Remove indentation limit in the sqlparser (#13158) [#13166](https://github.com/vitessio/vitess/pull/13166) + * Fix: errant GTID in health streamer [#13184](https://github.com/vitessio/vitess/pull/13184) + * [16.0] Fix: TabletServer ReserveBeginExecute to return transaction ID on error [#13193](https://github.com/vitessio/vitess/pull/13193) + * [release-16.0] Bug fix: SQL queries erroring with message `unknown aggregation random` (#13330) [#13334](https://github.com/vitessio/vitess/pull/13334) + * [release-16.0] ignore ongoing backfill vindex from routing selection (#13523) [#13607](https://github.com/vitessio/vitess/pull/13607) +#### Schema Tracker + * [release-16.0] Ignore error while reading table data in Schema.Engine reload (#13421) [#13424](https://github.com/vitessio/vitess/pull/13424) + * Backport v16: schema.Reload(): ignore column reading errors for views only, error for tables #13442 [#13456](https://github.com/vitessio/vitess/pull/13456) +#### TabletManager + * [release-16.0] mysqlctl: Correctly encode database and table names (#13312) [#13323](https://github.com/vitessio/vitess/pull/13323) +#### VReplication + * [release-16.0] VReplication: Do not delete sharded target vschema table entries on Cancel (#13146) [#13155](https://github.com/vitessio/vitess/pull/13155) + * [release-16.0] VReplication: Pass on --keep_routing_rules flag value for Cancel action (#13171) [#13194](https://github.com/vitessio/vitess/pull/13194) + * [release-16.0] VReplication: Fix VDiff2 DeleteByUUID Query (#13255) [#13282](https://github.com/vitessio/vitess/pull/13282) + * [release-16.0] VReplication: Ensure ROW events are sent within a transaction (#13547) [#13580](https://github.com/vitessio/vitess/pull/13580) +### CI/Build +#### General + * [release-16.0] Upgrade the Golang version to `go1.20.4` [#13053](https://github.com/vitessio/vitess/pull/13053) +### Documentation +#### Documentation + * [release-16.0] update link for reparenting guide (#13350) [#13356](https://github.com/vitessio/vitess/pull/13356) +### Enhancement +#### Build/CI + * [release-16.0] Set the number of threads for release notes generation with a flag [#13316](https://github.com/vitessio/vitess/pull/13316) +### Performance +#### TabletManager + * [release-16.0] BaseShowTablesWithSizes: optimize MySQL 8.0 query (#13375) [#13389](https://github.com/vitessio/vitess/pull/13389) +### Release +#### Build/CI + * [release-16.0] Optimize release notes generation to use GitHub Milestones (#13398) [#13621](https://github.com/vitessio/vitess/pull/13621) +#### Documentation + * [release-16.0] Fix format error in the `v16.0.2` release notes (#13057) [#13058](https://github.com/vitessio/vitess/pull/13058) +### Testing +#### Backup and Restore + * [release-16.0]: Fix `upgrade-downgrade` test setup and fix the `init_db.sql` [#13525](https://github.com/vitessio/vitess/pull/13525) +#### Cluster management + * [release-16.0] Deflake `TestPlannedReparentShardPromoteReplicaFail` (#13548) [#13549](https://github.com/vitessio/vitess/pull/13549) + * [release-16.0] Flaky tests: Fix wrangler tests (#13568) [#13571](https://github.com/vitessio/vitess/pull/13571) +#### General + * TestFix: `Upgrade Downgrade Testing - Backups - Manual` [#13408](https://github.com/vitessio/vitess/pull/13408) +#### Query Serving + * [release-16.0] Fix benchmarks in `plan_test.go` (#13096) [#13126](https://github.com/vitessio/vitess/pull/13126) + * [release-16.0] Deflake `TestQueryTimeoutWithDual` test (#13405) [#13409](https://github.com/vitessio/vitess/pull/13409) + * [release-16.0] Fix `TestGatewayBufferingWhileReparenting` flakiness (#13469) [#13500](https://github.com/vitessio/vitess/pull/13500) + * [release-16.0] fix TestQueryTimeoutWithTables flaky test (#13579) [#13585](https://github.com/vitessio/vitess/pull/13585) +#### VTorc + * [release-16.0]: Fix flakiness in VTOrc tests (#13489) [#13528](https://github.com/vitessio/vitess/pull/13528) +#### vtctl + * Fix new vtctl upgrade downgrade test on `release-16.0` [#13252](https://github.com/vitessio/vitess/pull/13252) + diff --git a/changelog/16.0/16.0.3/release_notes.md b/changelog/16.0/16.0.3/release_notes.md new file mode 100644 index 00000000000..d377bdc24f9 --- /dev/null +++ b/changelog/16.0/16.0.3/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v16.0.3 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/16.0/16.0.3/changelog.md). + +The release includes 38 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @app/github-actions, @app/vitess-bot, @frouioui, @harshit-gangal, @shlomi-noach, @systay + diff --git a/changelog/16.0/16.0.3/summary.md b/changelog/16.0/16.0.3/summary.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/changelog/16.0/README.md b/changelog/16.0/README.md index 35e87974acb..9d843eddab4 100644 --- a/changelog/16.0/README.md +++ b/changelog/16.0/README.md @@ -1,5 +1,9 @@ ## v16.0 The dedicated team for this release can be found [here](team.md). +* **[16.0.3](16.0.3)** + * [Changelog](16.0.3/changelog.md) + * [Release Notes](16.0.3/release_notes.md) + * **[16.0.2](16.0.2)** * [Changelog](16.0.2/changelog.md) * [Release Notes](16.0.2/release_notes.md) diff --git a/docker/release.sh b/docker/release.sh index aae5c38e5c3..05b5d450303 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.3-SNAPSHOT' +vt_base_version='v16.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 29ceca7ff25..61c969808c1 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:v16.0.2 + image: vitess/lite:v16.0.3 ports: - "15000:$WEB_PORT" - "$GRPC_PORT" @@ -81,7 +81,7 @@ services: condition: service_healthy vtgate: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 ports: - "15099:$WEB_PORT" - "$GRPC_PORT" @@ -111,7 +111,7 @@ services: condition: service_healthy schemaload: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 command: - sh - -c @@ -144,12 +144,12 @@ services: environment: - KEYSPACES=$KEYSPACE - GRPC_PORT=15999 - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 volumes: - .:/script vttablet100: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 ports: - "15100:$WEB_PORT" - "$GRPC_PORT" @@ -181,7 +181,7 @@ services: retries: 15 vttablet101: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 ports: - "15101:$WEB_PORT" - "$GRPC_PORT" @@ -213,7 +213,7 @@ services: retries: 15 vttablet102: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 ports: - "15102:$WEB_PORT" - "$GRPC_PORT" @@ -245,7 +245,7 @@ services: retries: 15 vttablet103: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 ports: - "15103:$WEB_PORT" - "$GRPC_PORT" @@ -277,7 +277,7 @@ services: retries: 15 vtorc: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 command: ["sh", "-c", "/script/vtorc-up.sh"] depends_on: - vtctld @@ -307,7 +307,7 @@ services: retries: 15 vreplication: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 volumes: - ".:/script" environment: diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index a3e06959bae..79ce6a5c2b2 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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.0.3 volumes: - .:/script vtctld: @@ -143,7 +143,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 ports: - 15000:8080 - "15999" @@ -160,7 +160,7 @@ services: --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 ports: - 15099:8080 - "15999" @@ -182,7 +182,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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 c3c61ba9627..ee60402ce83 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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.0.3 volumes: - .:/script vtctld: @@ -159,7 +159,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 ports: - 15000:8080 - "15999" @@ -176,7 +176,7 @@ services: ''grpc-vtgateservice'' --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 ports: - 15099:8080 - "15999" @@ -199,7 +199,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.0.3 ports: - 15301:8080 - "15999" diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index b085319bca6..bb39f229f45 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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.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:v16.0.2 + image: vitess/lite:v16.0.3 ports: - "15000:%[1]d" - "%[2]d" @@ -696,7 +696,7 @@ func generateVtgate(opts vtOptions) string { - op: add path: /services/vtgate value: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 ports: - "15099:%[1]d" - "%[2]d" @@ -738,7 +738,7 @@ func generateVTOrc(dbInfo externalDbInfo, keyspaceInfoMap map[string]keyspaceInf - op: add path: /services/vtorc value: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 volumes: - ".:/script" environment: @@ -763,7 +763,7 @@ func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - op: add path: /services/vreplication value: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 volumes: - ".:/script" environment: @@ -791,7 +791,7 @@ func generateSetKeyspaceDurabilityPolicy( - op: add path: /services/set_keyspace_durability_policy_%[3]s value: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 volumes: - ".:/script" environment: @@ -828,7 +828,7 @@ func generateSchemaload( - op: add path: /services/schemaload_%[7]s value: - image: vitess/lite:v16.0.2 + image: vitess/lite:v16.0.3 volumes: - ".:/script" environment: diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index da2375ad2ec..a8957076ac6 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:v16.0.2 - vtadmin: vitess/vtadmin:v16.0.2 - vtgate: vitess/lite:v16.0.2 - vttablet: vitess/lite:v16.0.2 - vtbackup: vitess/lite:v16.0.2 - vtorc: vitess/lite:v16.0.2 + vtctld: vitess/lite:v16.0.3 + vtadmin: vitess/vtadmin:v16.0.3 + vtgate: vitess/lite:v16.0.3 + vttablet: vitess/lite:v16.0.3 + vtbackup: vitess/lite:v16.0.3 + vtorc: vitess/lite:v16.0.3 mysqld: - mysql80Compatible: vitess/lite:v16.0.2 + mysql80Compatible: vitess/lite:v16.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 6b367609ffb..80e8efd3322 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:v16.0.2 - vtadmin: vitess/vtadmin:v16.0.2 - vtgate: vitess/lite:v16.0.2 - vttablet: vitess/lite:v16.0.2 - vtbackup: vitess/lite:v16.0.2 - vtorc: vitess/lite:v16.0.2 + vtctld: vitess/lite:v16.0.3 + vtadmin: vitess/vtadmin:v16.0.3 + vtgate: vitess/lite:v16.0.3 + vttablet: vitess/lite:v16.0.3 + vtbackup: vitess/lite:v16.0.3 + vtorc: vitess/lite:v16.0.3 mysqld: - mysql80Compatible: vitess/lite:v16.0.2 + mysql80Compatible: vitess/lite:v16.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 5402f8a54a8..c18c7c5f8d8 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:v16.0.2 - vtadmin: vitess/vtadmin:v16.0.2 - vtgate: vitess/lite:v16.0.2 - vttablet: vitess/lite:v16.0.2 - vtbackup: vitess/lite:v16.0.2 - vtorc: vitess/lite:v16.0.2 + vtctld: vitess/lite:v16.0.3 + vtadmin: vitess/vtadmin:v16.0.3 + vtgate: vitess/lite:v16.0.3 + vttablet: vitess/lite:v16.0.3 + vtbackup: vitess/lite:v16.0.3 + vtorc: vitess/lite:v16.0.3 mysqld: - mysql80Compatible: vitess/lite:v16.0.2 + mysql80Compatible: vitess/lite:v16.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 37455dc11c7..0055de12012 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:v16.0.2 - vtadmin: vitess/vtadmin:v16.0.2 - vtgate: vitess/lite:v16.0.2 - vttablet: vitess/lite:v16.0.2 - vtbackup: vitess/lite:v16.0.2 - vtorc: vitess/lite:v16.0.2 + vtctld: vitess/lite:v16.0.3 + vtadmin: vitess/vtadmin:v16.0.3 + vtgate: vitess/lite:v16.0.3 + vttablet: vitess/lite:v16.0.3 + vtbackup: vitess/lite:v16.0.3 + vtorc: vitess/lite:v16.0.3 mysqld: - mysql80Compatible: vitess/lite:v16.0.2 + mysql80Compatible: vitess/lite:v16.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 7f211db50a1..e782a162e5b 100644 --- a/examples/operator/operator.yaml +++ b/examples/operator/operator.yaml @@ -6145,7 +6145,7 @@ spec: fieldPath: metadata.name - name: OPERATOR_NAME value: vitess-operator - image: planetscale/vitess-operator:v2.9.2 + image: planetscale/vitess-operator:v2.9.3 name: vitess-operator resources: limits: diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index e6fc057fe94..f90d3e11798 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 = "16.0.3-SNAPSHOT" +const versionName = "16.0.3" diff --git a/java/client/pom.xml b/java/client/pom.xml index b50af98b563..1514035938d 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.3-SNAPSHOT + 16.0.3 vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 43059d2cfec..668f9d79752 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.3-SNAPSHOT + 16.0.3 vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 575ffbaf6bf..d365b602bd5 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.3-SNAPSHOT + 16.0.3 vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 9d827bc84f8..3848db66249 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.3-SNAPSHOT + 16.0.3 vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 87aef5d1522..ef4363adb45 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.3-SNAPSHOT + 16.0.3 pom Vitess Java Client libraries [Parent] From 0904ef0672185c2179880d14f7ba4e47c744b3e0 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 28 Jul 2023 20:49:16 +0530 Subject: [PATCH 155/233] Back to dev mode after v16.0.3 (#13660) --- 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 05b5d450303..50aa878c178 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.3' +vt_base_version='v16.0.4-SNAPSHOT' debian_versions='buster bullseye' default_debian_version='bullseye' diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index f90d3e11798..ce425a780fa 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 = "16.0.3" +const versionName = "16.0.4-SNAPSHOT" diff --git a/java/client/pom.xml b/java/client/pom.xml index 1514035938d..67dfbcea098 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.3 + 16.0.4-SNAPSHOT vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 668f9d79752..3c3b8afcc32 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.3 + 16.0.4-SNAPSHOT vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index d365b602bd5..fcbc6424327 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.3 + 16.0.4-SNAPSHOT vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 3848db66249..fe1579b86f3 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.3 + 16.0.4-SNAPSHOT vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index ef4363adb45..a8e0f0a53e6 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.3 + 16.0.4-SNAPSHOT pom Vitess Java Client libraries [Parent] From effe3928c6713b8cba46af8038bb76988333a198 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Mon, 7 Aug 2023 14:48:02 +0300 Subject: [PATCH 156/233] v16 backport: Solve RevertMigration.Comment read/write concurrency issue (#13736) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/schema/online_ddl.go | 5 +++++ go/vt/sqlparser/ast_test.go | 29 ++++++++++++++++++++++++++++ go/vt/sqlparser/comments.go | 9 +++++++++ go/vt/vttablet/onlineddl/executor.go | 2 +- 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/go/vt/schema/online_ddl.go b/go/vt/schema/online_ddl.go index 7141d9ec71b..3565680e108 100644 --- a/go/vt/schema/online_ddl.go +++ b/go/vt/schema/online_ddl.go @@ -274,6 +274,11 @@ func OnlineDDLFromCommentedStatement(stmt sqlparser.Statement) (onlineDDL *Onlin default: return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unsupported statement for Online DDL: %v", sqlparser.String(stmt)) } + // We clone the comments because they will end up being cached by the query planner. Then, the Directive() function actually modifies the comments. + // If comments are shared in cache, and Directive() modifies it, then we have a concurrency issue when someone else wants to read the comments. + // By cloning the comments we remove the concurrency problem. + comments = sqlparser.CloneRefOfParsedComments(comments) + comments.ResetDirectives() if comments.Length() == 0 { return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "no comments found in statement: %v", sqlparser.String(stmt)) diff --git a/go/vt/sqlparser/ast_test.go b/go/vt/sqlparser/ast_test.go index 3c518ee7886..0d6841755c8 100644 --- a/go/vt/sqlparser/ast_test.go +++ b/go/vt/sqlparser/ast_test.go @@ -821,3 +821,32 @@ func BenchmarkStringTraces(b *testing.B) { }) } } + +func TestCloneComments(t *testing.T) { + c := []string{"/*vt+ a=b */"} + parsedComments := Comments(c).Parsed() + directives := parsedComments.Directives() + { + assert.NotEmpty(t, directives.m) + val, ok := directives.m["a"] + assert.Truef(t, ok, "directives map: %v", directives.m) + assert.Equal(t, "b", val) + } + cloned := CloneRefOfParsedComments(parsedComments) + cloned.ResetDirectives() + clonedDirectives := cloned.Directives() + { + assert.NotEmpty(t, clonedDirectives.m) + val, ok := clonedDirectives.m["a"] + assert.Truef(t, ok, "directives map: %v", directives.m) + assert.Equal(t, "b", val) + } + { + delete(directives.m, "a") + assert.Empty(t, directives.m) + + val, ok := clonedDirectives.m["a"] + assert.Truef(t, ok, "directives map: %v", directives.m) + assert.Equal(t, "b", val) + } +} diff --git a/go/vt/sqlparser/comments.go b/go/vt/sqlparser/comments.go index 7e17e58e66b..6466c4facfd 100644 --- a/go/vt/sqlparser/comments.go +++ b/go/vt/sqlparser/comments.go @@ -210,6 +210,15 @@ type CommentDirectives struct { m map[string]string } +// ResetDirectives sets the _directives member to `nil`, which means the next call to Directives() +// will re-evaluate it. +func (c *ParsedComments) ResetDirectives() { + if c == nil { + return + } + c._directives = nil +} + // Directives parses the comment list for any execution directives // of the form: // diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index e8410ea8e16..f4da7d6fae5 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -2844,7 +2844,7 @@ func (e *Executor) executeAlterViewOnline(ctx context.Context, onlineDDL *schema Select: viewStmt.Select, CheckOption: viewStmt.CheckOption, IsReplace: true, - Comments: viewStmt.Comments, + Comments: sqlparser.CloneRefOfParsedComments(viewStmt.Comments), } stmt.SetTable("", artifactViewName) default: From 4a810e41c7ff6c17d49c39f0e49b1ac31304e4a3 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Tue, 8 Aug 2023 10:14:46 +0300 Subject: [PATCH 157/233] v16 backport: Fix closed channel panic in Online DDL cutover (#13732) --- go/vt/vttablet/onlineddl/executor.go | 1 + 1 file changed, 1 insertion(+) diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index f4da7d6fae5..413b5f012ee 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -921,6 +921,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream) er e.updateMigrationStage(ctx, onlineDDL.UUID, "renaming tables") go func() { + defer close(renameCompleteChan) _, err := renameConn.Exec(ctx, renameQuery.Query, 1, false) renameCompleteChan <- err }() From fb298a40a59c3e2bdb442d8742e4b1ca5ae7d572 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 10 Aug 2023 15:24:34 +0530 Subject: [PATCH 158/233] [release-16.0] CI: fix onlineddl_scheduler flakiness (#13754) (#13759) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- .../scheduler/onlineddl_scheduler_test.go | 55 ++++++++++++++----- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go index 875ac646d2c..2911fbb80b2 100644 --- a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go +++ b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go @@ -166,6 +166,31 @@ func TestParseTableName(t *testing.T) { } } +func waitForReadyToComplete(t *testing.T, uuid string, expected bool) { + ctx, cancel := context.WithTimeout(context.Background(), normalWaitTime) + defer cancel() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + for { + + rs := onlineddl.ReadMigrations(t, &vtParams, uuid) + require.NotNil(t, rs) + for _, row := range rs.Named().Rows { + readyToComplete := row.AsInt64("ready_to_complete", 0) + if expected == (readyToComplete > 0) { + // all good. This is what we waited for + return + } + } + select { + case <-ticker.C: + case <-ctx.Done(): + } + require.NoError(t, ctx.Err()) + } +} + func TestMain(m *testing.M) { defer cluster.PanicHandler(nil) flag.Parse() @@ -553,6 +578,12 @@ func testScheduler(t *testing.T) { onlineddl.CheckMigrationStatus(t, &vtParams, shards, t1uuid, schema.OnlineDDLStatusRunning) onlineddl.CheckMigrationStatus(t, &vtParams, shards, t2uuid, schema.OnlineDDLStatusQueued, schema.OnlineDDLStatusReady) }) + + t.Run("check ready to complete (before)", func(t *testing.T) { + for _, uuid := range []string{t1uuid, t2uuid} { + waitForReadyToComplete(t, uuid, false) + } + }) t.Run("unthrottle, expect t2 running", func(t *testing.T) { onlineddl.UnthrottleAllMigrations(t, &vtParams) // t1 should now be ready_to_complete, hence t2 should start running @@ -580,11 +611,17 @@ func testScheduler(t *testing.T) { fmt.Printf("# Migration status (for debug purposes): <%s>\n", status) onlineddl.CheckMigrationStatus(t, &vtParams, shards, t1uuid, schema.OnlineDDLStatusComplete) }) + t.Run("check ready to complete (after)", func(t *testing.T) { + for _, uuid := range []string{t1uuid, t2uuid} { + waitForReadyToComplete(t, uuid, true) + } + }) + testTableCompletionTimes(t, t2uuid, t1uuid) }) t.Run("REVERT both tables concurrent, postponed", func(t *testing.T) { - t1uuid = testRevertMigration(t, createRevertParams(t1uuid, ddlStrategy+" -allow-concurrent -postpone-completion", "vtgate", "", true)) - t2uuid = testRevertMigration(t, createRevertParams(t2uuid, ddlStrategy+" -allow-concurrent -postpone-completion", "vtgate", "", true)) + t1uuid = testRevertMigration(t, createRevertParams(t1uuid, ddlStrategy+" --allow-concurrent --postpone-completion", "vtgate", "", true)) + t2uuid = testRevertMigration(t, createRevertParams(t2uuid, ddlStrategy+" --allow-concurrent --postpone-completion", "vtgate", "", true)) testAllowConcurrent(t, "t1", t1uuid, 1) t.Run("expect both migrations to run", func(t *testing.T) { @@ -592,12 +629,7 @@ func testScheduler(t *testing.T) { onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t2uuid, normalWaitTime, schema.OnlineDDLStatusRunning) }) t.Run("test ready-to-complete", func(t *testing.T) { - rs := onlineddl.ReadMigrations(t, &vtParams, t1uuid) - require.NotNil(t, rs) - for _, row := range rs.Named().Rows { - readyToComplete := row.AsInt64("ready_to_complete", 0) - assert.Equal(t, int64(1), readyToComplete) - } + waitForReadyToComplete(t, t1uuid, true) }) t.Run("complete t2", func(t *testing.T) { // now that both are running, let's unblock t2. We expect it to complete. @@ -735,12 +767,7 @@ func testScheduler(t *testing.T) { onlineddl.CheckMigrationStatus(t, &vtParams, shards, drop1uuid, schema.OnlineDDLStatusReady) }) t.Run("t3 ready to complete", func(t *testing.T) { - rs := onlineddl.ReadMigrations(t, &vtParams, drop1uuid) - require.NotNil(t, rs) - for _, row := range rs.Named().Rows { - readyToComplete := row.AsInt64("ready_to_complete", 0) - assert.Equal(t, int64(1), readyToComplete) - } + waitForReadyToComplete(t, drop1uuid, true) }) t.Run("t3drop complete", func(t *testing.T) { // drop3 migration should not block. It can run concurrently to t1, and does not conflict From 630728f1dd6d7b5593c543977a7f858eb1dcdd51 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Thu, 10 Aug 2023 17:31:06 +0200 Subject: [PATCH 159/233] Manual cherry-pick of 13339 (#13733) Signed-off-by: Rohit Nayak --- .../endtoend/backup/vtctlbackup/backup_utils.go | 15 ++++++++++++++- go/vt/vttablet/tabletmanager/restore.go | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/go/test/endtoend/backup/vtctlbackup/backup_utils.go b/go/test/endtoend/backup/vtctlbackup/backup_utils.go index cf264c612cf..dc785ed992d 100644 --- a/go/test/endtoend/backup/vtctlbackup/backup_utils.go +++ b/go/test/endtoend/backup/vtctlbackup/backup_utils.go @@ -446,7 +446,7 @@ func primaryBackup(t *testing.T) { // Restore the older/first backup -- using the timestamp we saved -- on the original primary tablet (primary) err = localCluster.VtctlclientProcess.ExecuteCommand("RestoreFromBackup", "--", "--backup_timestamp", firstBackupTimestamp, primary.Alias) require.Nil(t, err) - + verifyRestorePositionAndTimeStats(t, primary.VttabletProcess.GetVars()) // Re-init the shard -- making the original primary tablet (primary) primary again -- for subsequent tests err = localCluster.VtctlclientProcess.InitShardPrimary(keyspaceName, shardName, cell, primary.TabletUID) require.Nil(t, err) @@ -1048,3 +1048,16 @@ func TestReplicaRestoreToPos(t *testing.T, restoreToPos mysql.Position, expectEr } require.NoErrorf(t, err, "output: %v", output) } + +func verifyRestorePositionAndTimeStats(t *testing.T, vars map[string]any) { + require.Contains(t, vars, "RestoredBackupTime") + backupTime := vars["RestoredBackupTime"].(string) + require.NotEqual(t, "", backupTime) + + require.Contains(t, vars, "RestorePosition") + backupPosition := vars["RestorePosition"].(string) + require.NotEqual(t, "", backupPosition) + rp, err := mysql.DecodePosition(backupPosition) + require.NoError(t, err) + require.False(t, rp.IsZero()) +} diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index 2c6cb3b82dc..a784bfcc658 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -22,6 +22,8 @@ import ( "io" "time" + "vitess.io/vitess/go/stats" + "github.com/spf13/pflag" "vitess.io/vitess/go/mysql" @@ -52,8 +54,16 @@ var ( restoreFromBackupTsStr string restoreConcurrency = 4 waitForBackupInterval time.Duration + + statsRestoredBackupTime *stats.String + statsRestoreBackupPosition *stats.String ) +func init() { + statsRestoredBackupTime = stats.NewString("RestoredBackupTime") + statsRestoreBackupPosition = stats.NewString("RestorePosition") +} + func registerRestoreFlags(fs *pflag.FlagSet) { fs.BoolVar(&restoreFromBackup, "restore_from_backup", restoreFromBackup, "(init restore parameter) will check BackupStorage for a recent backup at startup and start there") fs.StringVar(&restoreFromBackupTsStr, "restore_from_backup_ts", restoreFromBackupTsStr, "(init restore parameter) if set, restore the latest backup taken at or before this timestamp. Example: '2021-04-29.133050'") @@ -225,6 +235,11 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L var backupManifest *mysqlctl.BackupManifest for { backupManifest, err = mysqlctl.Restore(ctx, params) + if backupManifest != nil { + statsRestoreBackupPosition.Set(mysql.EncodePosition(backupManifest.Position)) + statsRestoredBackupTime.Set(backupManifest.BackupTime) + } + params.Logger.Infof("Restore: got a restore manifest: %v, err=%v, waitForBackupInterval=%v", backupManifest, err, waitForBackupInterval) if waitForBackupInterval == 0 { break From 75fdcaa14db8e21f924c63e238cb80cb1eba0118 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Sun, 13 Aug 2023 21:29:00 +0200 Subject: [PATCH 160/233] [release-16.0] Address vttablet memory usage with backups to Azure Blob Service (#13770) (#13774) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/flags/endtoend/vtbackup.txt | 1 + go/flags/endtoend/vtctld.txt | 1 + go/flags/endtoend/vttablet.txt | 1 + go/vt/mysqlctl/azblobbackupstorage/azblob.go | 4 +++- 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/go/flags/endtoend/vtbackup.txt b/go/flags/endtoend/vtbackup.txt index 98dc99c0e17..f9602cbc20d 100644 --- a/go/flags/endtoend/vtbackup.txt +++ b/go/flags/endtoend/vtbackup.txt @@ -3,6 +3,7 @@ Usage of vtbackup: --alsologtostderr log to standard error as well as files --azblob_backup_account_key_file string Path to a file containing the Azure Storage account key; if this flag is unset, the environment variable VT_AZBLOB_ACCOUNT_KEY will be used as the key itself (NOT a file path). --azblob_backup_account_name string Azure Storage Account name for backups; if this flag is unset, the environment variable VT_AZBLOB_ACCOUNT_NAME will be used. + --azblob_backup_buffer_size int The memory buffer size to use in bytes, per file or stripe, when streaming to Azure Blob Service. (default 104857600) --azblob_backup_container_name string Azure Blob Container Name. --azblob_backup_parallelism int Azure Blob operation parallelism (requires extra memory when increased). (default 1) --azblob_backup_storage_root string Root prefix for all backup-related Azure Blobs; this should exclude both initial and trailing '/' (e.g. just 'a/b' not '/a/b/'). diff --git a/go/flags/endtoend/vtctld.txt b/go/flags/endtoend/vtctld.txt index 0c165a66a5a..a252a7f1ff8 100644 --- a/go/flags/endtoend/vtctld.txt +++ b/go/flags/endtoend/vtctld.txt @@ -3,6 +3,7 @@ Usage of vtctld: --alsologtostderr log to standard error as well as files --azblob_backup_account_key_file string Path to a file containing the Azure Storage account key; if this flag is unset, the environment variable VT_AZBLOB_ACCOUNT_KEY will be used as the key itself (NOT a file path). --azblob_backup_account_name string Azure Storage Account name for backups; if this flag is unset, the environment variable VT_AZBLOB_ACCOUNT_NAME will be used. + --azblob_backup_buffer_size int The memory buffer size to use in bytes, per file or stripe, when streaming to Azure Blob Service. (default 104857600) --azblob_backup_container_name string Azure Blob Container Name. --azblob_backup_parallelism int Azure Blob operation parallelism (requires extra memory when increased). (default 1) --azblob_backup_storage_root string Root prefix for all backup-related Azure Blobs; this should exclude both initial and trailing '/' (e.g. just 'a/b' not '/a/b/'). diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index 32160387009..9902b4b2076 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -4,6 +4,7 @@ Usage of vttablet: --app_pool_size int Size of the connection pool for app connections (default 40) --azblob_backup_account_key_file string Path to a file containing the Azure Storage account key; if this flag is unset, the environment variable VT_AZBLOB_ACCOUNT_KEY will be used as the key itself (NOT a file path). --azblob_backup_account_name string Azure Storage Account name for backups; if this flag is unset, the environment variable VT_AZBLOB_ACCOUNT_NAME will be used. + --azblob_backup_buffer_size int The memory buffer size to use in bytes, per file or stripe, when streaming to Azure Blob Service. (default 104857600) --azblob_backup_container_name string Azure Blob Container Name. --azblob_backup_parallelism int Azure Blob operation parallelism (requires extra memory when increased). (default 1) --azblob_backup_storage_root string Root prefix for all backup-related Azure Blobs; this should exclude both initial and trailing '/' (e.g. just 'a/b' not '/a/b/'). diff --git a/go/vt/mysqlctl/azblobbackupstorage/azblob.go b/go/vt/mysqlctl/azblobbackupstorage/azblob.go index 660abcc5008..144b9435437 100644 --- a/go/vt/mysqlctl/azblobbackupstorage/azblob.go +++ b/go/vt/mysqlctl/azblobbackupstorage/azblob.go @@ -52,6 +52,7 @@ var ( storageRoot string azBlobParallelism int + azBlobBufferSize = 100 << (10 * 2) // 100 MiB ) func registerFlags(fs *pflag.FlagSet) { @@ -59,6 +60,7 @@ func registerFlags(fs *pflag.FlagSet) { fs.StringVar(&accountKeyFile, "azblob_backup_account_key_file", "", "Path to a file containing the Azure Storage account key; if this flag is unset, the environment variable VT_AZBLOB_ACCOUNT_KEY will be used as the key itself (NOT a file path).") fs.StringVar(&containerName, "azblob_backup_container_name", "", "Azure Blob Container Name.") fs.StringVar(&storageRoot, "azblob_backup_storage_root", "", "Root prefix for all backup-related Azure Blobs; this should exclude both initial and trailing '/' (e.g. just 'a/b' not '/a/b/').") + fs.IntVar(&azBlobBufferSize, "azblob_backup_buffer_size", azBlobBufferSize, "The memory buffer size to use in bytes, per file or stripe, when streaming to Azure Blob Service.") fs.IntVar(&azBlobParallelism, "azblob_backup_parallelism", 1, "Azure Blob operation parallelism (requires extra memory when increased).") } @@ -218,7 +220,7 @@ func (bh *AZBlobBackupHandle) AddFile(ctx context.Context, filename string, file go func() { defer bh.waitGroup.Done() _, err := azblob.UploadStreamToBlockBlob(bh.ctx, reader, blockBlobURL, azblob.UploadStreamToBlockBlobOptions{ - BufferSize: azblob.BlockBlobMaxStageBlockBytes, + BufferSize: azBlobBufferSize, MaxBuffers: azBlobParallelism, }) if err != nil { From 86a714e54d1025160341161b95b4bc6c0fb9dafd Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Mon, 14 Aug 2023 11:32:00 +0200 Subject: [PATCH 161/233] planbuilder: Fix infinite recursion for subqueries (#13783) Signed-off-by: Dirkjan Bussink --- go/vt/vtgate/planbuilder/rewrite.go | 2 ++ .../testdata/info_schema80_cases.json | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/go/vt/vtgate/planbuilder/rewrite.go b/go/vt/vtgate/planbuilder/rewrite.go index 93df3ba63c3..73f5ca43c82 100644 --- a/go/vt/vtgate/planbuilder/rewrite.go +++ b/go/vt/vtgate/planbuilder/rewrite.go @@ -88,6 +88,8 @@ func (r *rewriter) rewriteDown(cursor *sqlparser.Cursor) bool { // replace the table name with the original table tableName.Name = vindexTable.Name node.Expr = tableName + case *sqlparser.ExtractedSubquery: + return false case *sqlparser.Subquery: err := rewriteSubquery(cursor, r, node) if err != nil { diff --git a/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json b/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json index 5faea3ef96f..fbae05c2d61 100644 --- a/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json @@ -1693,5 +1693,24 @@ "Table": "information_schema.apa" } } + }, + { + "comment": "mysqldump query", + "query": "SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE ENGINE = 'ndbcluster' AND FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE ENGINE = 'ndbcluster' AND FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('commerce'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME", + "plan": { + "QueryType": "SELECT", + "Original": "SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE ENGINE = 'ndbcluster' AND FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE ENGINE = 'ndbcluster' AND FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('commerce'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, `ENGINE`, EXTRA from INFORMATION_SCHEMA.FILES where 1 != 1 group by LOGFILE_GROUP_NAME, FILE_NAME, `ENGINE`, TOTAL_EXTENTS, INITIAL_SIZE", + "Query": "select LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, `ENGINE`, EXTRA from INFORMATION_SCHEMA.FILES where `ENGINE` = 'ndbcluster' and FILE_TYPE = 'UNDO LOG' and FILE_NAME is not null and LOGFILE_GROUP_NAME is not null and LOGFILE_GROUP_NAME in (select distinct LOGFILE_GROUP_NAME from INFORMATION_SCHEMA.FILES where `ENGINE` = 'ndbcluster' and FILE_TYPE = 'DATAFILE' and TABLESPACE_NAME in (select distinct TABLESPACE_NAME from INFORMATION_SCHEMA.`PARTITIONS` where TABLE_SCHEMA in ('commerce'))) group by LOGFILE_GROUP_NAME, FILE_NAME, `ENGINE`, TOTAL_EXTENTS, INITIAL_SIZE order by LOGFILE_GROUP_NAME asc", + "Table": "INFORMATION_SCHEMA.FILES" + } + } } ] From 31b76acc37535e11ca478bb3d29d1117c7880576 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 16 Aug 2023 11:14:58 -0400 Subject: [PATCH 162/233] [release-16.0] Flakes: Delete VTDATAROOT files in reparent test teardown within CI (#13793) (#13797) Signed-off-by: Matt Lord Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- go/test/endtoend/reparent/utils/utils.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index 1b169d6c0ac..8bab1fe4c0c 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -75,9 +75,25 @@ func SetupRangeBasedCluster(ctx context.Context, t *testing.T) *cluster.LocalPro return setupCluster(ctx, t, ShardName, []string{cell1}, []int{2}, "semi_sync") } -// TeardownCluster is used to teardown the reparent cluster +// TeardownCluster is used to teardown the reparent cluster. When +// run in a CI environment -- which is considered true when the +// "CI" env variable is set to "true" -- the teardown also removes +// the VTDATAROOT directory that was used for the test/cluster. func TeardownCluster(clusterInstance *cluster.LocalProcessCluster) { + usedRoot := clusterInstance.CurrentVTDATAROOT clusterInstance.Teardown() + // This is always set to "true" on GitHub Actions runners: + // https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables + ci, ok := os.LookupEnv("CI") + if !ok || strings.ToLower(ci) != "true" { + // Leave the directory in place to support local debugging. + return + } + // We're running in the CI, so free up disk space for any + // subsequent tests. + if err := os.RemoveAll(usedRoot); err != nil { + log.Errorf("Failed to remove previously used VTDATAROOT (%s): %v", usedRoot, err) + } } func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []string, numTablets []int, durability string) *cluster.LocalProcessCluster { From 1a1250c93f809c19790030f1f2214fb301004fbf Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 17 Aug 2023 10:47:51 +0530 Subject: [PATCH 163/233] [release-16.0] vtgate: fix race condition iterating tables and views from schema tracker (#13673) (#13795) Signed-off-by: Matt Lord Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Matt Lord --- go/vt/vtgate/schema/tracker.go | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/go/vt/vtgate/schema/tracker.go b/go/vt/vtgate/schema/tracker.go index a75a583ae11..fe4fd947c56 100644 --- a/go/vt/vtgate/schema/tracker.go +++ b/go/vt/vtgate/schema/tracker.go @@ -21,21 +21,20 @@ import ( "sync" "time" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" - "vitess.io/vitess/go/vt/vterrors" - - "vitess.io/vitess/go/vt/callerid" - - "vitess.io/vitess/go/vt/vttablet/queryservice" + "golang.org/x/exp/maps" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" - querypb "vitess.io/vitess/go/vt/proto/query" - + "vitess.io/vitess/go/vt/callerid" "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/vindexes" + "vitess.io/vitess/go/vt/vttablet/queryservice" + + querypb "vitess.io/vitess/go/vt/proto/query" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) type ( @@ -228,7 +227,7 @@ func (t *Tracker) Tables(ks string) map[string][]vindexes.Column { return map[string][]vindexes.Column{} // we know nothing about this KS, so that is the info we can give out } - return m + return maps.Clone(m) } // Views returns all known views in the keyspace with their definition. @@ -239,7 +238,9 @@ func (t *Tracker) Views(ks string) map[string]sqlparser.SelectStatement { if t.views == nil { return nil } - return t.views.m[ks] + + m := t.views.m[ks] + return maps.Clone(m) } func (t *Tracker) updateSchema(th *discovery.TabletHealth) bool { From c4efce055451137dce99d212d42af6375d7e96ad Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 17 Aug 2023 19:01:34 +0530 Subject: [PATCH 164/233] Release 16.0 code freeze for `v16.0.3` release (#13810) Signed-off-by: Manan Gupta --- .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 efe1d6e8856..1bb74feee50 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 bafc21d6d04b299faac98289c11a243f24af984e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Taylor?= Date: Fri, 18 Aug 2023 11:02:33 +0200 Subject: [PATCH 165/233] [16.0] bugfixes: collection of fixes to bugs found while fuzzing (#13805) Signed-off-by: Andres Taylor Signed-off-by: Manan Gupta Co-authored-by: Manan Gupta --- .../queries/aggregation/aggregation_test.go | 14 +++- .../endtoend/vtgate/queries/misc/misc_test.go | 10 +++ go/vt/vtgate/engine/filter.go | 7 +- go/vt/vtgate/evalengine/eval_result.go | 4 + go/vt/vtgate/planbuilder/operators/joins.go | 2 +- .../planbuilder/testdata/from_cases.json | 78 +++++++++++++++++++ 6 files changed, 108 insertions(+), 7 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go index db29644988e..13a5d628725 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", "t10"} for _, table := range tables { _, _ = mcmp.ExecAndIgnore("delete from " + table) } @@ -438,3 +438,15 @@ func TestAggregationRandomOnAnAggregatedValue(t *testing.T) { 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 t10 where a = 100) A;", `[[DECIMAL(100) DECIMAL(10) DECIMAL(10.0000)]]`) } + +func TestBuggyQueries(t *testing.T) { + // These queries have been found to be producing the wrong results by the query fuzzer + // Adding them as end2end tests to make sure we never get them wrong again + mcmp, closer := start(t) + defer closer() + + mcmp.Exec("insert into t10(k, a, b) values (0, 100, 10), (10, 200, 20), (20, null, null)") + + mcmp.AssertMatches("select /*vt+ PLANNER=Gen4 */ sum(t1.a) from t10 as t1, t10 as t2", + `[[DECIMAL(900)]]`) +} diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index 2c8aece59fb..14448989956 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -230,3 +230,13 @@ func TestHighNumberOfParams(t *testing.T) { } require.Equal(t, 5, count) } + +func TestBuggyOuterJoin(t *testing.T) { + // We found a couple of inconsistencies around outer joins, adding these tests to stop regressions + mcmp, closer := start(t) + defer closer() + + mcmp.Exec("insert into t1(id1, id2) values (1,2), (42,5), (5, 42)") + + mcmp.Exec("select t1.id1, t2.id1 from t1 left join t1 as t2 on t2.id1 = t2.id2") +} diff --git a/go/vt/vtgate/engine/filter.go b/go/vt/vtgate/engine/filter.go index f36467a7526..fb696a9d679 100644 --- a/go/vt/vtgate/engine/filter.go +++ b/go/vt/vtgate/engine/filter.go @@ -68,11 +68,8 @@ func (f *Filter) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[s if err != nil { return nil, err } - intEvalResult, err := evalResult.Value().ToInt64() - if err != nil { - return nil, err - } - if intEvalResult == 1 { + + if evalResult.ToBoolean() { rows = append(rows, row) } } diff --git a/go/vt/vtgate/evalengine/eval_result.go b/go/vt/vtgate/evalengine/eval_result.go index 2f2de033fdc..1971fdc39c2 100644 --- a/go/vt/vtgate/evalengine/eval_result.go +++ b/go/vt/vtgate/evalengine/eval_result.go @@ -309,6 +309,10 @@ func (er *EvalResult) isTextual() bool { return sqltypes.IsText(tt) || sqltypes.IsBinary(tt) } +func (er *EvalResult) ToBoolean() bool { + return er.isTruthy() == boolTrue +} + func (er *EvalResult) isTruthy() boolean { if er.isNull() { return boolNULL diff --git a/go/vt/vtgate/planbuilder/operators/joins.go b/go/vt/vtgate/planbuilder/operators/joins.go index a91f6b43ffc..2764ad7f735 100644 --- a/go/vt/vtgate/planbuilder/operators/joins.go +++ b/go/vt/vtgate/planbuilder/operators/joins.go @@ -48,7 +48,7 @@ func AddPredicate(join JoinOp, ctx *plancontext.PlanningContext, expr sqlparser. case deps.IsSolvedBy(TableID(join.GetRHS())): // if we are dealing with an outer join, always start by checking if this predicate can turn // the join into an inner join - if !join.IsInner() && canConvertToInner(ctx, expr, TableID(join.GetRHS())) { + if !joinPredicates && !join.IsInner() && canConvertToInner(ctx, expr, TableID(join.GetRHS())) { join.MakeInner() } diff --git a/go/vt/vtgate/planbuilder/testdata/from_cases.json b/go/vt/vtgate/planbuilder/testdata/from_cases.json index 8315a60e013..5687c950bdc 100644 --- a/go/vt/vtgate/planbuilder/testdata/from_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/from_cases.json @@ -6421,5 +6421,83 @@ "query": "select missing_column from unsharded, unsharded_tab", "v3-plan": "VT03019: symbol missing_column not found", "gen4-plan": "Column 'missing_column' in field list is ambiguous" + }, + { + "comment": "join predicate only depending on the RHS should not turn outer join into inner join", + "query": "select t1.id1, t2.id1 from t1 left join t1 as t2 on t2.id1 = t2.id2", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select t1.id1, t2.id1 from t1 left join t1 as t2 on t2.id1 = t2.id2", + "Instructions": { + "OperatorType": "Join", + "Variant": "LeftJoin", + "JoinColumnIndexes": "L:0,R:0", + "TableName": "t1_t1", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "zlookup_unique", + "Sharded": true + }, + "FieldQuery": "select t1.id1 from t1 where 1 != 1", + "Query": "select t1.id1 from t1", + "Table": "t1" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "zlookup_unique", + "Sharded": true + }, + "FieldQuery": "select t2.id1 from t1 as t2 where 1 != 1", + "Query": "select t2.id1 from t1 as t2 where t2.id1 = t2.id2", + "Table": "t1" + } + ] + }, + "TablesUsed": [ + "zlookup_unique.t1" + ] + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select t1.id1, t2.id1 from t1 left join t1 as t2 on t2.id1 = t2.id2", + "Instructions": { + "OperatorType": "Join", + "Variant": "LeftJoin", + "JoinColumnIndexes": "L:0,R:0", + "TableName": "t1_t1", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "zlookup_unique", + "Sharded": true + }, + "FieldQuery": "select t1.id1 from t1 where 1 != 1", + "Query": "select t1.id1 from t1", + "Table": "t1" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "zlookup_unique", + "Sharded": true + }, + "FieldQuery": "select t2.id1 from t1 as t2 where 1 != 1", + "Query": "select t2.id1 from t1 as t2 where t2.id1 = t2.id2", + "Table": "t1" + } + ] + }, + "TablesUsed": [ + "zlookup_unique.t1" + ] + } } ] From 87ea735673ede27d438dce2edfce5a7b1104285a Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 18 Aug 2023 18:05:23 +0530 Subject: [PATCH 166/233] Release of v16.0.4 (#13808) Signed-off-by: Manan Gupta --- .github/workflows/code_freeze.yml | 2 +- changelog/16.0/16.0.4/changelog.md | 24 +++++++++++++++++ changelog/16.0/16.0.4/release_notes.md | 7 +++++ changelog/16.0/16.0.4/summary.md | 0 changelog/16.0/README.md | 4 +++ 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 | 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 +- 21 files changed, 117 insertions(+), 82 deletions(-) create mode 100644 changelog/16.0/16.0.4/changelog.md create mode 100644 changelog/16.0/16.0.4/release_notes.md create mode 100644 changelog/16.0/16.0.4/summary.md diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 1bb74feee50..efe1d6e8856 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/16.0/16.0.4/changelog.md b/changelog/16.0/16.0.4/changelog.md new file mode 100644 index 00000000000..45c4944aa25 --- /dev/null +++ b/changelog/16.0/16.0.4/changelog.md @@ -0,0 +1,24 @@ +# Changelog of Vitess v16.0.4 + +### Bug fixes +#### Backup and Restore + * Manual cherry-pick of 13339 [#13733](https://github.com/vitessio/vitess/pull/13733) + * [release-16.0] Address vttablet memory usage with backups to Azure Blob Service (#13770) [#13774](https://github.com/vitessio/vitess/pull/13774) +#### Online DDL + * v16 backport: Fix closed channel panic in Online DDL cutover [#13732](https://github.com/vitessio/vitess/pull/13732) + * v16 backport: Solve RevertMigration.Comment read/write concurrency issue [#13736](https://github.com/vitessio/vitess/pull/13736) +#### Query Serving + * planbuilder: Fix infinite recursion for subqueries [#13783](https://github.com/vitessio/vitess/pull/13783) + * [release-16.0] vtgate: fix race condition iterating tables and views from schema tracker (#13673) [#13795](https://github.com/vitessio/vitess/pull/13795) + * [16.0] bugfixes: collection of fixes to bugs found while fuzzing [#13805](https://github.com/vitessio/vitess/pull/13805) +### CI/Build +#### Online DDL + * [release-16.0] CI: fix onlineddl_scheduler flakiness (#13754) [#13759](https://github.com/vitessio/vitess/pull/13759) +### Release +#### General + * Back to dev mode after v16.0.3 [#13660](https://github.com/vitessio/vitess/pull/13660) + * Release 16.0 code freeze for `v16.0.3` release [#13810](https://github.com/vitessio/vitess/pull/13810) +### Testing +#### Build/CI + * [release-16.0] Flakes: Delete VTDATAROOT files in reparent test teardown within CI (#13793) [#13797](https://github.com/vitessio/vitess/pull/13797) + diff --git a/changelog/16.0/16.0.4/release_notes.md b/changelog/16.0/16.0.4/release_notes.md new file mode 100644 index 00000000000..d46559f5fec --- /dev/null +++ b/changelog/16.0/16.0.4/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v16.0.4 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/16.0/16.0.4/changelog.md). + +The release includes 11 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @app/vitess-bot, @dbussink, @rohit-nayak-ps, @shlomi-noach, @systay + diff --git a/changelog/16.0/16.0.4/summary.md b/changelog/16.0/16.0.4/summary.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/changelog/16.0/README.md b/changelog/16.0/README.md index 9d843eddab4..75b3f3a0a1f 100644 --- a/changelog/16.0/README.md +++ b/changelog/16.0/README.md @@ -1,5 +1,9 @@ ## v16.0 The dedicated team for this release can be found [here](team.md). +* **[16.0.4](16.0.4)** + * [Changelog](16.0.4/changelog.md) + * [Release Notes](16.0.4/release_notes.md) + * **[16.0.3](16.0.3)** * [Changelog](16.0.3/changelog.md) * [Release Notes](16.0.3/release_notes.md) diff --git a/docker/release.sh b/docker/release.sh index 50aa878c178..5b44d53d39a 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.4-SNAPSHOT' +vt_base_version='v16.0.4' 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 61c969808c1..108e7cc0d69 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:v16.0.3 + image: vitess/lite:v16.0.4 ports: - "15000:$WEB_PORT" - "$GRPC_PORT" @@ -81,7 +81,7 @@ services: condition: service_healthy vtgate: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 ports: - "15099:$WEB_PORT" - "$GRPC_PORT" @@ -111,7 +111,7 @@ services: condition: service_healthy schemaload: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 command: - sh - -c @@ -144,12 +144,12 @@ services: environment: - KEYSPACES=$KEYSPACE - GRPC_PORT=15999 - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - .:/script vttablet100: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 ports: - "15100:$WEB_PORT" - "$GRPC_PORT" @@ -181,7 +181,7 @@ services: retries: 15 vttablet101: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 ports: - "15101:$WEB_PORT" - "$GRPC_PORT" @@ -213,7 +213,7 @@ services: retries: 15 vttablet102: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 ports: - "15102:$WEB_PORT" - "$GRPC_PORT" @@ -245,7 +245,7 @@ services: retries: 15 vttablet103: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 ports: - "15103:$WEB_PORT" - "$GRPC_PORT" @@ -277,7 +277,7 @@ services: retries: 15 vtorc: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 command: ["sh", "-c", "/script/vtorc-up.sh"] depends_on: - vtctld @@ -307,7 +307,7 @@ services: retries: 15 vreplication: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - ".:/script" environment: diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index 79ce6a5c2b2..37553ac10f8 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - .:/script set_keyspace_durability_policy: @@ -115,7 +115,7 @@ services: environment: - KEYSPACES=test_keyspace lookup_keyspace - GRPC_PORT=15999 - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - .:/script vtctld: @@ -143,7 +143,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 ports: - 15000:8080 - "15999" @@ -160,7 +160,7 @@ services: --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 ports: - 15099:8080 - "15999" @@ -182,7 +182,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 ports: - 15302:8080 - "15999" diff --git a/examples/compose/vtcompose/docker-compose.test.yml b/examples/compose/vtcompose/docker-compose.test.yml index ee60402ce83..40eb9d39bba 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - .:/script set_keyspace_durability_policy_test_keyspace: @@ -117,7 +117,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=test_keyspace - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - .:/script set_keyspace_durability_policy_unsharded_keyspace: @@ -130,7 +130,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=unsharded_keyspace - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - .:/script vtctld: @@ -159,7 +159,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 ports: - 15000:8080 - "15999" @@ -176,7 +176,7 @@ services: ''grpc-vtgateservice'' --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 ports: - 15099:8080 - "15999" @@ -199,7 +199,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 ports: - 15301:8080 - "15999" diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index bb39f229f45..a13742ea2c0 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 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:v16.0.3 + image: vitess/lite:v16.0.4 ports: - "15000:%[1]d" - "%[2]d" @@ -696,7 +696,7 @@ func generateVtgate(opts vtOptions) string { - op: add path: /services/vtgate value: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 ports: - "15099:%[1]d" - "%[2]d" @@ -738,7 +738,7 @@ func generateVTOrc(dbInfo externalDbInfo, keyspaceInfoMap map[string]keyspaceInf - op: add path: /services/vtorc value: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - ".:/script" environment: @@ -763,7 +763,7 @@ func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - op: add path: /services/vreplication value: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - ".:/script" environment: @@ -791,7 +791,7 @@ func generateSetKeyspaceDurabilityPolicy( - op: add path: /services/set_keyspace_durability_policy_%[3]s value: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - ".:/script" environment: @@ -828,7 +828,7 @@ func generateSchemaload( - op: add path: /services/schemaload_%[7]s value: - image: vitess/lite:v16.0.3 + image: vitess/lite:v16.0.4 volumes: - ".:/script" environment: diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index a8957076ac6..51311f1dbfb 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:v16.0.3 - vtadmin: vitess/vtadmin:v16.0.3 - vtgate: vitess/lite:v16.0.3 - vttablet: vitess/lite:v16.0.3 - vtbackup: vitess/lite:v16.0.3 - vtorc: vitess/lite:v16.0.3 + vtctld: vitess/lite:v16.0.4 + vtadmin: vitess/vtadmin:v16.0.4 + vtgate: vitess/lite:v16.0.4 + vttablet: vitess/lite:v16.0.4 + vtbackup: vitess/lite:v16.0.4 + vtorc: vitess/lite:v16.0.4 mysqld: - mysql80Compatible: vitess/lite:v16.0.3 + mysql80Compatible: vitess/lite:v16.0.4 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 80e8efd3322..0f28bc2ee10 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:v16.0.3 - vtadmin: vitess/vtadmin:v16.0.3 - vtgate: vitess/lite:v16.0.3 - vttablet: vitess/lite:v16.0.3 - vtbackup: vitess/lite:v16.0.3 - vtorc: vitess/lite:v16.0.3 + vtctld: vitess/lite:v16.0.4 + vtadmin: vitess/vtadmin:v16.0.4 + vtgate: vitess/lite:v16.0.4 + vttablet: vitess/lite:v16.0.4 + vtbackup: vitess/lite:v16.0.4 + vtorc: vitess/lite:v16.0.4 mysqld: - mysql80Compatible: vitess/lite:v16.0.3 + mysql80Compatible: vitess/lite:v16.0.4 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 c18c7c5f8d8..83bc869ee25 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:v16.0.3 - vtadmin: vitess/vtadmin:v16.0.3 - vtgate: vitess/lite:v16.0.3 - vttablet: vitess/lite:v16.0.3 - vtbackup: vitess/lite:v16.0.3 - vtorc: vitess/lite:v16.0.3 + vtctld: vitess/lite:v16.0.4 + vtadmin: vitess/vtadmin:v16.0.4 + vtgate: vitess/lite:v16.0.4 + vttablet: vitess/lite:v16.0.4 + vtbackup: vitess/lite:v16.0.4 + vtorc: vitess/lite:v16.0.4 mysqld: - mysql80Compatible: vitess/lite:v16.0.3 + mysql80Compatible: vitess/lite:v16.0.4 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 0055de12012..68c51aecdc0 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:v16.0.3 - vtadmin: vitess/vtadmin:v16.0.3 - vtgate: vitess/lite:v16.0.3 - vttablet: vitess/lite:v16.0.3 - vtbackup: vitess/lite:v16.0.3 - vtorc: vitess/lite:v16.0.3 + vtctld: vitess/lite:v16.0.4 + vtadmin: vitess/vtadmin:v16.0.4 + vtgate: vitess/lite:v16.0.4 + vttablet: vitess/lite:v16.0.4 + vtbackup: vitess/lite:v16.0.4 + vtorc: vitess/lite:v16.0.4 mysqld: - mysql80Compatible: vitess/lite:v16.0.3 + mysql80Compatible: vitess/lite:v16.0.4 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/operator.yaml b/examples/operator/operator.yaml index e782a162e5b..82dbee746c5 100644 --- a/examples/operator/operator.yaml +++ b/examples/operator/operator.yaml @@ -6145,7 +6145,7 @@ spec: fieldPath: metadata.name - name: OPERATOR_NAME value: vitess-operator - image: planetscale/vitess-operator:v2.9.3 + image: planetscale/vitess-operator:v2.9.4 name: vitess-operator resources: limits: diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index ce425a780fa..537e73fd503 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 = "16.0.4-SNAPSHOT" +const versionName = "16.0.4" diff --git a/java/client/pom.xml b/java/client/pom.xml index 67dfbcea098..fe66c369a2e 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.4-SNAPSHOT + 16.0.4 vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 3c3b8afcc32..ee5747a401e 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.4-SNAPSHOT + 16.0.4 vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index fcbc6424327..39e1d8c5509 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.4-SNAPSHOT + 16.0.4 vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index fe1579b86f3..58ec71adab5 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.4-SNAPSHOT + 16.0.4 vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index a8e0f0a53e6..dffefd3c099 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.4-SNAPSHOT + 16.0.4 pom Vitess Java Client libraries [Parent] From 6cf15c80c3b2a67aed70c99f4da3216492063720 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 18 Aug 2023 23:30:01 +0530 Subject: [PATCH 167/233] Back to dev mode after v16.0.4 (#13814) Signed-off-by: Manan Gupta --- 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 5b44d53d39a..1fa6c57326c 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.4' +vt_base_version='v16.0.5-SNAPSHOT' debian_versions='buster bullseye' default_debian_version='bullseye' diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index 537e73fd503..0f2e11ff73c 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 = "16.0.4" +const versionName = "16.0.5-SNAPSHOT" diff --git a/java/client/pom.xml b/java/client/pom.xml index fe66c369a2e..edf3b3fcf0e 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.4 + 16.0.5-SNAPSHOT vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index ee5747a401e..183d94bfe3c 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.4 + 16.0.5-SNAPSHOT vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 39e1d8c5509..975eebf948a 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.4 + 16.0.5-SNAPSHOT vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 58ec71adab5..bf7d0892154 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.4 + 16.0.5-SNAPSHOT vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index dffefd3c099..909efd2631c 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.4 + 16.0.5-SNAPSHOT pom Vitess Java Client libraries [Parent] From 2f507194c0db8e0feeb5cbc004dc6120dc272713 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Sat, 19 Aug 2023 12:41:23 -0400 Subject: [PATCH 168/233] [release-16.0] Fix `BackupShard` to get its options from its own flags (#13813) (#13819) Signed-off-by: Andrew Mason Co-authored-by: Andrew Mason --- go/cmd/vtctldclient/command/backups.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/cmd/vtctldclient/command/backups.go b/go/cmd/vtctldclient/command/backups.go index 53aac5b51bb..c427a88f1df 100644 --- a/go/cmd/vtctldclient/command/backups.go +++ b/go/cmd/vtctldclient/command/backups.go @@ -129,8 +129,8 @@ func commandBackupShard(cmd *cobra.Command, args []string) error { stream, err := client.BackupShard(commandCtx, &vtctldatapb.BackupShardRequest{ Keyspace: keyspace, Shard: shard, - AllowPrimary: backupOptions.AllowPrimary, - Concurrency: backupOptions.Concurrency, + AllowPrimary: backupShardOptions.AllowPrimary, + Concurrency: backupShardOptions.Concurrency, }) if err != nil { return err From 73fa4d6e66b62e2234c45078e7c090a89a98b9ca Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 07:22:29 -0400 Subject: [PATCH 169/233] [release-16.0] Flakes: empty vtdataroot before starting a new vreplication e2e test (#13803) (#13821) Signed-off-by: Rohit Nayak Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- go/test/endtoend/vreplication/cluster_test.go | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/go/test/endtoend/vreplication/cluster_test.go b/go/test/endtoend/vreplication/cluster_test.go index 43991454b6e..edd90599de3 100644 --- a/go/test/endtoend/vreplication/cluster_test.go +++ b/go/test/endtoend/vreplication/cluster_test.go @@ -338,6 +338,9 @@ func init() { func NewVitessCluster(t *testing.T, name string, cellNames []string, clusterConfig *ClusterConfig) *VitessCluster { vc := &VitessCluster{Name: name, Cells: make(map[string]*Cell), ClusterConfig: clusterConfig} require.NotNil(t, vc) + + vc.CleanupDataroot(t, true) + topo := cluster.TopoProcessInstance(vc.ClusterConfig.topoPort, vc.ClusterConfig.topoPort+1, vc.ClusterConfig.hostname, "etcd2", "global") require.NotNil(t, topo) @@ -373,6 +376,26 @@ func NewVitessCluster(t *testing.T, name string, cellNames []string, clusterConf return vc } +// CleanupDataroot deletes the vtdataroot directory. Since we run multiple tests sequentially in a single CI test shard, +// we can run out of disk space due to all the leftover artifacts from previous tests. +func (vc *VitessCluster) CleanupDataroot(t *testing.T, recreate bool) { + // This is always set to "true" on GitHub Actions runners: + // https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables + ci, ok := os.LookupEnv("CI") + if !ok || strings.ToLower(ci) != "true" { + // Leave the directory in place to support local debugging. + return + } + dir := vc.ClusterConfig.vtdataroot + log.Infof("Deleting vtdataroot %s", dir) + err := os.RemoveAll(dir) + require.NoError(t, err) + if recreate { + err = os.Mkdir(dir, 0700) + require.NoError(t, err) + } +} + // AddKeyspace creates a keyspace with specified shard keys and number of replica/read-only tablets. // You can pass optional key value pairs (opts) if you want conditional behavior. func (vc *VitessCluster) AddKeyspace(t *testing.T, cells []*Cell, ksName string, shards string, vschema string, schema string, numReplicas int, numRdonly int, tabletIDBase int, opts map[string]string) (*Keyspace, error) { @@ -605,7 +628,7 @@ func (vc *VitessCluster) AddCell(t testing.TB, name string) (*Cell, error) { return cell, nil } -func (vc *VitessCluster) teardown(t testing.TB) { +func (vc *VitessCluster) teardown() { for _, cell := range vc.Cells { for _, vtgate := range cell.Vtgates { if err := vtgate.TearDown(); err != nil { @@ -668,13 +691,13 @@ func (vc *VitessCluster) teardown(t testing.TB) { } // TearDown brings down a cluster, deleting processes, removing topo keys -func (vc *VitessCluster) TearDown(t testing.TB) { +func (vc *VitessCluster) TearDown(t *testing.T) { if debugMode { return } done := make(chan bool) go func() { - vc.teardown(t) + vc.teardown() done <- true }() select { @@ -685,6 +708,7 @@ func (vc *VitessCluster) TearDown(t testing.TB) { } // some processes seem to hang around for a bit time.Sleep(5 * time.Second) + vc.CleanupDataroot(t, false) } func (vc *VitessCluster) getVttabletsInKeyspace(t *testing.T, cell *Cell, ksName string, tabletType string) map[string]*cluster.VttabletProcess { From c934b2b49e155fdf72a2e1ee2aa674df8400437d Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 07:23:20 -0400 Subject: [PATCH 170/233] [release-16.0] Flakes: skip flaky check that ETA for a VReplication VDiff2 Progress command is in the future. (#13804) (#13816) Signed-off-by: Rohit Nayak Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- .../vreplication/vdiff_helper_test.go | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/go/test/endtoend/vreplication/vdiff_helper_test.go b/go/test/endtoend/vreplication/vdiff_helper_test.go index 9dc2648f574..35b3b3f5d26 100644 --- a/go/test/endtoend/vreplication/vdiff_helper_test.go +++ b/go/test/endtoend/vreplication/vdiff_helper_test.go @@ -110,12 +110,20 @@ func waitForVDiff2ToComplete(t *testing.T, ksWorkflow, cells, uuid string, compl // The timestamp format allows us to compare them lexicographically. // We don't test that the ETA always increases as it can decrease based on how // quickly we're doing work. - if info.Progress.ETA != "" { - // If we're operating at the second boundary then the ETA can be up - // to 1 second in the past due to using second based precision. - loc, _ := time.LoadLocation("UTC") - require.GreaterOrEqual(t, info.Progress.ETA, time.Now().Add(-time.Second).In(loc).Format(vdiff2.TimestampFormat)) - } + + // Commenting out this check for now as it is quite flaky in Github CI: we sometimes get a difference of + // more than 1s between the ETA and the current time, empirically seen 2s when it has failed, + // but presumably it can be higher. Keeping the code here for now in case we want to re-enable it. + + /* + if info.Progress.ETA != "" { + // If we're operating at the second boundary then the ETA can be up + // to 1 second in the past due to using second based precision. + loc, _ := time.LoadLocation("UTC") + require.GreaterOrEqual(t, info.Progress.ETA, time.Now().Add(-time.Second).In(loc).Format(vdiff2.TimestampFormat)) + } + */ + if !first { require.GreaterOrEqual(t, info.Progress.Percentage, previousProgress.Percentage) } From d4e5cc777c172d4b204d65d711c8e35243de5207 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Mon, 28 Aug 2023 17:40:51 +0200 Subject: [PATCH 171/233] [release-16.0] MoveTables: add flag to specify that routing rules should not be created when a movetables workflow is created (#13858) Signed-off-by: Rohit Nayak --- go/vt/vtctl/vtctl.go | 4 +- go/vt/wrangler/materializer.go | 57 ++++++++++++++++------------- go/vt/wrangler/materializer_test.go | 44 ++++++++++++++++++---- go/vt/wrangler/workflow.go | 5 ++- 4 files changed, 74 insertions(+), 36 deletions(-) diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 93628b4d0f5..86a002bde9a 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -467,7 +467,7 @@ var commands = []commandGroup{ { name: "MoveTables", method: commandMoveTables, - params: "[--source=] [--tables=] [--cells=] [--tablet_types=] [--all] [--exclude=] [--auto_start] [--stop_after_copy] [--defer-secondary-keys] [--on-ddl=] [--source_shards=] 'action must be one of the following: Create, Complete, Cancel, SwitchTraffic, ReverseTrafffic, Show, or Progress' ", + params: "[--source=] [--tables=] [--cells=] [--tablet_types=] [--all] [--exclude=] [--auto_start] [--stop_after_copy] [--defer-secondary-keys] [--on-ddl=] [--source_shards=] [--no-routing-rules] 'action must be one of the following: Create, Complete, Cancel, SwitchTraffic, ReverseTrafffic, Show, or Progress' ", help: `Move table(s) to another keyspace, table_specs is a list of tables or the tables section of the vschema for the target keyspace. Example: '{"t1":{"column_vindexes": [{"column": "id1", "name": "hash"}]}, "t2":{"column_vindexes": [{"column": "id2", "name": "hash"}]}}'. In the case of an unsharded target keyspace the vschema for each table may be empty. Example: '{"t1":{}, "t2":{}}'.`, }, { @@ -2125,6 +2125,7 @@ func commandVRWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *pfl // MoveTables-only params renameTables := subFlags.Bool("rename_tables", false, "MoveTables only. Rename tables instead of dropping them. --rename_tables is only supported for Complete.") + noRoutingRules := subFlags.Bool("no-routing-rules", false, "(Advanced) MoveTables Create only. Do not create routing rules while creating the workflow. See the reference documentation for limitations if you use this flag.") // MoveTables and Reshard params sourceShards := subFlags.String("source_shards", "", "Source shards") @@ -2262,6 +2263,7 @@ func commandVRWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *pfl vrwp.ExternalCluster = externalClusterName vrwp.SourceTimeZone = *sourceTimeZone vrwp.DropForeignKeys = *dropForeignKeys + vrwp.NoRoutingRules = *noRoutingRules if *sourceShards != "" { vrwp.SourceShards = strings.Split(*sourceShards, ",") } diff --git a/go/vt/wrangler/materializer.go b/go/vt/wrangler/materializer.go index a44d15b36e2..98bb3f42bc7 100644 --- a/go/vt/wrangler/materializer.go +++ b/go/vt/wrangler/materializer.go @@ -122,7 +122,8 @@ func shouldInclude(table string, excludes []string) bool { // MoveTables initiates moving table(s) over to another keyspace func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, targetKeyspace, tableSpecs, cell, tabletTypes string, allTables bool, excludeTables string, autoStart, stopAfterCopy bool, - externalCluster string, dropForeignKeys, deferSecondaryKeys bool, sourceTimeZone, onDDL string, sourceShards []string) error { + externalCluster string, dropForeignKeys, deferSecondaryKeys bool, sourceTimeZone, onDDL string, + sourceShards []string, noRoutingRules bool) error { //FIXME validate tableSpecs, allTables, excludeTables var tables []string var externalTopo *topo.Server @@ -206,33 +207,37 @@ func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, ta } } if externalTopo == nil { - // Save routing rules before vschema. If we save vschema first, and routing rules - // fails to save, we may generate duplicate table errors. - rules, err := topotools.GetRoutingRules(ctx, wr.ts) - if err != nil { - return err - } - for _, table := range tables { - toSource := []string{sourceKeyspace + "." + table} - rules[table] = toSource - rules[table+"@replica"] = toSource - rules[table+"@rdonly"] = toSource - rules[targetKeyspace+"."+table] = toSource - rules[targetKeyspace+"."+table+"@replica"] = toSource - rules[targetKeyspace+"."+table+"@rdonly"] = toSource - rules[targetKeyspace+"."+table] = toSource - rules[sourceKeyspace+"."+table+"@replica"] = toSource - rules[sourceKeyspace+"."+table+"@rdonly"] = toSource - } - if err := topotools.SaveRoutingRules(ctx, wr.ts, rules); err != nil { - return err - } - - if vschema != nil { - // We added to the vschema. - if err := wr.ts.SaveVSchema(ctx, targetKeyspace, vschema); err != nil { + if noRoutingRules { + log.Warningf("Found --no-routing-rules flag, not creating routing rules for workflow %s.%s", targetKeyspace, workflow) + } else { + // Save routing rules before vschema. If we save vschema first, and routing rules + // fails to save, we may generate duplicate table errors. + rules, err := topotools.GetRoutingRules(ctx, wr.ts) + if err != nil { + return err + } + for _, table := range tables { + toSource := []string{sourceKeyspace + "." + table} + rules[table] = toSource + rules[table+"@replica"] = toSource + rules[table+"@rdonly"] = toSource + rules[targetKeyspace+"."+table] = toSource + rules[targetKeyspace+"."+table+"@replica"] = toSource + rules[targetKeyspace+"."+table+"@rdonly"] = toSource + rules[targetKeyspace+"."+table] = toSource + rules[sourceKeyspace+"."+table+"@replica"] = toSource + rules[sourceKeyspace+"."+table+"@rdonly"] = toSource + } + if err := topotools.SaveRoutingRules(ctx, wr.ts, rules); err != nil { return err } + + if vschema != nil { + // We added to the vschema. + if err := wr.ts.SaveVSchema(ctx, targetKeyspace, vschema); err != nil { + return err + } + } } } if err := wr.ts.RebuildSrvVSchema(ctx, nil); err != nil { diff --git a/go/vt/wrangler/materializer_test.go b/go/vt/wrangler/materializer_test.go index 8a7e68f9d82..e297f534e33 100644 --- a/go/vt/wrangler/materializer_test.go +++ b/go/vt/wrangler/materializer_test.go @@ -46,6 +46,34 @@ const mzCheckJournal = "/select val from _vt.resharding_journal where id=" var defaultOnDDL = binlogdatapb.OnDDLAction_name[int32(binlogdatapb.OnDDLAction_IGNORE)] +// TestMoveTablesNoRoutingRules confirms that MoveTables does not create routing rules if --no-routing-rules is specified. +func TestMoveTablesNoRoutingRules(t *testing.T) { + ms := &vtctldatapb.MaterializeSettings{ + Workflow: "workflow", + SourceKeyspace: "sourceks", + TargetKeyspace: "targetks", + TableSettings: []*vtctldatapb.TableMaterializeSettings{{ + TargetTable: "t1", + SourceExpression: "select * from t1", + }}, + } + env := newTestMaterializerEnv(t, ms, []string{"0"}, []string{"0"}) + defer env.close() + + env.tmc.expectVRQuery(100, mzCheckJournal, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, insertPrefix, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, mzSelectIDQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) + + ctx := context.Background() + err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, true) + require.NoError(t, err) + rr, err := env.wr.ts.GetRoutingRules(ctx) + require.NoError(t, err) + require.Equal(t, 0, len(rr.Rules)) +} + func TestMigrateTables(t *testing.T) { ms := &vtctldatapb.MaterializeSettings{ Workflow: "workflow", @@ -66,7 +94,7 @@ func TestMigrateTables(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() - err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil) + err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, false) require.NoError(t, err) vschema, err := env.wr.ts.GetSrvVSchema(ctx, env.cell) require.NoError(t, err) @@ -107,11 +135,11 @@ func TestMissingTables(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() - err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil) + err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, false) require.EqualError(t, err, "table(s) not found in source keyspace sourceks: tyt") - err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt,t2,txt", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil) + err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt,t2,txt", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, false) require.EqualError(t, err, "table(s) not found in source keyspace sourceks: tyt,txt") - err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil) + err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, false) require.NoError(t, err) } @@ -167,7 +195,7 @@ func TestMoveTablesAllAndExclude(t *testing.T) { env.tmc.expectVRQuery(200, insertPrefix, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) - err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "", "", "", tcase.allTables, tcase.excludeTables, true, false, "", false, false, "", defaultOnDDL, nil) + err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "", "", "", tcase.allTables, tcase.excludeTables, true, false, "", false, false, "", defaultOnDDL, nil, false) require.NoError(t, err) require.EqualValues(t, tcase.want, targetTables(env)) }) @@ -201,7 +229,7 @@ func TestMoveTablesStopFlags(t *testing.T) { env.tmc.expectVRQuery(200, mzSelectIDQuery, &sqltypes.Result{}) // -auto_start=false is tested by NOT expecting the update query which sets state to RUNNING err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", - "", false, "", false, true, "", false, false, "", defaultOnDDL, nil) + "", false, "", false, true, "", false, false, "", defaultOnDDL, nil, false) require.NoError(t, err) env.tmc.verifyQueries(t) }) @@ -227,7 +255,7 @@ func TestMigrateVSchema(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() - err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", `{"t1":{}}`, "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil) + err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", `{"t1":{}}`, "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, false) require.NoError(t, err) vschema, err := env.wr.ts.GetSrvVSchema(ctx, env.cell) require.NoError(t, err) @@ -2828,7 +2856,7 @@ func TestMoveTablesDDLFlag(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", - "", false, "", false, true, "", false, false, "", onDDLAction, nil) + "", false, "", false, true, "", false, false, "", onDDLAction, nil, false) require.NoError(t, err) }) } diff --git a/go/vt/wrangler/workflow.go b/go/vt/wrangler/workflow.go index fbdeb58dd17..630330058c9 100644 --- a/go/vt/wrangler/workflow.go +++ b/go/vt/wrangler/workflow.go @@ -71,6 +71,9 @@ type VReplicationWorkflowParams struct { // Migrate specific ExternalCluster string + + // MoveTables only + NoRoutingRules bool } // VReplicationWorkflow stores various internal objects for a workflow @@ -433,7 +436,7 @@ func (vrw *VReplicationWorkflow) initMoveTables() error { return vrw.wr.MoveTables(vrw.ctx, vrw.params.Workflow, vrw.params.SourceKeyspace, vrw.params.TargetKeyspace, vrw.params.Tables, vrw.params.Cells, vrw.params.TabletTypes, vrw.params.AllTables, vrw.params.ExcludeTables, vrw.params.AutoStart, vrw.params.StopAfterCopy, vrw.params.ExternalCluster, vrw.params.DropForeignKeys, - vrw.params.DeferSecondaryKeys, vrw.params.SourceTimeZone, vrw.params.OnDDL, vrw.params.SourceShards) + vrw.params.DeferSecondaryKeys, vrw.params.SourceTimeZone, vrw.params.OnDDL, vrw.params.SourceShards, vrw.params.NoRoutingRules) } func (vrw *VReplicationWorkflow) initReshard() error { From a682c1e5b020a23cc93e3e1d2074850d20b23812 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Mon, 4 Sep 2023 09:32:29 +0200 Subject: [PATCH 172/233] Revert "[release-16.0] MoveTables: add flag to specify that routing rules should not be created when a movetables workflow is created" (#13899) Signed-off-by: Rohit Nayak --- go/vt/vtctl/vtctl.go | 4 +- go/vt/wrangler/materializer.go | 57 +++++++++++++---------------- go/vt/wrangler/materializer_test.go | 44 ++++------------------ go/vt/wrangler/workflow.go | 5 +-- 4 files changed, 36 insertions(+), 74 deletions(-) diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 86a002bde9a..93628b4d0f5 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -467,7 +467,7 @@ var commands = []commandGroup{ { name: "MoveTables", method: commandMoveTables, - params: "[--source=] [--tables=] [--cells=] [--tablet_types=] [--all] [--exclude=] [--auto_start] [--stop_after_copy] [--defer-secondary-keys] [--on-ddl=] [--source_shards=] [--no-routing-rules] 'action must be one of the following: Create, Complete, Cancel, SwitchTraffic, ReverseTrafffic, Show, or Progress' ", + params: "[--source=] [--tables=] [--cells=] [--tablet_types=] [--all] [--exclude=] [--auto_start] [--stop_after_copy] [--defer-secondary-keys] [--on-ddl=] [--source_shards=] 'action must be one of the following: Create, Complete, Cancel, SwitchTraffic, ReverseTrafffic, Show, or Progress' ", help: `Move table(s) to another keyspace, table_specs is a list of tables or the tables section of the vschema for the target keyspace. Example: '{"t1":{"column_vindexes": [{"column": "id1", "name": "hash"}]}, "t2":{"column_vindexes": [{"column": "id2", "name": "hash"}]}}'. In the case of an unsharded target keyspace the vschema for each table may be empty. Example: '{"t1":{}, "t2":{}}'.`, }, { @@ -2125,7 +2125,6 @@ func commandVRWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *pfl // MoveTables-only params renameTables := subFlags.Bool("rename_tables", false, "MoveTables only. Rename tables instead of dropping them. --rename_tables is only supported for Complete.") - noRoutingRules := subFlags.Bool("no-routing-rules", false, "(Advanced) MoveTables Create only. Do not create routing rules while creating the workflow. See the reference documentation for limitations if you use this flag.") // MoveTables and Reshard params sourceShards := subFlags.String("source_shards", "", "Source shards") @@ -2263,7 +2262,6 @@ func commandVRWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *pfl vrwp.ExternalCluster = externalClusterName vrwp.SourceTimeZone = *sourceTimeZone vrwp.DropForeignKeys = *dropForeignKeys - vrwp.NoRoutingRules = *noRoutingRules if *sourceShards != "" { vrwp.SourceShards = strings.Split(*sourceShards, ",") } diff --git a/go/vt/wrangler/materializer.go b/go/vt/wrangler/materializer.go index 98bb3f42bc7..a44d15b36e2 100644 --- a/go/vt/wrangler/materializer.go +++ b/go/vt/wrangler/materializer.go @@ -122,8 +122,7 @@ func shouldInclude(table string, excludes []string) bool { // MoveTables initiates moving table(s) over to another keyspace func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, targetKeyspace, tableSpecs, cell, tabletTypes string, allTables bool, excludeTables string, autoStart, stopAfterCopy bool, - externalCluster string, dropForeignKeys, deferSecondaryKeys bool, sourceTimeZone, onDDL string, - sourceShards []string, noRoutingRules bool) error { + externalCluster string, dropForeignKeys, deferSecondaryKeys bool, sourceTimeZone, onDDL string, sourceShards []string) error { //FIXME validate tableSpecs, allTables, excludeTables var tables []string var externalTopo *topo.Server @@ -207,36 +206,32 @@ func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, ta } } if externalTopo == nil { - if noRoutingRules { - log.Warningf("Found --no-routing-rules flag, not creating routing rules for workflow %s.%s", targetKeyspace, workflow) - } else { - // Save routing rules before vschema. If we save vschema first, and routing rules - // fails to save, we may generate duplicate table errors. - rules, err := topotools.GetRoutingRules(ctx, wr.ts) - if err != nil { - return err - } - for _, table := range tables { - toSource := []string{sourceKeyspace + "." + table} - rules[table] = toSource - rules[table+"@replica"] = toSource - rules[table+"@rdonly"] = toSource - rules[targetKeyspace+"."+table] = toSource - rules[targetKeyspace+"."+table+"@replica"] = toSource - rules[targetKeyspace+"."+table+"@rdonly"] = toSource - rules[targetKeyspace+"."+table] = toSource - rules[sourceKeyspace+"."+table+"@replica"] = toSource - rules[sourceKeyspace+"."+table+"@rdonly"] = toSource - } - if err := topotools.SaveRoutingRules(ctx, wr.ts, rules); err != nil { - return err - } + // Save routing rules before vschema. If we save vschema first, and routing rules + // fails to save, we may generate duplicate table errors. + rules, err := topotools.GetRoutingRules(ctx, wr.ts) + if err != nil { + return err + } + for _, table := range tables { + toSource := []string{sourceKeyspace + "." + table} + rules[table] = toSource + rules[table+"@replica"] = toSource + rules[table+"@rdonly"] = toSource + rules[targetKeyspace+"."+table] = toSource + rules[targetKeyspace+"."+table+"@replica"] = toSource + rules[targetKeyspace+"."+table+"@rdonly"] = toSource + rules[targetKeyspace+"."+table] = toSource + rules[sourceKeyspace+"."+table+"@replica"] = toSource + rules[sourceKeyspace+"."+table+"@rdonly"] = toSource + } + if err := topotools.SaveRoutingRules(ctx, wr.ts, rules); err != nil { + return err + } - if vschema != nil { - // We added to the vschema. - if err := wr.ts.SaveVSchema(ctx, targetKeyspace, vschema); err != nil { - return err - } + if vschema != nil { + // We added to the vschema. + if err := wr.ts.SaveVSchema(ctx, targetKeyspace, vschema); err != nil { + return err } } } diff --git a/go/vt/wrangler/materializer_test.go b/go/vt/wrangler/materializer_test.go index e297f534e33..8a7e68f9d82 100644 --- a/go/vt/wrangler/materializer_test.go +++ b/go/vt/wrangler/materializer_test.go @@ -46,34 +46,6 @@ const mzCheckJournal = "/select val from _vt.resharding_journal where id=" var defaultOnDDL = binlogdatapb.OnDDLAction_name[int32(binlogdatapb.OnDDLAction_IGNORE)] -// TestMoveTablesNoRoutingRules confirms that MoveTables does not create routing rules if --no-routing-rules is specified. -func TestMoveTablesNoRoutingRules(t *testing.T) { - ms := &vtctldatapb.MaterializeSettings{ - Workflow: "workflow", - SourceKeyspace: "sourceks", - TargetKeyspace: "targetks", - TableSettings: []*vtctldatapb.TableMaterializeSettings{{ - TargetTable: "t1", - SourceExpression: "select * from t1", - }}, - } - env := newTestMaterializerEnv(t, ms, []string{"0"}, []string{"0"}) - defer env.close() - - env.tmc.expectVRQuery(100, mzCheckJournal, &sqltypes.Result{}) - env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) - env.tmc.expectVRQuery(200, insertPrefix, &sqltypes.Result{}) - env.tmc.expectVRQuery(200, mzSelectIDQuery, &sqltypes.Result{}) - env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) - - ctx := context.Background() - err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, true) - require.NoError(t, err) - rr, err := env.wr.ts.GetRoutingRules(ctx) - require.NoError(t, err) - require.Equal(t, 0, len(rr.Rules)) -} - func TestMigrateTables(t *testing.T) { ms := &vtctldatapb.MaterializeSettings{ Workflow: "workflow", @@ -94,7 +66,7 @@ func TestMigrateTables(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() - err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, false) + err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil) require.NoError(t, err) vschema, err := env.wr.ts.GetSrvVSchema(ctx, env.cell) require.NoError(t, err) @@ -135,11 +107,11 @@ func TestMissingTables(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() - err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, false) + err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil) require.EqualError(t, err, "table(s) not found in source keyspace sourceks: tyt") - err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt,t2,txt", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, false) + err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt,t2,txt", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil) require.EqualError(t, err, "table(s) not found in source keyspace sourceks: tyt,txt") - err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, false) + err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil) require.NoError(t, err) } @@ -195,7 +167,7 @@ func TestMoveTablesAllAndExclude(t *testing.T) { env.tmc.expectVRQuery(200, insertPrefix, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) - err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "", "", "", tcase.allTables, tcase.excludeTables, true, false, "", false, false, "", defaultOnDDL, nil, false) + err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "", "", "", tcase.allTables, tcase.excludeTables, true, false, "", false, false, "", defaultOnDDL, nil) require.NoError(t, err) require.EqualValues(t, tcase.want, targetTables(env)) }) @@ -229,7 +201,7 @@ func TestMoveTablesStopFlags(t *testing.T) { env.tmc.expectVRQuery(200, mzSelectIDQuery, &sqltypes.Result{}) // -auto_start=false is tested by NOT expecting the update query which sets state to RUNNING err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", - "", false, "", false, true, "", false, false, "", defaultOnDDL, nil, false) + "", false, "", false, true, "", false, false, "", defaultOnDDL, nil) require.NoError(t, err) env.tmc.verifyQueries(t) }) @@ -255,7 +227,7 @@ func TestMigrateVSchema(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() - err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", `{"t1":{}}`, "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil, false) + err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", `{"t1":{}}`, "", "", false, "", true, false, "", false, false, "", defaultOnDDL, nil) require.NoError(t, err) vschema, err := env.wr.ts.GetSrvVSchema(ctx, env.cell) require.NoError(t, err) @@ -2856,7 +2828,7 @@ func TestMoveTablesDDLFlag(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", - "", false, "", false, true, "", false, false, "", onDDLAction, nil, false) + "", false, "", false, true, "", false, false, "", onDDLAction, nil) require.NoError(t, err) }) } diff --git a/go/vt/wrangler/workflow.go b/go/vt/wrangler/workflow.go index 630330058c9..fbdeb58dd17 100644 --- a/go/vt/wrangler/workflow.go +++ b/go/vt/wrangler/workflow.go @@ -71,9 +71,6 @@ type VReplicationWorkflowParams struct { // Migrate specific ExternalCluster string - - // MoveTables only - NoRoutingRules bool } // VReplicationWorkflow stores various internal objects for a workflow @@ -436,7 +433,7 @@ func (vrw *VReplicationWorkflow) initMoveTables() error { return vrw.wr.MoveTables(vrw.ctx, vrw.params.Workflow, vrw.params.SourceKeyspace, vrw.params.TargetKeyspace, vrw.params.Tables, vrw.params.Cells, vrw.params.TabletTypes, vrw.params.AllTables, vrw.params.ExcludeTables, vrw.params.AutoStart, vrw.params.StopAfterCopy, vrw.params.ExternalCluster, vrw.params.DropForeignKeys, - vrw.params.DeferSecondaryKeys, vrw.params.SourceTimeZone, vrw.params.OnDDL, vrw.params.SourceShards, vrw.params.NoRoutingRules) + vrw.params.DeferSecondaryKeys, vrw.params.SourceTimeZone, vrw.params.OnDDL, vrw.params.SourceShards) } func (vrw *VReplicationWorkflow) initReshard() error { From 1f2de683b890985605d11a606a8804117dc93d59 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 7 Sep 2023 11:32:05 +0300 Subject: [PATCH 173/233] [release-16.0] OnlineDDL: fix nil 'completed_timestamp' for cancelled migrations (#13928) (#13936) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- .../scheduler/onlineddl_scheduler_test.go | 3 ++ .../onlineddl/vrepl/onlineddl_vrepl_test.go | 13 ++++--- go/test/endtoend/onlineddl/vtgate_util.go | 38 ++++++++++++++++++- go/test/endtoend/onlineddl/vttablet_util.go | 3 +- go/vt/vttablet/onlineddl/executor.go | 23 ++++++++--- go/vt/vttablet/onlineddl/schema.go | 5 ++- 6 files changed, 69 insertions(+), 16 deletions(-) diff --git a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go index 2911fbb80b2..2b068df643d 100644 --- a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go +++ b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go @@ -265,6 +265,9 @@ func TestSchemaChange(t *testing.T) { t.Run("summary: validate sequential migration IDs", func(t *testing.T) { onlineddl.ValidateSequentialMigrationIDs(t, &vtParams, shards) }) + t.Run("summary: validate completed_timestamp", func(t *testing.T) { + onlineddl.ValidateCompletedTimestamp(t, &vtParams) + }) } func testScheduler(t *testing.T) { diff --git a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go index ec6eed14f17..10902baf1d4 100644 --- a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go +++ b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go @@ -213,7 +213,7 @@ func TestMain(m *testing.M) { if err != nil { fmt.Printf("%v\n", err) os.Exit(1) - } else { + } else { // nolint:revive os.Exit(exitcode) } @@ -537,11 +537,11 @@ func TestSchemaChange(t *testing.T) { onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusRunning) }) t.Run("wait for vreplication to run on shard -80", func(t *testing.T) { - vreplStatus := onlineddl.WaitForVReplicationStatus(t, &vtParams, currentPrimaryTablet, uuid, normalMigrationWait, "Copying", "Running") + vreplStatus := onlineddl.WaitForVReplicationStatus(t, currentPrimaryTablet, uuid, normalMigrationWait, "Copying", "Running") require.Contains(t, []string{"Copying", "Running"}, vreplStatus) }) t.Run("wait for vreplication to run on shard 80-", func(t *testing.T) { - vreplStatus := onlineddl.WaitForVReplicationStatus(t, &vtParams, shards[1].Vttablets[0], uuid, normalMigrationWait, "Copying", "Running") + vreplStatus := onlineddl.WaitForVReplicationStatus(t, shards[1].Vttablets[0], uuid, normalMigrationWait, "Copying", "Running") require.Contains(t, []string{"Copying", "Running"}, vreplStatus) }) t.Run("check status again", func(t *testing.T) { @@ -646,11 +646,11 @@ func TestSchemaChange(t *testing.T) { onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusRunning) }) t.Run("wait for vreplication to run on shard -80", func(t *testing.T) { - vreplStatus := onlineddl.WaitForVReplicationStatus(t, &vtParams, currentPrimaryTablet, uuid, normalMigrationWait, "Copying", "Running") + vreplStatus := onlineddl.WaitForVReplicationStatus(t, currentPrimaryTablet, uuid, normalMigrationWait, "Copying", "Running") require.Contains(t, []string{"Copying", "Running"}, vreplStatus) }) t.Run("wait for vreplication to run on shard 80-", func(t *testing.T) { - vreplStatus := onlineddl.WaitForVReplicationStatus(t, &vtParams, shards[1].Vttablets[0], uuid, normalMigrationWait, "Copying", "Running") + vreplStatus := onlineddl.WaitForVReplicationStatus(t, shards[1].Vttablets[0], uuid, normalMigrationWait, "Copying", "Running") require.Contains(t, []string{"Copying", "Running"}, vreplStatus) }) t.Run("check status again", func(t *testing.T) { @@ -888,6 +888,9 @@ func TestSchemaChange(t *testing.T) { t.Run("summary: validate sequential migration IDs", func(t *testing.T) { onlineddl.ValidateSequentialMigrationIDs(t, &vtParams, shards) }) + t.Run("summary: validate completed_timestamp", func(t *testing.T) { + onlineddl.ValidateCompletedTimestamp(t, &vtParams) + }) } func insertRow(t *testing.T) { diff --git a/go/test/endtoend/onlineddl/vtgate_util.go b/go/test/endtoend/onlineddl/vtgate_util.go index 75c35061da9..5052065082b 100644 --- a/go/test/endtoend/onlineddl/vtgate_util.go +++ b/go/test/endtoend/onlineddl/vtgate_util.go @@ -39,6 +39,14 @@ import ( "github.com/stretchr/testify/require" ) +var ( + testsStartupTime time.Time +) + +func init() { + testsStartupTime = time.Now() +} + // VtgateExecQuery runs a query on VTGate using given query params func VtgateExecQuery(t *testing.T, vtParams *mysql.ConnParams, query string, expectError string) *sqltypes.Result { t.Helper() @@ -354,7 +362,7 @@ func WaitForThrottlerStatusEnabled(t *testing.T, tablet *cluster.Vttablet, timeo jsonPath := "IsEnabled" url := fmt.Sprintf("http://localhost:%d/throttler/status", tablet.HTTPPort) - ctx, cancel := context.WithTimeout(context.Background(), throttlerConfigTimeout) + ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() ticker := time.NewTicker(time.Second) @@ -428,3 +436,31 @@ func ValidateSequentialMigrationIDs(t *testing.T, vtParams *mysql.ConnParams, sh assert.Equalf(t, count, shardMax[shard]-shardMin[shard]+1, "mismatch: shared=%v, count=%v, min=%v, max=%v", shard, count, shardMin[shard], shardMax[shard]) } } + +// ValidateCompletedTimestamp ensures that any migration in `cancelled`, `completed`, `failed` statuses +// has a non-nil and valid `completed_timestamp` value. +func ValidateCompletedTimestamp(t *testing.T, vtParams *mysql.ConnParams) { + require.False(t, testsStartupTime.IsZero()) + r := VtgateExecQuery(t, vtParams, "show vitess_migrations", "") + + completedTimestampNumValidations := 0 + for _, row := range r.Named().Rows { + migrationStatus := row.AsString("migration_status", "") + require.NotEmpty(t, migrationStatus) + switch migrationStatus { + case string(schema.OnlineDDLStatusComplete), + string(schema.OnlineDDLStatusFailed), + string(schema.OnlineDDLStatusCancelled): + { + assert.False(t, row["completed_timestamp"].IsNull()) + // Also make sure the timestamp is "real", and that it is recent. + timestamp := row.AsString("completed_timestamp", "") + completedTime, err := time.Parse(sqltypes.TimestampFormat, timestamp) + assert.NoError(t, err) + assert.Greater(t, completedTime.Unix(), testsStartupTime.Unix()) + completedTimestampNumValidations++ + } + } + } + assert.NotZero(t, completedTimestampNumValidations) +} diff --git a/go/test/endtoend/onlineddl/vttablet_util.go b/go/test/endtoend/onlineddl/vttablet_util.go index 3d4ded89dac..b4669490f63 100644 --- a/go/test/endtoend/onlineddl/vttablet_util.go +++ b/go/test/endtoend/onlineddl/vttablet_util.go @@ -20,7 +20,6 @@ import ( "testing" "time" - "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/sqlparser" @@ -31,7 +30,7 @@ import ( ) // WaitForVReplicationStatus waits for a vreplication stream to be in one of given states, or timeout -func WaitForVReplicationStatus(t *testing.T, vtParams *mysql.ConnParams, tablet *cluster.Vttablet, uuid string, timeout time.Duration, expectStatuses ...string) (status string) { +func WaitForVReplicationStatus(t *testing.T, tablet *cluster.Vttablet, uuid string, timeout time.Duration, expectStatuses ...string) (status string) { query, err := sqlparser.ParseAndBind("select state from _vt.vreplication where workflow=%a", sqltypes.StringBindVariable(uuid), diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index 413b5f012ee..62e22cf3fda 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -99,6 +99,13 @@ var vexecInsertTemplates = []string{ 'val1', 'val2', 'val3', 'val4', 'val5', 'val6', 'val7', 'val8', 'val9', FROM_UNIXTIME(0), 'vala', 'valb' )`, } +var ( + // fixCompletedTimestampDone fixes a nil `completed_tiemstamp` columns, see + // https://github.com/vitessio/vitess/issues/13927 + // The fix is in release-18.0 + // TODO: remove in release-19.0 + fixCompletedTimestampDone bool +) var emptyResult = &sqltypes.Result{} var acceptableDropTableIfExistsErrorCodes = []int{mysql.ERCantFindFile, mysql.ERNoSuchTable} @@ -3852,13 +3859,17 @@ func (e *Executor) gcArtifacts(ctx context.Context) error { e.migrationMutex.Lock() defer e.migrationMutex.Unlock() - if _, err := e.execQuery(ctx, sqlFixCompletedTimestamp); err != nil { - // This query fixes a bug where stale migrations were marked as 'failed' without updating 'completed_timestamp' - // see https://github.com/vitessio/vitess/issues/8499 - // Running this query retroactively sets completed_timestamp - // This 'if' clause can be removed in version v13 - return err + // v18 fix (backported to 16). Remove in v19 + if !fixCompletedTimestampDone { + if _, err := e.execQuery(ctx, sqlFixCompletedTimestamp); err != nil { + // This query fixes a bug where stale migrations were marked as 'cancelled' or 'failed' without updating 'completed_timestamp' + // Running this query retroactively sets completed_timestamp + // This fix is created in v18 and can be removed in v19 + return err + } + fixCompletedTimestampDone = true } + query, err := sqlparser.ParseAndBind(sqlSelectUncollectedArtifacts, sqltypes.Int64BindVariable(int64((retainOnlineDDLTables).Seconds())), ) diff --git a/go/vt/vttablet/onlineddl/schema.go b/go/vt/vttablet/onlineddl/schema.go index adf550dabfe..c4a6d96953b 100644 --- a/go/vt/vttablet/onlineddl/schema.go +++ b/go/vt/vttablet/onlineddl/schema.go @@ -66,7 +66,8 @@ const ( migration_uuid=%a ` sqlUpdateMigrationStatusFailedOrCancelled = `UPDATE _vt.schema_migrations - SET migration_status=IF(cancelled_timestamp IS NULL, 'failed', 'cancelled') + SET migration_status=IF(cancelled_timestamp IS NULL, 'failed', 'cancelled'), + completed_timestamp=NOW(6) WHERE migration_uuid=%a ` @@ -349,7 +350,7 @@ const ( SET completed_timestamp=NOW(6) WHERE - migration_status='failed' + migration_status IN ('cancelled', 'failed') AND cleanup_timestamp IS NULL AND completed_timestamp IS NULL ` From 7012754a4696465515aa971747831eb0deca4eb6 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 7 Sep 2023 17:12:11 -0400 Subject: [PATCH 174/233] [release-16.0] Use Debian Bullseye in Bootstrap (#13757) (#13921) Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Co-authored-by: Florent Poinsard --- Makefile | 5 ++++- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/bootstrap/Dockerfile.mysql80 | 2 +- docker/bootstrap/Dockerfile.percona57 | 7 +++---- docker/bootstrap/Dockerfile.percona80 | 4 ++-- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 3 ++- docker/lite/Dockerfile.ubi7.mysql80 | 7 +++++-- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 4 +++- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 7 +++++-- docker/lite/Dockerfile.ubi8.mysql80 | 7 +++++-- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 4 ++-- docker/vttestserver/Dockerfile.mysql80 | 4 ++-- examples/compose/vtcompose/vtcompose.go | 6 +++--- test.go | 2 +- test/templates/dockerfile.tpl | 2 +- 27 files changed, 56 insertions(+), 38 deletions(-) diff --git a/Makefile b/Makefile index a61df12ffa9..b34e388064b 100644 --- a/Makefile +++ b/Makefile @@ -275,7 +275,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=14.5 +BOOTSTRAP_VERSION=14.6 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go @@ -328,6 +328,9 @@ $(DOCKER_LITE_TARGETS): docker_lite_%: docker_lite_all: docker_lite $(DOCKER_LITE_TARGETS) +docker_lite_push: + for i in $(DOCKER_LITE_SUFFIX); do echo "pushing lite image: $$i"; docker push vitess/lite:$$i || exit 1; done + docker_local: ${call build_docker_image,docker/local/Dockerfile,vitess/local} diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 2223d7d1fd6..35bf17f1aac 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index b0c9af936a4..a5c09a33f8e 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index c54ba510b3e..2a367f76684 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index 83b256c6737..7d599f54e29 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index 36ad6e8dd76..dbd611fbb5f 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -72,4 +72,8 @@ List of changes between bootstrap image versions. ## [14.5] - 2023-06-07 ### Changes -- Update build to golang 1.20.5 \ No newline at end of file +- Update build to golang 1.20.5 + +## [14.6] - 2023-09-06 +### Changes +- Use Debian Bullseye as base bootstrap image in order to continue upgrading the Golang version \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 5c6e4da5930..ba3b6b0dc1e 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.20.5-buster +FROM --platform=linux/amd64 golang:1.20.5-bullseye # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/bootstrap/Dockerfile.mysql80 b/docker/bootstrap/Dockerfile.mysql80 index e064c638d99..dbb16bdbebc 100644 --- a/docker/bootstrap/Dockerfile.mysql80 +++ b/docker/bootstrap/Dockerfile.mysql80 @@ -8,7 +8,7 @@ RUN for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyser for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyserver.ubuntu.com 467B942D3A79BD29 && break; done && \ add-apt-repository 'deb http://repo.mysql.com/apt/debian/ buster mysql-8.0' && \ for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done && \ - echo 'deb http://repo.percona.com/apt buster main' > /etc/apt/sources.list.d/percona.list && \ + echo 'deb http://repo.percona.com/apt bullseye main' > /etc/apt/sources.list.d/percona.list && \ { \ echo debconf debconf/frontend select Noninteractive; \ echo percona-server-server-8.0 percona-server-server/root_password password 'unused'; \ diff --git a/docker/bootstrap/Dockerfile.percona57 b/docker/bootstrap/Dockerfile.percona57 index 2d8beb5e95d..febe09fd8bf 100644 --- a/docker/bootstrap/Dockerfile.percona57 +++ b/docker/bootstrap/Dockerfile.percona57 @@ -5,16 +5,15 @@ FROM --platform=linux/amd64 "${image}" # Install Percona 5.7 RUN for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done && \ - add-apt-repository 'deb http://repo.percona.com/apt buster main' && \ + add-apt-repository 'deb http://repo.percona.com/apt bullseye main' && \ { \ echo debconf debconf/frontend select Noninteractive; \ echo percona-server-server-5.7 percona-server-server/root_password password 'unused'; \ echo percona-server-server-5.7 percona-server-server/root_password_again password 'unused'; \ } | debconf-set-selections && \ apt-get update && \ - apt-get install -y --no-install-recommends \ - percona-server-server-5.7 \ - libperconaserverclient20-dev percona-xtrabackup-24 && \ + apt-get install -y --no-install-recommends percona-server-server-5.7 && \ + apt-get install -y --no-install-recommends libperconaserverclient20-dev percona-xtrabackup-24 && \ rm -rf /var/lib/apt/lists/* # Bootstrap Vitess diff --git a/docker/bootstrap/Dockerfile.percona80 b/docker/bootstrap/Dockerfile.percona80 index 5dadc32cd0a..446ec554612 100644 --- a/docker/bootstrap/Dockerfile.percona80 +++ b/docker/bootstrap/Dockerfile.percona80 @@ -5,7 +5,7 @@ FROM --platform=linux/amd64 "${image}" # Install Percona 8.0 RUN for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done \ - && echo 'deb http://repo.percona.com/ps-80/apt buster main' > /etc/apt/sources.list.d/percona.list && \ + && echo 'deb http://repo.percona.com/ps-80/apt bullseye main' > /etc/apt/sources.list.d/percona.list && \ { \ echo debconf debconf/frontend select Noninteractive; \ echo percona-server-server-8.0 percona-server-server/root_password password 'unused'; \ @@ -21,7 +21,7 @@ RUN for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.c rsync \ libev4 \ # && rm -f /etc/apt/sources.list.d/percona.list \ - && echo 'deb http://repo.percona.com/apt buster main' > /etc/apt/sources.list.d/percona.list \ + && echo 'deb http://repo.percona.com/apt bullseye main' > /etc/apt/sources.list.d/percona.list \ # { \ # echo debconf debconf/frontend select Noninteractive; \ # echo percona-server-server-8.0 percona-server-server/root_password password 'unused'; \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index 21227e342e0..9bb6905339a 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index 9d5f1980865..07dc9a3afb3 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index 178b0f702df..ff784c76e25 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index f4d6e0a0e71..48abed4585f 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index a86eea7e786..db4468b297d 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index 405263d974a..c14d0e71cf6 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder @@ -36,6 +36,7 @@ RUN make install PREFIX=/vt/install FROM registry.access.redhat.com/ubi7/ubi:latest # Install keys and dependencies +RUN rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \ && yum install -y --setopt=alwaysprompt=no gnupg \ && ( gpg --keyserver keyserver.ubuntu.com --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 A4A9406876FCBD3C456770C88C718D3B5072E1F5 ) \ diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index 3003ffdbe03..1d4dc9b08a7 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder @@ -36,6 +36,7 @@ RUN make install PREFIX=/vt/install FROM registry.access.redhat.com/ubi7/ubi:latest # Install keys and dependencies +RUN rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \ && yum install -y --setopt=alwaysprompt=no gnupg \ && ( gpg --keyserver keyserver.ubuntu.com --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 A4A9406876FCBD3C456770C88C718D3B5072E1F5 ) \ @@ -51,6 +52,8 @@ RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \ && rm -f /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm RUN echo H4sICH852V8CA2ZvbwC1jr0OgkAQhPt7CgrbY7W6xOQaDaEgRqKxMMTiOFYg/F2WI9G39xCttKGg2UxmJrNfokWqeryxVjUo99ja45kLj3s757IxGqiWhbVmC9CURB352rW63u8oh0mCAHdWY1uRLoDlJtcF6kpuRlnhU97LGt0CoNVgqhLINNxFcIoPPIxDHgVX/v3OsFVpjZlcM5ZoMZhMWex/ES9TMIPyM7UYKj4sqT+kwdufAToNLcP5AvRgmV7zAQAA | base64 -d | gzip -dc > /etc/yum.repos.d/CentOS-Base.repo \ && yum install -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs --enablerepo c7base --enablerepo c7updates --enablerepo c7extras install libev gperftools-libs numactl-libs sysstat strace +RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm +RUN yum install -y zstd RUN yum update -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs \ && yum install -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs bzip2 ca-certificates gnupg libaio libcurl \ jemalloc gperftools-libs procps-ng rsync wget openssl hostname curl tzdata make \ @@ -60,7 +63,7 @@ RUN yum update -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs \ mysql-community-client mysql-community-server \ # Have to use hacks to ignore conflicts on /etc/my.cnf install && mkdir -p /tmp/1 \ - && yum install -y --setopt=alwaysprompt=no --downloadonly --downloaddir=/tmp/1 --enablerepo mysql80-community --disablerepo mysql57-community percona-xtrabackup-80 percona-toolkit \ + && yum install -y --skip-broken --setopt=alwaysprompt=no --downloadonly --downloaddir=/tmp/1 --enablerepo mysql80-community --disablerepo mysql57-community percona-xtrabackup-80 percona-toolkit \ && rpm -Uvh --replacefiles /tmp/1/*rpm \ && rm -rf /tmp/1 \ && yum clean all \ diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index b485aa660f1..8ad74e41734 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index 20cc21e4319..48784bdff0a 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder @@ -47,6 +47,8 @@ RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \ && rpmkeys --checksig /tmp/perconarepo.rpm \ && rpm -Uvh /tmp/perconarepo.rpm \ && rm -f /tmp/perconarepo.rpm +RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm +RUN yum install -y zstd RUN echo H4sICH852V8CA2ZvbwC1jr0OgkAQhPt7CgrbY7W6xOQaDaEgRqKxMMTiOFYg/F2WI9G39xCttKGg2UxmJrNfokWqeryxVjUo99ja45kLj3s757IxGqiWhbVmC9CURB352rW63u8oh0mCAHdWY1uRLoDlJtcF6kpuRlnhU97LGt0CoNVgqhLINNxFcIoPPIxDHgVX/v3OsFVpjZlcM5ZoMZhMWex/ES9TMIPyM7UYKj4sqT+kwdufAToNLcP5AvRgmV7zAQAA | base64 -d | gzip -dc > /etc/yum.repos.d/CentOS-Base.repo \ && yum install -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs --enablerepo c7base --enablerepo c7updates --enablerepo c7extras install libev gperftools-libs numactl-libs sysstat strace RUN yum update -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs \ diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index a8f993a7279..2df3b01ba5f 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder @@ -36,6 +36,7 @@ RUN make cross-install PREFIX=/vt/install GOOS=linux GOARCH=arm64 FROM registry.access.redhat.com/ubi8/ubi:latest # Install keys and dependencies +RUN rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \ && yum install -y --setopt=alwaysprompt=no gnupg \ && ( gpg --keyserver keyserver.ubuntu.com --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 99DB70FAE1D7CE227FB6488205B555B38483C65D 3A79BD29 A4A9406876FCBD3C456770C88C718D3B5072E1F5 94E279EB8D8F25B21810ADF121EA45AB2F86D6A1 ) \ @@ -52,10 +53,12 @@ RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \ && rpmkeys --checksig /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm \ && rpm -Uvh /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm \ && rm -f /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm +RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm +RUN yum install -y zstd RUN echo H4sICIDAHmICA2ZvbwDVkDFLxEAQhfv9FVfY7o4RhCBsoXJcIXKHwUIOi7m5MVk2yS6zG0//vYlRULTU4rrHvOHN+2ZL5Q4TP6oeO7bX3Od1pcuFXlyNUzVZg7S2yTmmCwDsgzjuDSUyB5SDI2+QzOChcyJBEnwkPOPQZijNuTkrigKmsHUFJ1MeCjUQEqg61tQweVtM0vOrfXItj1eAM0H0DiR2erTgbnOrV5uVvlk+6M+Kinvctby3p0ptqRziHjOnnxz3s/FnKJcxVlkYu/+k4Zcs+AvM8n3+jWW8MBc2NO6FZILUMEsoYQ76UvWI/vAGB/SOZZsCAAA= | base64 -d | gzip -dc > /etc/yum.repos.d/CentOS-Base.repo \ && yum install -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs --enablerepo c8base --enablerepo c8updates --enablerepo c8extras libev numactl-libs sysstat strace \ && yum install -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs https://download-ib01.fedoraproject.org/pub/epel/8/Everything/aarch64/Packages/g/gperftools-libs-2.7-9.el8.aarch64.rpm https://download-ib01.fedoraproject.org/pub/epel/8/Everything/aarch64/Packages/j/jemalloc-5.2.1-2.el8.aarch64.rpm https://download-ib01.fedoraproject.org/pub/epel/8/Everything/aarch64/Packages/l/libunwind-1.3.1-3.el8.aarch64.rpm -RUN yum update -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs \ +RUN yum update -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs --nobest \ && yum install -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs bzip2 ca-certificates gnupg libaio libcurl \ procps-ng rsync wget openssl hostname curl tzdata make \ # Can't use alwaysprompt=no here, since we need to pick up deps diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index f5b2dbbf146..59189f89587 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder @@ -36,6 +36,7 @@ RUN make install PREFIX=/vt/install FROM registry.access.redhat.com/ubi8/ubi:latest # Install keys and dependencies +RUN rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \ && yum install -y --setopt=alwaysprompt=no gnupg \ && ( gpg --keyserver keyserver.ubuntu.com --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 99DB70FAE1D7CE227FB6488205B555B38483C65D 3A79BD29 A4A9406876FCBD3C456770C88C718D3B5072E1F5 94E279EB8D8F25B21810ADF121EA45AB2F86D6A1 ) \ @@ -51,10 +52,12 @@ RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \ && rpmkeys --checksig /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm \ && rpm -Uvh /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm \ && rm -f /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm +RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm +RUN yum install -y zstd RUN echo H4sICIDAHmICA2ZvbwDVkDFLxEAQhfv9FVfY7o4RhCBsoXJcIXKHwUIOi7m5MVk2yS6zG0//vYlRULTU4rrHvOHN+2ZL5Q4TP6oeO7bX3Od1pcuFXlyNUzVZg7S2yTmmCwDsgzjuDSUyB5SDI2+QzOChcyJBEnwkPOPQZijNuTkrigKmsHUFJ1MeCjUQEqg61tQweVtM0vOrfXItj1eAM0H0DiR2erTgbnOrV5uVvlk+6M+Kinvctby3p0ptqRziHjOnnxz3s/FnKJcxVlkYu/+k4Zcs+AvM8n3+jWW8MBc2NO6FZILUMEsoYQ76UvWI/vAGB/SOZZsCAAA= | base64 -d | gzip -dc > /etc/yum.repos.d/CentOS-Base.repo \ && yum install -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs --enablerepo c8base --enablerepo c8updates --enablerepo c8extras libev numactl-libs sysstat strace \ && yum install -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/g/gperftools-libs-2.7-9.el8.x86_64.rpm https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/j/jemalloc-5.2.1-2.el8.x86_64.rpm https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/l/libunwind-1.3.1-3.el8.x86_64.rpm -RUN yum update -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs \ +RUN yum update -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs --nobest \ && yum install -y --setopt=alwaysprompt=no --setopt=tsflags=nodocs bzip2 ca-certificates gnupg libaio libcurl \ procps-ng rsync wget openssl hostname curl tzdata make \ # Can't use alwaysprompt=no here, since we need to pick up deps diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index 6d4b96cc3ec..33769d9e888 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index 5f553816a15..228c1e72d93 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder @@ -33,7 +33,7 @@ USER vitess RUN make install-testing PREFIX=/vt/install # Start over and build the final image. -FROM debian:buster-slim +FROM debian:bullseye-slim # Install dependencies COPY docker/lite/install_dependencies.sh /vt/dist/install_dependencies.sh diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index e5ad3098226..303d0e82311 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder @@ -33,7 +33,7 @@ USER vitess RUN make install-testing PREFIX=/vt/install # Start over and build the final image. -FROM debian:buster-slim +FROM debian:bullseye-slim # Install dependencies COPY docker/lite/install_dependencies.sh /vt/dist/install_dependencies.sh diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index a13742ea2c0..8ef6dcec387 100644 --- a/examples/compose/vtcompose/vtcompose.go +++ b/examples/compose/vtcompose/vtcompose.go @@ -196,9 +196,9 @@ func main() { // Check if it is an external_db if _, ok := externalDbInfoMap[k]; ok { - //This is no longer necessary, but we'll keep it for reference - //https://github.com/vitessio/vitess/pull/4868, https://github.com/vitessio/vitess/pull/5010 - //vSchemaFile = applyJsonInMemoryPatch(vSchemaFile,`[{"op": "add","path": "/tables/*", "value": {}}]`) + // This is no longer necessary, but we'll keep it for reference + // https://github.com/vitessio/vitess/pull/4868, https://github.com/vitessio/vitess/pull/5010 + // vSchemaFile = applyJsonInMemoryPatch(vSchemaFile,`[{"op": "add","path": "/tables/*", "value": {}}]`) } else { var primaryTableColumns map[string]string vSchemaFile, primaryTableColumns = addTablesVschemaPatch(vSchemaFile, keyspaceData.schemaFileNames) diff --git a/test.go b/test.go index d62441629be..8cc1723f0f5 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "14.5", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "14.6", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index f5d8af80cab..bc494050f7d 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.5 +ARG bootstrap_version=14.6 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" From 1fd96b48d1dab49ccf65136fc8d83a62be61f007 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 8 Sep 2023 13:48:15 -0400 Subject: [PATCH 175/233] [release-16.0] Upgrade the Golang version to `go1.20.8` (#13932) Co-authored-by: frouioui Co-authored-by: Florent Poinsard --- .github/workflows/assign_milestone.yml | 2 +- .github/workflows/check_make_vtadmin_authz_testgen.yml | 2 +- .github/workflows/check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr_mysql57.yml | 2 +- .../cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .github/workflows/cluster_endtoend_mysql_server_vault.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_scheduler.yml | 2 +- .../cluster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- ...luster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl.yml | 2 +- .../workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_consul.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_tablegc.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_throttler.yml | 2 +- ...uster_endtoend_tabletmanager_throttler_custom_config.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .../workflows/cluster_endtoend_topo_connection_cache.yml | 2 +- .../cluster_endtoend_vreplication_across_db_versions.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_basic.yml | 2 +- .../workflows/cluster_endtoend_vreplication_cellalias.yml | 2 +- ...ster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .../workflows/cluster_endtoend_vreplication_multicell.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_v2.yml | 2 +- .github/workflows/cluster_endtoend_vstream_failover.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_false.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_true.yml | 2 +- .../cluster_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- ...uster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_general_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_godriver.yml | 2 +- .../workflows/cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .../workflows/cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_reservedconn.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .../workflows/cluster_endtoend_vtgate_schema_tracker.yml | 2 +- .../cluster_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_consul.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_transaction.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_unsharded.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .github/workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 2 +- .github/workflows/docker_test_cluster_10.yml | 2 +- .github/workflows/docker_test_cluster_25.yml | 2 +- .github/workflows/e2e_race.yml | 2 +- .github/workflows/endtoend.yml | 2 +- .github/workflows/local_example.yml | 2 +- .github/workflows/region_example.yml | 2 +- .github/workflows/sonar_analysis.yml | 2 +- .github/workflows/static_checks_etc.yml | 2 +- .github/workflows/unit_race.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- .github/workflows/update_golang_version.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 2 +- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 2 +- .../upgrade_downgrade_test_backups_manual_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries.yml | 2 +- ...de_downgrade_test_query_serving_queries_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_schema.yml | 2 +- ...ade_downgrade_test_query_serving_schema_next_release.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 2 +- docker/lite/Dockerfile.ubi7.mysql80 | 2 +- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 2 +- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 2 +- docker/lite/Dockerfile.ubi8.mysql80 | 2 +- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- test.go | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_docker.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/dockerfile.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 128 files changed, 132 insertions(+), 128 deletions(-) diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index 42413941471..626d3ce14a2 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index 9ffd6b53309..c000f3198b0 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -48,7 +48,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 90ee01bd72f..874707c67fd 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -50,7 +50,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index c4741a582d1..056ac512f72 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 82e1633364e..e83444b95ef 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 d813e799953..7e9d597df57 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 4cf3db3efb5..aee8d491ae8 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 3149d2b3721..f99601db059 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 1c2257fc5f1..9e6b0777821 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index c4f56eb3bc9..ada7ccbbd34 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index fdf60c2d921..530ad9eae39 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 4181df3f56f..175f53b7bda 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 771c6aa4097..602c9ab999a 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 d954619cc43..c00a972dd78 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 476553ee3bd..4c72209f226 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 6101e4fbc21..4cffa4caaef 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 0ec1987eaf2..703eab7a8ea 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 16247813e79..1d1429f2bfe 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 a278abfc8cc..fc552f7e37f 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 9dbcbe6652d..84139168bdd 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 96469d73d49..5566aa2e550 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 1310893eb9d..97e3f002034 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 642daa653f2..55f5c2b3b7a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 c3d772e6f47..8dc65820b73 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 ef317f37b21..13509e70e3a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 e78aea9d982..2cfa7d12d4e 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 c2710722ddb..8e960d3c41f 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 dd20d37431b..1d18b2b36a8 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 b833b55bd18..3dbbba573aa 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 0e1c8097800..378c9609417 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 5740d9ed8f1..d9e6653d5cf 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 8243fefd503..e4732868da5 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 eab347079cf..5a2081689ea 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 05252a55f2c..cc71bd5e0b0 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 b14ff1a8c81..596f2c36e49 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 4e79ad26f0f..220d45d58be 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 011e7085ae5..1e25a842831 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 9ed793f0543..3027b28c6b8 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 e08f39735fd..d33783d257b 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 89e52d40bcc..9b245c8595f 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 d7df7ba0eda..91edcb9d8e2 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 b43f9d21939..d43f4664968 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 75bfd84685b..5c7868b0e32 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 86b2182a49c..e1c4699b65a 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 b8495923377..42042071cf8 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 2eb00c367dd..675b64e64be 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 f2a16eedecb..dff7a842287 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index 3cdb11f4b79..ff17a63b767 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 cfb76ff5bf2..bc07125f1f3 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 b88ba288893..3aaee43af92 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 b2a413ab7b3..3161053fd68 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 ac6b9927f1f..6982c6acfda 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 e5481ec140b..26d1b198a4f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 3dc7c31dba2..13015700fe7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 6666ea18e76..fe8de9d9d5a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 cdeab66621d..de53010f685 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 629b0e6d763..be356d8c781 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 898365c92fe..6b59f050a63 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 18ba08aa8ea..1ec982dc81e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 e554845a041..05881d09d98 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 97377b17ad8..8d20c0b43e0 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 7a842d6b20c..a2671328e77 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 da7e9ade564..fca95a26844 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 6d72a7d92bf..3ab6ca26a25 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 1ef844cc3a1..d4ba377f7c6 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 05436cb5990..ea65dce089c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 0d23f9d3fbb..af73b945d39 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 3ce296802ae..e8ded8b55be 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 c28b17c657a..36529fc6e31 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 ce74715c0a6..21b82d83b78 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 8d478d38ec8..3e53566f9a1 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 d657bfc1fc7..fc5a0def074 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 f2570f616ac..39d618b51c1 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 40c1617acf8..fa110a24b0d 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 4e4ed75b45f..669231f287a 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -42,7 +42,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Get base dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 1ad9dcfdaeb..677cd49a146 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index b30d1687643..a236185dea7 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index de75ed577f2..f6b3f644914 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 87f97a205a9..f4b2e2635c5 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index 9c28676795d..fa28f46fd7e 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index 639b02edc40..f0b04fd3947 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index 824ed20eaaa..faed1845135 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index 9c1f90ade40..c9e44063562 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS run: | diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 0000d37b799..5139d73d77e 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -105,7 +105,7 @@ jobs: 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@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 96a8e214f98..f36c7190974 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -55,7 +55,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 02473ec6d46..621068ff45f 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index e12a0e5d29a..bc8b8502779 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index 19d1c50a25b..a80f234f6b8 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 0c76e314cac..20621f503ed 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -83,7 +83,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index d97b677110b..1b57d54b1ce 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -86,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 079943f1925..7bfac25cd38 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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 7148834efe7..b93e75f03e2 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 04694af0688..79ab3b038e0 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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 54138981f4f..a29b87c25be 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 60900425aa2..5080fcfaf1d 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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 ccc06158473..7ef97bbeae4 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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 9e3fa8fff57..00761ba186f 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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 f73acecdd77..20458bd2a08 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 99028510716..9539f83f3b8 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 2bca1844ba8..965fb92786e 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/Makefile b/Makefile index b34e388064b..b69bb168707 100644 --- a/Makefile +++ b/Makefile @@ -275,7 +275,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=14.6 +BOOTSTRAP_VERSION=14.7 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index 038f791c3c3..ca1110e9af4 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.20.5 || echo "Go version reported: `go version`. Version 1.20.5+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.20.8 || echo "Go version reported: `go version`. Version 1.20.8+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 35bf17f1aac..24cd4b22cec 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index a5c09a33f8e..9e60efde5f2 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index 2a367f76684..bcb1669601d 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index 7d599f54e29..c872d140a72 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index dbd611fbb5f..59a4567696c 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -74,6 +74,10 @@ List of changes between bootstrap image versions. ### Changes - Update build to golang 1.20.5 -## [14.6] - 2023-09-06 +## [14.6] - 2023-09-07 +### Changes +- Update build to golang 1.20.8 + +## [14.7] - 2023-09-06 ### Changes - Use Debian Bullseye as base bootstrap image in order to continue upgrading the Golang version \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index ba3b6b0dc1e..243d8425dd6 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.20.5-bullseye +FROM --platform=linux/amd64 golang:1.20.8-bullseye # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index 9bb6905339a..152446b2160 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index 07dc9a3afb3..f395d03d36d 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index ff784c76e25..0bdd2390243 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index 48abed4585f..85ac23141c3 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index db4468b297d..dba735d9947 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index c14d0e71cf6..e43a30e018e 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index 1d4dc9b08a7..df61310f844 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index 8ad74e41734..57ed183fa36 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index 48784bdff0a..b18e35a2573 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index 2df3b01ba5f..235f4fc6a47 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index 59189f89587..b983a7b4ce4 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index 33769d9e888..d520780387d 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index 228c1e72d93..2aefd753c02 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index 303d0e82311..ab1e6efd104 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/test.go b/test.go index 8cc1723f0f5..2e7f566a110 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "14.6", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "14.7", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index ff5bd434236..4e7e0b5c056 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python 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 eee5c7073a4..e359ed94539 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - 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_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index ce3ffe76a84..c986126632a 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -68,7 +68,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index bc494050f7d..c1187ec0527 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.6 +ARG bootstrap_version=14.7 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index ea0d455c92e..f281f5e0137 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -59,7 +59,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.8 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' From d75b9dce27f08894790144f7d2d904844ef176dc Mon Sep 17 00:00:00 2001 From: Arthur Schreiber Date: Thu, 14 Sep 2023 20:27:50 +0200 Subject: [PATCH 176/233] [release-16.0] Fix: convertBoolToSemiSyncAction method to account for all semi sync actions (#13075) (#13958) Signed-off-by: William Lu Signed-off-by: William Lu Signed-off-by: Arthur Schreiber Co-authored-by: William Lu <31415453+WilliamLu99@users.noreply.github.com> --- go/cmd/vtcombo/main.go | 5 ++ .../reparent/newfeaturetest/reparent_test.go | 37 +++++++++++++++ .../fakemysqldaemon/fakemysqldaemon.go | 5 ++ go/vt/mysqlctl/mysql_daemon.go | 1 + go/vt/mysqlctl/replication.go | 13 ++++++ go/vt/vterrors/code.go | 2 + go/vt/vttablet/tabletmanager/rpc_actions.go | 30 ++++++++++-- .../vttablet/tabletmanager/rpc_replication.go | 46 +++++++++++++++---- go/vt/vttablet/tabletmanager/tm_init.go | 9 +++- 9 files changed, 134 insertions(+), 14 deletions(-) diff --git a/go/cmd/vtcombo/main.go b/go/cmd/vtcombo/main.go index 52cf2f0c8d2..61e862475dc 100644 --- a/go/cmd/vtcombo/main.go +++ b/go/cmd/vtcombo/main.go @@ -345,3 +345,8 @@ func (mysqld *vtcomboMysqld) StopReplication(hookExtraEnv map[string]string) err func (mysqld *vtcomboMysqld) SetSemiSyncEnabled(source, replica bool) error { return nil } + +// SemiSyncExtensionLoaded implements the MysqlDaemon interface +func (mysqld *vtcomboMysqld) SemiSyncExtensionLoaded() (bool, error) { + return true, nil +} diff --git a/go/test/endtoend/reparent/newfeaturetest/reparent_test.go b/go/test/endtoend/reparent/newfeaturetest/reparent_test.go index db7784f6459..d5f37dc8604 100644 --- a/go/test/endtoend/reparent/newfeaturetest/reparent_test.go +++ b/go/test/endtoend/reparent/newfeaturetest/reparent_test.go @@ -17,6 +17,8 @@ limitations under the License. package newfeaturetest import ( + "context" + "fmt" "testing" "github.com/stretchr/testify/require" @@ -109,3 +111,38 @@ func TestTabletRestart(t *testing.T) { err := tablets[1].VttabletProcess.Setup() require.NoError(t, err) } + +// Tests ensures that ChangeTabletType works even when semi-sync plugins are not loaded. +func TestChangeTypeWithoutSemiSync(t *testing.T) { + defer cluster.PanicHandler(t) + clusterInstance := utils.SetupReparentCluster(t, "none") + defer utils.TeardownCluster(clusterInstance) + tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets + + ctx := context.Background() + + primary, replica := tablets[0], tablets[1] + + // Unload semi sync plugins + for _, tablet := range tablets[0:4] { + qr := utils.RunSQL(ctx, t, "select @@global.super_read_only", tablet) + result := fmt.Sprintf("%v", qr.Rows[0][0].ToString()) + if result == "1" { + utils.RunSQL(ctx, t, "set global super_read_only = 0", tablet) + } + + utils.RunSQL(ctx, t, "UNINSTALL PLUGIN rpl_semi_sync_slave;", tablet) + utils.RunSQL(ctx, t, "UNINSTALL PLUGIN rpl_semi_sync_master;", tablet) + } + + utils.ValidateTopology(t, clusterInstance, true) + utils.CheckPrimaryTablet(t, clusterInstance, primary) + + // Change replica's type to rdonly + err := clusterInstance.VtctlclientProcess.ExecuteCommand("ChangeTabletType", replica.Alias, "rdonly") + require.NoError(t, err) + + // Change tablets type from rdonly back to replica + err = clusterInstance.VtctlclientProcess.ExecuteCommand("ChangeTabletType", replica.Alias, "replica") + require.NoError(t, err) +} diff --git a/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go b/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go index dfa24555f25..5d7d5a9c0ec 100644 --- a/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go +++ b/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go @@ -663,6 +663,11 @@ func (fmd *FakeMysqlDaemon) SemiSyncClients() uint32 { return 0 } +// SemiSyncExtensionLoaded is part of the MysqlDaemon interface. +func (fmd *FakeMysqlDaemon) SemiSyncExtensionLoaded() (bool, error) { + return true, nil +} + // SemiSyncSettings is part of the MysqlDaemon interface. func (fmd *FakeMysqlDaemon) SemiSyncSettings() (timeout uint64, numReplicas uint32) { return 10000000, 1 diff --git a/go/vt/mysqlctl/mysql_daemon.go b/go/vt/mysqlctl/mysql_daemon.go index ac0aede5614..a05585faa3c 100644 --- a/go/vt/mysqlctl/mysql_daemon.go +++ b/go/vt/mysqlctl/mysql_daemon.go @@ -57,6 +57,7 @@ type MysqlDaemon interface { GetGTIDPurged(ctx context.Context) (mysql.Position, error) SetSemiSyncEnabled(source, replica bool) error SemiSyncEnabled() (source, replica bool) + SemiSyncExtensionLoaded() (bool, error) SemiSyncStatus() (source, replica bool) SemiSyncClients() (count uint32) SemiSyncSettings() (timeout uint64, numReplicas uint32) diff --git a/go/vt/mysqlctl/replication.go b/go/vt/mysqlctl/replication.go index bcad45012d1..dc00e7fd86c 100644 --- a/go/vt/mysqlctl/replication.go +++ b/go/vt/mysqlctl/replication.go @@ -705,3 +705,16 @@ func (mysqld *Mysqld) SemiSyncReplicationStatus() (bool, error) { } return false, nil } + +// SemiSyncExtensionLoaded returns whether semi-sync plugins are loaded. +func (mysqld *Mysqld) SemiSyncExtensionLoaded() (bool, error) { + qr, err := mysqld.FetchSuperQuery(context.Background(), "SELECT COUNT(*) > 0 AS plugin_loaded FROM information_schema.plugins WHERE plugin_name LIKE 'rpl_semi_sync%'") + if err != nil { + return false, err + } + pluginPresent, err := qr.Rows[0][0].ToBool() + if err != nil { + return false, err + } + return pluginPresent, nil +} diff --git a/go/vt/vterrors/code.go b/go/vt/vterrors/code.go index 9b4351d8e7b..50238c38eee 100644 --- a/go/vt/vterrors/code.go +++ b/go/vt/vterrors/code.go @@ -67,6 +67,7 @@ var ( VT09008 = errorWithoutState("VT09008", vtrpcpb.Code_FAILED_PRECONDITION, "vexplain queries/all will actually run queries", "vexplain queries/all will actually run queries. `/*vt+ EXECUTE_DML_QUERIES */` must be set to run DML queries in vtexplain. Example: `vexplain /*vt+ EXECUTE_DML_QUERIES */ queries delete from t1`") VT09009 = errorWithoutState("VT09009", vtrpcpb.Code_FAILED_PRECONDITION, "stream is supported only for primary tablet type, current type: %v", "Stream is only supported for primary tablets, please use a stream on those tablets.") VT09010 = errorWithoutState("VT09010", vtrpcpb.Code_FAILED_PRECONDITION, "SHOW VITESS_THROTTLER STATUS works only on primary tablet", "SHOW VITESS_THROTTLER STATUS works only on primary tablet.") + VT09013 = errorWithoutState("VT09013", vtrpcpb.Code_FAILED_PRECONDITION, "semi-sync plugins are not loaded", "Durability policy wants Vitess to use semi-sync, but the MySQL instances don't have the semi-sync plugin loaded.") VT10001 = errorWithoutState("VT10001", vtrpcpb.Code_ABORTED, "foreign key constraints are not allowed", "Foreign key constraints are not allowed, see https://vitess.io/blog/2021-06-15-online-ddl-why-no-fk/.") @@ -123,6 +124,7 @@ var ( VT09008, VT09009, VT09010, + VT09013, VT10001, VT12001, VT13001, diff --git a/go/vt/vttablet/tabletmanager/rpc_actions.go b/go/vt/vttablet/tabletmanager/rpc_actions.go index 1093c331a1a..d27cff5ebc8 100644 --- a/go/vt/vttablet/tabletmanager/rpc_actions.go +++ b/go/vt/vttablet/tabletmanager/rpc_actions.go @@ -82,7 +82,13 @@ func (tm *TabletManager) ChangeType(ctx context.Context, tabletType topodatapb.T return err } defer tm.unlock() - return tm.changeTypeLocked(ctx, tabletType, DBActionNone, convertBoolToSemiSyncAction(semiSync)) + + semiSyncAction, err := tm.convertBoolToSemiSyncAction(semiSync) + if err != nil { + return err + } + + return tm.changeTypeLocked(ctx, tabletType, DBActionNone, semiSyncAction) } // ChangeType changes the tablet type @@ -142,9 +148,23 @@ func (tm *TabletManager) RunHealthCheck(ctx context.Context) { tm.QueryServiceControl.BroadcastHealth() } -func convertBoolToSemiSyncAction(semiSync bool) SemiSyncAction { - if semiSync { - return SemiSyncActionSet +func (tm *TabletManager) convertBoolToSemiSyncAction(semiSync bool) (SemiSyncAction, error) { + semiSyncExtensionLoaded, err := tm.MysqlDaemon.SemiSyncExtensionLoaded() + if err != nil { + return SemiSyncActionNone, err + } + + if semiSyncExtensionLoaded { + if semiSync { + return SemiSyncActionSet, nil + } else { + return SemiSyncActionUnset, nil + } + } else { + if semiSync { + return SemiSyncActionNone, vterrors.VT09013() + } else { + return SemiSyncActionNone, nil + } } - return SemiSyncActionUnset } diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index 21c502bfa1e..02c9658023b 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -247,7 +247,12 @@ func (tm *TabletManager) StartReplication(ctx context.Context, semiSync bool) er } defer tm.unlock() - if err := tm.fixSemiSync(tm.Tablet().Type, convertBoolToSemiSyncAction(semiSync)); err != nil { + semiSyncAction, err := tm.convertBoolToSemiSyncAction(semiSync) + if err != nil { + return err + } + + if err := tm.fixSemiSync(tm.Tablet().Type, semiSyncAction); err != nil { return err } return tm.MysqlDaemon.StartReplication(tm.hookExtraEnv()) @@ -321,16 +326,21 @@ func (tm *TabletManager) InitPrimary(ctx context.Context, semiSync bool) (string return "", err } + semiSyncAction, err := tm.convertBoolToSemiSyncAction(semiSync) + if err != nil { + return "", err + } + // Set the server read-write, from now on we can accept real // client writes. Note that if semi-sync replication is enabled, // we'll still need some replicas to be able to commit transactions. - if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_PRIMARY, DBActionSetReadWrite, convertBoolToSemiSyncAction(semiSync)); err != nil { + if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_PRIMARY, DBActionSetReadWrite, semiSyncAction); err != nil { return "", err } // Enforce semi-sync after changing the tablet type to PRIMARY. Otherwise, the // primary will hang while trying to create the database. - if err := tm.fixSemiSync(topodatapb.TabletType_PRIMARY, convertBoolToSemiSyncAction(semiSync)); err != nil { + if err := tm.fixSemiSync(topodatapb.TabletType_PRIMARY, semiSyncAction); err != nil { return "", err } @@ -360,11 +370,16 @@ func (tm *TabletManager) InitReplica(ctx context.Context, parent *topodatapb.Tab } defer tm.unlock() + semiSyncAction, err := tm.convertBoolToSemiSyncAction(semiSync) + if err != nil { + return err + } + // If we were a primary type, switch our type to replica. This // is used on the old primary when using InitShardPrimary with // -force, and the new primary is different from the old primary. if tm.Tablet().Type == topodatapb.TabletType_PRIMARY { - if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_REPLICA, DBActionNone, convertBoolToSemiSyncAction(semiSync)); err != nil { + if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_REPLICA, DBActionNone, semiSyncAction); err != nil { return err } } @@ -385,7 +400,7 @@ func (tm *TabletManager) InitReplica(ctx context.Context, parent *topodatapb.Tab if tt == topodatapb.TabletType_PRIMARY { tt = topodatapb.TabletType_REPLICA } - if err := tm.fixSemiSync(tt, convertBoolToSemiSyncAction(semiSync)); err != nil { + if err := tm.fixSemiSync(tt, semiSyncAction); err != nil { return err } @@ -525,8 +540,13 @@ func (tm *TabletManager) UndoDemotePrimary(ctx context.Context, semiSync bool) e } defer tm.unlock() + semiSyncAction, err := tm.convertBoolToSemiSyncAction(semiSync) + if err != nil { + return err + } + // If using semi-sync, we need to enable source-side. - if err := tm.fixSemiSync(topodatapb.TabletType_PRIMARY, convertBoolToSemiSyncAction(semiSync)); err != nil { + if err := tm.fixSemiSync(topodatapb.TabletType_PRIMARY, semiSyncAction); err != nil { return err } @@ -583,9 +603,14 @@ func (tm *TabletManager) SetReplicationSource(ctx context.Context, parentAlias * } defer tm.unlock() + semiSyncAction, err := tm.convertBoolToSemiSyncAction(semiSync) + if err != nil { + return err + } + // setReplicationSourceLocked also fixes the semi-sync. In case the tablet type is primary it assumes that it will become a replica if SetReplicationSource // is called, so we always call fixSemiSync with a non-primary tablet type. This will always set the source side replication to false. - return tm.setReplicationSourceLocked(ctx, parentAlias, timeCreatedNS, waitPosition, forceStartReplication, convertBoolToSemiSyncAction(semiSync)) + return tm.setReplicationSourceLocked(ctx, parentAlias, timeCreatedNS, waitPosition, forceStartReplication, semiSyncAction) } func (tm *TabletManager) setReplicationSourceRepairReplication(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartReplication bool) (err error) { @@ -839,8 +864,13 @@ func (tm *TabletManager) PromoteReplica(ctx context.Context, semiSync bool) (str return "", err } + semiSyncAction, err := tm.convertBoolToSemiSyncAction(semiSync) + if err != nil { + return "", err + } + // If using semi-sync, we need to enable it before going read-write. - if err := tm.fixSemiSync(topodatapb.TabletType_PRIMARY, convertBoolToSemiSyncAction(semiSync)); err != nil { + if err := tm.fixSemiSync(topodatapb.TabletType_PRIMARY, semiSyncAction); err != nil { return "", err } diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 408f5b44947..6d2884e6f7e 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -872,8 +872,15 @@ func (tm *TabletManager) initializeReplication(ctx context.Context, tabletType t } // If using semi-sync, we need to enable it before connecting to primary. // We should set the correct type, since it is used in replica semi-sync + tablet.Type = tabletType - if err := tm.fixSemiSync(tabletType, convertBoolToSemiSyncAction(reparentutil.IsReplicaSemiSync(durability, currentPrimary.Tablet, tablet))); err != nil { + + semiSyncAction, err := tm.convertBoolToSemiSyncAction(reparentutil.IsReplicaSemiSync(durability, currentPrimary.Tablet, tablet)) + if err != nil { + return nil, err + } + + if err := tm.fixSemiSync(tabletType, semiSyncAction); err != nil { return nil, err } From 09b29275b4a1ce71786583cf2a4c63a7a2fa2542 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 18:14:22 -0400 Subject: [PATCH 177/233] [release-16.0] VDiff: correct handling of default source and target cells (#13969) (#13983) Signed-off-by: Matt Lord Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Matt Lord --- go/vt/discovery/tablet_picker_test.go | 48 +++++++++++-- go/vt/vttablet/tabletmanager/vdiff/action.go | 14 +++- .../tabletmanager/vdiff/action_test.go | 71 ++++++++++++++++++- 3 files changed, 124 insertions(+), 9 deletions(-) diff --git a/go/vt/discovery/tablet_picker_test.go b/go/vt/discovery/tablet_picker_test.go index ed071af13ad..143d0798f4b 100644 --- a/go/vt/discovery/tablet_picker_test.go +++ b/go/vt/discovery/tablet_picker_test.go @@ -25,10 +25,11 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" - querypb "vitess.io/vitess/go/vt/proto/query" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" + + querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) func TestPickSimple(t *testing.T) { @@ -364,6 +365,38 @@ func TestPickUsingCellAlias(t *testing.T) { assert.True(t, picked2) } +// TestPickUsingCellAsAlias confirms that when the tablet picker is +// given a cell name that is an alias, it will choose a tablet that +// exists within a cell that is part of the alias. +func TestPickUsingCellAsAlias(t *testing.T) { + ctx := context.Background() + + // The test env puts all cells into an alias called "cella". + // We're also going to specify an optional extraCell that is NOT + // added to the alias. + te := newPickerTestEnv(t, []string{"cell1", "cell2", "cell3"}, "xtracell") + // Specify the alias as the cell. + tp, err := NewTabletPicker(te.topoServ, []string{"cella"}, te.keyspace, te.shard, "replica") + require.NoError(t, err) + + // Create a tablet in one of the main cells, it should be + // picked as it is part of the cella alias. This tablet is + // NOT part of the talbet picker's local cell (cell1) so it + // will not be given local preference. + want := addTablet(te, 101, topodatapb.TabletType_REPLICA, "cell2", true, true) + defer deleteTablet(t, te, want) + // Create a tablet in an extra cell which is thus NOT part of + // the cella alias so it should NOT be picked. + noWant := addTablet(te, 102, topodatapb.TabletType_REPLICA, "xtracell", true, true) + defer deleteTablet(t, te, noWant) + // Try it many times to be sure we don't ever pick the wrong one. + for i := 0; i < 100; i++ { + tablet, err := tp.PickForStreaming(ctx) + require.NoError(t, err) + assert.True(t, proto.Equal(want, tablet), "Pick: %v, want %v", tablet, want) + } +} + func TestTabletAppearsDuringSleep(t *testing.T) { te := newPickerTestEnv(t, []string{"cell"}) tp, err := NewTabletPicker(te.topoServ, te.cells, te.keyspace, te.shard, "replica") @@ -428,17 +461,22 @@ type pickerTestEnv struct { topoServ *topo.Server } -func newPickerTestEnv(t *testing.T, cells []string) *pickerTestEnv { +// newPickerTestEnv creates a test environment for TabletPicker tests. +// It creates a cell alias called 'cella' which contains all of the +// provided cells. However, if any optional extraCells are provided, those +// are NOT added to the cell alias. +func newPickerTestEnv(t *testing.T, cells []string, extraCells ...string) *pickerTestEnv { ctx := context.Background() + allCells := append(cells, extraCells...) te := &pickerTestEnv{ t: t, keyspace: "ks", shard: "0", cells: cells, - topoServ: memorytopo.NewServer(cells...), + topoServ: memorytopo.NewServer(allCells...), } - // create cell alias + // Create cell alias containing the cells (but NOT the extraCells). err := te.topoServ.CreateCellsAlias(ctx, "cella", &topodatapb.CellsAlias{ Cells: cells, }) diff --git a/go/vt/vttablet/tabletmanager/vdiff/action.go b/go/vt/vttablet/tabletmanager/vdiff/action.go index 7a18015fc24..df8fb8854bf 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/action.go +++ b/go/vt/vttablet/tabletmanager/vdiff/action.go @@ -20,6 +20,8 @@ import ( "context" "encoding/json" "fmt" + "sort" + "strings" "github.com/google/uuid" @@ -108,6 +110,9 @@ func (vde *Engine) getVDiffSummary(vdiffID int64, dbClient binlogplayer.DBClient // Validate vdiff options. Also setup defaults where applicable. func (vde *Engine) fixupOptions(options *tabletmanagerdatapb.VDiffOptions) (*tabletmanagerdatapb.VDiffOptions, error) { // Assign defaults to sourceCell and targetCell if not specified. + if options == nil { + options = &tabletmanagerdatapb.VDiffOptions{} + } sourceCell := options.PickerOptions.SourceCell targetCell := options.PickerOptions.TargetCell var defaultCell string @@ -118,10 +123,10 @@ func (vde *Engine) fixupOptions(options *tabletmanagerdatapb.VDiffOptions) (*tab return nil, err } } - if sourceCell == "" { + if sourceCell == "" { // Default is all cells sourceCell = defaultCell } - if targetCell == "" { + if targetCell == "" { // Default is all cells targetCell = defaultCell } options.PickerOptions.SourceCell = sourceCell @@ -130,6 +135,8 @@ func (vde *Engine) fixupOptions(options *tabletmanagerdatapb.VDiffOptions) (*tab return options, nil } +// getDefaultCell returns all of the cells in the topo as a comma +// separated string as the default value is all available cells. func (vde *Engine) getDefaultCell() (string, error) { cells, err := vde.ts.GetCellInfoNames(vde.ctx) if err != nil { @@ -139,7 +146,8 @@ func (vde *Engine) getDefaultCell() (string, error) { // Unreachable return "", fmt.Errorf("there are no cells in the topo") } - return cells[0], nil + sort.Strings(cells) // Ensure that the resulting value is deterministic + return strings.Join(cells, ","), nil } func (vde *Engine) handleCreateResumeAction(ctx context.Context, dbClient binlogplayer.DBClient, action VDiffAction, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error { diff --git a/go/vt/vttablet/tabletmanager/vdiff/action_test.go b/go/vt/vttablet/tabletmanager/vdiff/action_test.go index b6ad3d65775..6c3106f5310 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/action_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/action_test.go @@ -24,11 +24,14 @@ import ( "time" "github.com/google/uuid" + "github.com/stretchr/testify/require" "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/vterrors" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" - "vitess.io/vitess/go/vt/vterrors" ) func TestPerformVDiffAction(t *testing.T) { @@ -43,6 +46,8 @@ func TestPerformVDiffAction(t *testing.T) { name string vde *Engine req *tabletmanagerdatapb.VDiffRequest + preFunc func() error + postFunc func() error want *tabletmanagerdatapb.VDiffResponse expectQueries []string wantErr error @@ -52,6 +57,62 @@ func TestPerformVDiffAction(t *testing.T) { vde: &Engine{isOpen: false}, wantErr: vterrors.New(vtrpcpb.Code_UNAVAILABLE, "vdiff engine is closed"), }, + { + name: "create with defaults", + req: &tabletmanagerdatapb.VDiffRequest{ + Action: string(CreateAction), + VdiffUuid: uuid, + Options: &tabletmanagerdatapb.VDiffOptions{ + PickerOptions: &tabletmanagerdatapb.VDiffPickerOptions{}, + }, + }, + // Add a second cell. The default for source_cell and target_cell is all + // available cells, so this additional cell should then show up in the + // created vdiff record. + preFunc: func() error { + return tstenv.TopoServ.CreateCellInfo(ctx, "zone100_test", &topodatapb.CellInfo{}) + }, + expectQueries: []string{ + fmt.Sprintf("select id as id from _vt.vdiff where vdiff_uuid = %s", encodeString(uuid)), + fmt.Sprintf(`insert into _vt.vdiff(keyspace, workflow, state, options, shard, db_name, vdiff_uuid) values('', '', 'pending', '{\"picker_options\":{\"source_cell\":\"cell1,zone100_test\",\"target_cell\":\"cell1,zone100_test\"}}', '0', 'vt_vttest', %s)`, encodeString(uuid)), + }, + postFunc: func() error { + return tstenv.TopoServ.DeleteCellInfo(ctx, "zone100_test", true) + }, + }, + { + name: "create with cell alias", + req: &tabletmanagerdatapb.VDiffRequest{ + Action: string(CreateAction), + VdiffUuid: uuid, + Options: &tabletmanagerdatapb.VDiffOptions{ + PickerOptions: &tabletmanagerdatapb.VDiffPickerOptions{ + SourceCell: "all", + TargetCell: "all", + }, + }, + }, + // Add a second cell and create an cell alias that contains it. + preFunc: func() error { + if err := tstenv.TopoServ.CreateCellInfo(ctx, "zone100_test", &topodatapb.CellInfo{}); err != nil { + return err + } + cells := append(tstenv.Cells, "zone100_test") + return tstenv.TopoServ.CreateCellsAlias(ctx, "all", &topodatapb.CellsAlias{ + Cells: cells, + }) + }, + expectQueries: []string{ + fmt.Sprintf("select id as id from _vt.vdiff where vdiff_uuid = %s", encodeString(uuid)), + fmt.Sprintf(`insert into _vt.vdiff(keyspace, workflow, state, options, shard, db_name, vdiff_uuid) values('', '', 'pending', '{\"picker_options\":{\"source_cell\":\"all\",\"target_cell\":\"all\"}}', '0', 'vt_vttest', %s)`, encodeString(uuid)), + }, + postFunc: func() error { + if err := tstenv.TopoServ.DeleteCellInfo(ctx, "zone100_test", true); err != nil { + return err + } + return tstenv.TopoServ.DeleteCellsAlias(ctx, "all") + }, + }, { name: "delete by uuid", req: &tabletmanagerdatapb.VDiffRequest{ @@ -80,6 +141,10 @@ func TestPerformVDiffAction(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + if tt.preFunc != nil { + err := tt.preFunc() + require.NoError(t, err, "pre function failed: %v", err) + } if tt.vde == nil { tt.vde = vdiffenv.vde } @@ -94,6 +159,10 @@ func TestPerformVDiffAction(t *testing.T) { if tt.want != nil && !reflect.DeepEqual(got, tt.want) { t.Errorf("Engine.PerformVDiffAction() = %v, want %v", got, tt.want) } + if tt.postFunc != nil { + err := tt.postFunc() + require.NoError(t, err, "post function failed: %v", err) + } }) } } From cee1662b41351f812e1e721427bc695b83e804d0 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 19:00:29 -0400 Subject: [PATCH 178/233] [release-16.0] copy over existing vreplication rows copied to local counter if resuming from another tablet (#13949) (#13962) Signed-off-by: Matt Lord Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Matt Lord --- .../vreplication/external_connector_test.go | 2 + .../vreplication/journal_test.go | 4 ++ .../vreplication/vcopier_test.go | 16 ++++++ .../vreplication/vplayer_flaky_test.go | 6 +++ .../tabletmanager/vreplication/vreplicator.go | 40 ++++++++++++++- .../vreplication/vreplicator_test.go | 51 +++++++++++++++++++ 6 files changed, 118 insertions(+), 1 deletion(-) diff --git a/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go b/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go index 24e6cb0dbc3..e2b1b8bf100 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go @@ -181,6 +181,7 @@ func getExpectedVreplicationQueries(t *testing.T, pos string) []string { if pos == "" { return []string{ "/insert into _vt.vreplication", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "begin", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", @@ -190,6 +191,7 @@ func getExpectedVreplicationQueries(t *testing.T, pos string) []string { } return []string{ "/insert into _vt.vreplication", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running'", } } diff --git a/go/vt/vttablet/tabletmanager/vreplication/journal_test.go b/go/vt/vttablet/tabletmanager/vreplication/journal_test.go index 9dfdee766d1..611f0f4ac3b 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/journal_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/journal_test.go @@ -77,6 +77,7 @@ func TestJournalOneToOne(t *testing.T) { fmt.Sprintf("delete from _vt.vreplication where id=%d", firstID), "commit", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running', message='' where id.*", )) @@ -145,6 +146,8 @@ func TestJournalOneToMany(t *testing.T) { "commit", "/update _vt.vreplication set message='Picked source tablet.*", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running', message='' where id.*", "/update _vt.vreplication set state='Running', message='' where id.*", )) @@ -207,6 +210,7 @@ func TestJournalTablePresent(t *testing.T) { fmt.Sprintf("delete from _vt.vreplication where id=%d", firstID), "commit", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running', message='' where id.*", )) diff --git a/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go b/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go index 92a44336e9f..8d979a569c4 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go @@ -171,6 +171,7 @@ func testPlayerCopyCharPK(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", "insert into dst(idc,val) values ('a\\0',1)", @@ -278,6 +279,7 @@ func testPlayerCopyVarcharPKCaseInsensitive(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", // Copy mode. @@ -401,6 +403,7 @@ func testPlayerCopyVarcharCompositePKCaseSensitiveCollation(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", // Copy mode. @@ -475,6 +478,7 @@ func testPlayerCopyTablesWithFK(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "select @@foreign_key_checks;", // Create the list of tables to copy and transition to Copying state. "begin", @@ -607,6 +611,7 @@ func testPlayerCopyTables(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", // Create the list of tables to copy and transition to Copying state. "begin", "/insert into _vt.copy_state", @@ -746,6 +751,7 @@ func testPlayerCopyBigTable(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", // The first fast-forward has no starting point. So, it just saves the current position. "/update _vt.vreplication set state='Copying'", @@ -876,6 +882,7 @@ func testPlayerCopyWildcardRule(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", // The first fast-forward has no starting point. So, it just saves the current position. @@ -1037,6 +1044,7 @@ func testPlayerCopyTableContinuation(t *testing.T) { expectNontxQueries(t, qh.Expect( // Catchup "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "insert into dst1(id,val) select 1, 'insert in' from dual where (1,1) <= (6,6)", "insert into dst1(id,val) select 7, 'insert out' from dual where (7,7) <= (6,6)", "update dst1 set val='updated' where id=3 and (3,3) <= (6,6)", @@ -1167,6 +1175,7 @@ func testPlayerCopyWildcardTableContinuation(t *testing.T) { "/insert into _vt.vreplication", "/update _vt.vreplication set state = 'Copying'", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", ).Then(func(expect qh.ExpectationSequencer) qh.ExpectationSequencer { if !optimizeInsertsEnabled { expect = expect.Then(qh.Immediately("insert into dst(id,val) select 4, 'new' from dual where (4) <= (2)")) @@ -1263,6 +1272,7 @@ func TestPlayerCopyWildcardTableContinuationWithOptimizeInserts(t *testing.T) { "/insert into _vt.vreplication", "/update _vt.vreplication set state = 'Copying'", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", // Copy "insert into dst(id,val) values (3,'uncopied'), (4,'new')", `/insert into _vt.copy_state .*`, @@ -1316,6 +1326,7 @@ func testPlayerCopyTablesNone(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "begin", "/update _vt.vreplication set state='Stopped'", "commit", @@ -1370,6 +1381,7 @@ func testPlayerCopyTablesStopAfterCopy(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", // Create the list of tables to copy and transition to Copying state. "begin", "/insert into _vt.copy_state", @@ -1454,6 +1466,7 @@ func testPlayerCopyTableCancel(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", // Create the list of tables to copy and transition to Copying state. "begin", "/insert into _vt.copy_state", @@ -1542,6 +1555,7 @@ func testPlayerCopyTablesWithGeneratedColumn(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message=", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state", // The first fast-forward has no starting point. So, it just saves the current position. @@ -1614,6 +1628,7 @@ func testCopyTablesWithInvalidDates(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", // Create the list of tables to copy and transition to Copying state. "begin", "/insert into _vt.copy_state", @@ -1711,6 +1726,7 @@ func testCopyInvisibleColumns(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message=", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", // The first fast-forward has no starting point. So, it just saves the current position. diff --git a/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go b/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go index 60378c8924a..4570d16824d 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go @@ -1623,6 +1623,7 @@ func TestPlayerDDL(t *testing.T) { "/update.*'Running'", // Second update is from vreplicator. "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update.*'Running'", "begin", fmt.Sprintf("/update.*'%s'", pos2), @@ -1787,6 +1788,7 @@ func TestPlayerStopPos(t *testing.T) { "/update.*'Running'", // Second update is from vreplicator. "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update.*'Running'", "begin", "insert into yes(id,val) values (1,'aaa')", @@ -1812,6 +1814,7 @@ func TestPlayerStopPos(t *testing.T) { "/update.*'Running'", // Second update is from vreplicator. "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update.*'Running'", "begin", // Since 'no' generates empty transactions that are skipped by @@ -1830,6 +1833,7 @@ func TestPlayerStopPos(t *testing.T) { "/update.*'Running'", // Second update is from vreplicator. "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update.*'Running'", "/update.*'Stopped'.*already reached", )) @@ -2451,6 +2455,7 @@ func TestRestartOnVStreamEnd(t *testing.T) { }) expectDBClientQueries(t, qh.Expect( "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running'", "begin", "insert into t1(id,val) values (2,'aaa')", @@ -2906,6 +2911,7 @@ func startVReplication(t *testing.T, bls *binlogdatapb.BinlogSource, pos string) expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", + "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running'", )) var once sync.Once diff --git a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go index 9dddb573e1d..7eb879d2fbd 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go @@ -153,7 +153,7 @@ func newVReplicator(id uint32, source *binlogdatapb.BinlogSource, sourceVStreame log.Warningf("The supplied value for vreplication_heartbeat_update_interval:%d seconds is larger than the maximum allowed:%d seconds, vreplication will fallback to %d", vreplicationHeartbeatUpdateInterval, vreplicationMinimumHeartbeatUpdateInterval, vreplicationMinimumHeartbeatUpdateInterval) } - return &vreplicator{ + vr := &vreplicator{ vre: vre, id: id, source: source, @@ -164,6 +164,8 @@ func newVReplicator(id uint32, source *binlogdatapb.BinlogSource, sourceVStreame throttleUpdatesRateLimiter: timer.NewRateLimiter(time.Second), } + vr.setExistingRowsCopied() + return vr } // Replicate starts a vreplication stream. It can be in one of three phases: @@ -991,3 +993,39 @@ func (vr *vreplicator) newClientConnection(ctx context.Context) (*vdbClient, err } return dbClient, nil } + +// setExistingRowsCopied deals with the case where another tablet started +// the workflow and a reparent occurred, and now that we manage the +// workflow, we need to read the rows_copied that already exists and add +// them to our counter, otherwise it will look like the reparent wiped all the +// rows_copied. So in the event that our CopyRowCount counter is zero, and +// the existing rows_copied in the vreplication table is not, copy the value of +// vreplication.rows_copied into our CopyRowCount. +func (vr *vreplicator) setExistingRowsCopied() { + if vr.stats.CopyRowCount.Get() == 0 { + rowsCopiedExisting, err := vr.readExistingRowsCopied(vr.id) + if err != nil { + log.Warningf("Failed to read existing rows copied value for %s worfklow: %v", vr.WorkflowName, err) + } else if rowsCopiedExisting != 0 { + log.Infof("Resuming the %s vreplication workflow started on another tablet, setting rows copied counter to %v", vr.WorkflowName, rowsCopiedExisting) + vr.stats.CopyRowCount.Set(rowsCopiedExisting) + } + } +} + +func (vr *vreplicator) readExistingRowsCopied(id uint32) (int64, error) { + query, err := sqlparser.ParseAndBind(`SELECT rows_copied FROM _vt.vreplication WHERE id=%a`, + sqltypes.Uint32BindVariable(id), + ) + if err != nil { + return 0, err + } + r, err := vr.dbClient.Execute(query) + if err != nil { + return 0, err + } + if len(r.Rows) != 1 { + return 0, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "did not get expected single row value when getting rows_copied for workflow id: %d", id) + } + return r.Rows[0][0].ToInt64() +} diff --git a/go/vt/vttablet/tabletmanager/vreplication/vreplicator_test.go b/go/vt/vttablet/tabletmanager/vreplication/vreplicator_test.go index 1cf3d358f93..6b9f9ce0983 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vreplicator_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vreplicator_test.go @@ -626,6 +626,57 @@ func TestCancelledDeferSecondaryKeys(t *testing.T) { require.Equal(t, 1, len(res.Rows)) } +// TestResumingFromPreviousWorkflowKeepingRowsCopied tests that when you +// resume a workflow started by another tablet (eg. a reparent occurred), +// the rows_copied does not reset to zero but continues along from where +// it left off. +func TestResumingFromPreviousWorkflowKeepingRowsCopied(t *testing.T) { + _, cancel := context.WithCancel(context.Background()) + defer cancel() + tablet := addTablet(100) + defer deleteTablet(tablet) + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "t1", + }}, + } + bls := &binlogdatapb.BinlogSource{ + Keyspace: env.KeyspaceName, + Shard: env.ShardName, + Filter: filter, + } + // The test env uses the same factory for both dba and + // filtered connections. + dbconfigs.GlobalDBConfigs.Filtered.User = "vt_dba" + id := uint32(1) + + vsclient := newTabletConnector(tablet) + stats := binlogplayer.NewStats() + + dbaconn := playerEngine.dbClientFactoryDba() + err := dbaconn.Connect() + require.NoError(t, err) + defer dbaconn.Close() + + dbClient := playerEngine.dbClientFactoryFiltered() + err = dbClient.Connect() + require.NoError(t, err) + defer dbClient.Close() + + dbName := dbClient.DBName() + rowsCopied := int64(500000) + // Ensure there's an existing vreplication workflow + _, err = dbClient.ExecuteFetch(fmt.Sprintf("insert into _vt.vreplication (id, workflow, source, pos, max_tps, max_replication_lag, time_updated, transaction_timestamp, state, db_name, rows_copied) values (%d, 'test', '', '', 99999, 99999, 0, 0, 'Running', '%s', %v) on duplicate key update workflow='test', source='', pos='', max_tps=99999, max_replication_lag=99999, time_updated=0, transaction_timestamp=0, state='Running', db_name='%s', rows_copied=%v", + id, dbName, rowsCopied, dbName, rowsCopied), 1) + require.NoError(t, err) + defer func() { + _, err = dbClient.ExecuteFetch(fmt.Sprintf("delete from _vt.vreplication where id = %d", id), 1) + require.NoError(t, err) + }() + vr := newVReplicator(id, bls, vsclient, stats, dbClient, env.Mysqld, playerEngine) + assert.Equal(t, rowsCopied, vr.stats.CopyRowCount.Get()) +} + // stripCruft removes all whitespace unicode chars and backticks. func stripCruft(in string) string { out := strings.Builder{} From 3bd77488259c767472f03748ef4eeff4cbd20cc3 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 12:21:46 -0400 Subject: [PATCH 179/233] [release-16.0] Make `Static Code Checks Etc` fail if the `./changelog` folder is out-of-date (#14003) (#14005) Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> --- .github/workflows/static_checks_etc.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 5139d73d77e..bc010c67d2c 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -100,6 +100,7 @@ jobs: release_notes: - 'changelog/**' - './go/tools/releases/**' + - '.github/workflows/static_checks_etc.yml' - 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') @@ -215,4 +216,5 @@ jobs: 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 + echo "" + exit 1 From b6ce299add1cfb38a637ef8d74359ee9db956b6c Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 16:04:56 +0530 Subject: [PATCH 180/233] [release-16.0] fix data race in join engine primitive olap streaming mode execution (#14012) (#14015) Signed-off-by: Harshit Gangal Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Harshit Gangal --- go/vt/vtgate/engine/join.go | 23 +++++++++++--------- go/vt/vtgate/executor_select_test.go | 32 ++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/go/vt/vtgate/engine/join.go b/go/vt/vtgate/engine/join.go index c67a0951b35..6343789aef8 100644 --- a/go/vt/vtgate/engine/join.go +++ b/go/vt/vtgate/engine/join.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "strings" + "sync/atomic" "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" @@ -95,34 +96,36 @@ func (jn *Join) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[st // TryStreamExecute performs a streaming exec. func (jn *Join) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { - joinVars := make(map[string]*querypb.BindVariable) - err := vcursor.StreamExecutePrimitive(ctx, jn.Left, bindVars, wantfields, func(lresult *sqltypes.Result) error { + var fieldNeeded atomic.Bool + fieldNeeded.Store(wantfields) + err := vcursor.StreamExecutePrimitive(ctx, jn.Left, bindVars, fieldNeeded.Load(), func(lresult *sqltypes.Result) error { + joinVars := make(map[string]*querypb.BindVariable) for _, lrow := range lresult.Rows { for k, col := range jn.Vars { joinVars[k] = sqltypes.ValueBindVariable(lrow[col]) } - rowSent := false - err := vcursor.StreamExecutePrimitive(ctx, jn.Right, combineVars(bindVars, joinVars), wantfields, func(rresult *sqltypes.Result) error { + var rowSent atomic.Bool + err := vcursor.StreamExecutePrimitive(ctx, jn.Right, combineVars(bindVars, joinVars), fieldNeeded.Load(), func(rresult *sqltypes.Result) error { result := &sqltypes.Result{} - if wantfields { + if fieldNeeded.Load() { // This code is currently unreachable because the first result // will always be just the field info, which will cause the outer // wantfields code path to be executed. But this may change in the future. - wantfields = false + fieldNeeded.Store(false) result.Fields = joinFields(lresult.Fields, rresult.Fields, jn.Cols) } for _, rrow := range rresult.Rows { result.Rows = append(result.Rows, joinRows(lrow, rrow, jn.Cols)) } if len(rresult.Rows) != 0 { - rowSent = true + rowSent.Store(true) } return callback(result) }) if err != nil { return err } - if jn.Opcode == LeftJoin && !rowSent { + if jn.Opcode == LeftJoin && !rowSent.Load() { result := &sqltypes.Result{} result.Rows = [][]sqltypes.Value{joinRows( lrow, @@ -132,8 +135,8 @@ func (jn *Join) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars return callback(result) } } - if wantfields { - wantfields = false + if fieldNeeded.Load() { + fieldNeeded.Store(false) for k := range jn.Vars { joinVars[k] = sqltypes.NullBindVariable } diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index 4aa51368be2..d934c7805da 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -3984,3 +3984,35 @@ func TestMain(m *testing.M) { _flag.ParseFlagsForTest() os.Exit(m.Run()) } + +func TestStreamJoinQuery(t *testing.T) { + // Special setup: Don't use createExecutorEnv. + cell := "aa" + hc := discovery.NewFakeHealthCheck(nil) + u := createSandbox(KsTestUnsharded) + s := createSandbox(KsTestSharded) + s.VSchema = executorVSchema + u.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-"} + for _, shard := range shards { + _ = hc.AddTestTablet(cell, shard, 1, "TestExecutor", shard, topodatapb.TabletType_PRIMARY, true, 1, nil) + } + executor := createExecutor(serv, cell, resolver) + + sql := "select u.foo, u.apa, ue.bar, ue.apa from user u join user_extra ue on u.foo = ue.bar" + result, err := executorStream(executor, sql) + require.NoError(t, err) + wantResult := &sqltypes.Result{ + Fields: append(sandboxconn.SingleRowResult.Fields, sandboxconn.SingleRowResult.Fields...), + } + wantRow := append(sandboxconn.StreamRowResult.Rows[0], sandboxconn.StreamRowResult.Rows[0]...) + for i := 0; i < 64; i++ { + wantResult.Rows = append(wantResult.Rows, wantRow) + } + require.Equal(t, len(wantResult.Rows), len(result.Rows)) + for idx := 0; idx < 64; idx++ { + utils.MustMatch(t, wantResult.Rows[idx], result.Rows[idx], "mismatched on: ", strconv.Itoa(idx)) + } +} From 2b525329dfd5d92e880b2cfe3993bb2d23244600 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 09:23:56 -0400 Subject: [PATCH 181/233] [release-16.0] handle large number of predicates without timing out (#13979) (#13981) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andrés Taylor --- go/vt/sqlparser/ast_funcs.go | 39 +++++------- go/vt/sqlparser/ast_test.go | 61 ++++++++----------- .../planbuilder/testdata/filter_cases.json | 31 ++++++++++ .../testdata/info_schema57_cases.json | 16 ++--- .../testdata/info_schema80_cases.json | 16 ++--- 5 files changed, 86 insertions(+), 77 deletions(-) diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index bc427c16636..1fb16092b50 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -989,29 +989,14 @@ func (node *Select) GetParsedComments() *ParsedComments { // AddWhere adds the boolean expression to the // WHERE clause as an AND condition. func (node *Select) AddWhere(expr Expr) { - if node.Where == nil { - node.Where = &Where{ - Type: WhereClause, - Expr: expr, - } - return - } - exprs := SplitAndExpression(nil, node.Where.Expr) - node.Where.Expr = AndExpressions(append(exprs, expr)...) + node.Where = addPredicate(node.Where, expr) } // AddHaving adds the boolean expression to the // HAVING clause as an AND condition. func (node *Select) AddHaving(expr Expr) { - if node.Having == nil { - node.Having = &Where{ - Type: HavingClause, - Expr: expr, - } - return - } - exprs := SplitAndExpression(nil, node.Having.Expr) - node.Having.Expr = AndExpressions(append(exprs, expr)...) + node.Having = addPredicate(node.Having, expr) + node.Having.Type = HavingClause } // AddGroupBy adds a grouping expression, unless it's already present @@ -1028,17 +1013,21 @@ func (node *Select) AddGroupBy(expr Expr) { // AddWhere adds the boolean expression to the // WHERE clause as an AND condition. func (node *Update) AddWhere(expr Expr) { - if node.Where == nil { - node.Where = &Where{ + node.Where = addPredicate(node.Where, expr) +} + +func addPredicate(where *Where, pred Expr) *Where { + if where == nil { + return &Where{ Type: WhereClause, - Expr: expr, + Expr: pred, } - return } - node.Where.Expr = &AndExpr{ - Left: node.Where.Expr, - Right: expr, + where.Expr = &AndExpr{ + Left: where.Expr, + Right: pred, } + return where } // AddOrder adds an order by element diff --git a/go/vt/sqlparser/ast_test.go b/go/vt/sqlparser/ast_test.go index 0d6841755c8..88e9cedf55d 100644 --- a/go/vt/sqlparser/ast_test.go +++ b/go/vt/sqlparser/ast_test.go @@ -49,46 +49,35 @@ func TestAppend(t *testing.T) { } func TestSelect(t *testing.T) { - tree, err := Parse("select * from t where a = 1") + e1, err := ParseExpr("a = 1") require.NoError(t, err) - expr := tree.(*Select).Where.Expr - - sel := &Select{} - sel.AddWhere(expr) - buf := NewTrackedBuffer(nil) - sel.Where.Format(buf) - assert.Equal(t, " where a = 1", buf.String()) - sel.AddWhere(expr) - buf = NewTrackedBuffer(nil) - sel.Where.Format(buf) - assert.Equal(t, " where a = 1", buf.String()) - - sel = &Select{} - sel.AddHaving(expr) - buf = NewTrackedBuffer(nil) - sel.Having.Format(buf) - assert.Equal(t, " having a = 1", buf.String()) - - sel.AddHaving(expr) - buf = NewTrackedBuffer(nil) - sel.Having.Format(buf) - assert.Equal(t, " having a = 1", buf.String()) - - tree, err = Parse("select * from t where a = 1 or b = 1") + e2, err := ParseExpr("b = 2") require.NoError(t, err) - expr = tree.(*Select).Where.Expr - sel = &Select{} - sel.AddWhere(expr) - buf = NewTrackedBuffer(nil) - sel.Where.Format(buf) - assert.Equal(t, " where a = 1 or b = 1", buf.String()) + t.Run("single predicate where", func(t *testing.T) { + sel := &Select{} + sel.AddWhere(e1) + assert.Equal(t, " where a = 1", String(sel.Where)) + }) - sel = &Select{} - sel.AddHaving(expr) - buf = NewTrackedBuffer(nil) - sel.Having.Format(buf) - assert.Equal(t, " having a = 1 or b = 1", buf.String()) + t.Run("single predicate having", func(t *testing.T) { + sel := &Select{} + sel.AddHaving(e1) + assert.Equal(t, " having a = 1", String(sel.Having)) + }) + t.Run("double predicate where", func(t *testing.T) { + sel := &Select{} + sel.AddWhere(e1) + sel.AddWhere(e2) + assert.Equal(t, " where a = 1 and b = 2", String(sel.Where)) + }) + + t.Run("double predicate having", func(t *testing.T) { + sel := &Select{} + sel.AddHaving(e1) + sel.AddHaving(e2) + assert.Equal(t, " having a = 1 and b = 2", String(sel.Having)) + }) } func TestUpdate(t *testing.T) { diff --git a/go/vt/vtgate/planbuilder/testdata/filter_cases.json b/go/vt/vtgate/planbuilder/testdata/filter_cases.json index 17ffcb7734f..d217bde3706 100644 --- a/go/vt/vtgate/planbuilder/testdata/filter_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/filter_cases.json @@ -6696,5 +6696,36 @@ "user.user" ] } + }, + { + "comment": "query that would time out because planning was too slow", + "query": "select 1 from user where shard_key = 1 and is_removed = 1 and cmd in ('A','B','C') and not (user_id = 1 and user_id is not null and ts >= 1 and ts <= 2) and not (user_id = 1 and user_id is not null and ts >= 12 and ts <= 13) and not (user_id = 1 and user_id is not null and ts >= 14 and ts <= 15) and not (user_id = 1 and user_id is not null and ts >= 16 and ts <= 17) and not (user_id = 1 and user_id is not null and ts >= 18 and ts <= 19) and not (user_id = 1 and user_id is not null and ts >= 110 and ts <= 111) and not (user_id = 1 and user_id is not null and ts >= 112 and ts <= 113) and not (user_id = 1 and user_id is not null and ts >= 114 and ts <= 115) and not (user_id = 1 and user_id is not null and ts >= 116 and ts <= 117) and not (user_id = 1 and user_id is not null and ts >= 118 and ts <= 119) and not (user_id = 1 and user_id is not null and ts >= 120 and ts <= 121) and not (user_id = 1 and user_id is not null and ts >= 122 and ts <= 123) and not (user_id = 1 and user_id is not null and ts >= 124 and ts <= 125) and not (user_id = 1 and user_id is not null and ts >= 126 and ts <= 127) and not (user_id = 1 and user_id is not null and ts >= 128 and ts <= 129) and not (user_id = 1 and user_id is not null and ts >= 130 and ts <= 131) and not (user_id = 1 and user_id is not null and ts >= 132 and ts <= 133) and not (user_id = 1 and user_id is not null and ts >= 134 and ts <= 135) and not (user_id = 1 and user_id is not null and ts >= 136 and ts <= 137) and not (user_id = 1 and user_id is not null and ts >= 138 and ts <= 139) and not (user_id = 1 and user_id is not null and ts >= 140 and ts <= 141) and not (user_id = 1 and user_id is not null and ts >= 142 and ts <= 143) and not (user_id = 1 and user_id is not null and ts >= 144 and ts <= 145) and not (user_id = 1 and user_id is not null and ts >= 146 and ts <= 147) and not (user_id = 1 and user_id is not null and ts >= 148 and ts <= 149) and not (user_id = 1 and user_id is not null and ts >= 150 and ts <= 151) and not (user_id = 1 and user_id is not null and ts >= 152 and ts <= 153) and not (user_id = 1 and user_id is not null and ts >= 154 and ts <= 155) and not (user_id = 1 and user_id is not null and ts >= 156 and ts <= 157) and not (user_id = 1 and user_id is not null and ts >= 158 and ts <= 159) and not (user_id = 1 and user_id is not null and ts >= 160 and ts <= 161) and not (user_id = 1 and user_id is not null and ts >= 162 and ts <= 163) and not (user_id = 1 and user_id is not null and ts >= 164 and ts <= 165) and not (user_id = 1 and user_id is not null and ts >= 166 and ts <= 167) and not (user_id = 1 and user_id is not null and ts >= 168 and ts <= 169) and not (user_id = 1 and user_id is not null and ts >= 170 and ts <= 171) and not (user_id = 1 and user_id is not null and ts >= 172 and ts <= 173) and not (user_id = 1 and user_id is not null and ts >= 174 and ts <= 175) and not (user_id = 1 and user_id is not null and ts >= 176 and ts <= 177) and not (user_id = 1 and user_id is not null and ts >= 178 and ts <= 179) and not (user_id = 1 and user_id is not null and ts >= 180 and ts <= 181) and not (user_id = 1 and user_id is not null and ts >= 182 and ts <= 183) and not (user_id = 1 and user_id is not null and ts >= 184 and ts <= 185) and not (user_id = 1 and user_id is not null and ts >= 186 and ts <= 187) and not (user_id = 1 and user_id is not null and ts >= 188 and ts <= 189) and not (user_id = 1 and user_id is not null and ts >= 190 and ts <= 191) and not (user_id = 1 and user_id is not null and ts >= 192 and ts <= 193) and not (user_id = 1 and user_id is not null and ts >= 194 and ts <= 195) and not (user_id = 1 and user_id is not null and ts >= 196 and ts <= 197) and not (user_id = 1 and user_id is not null and ts >= 198 and ts <= 199) and not (user_id = 1 and user_id is not null and ts >= 1100 and ts <= 1101) and not (user_id = 1 and user_id is not null and ts >= 1102 and ts <= 1103) and not (user_id = 1 and user_id is not null and ts >= 1104 and ts <= 1105) and not (user_id = 1 and user_id is not null and ts >= 1106 and ts <= 1107) and not (user_id = 1 and user_id is not null and ts >= 1108 and ts <= 1109) and not (user_id = 1 and user_id is not null and ts >= 1110 and ts <= 1111) and not (user_id = 1 and user_id is not null and ts >= 1112 and ts <= 1113) and not (user_id = 1 and user_id is not null and ts >= 1114 and ts <= 1115) and not (user_id = 1 and user_id is not null and ts >= 1116 and ts <= 1117) and not (user_id = 1 and user_id is not null and ts >= 1118 and ts <= 1119) and not (user_id = 1 and user_id is not null and ts >= 1120 and ts <= 1121) and not (user_id = 1 and user_id is not null and ts >= 1122 and ts <= 1123) and not (user_id = 1 and user_id is not null and ts >= 1124 and ts <= 1125) and not (user_id = 1 and user_id is not null and ts >= 1126 and ts <= 1127) and not (user_id = 1 and user_id is not null and ts >= 1128 and ts <= 1129) and not (user_id = 1 and user_id is not null and ts >= 1130 and ts <= 1131) and not (user_id = 1 and user_id is not null and ts >= 1132 and ts <= 1133) and not (user_id = 1 and user_id is not null and ts >= 1134 and ts <= 1135) and not (user_id = 1 and user_id is not null and ts >= 1136 and ts <= 1137) and not (user_id = 1 and user_id is not null and ts >= 1138 and ts <= 1139) and not (user_id = 1 and user_id is not null and ts >= 1140 and ts <= 1141) and not (user_id = 1 and user_id is not null and ts >= 1142 and ts <= 1143) and not (user_id = 1 and user_id is not null and ts >= 1144 and ts <= 1145) and not (user_id = 1 and user_id is not null and ts >= 1146 and ts <= 1147) and not (user_id = 1 and user_id is not null and ts >= 1148 and ts <= 1149) and not (user_id = 1 and user_id is not null and ts >= 1150 and ts <= 1151) and not (user_id = 1 and user_id is not null and ts >= 1152 and ts <= 1153) and not (user_id = 1 and user_id is not null and ts >= 1154 and ts <= 1155) and not (user_id = 1 and user_id is not null and ts >= 1156 and ts <= 1157) and not (user_id = 1 and user_id is not null and ts >= 1158 and ts <= 1159) and not (user_id = 1 and user_id is not null and ts >= 1160 and ts <= 1161) and not (user_id = 1 and user_id is not null and ts >= 1162 and ts <= 1163) and not (user_id = 1 and user_id is not null and ts >= 1164 and ts <= 1165) and not (user_id = 1 and user_id is not null and ts >= 1166 and ts <= 1167) and not (user_id = 1 and user_id is not null and ts >= 1168 and ts <= 1169) and not (user_id = 1 and user_id is not null and ts >= 1170 and ts <= 1171) and not (user_id = 1 and user_id is not null and ts >= 1172 and ts <= 1173) and not (user_id = 1 and user_id is not null and ts >= 1174 and ts <= 1175) and not (user_id = 1 and user_id is not null and ts >= 1176 and ts <= 1177) and not (user_id = 1 and user_id is not null and ts >= 1178 and ts <= 1179) and not (user_id = 1 and user_id is not null and ts >= 1180 and ts <= 1181) and not (user_id = 1 and user_id is not null and ts >= 1182 and ts <= 1183) and not (user_id = 1 and user_id is not null and ts >= 1184 and ts <= 1185) and not (user_id = 1 and user_id is not null and ts >= 1186 and ts <= 1187) and not (user_id = 1 and user_id is not null and ts >= 1188 and ts <= 1189) and not (user_id = 1 and user_id is not null and ts >= 1190 and ts <= 1191) and not (user_id = 1 and user_id is not null and ts >= 1192 and ts <= 1193) and not (user_id = 1 and user_id is not null and ts >= 1194 and ts <= 1195) and not (user_id = 1 and user_id is not null and ts >= 1196 and ts <= 1197) and not (user_id = 1 and user_id is not null and ts >= 1198 and ts <= 1199) and not (user_id = 1 and user_id is not null and ts >= 1200 and ts <= 1201) and not (user_id = 1 and user_id is not null and ts >= 1202 and ts <= 1203) and not (user_id = 1 and user_id is not null and ts >= 1204 and ts <= 1205) and not (user_id = 1 and user_id is not null and ts >= 1206 and ts <= 1207) and not (user_id = 1 and user_id is not null and ts >= 1208 and ts <= 1209) and not (user_id = 1 and user_id is not null and ts >= 1210 and ts <= 1211) and not (user_id = 1 and user_id is not null and ts >= 1212 and ts <= 1213) and not (user_id = 1 and user_id is not null and ts >= 1214 and ts <= 1215) and not (user_id = 1 and user_id is not null and ts >= 1216 and ts <= 1217) and not (user_id = 1 and user_id is not null and ts >= 1218 and ts <= 1219) and not (user_id = 1 and user_id is not null and ts >= 1220 and ts <= 1221) and not (user_id = 1 and user_id is not null and ts >= 1222 and ts <= 1223) and not (user_id = 1 and user_id is not null and ts >= 1224 and ts <= 1225) and not (user_id = 1 and user_id is not null and ts >= 1226 and ts <= 1227) and not (user_id = 1 and user_id is not null and ts >= 1228 and ts <= 1229) and not (user_id = 1 and user_id is not null and ts >= 1230 and ts <= 1231) and not (user_id = 1 and user_id is not null and ts >= 1232 and ts <= 1233) and not (user_id = 1 and user_id is not null and ts >= 1234 and ts <= 1235) and not (user_id = 1 and user_id is not null and ts >= 1236 and ts <= 1237) and not (user_id = 1 and user_id is not null and ts >= 1238 and ts <= 1239) and not (user_id = 1 and user_id is not null and ts >= 1240 and ts <= 1241) and not (user_id = 1 and user_id is not null and ts >= 1242 and ts <= 1243) and not (user_id = 1 and user_id is not null and ts >= 1244 and ts <= 1245) and not (user_id = 1 and user_id is not null and ts >= 1246 and ts <= 1247) and not (user_id = 1 and user_id is not null and ts >= 1248 and ts <= 1249) and not (user_id = 1 and user_id is not null and ts >= 1250 and ts <= 1251) and not (user_id = 1 and user_id is not null and ts >= 1252 and ts <= 1253) and not (user_id = 1 and user_id is not null and ts >= 1254 and ts <= 1255) and not (user_id = 1 and user_id is not null and ts >= 1256 and ts <= 1257) and not (user_id = 1 and user_id is not null and ts >= 1258 and ts <= 1259) and not (user_id = 1 and user_id is not null and ts >= 1260 and ts <= 1261) and not (user_id = 1 and user_id is not null and ts >= 1262 and ts <= 1263) and not (user_id = 1 and user_id is not null and ts >= 1264 and ts <= 1265) and not (user_id = 1 and user_id is not null and ts >= 1266 and ts <= 1267) and not (user_id = 1 and user_id is not null and ts >= 1268 and ts <= 1269) and not (user_id = 1 and user_id is not null and ts >= 1270 and ts <= 1271) and not (user_id = 1 and user_id is not null and ts >= 1272 and ts <= 1273) and not (user_id = 1 and user_id is not null and ts >= 1274 and ts <= 1275) and not (user_id = 1 and user_id is not null and ts >= 1276 and ts <= 1277) and not (user_id = 1 and user_id is not null and ts >= 1278 and ts <= 1279) and not (user_id = 1 and user_id is not null and ts >= 1280 and ts <= 1281) and not (user_id = 1 and user_id is not null and ts >= 1282 and ts <= 1283) and not (user_id = 1 and user_id is not null and ts >= 1284 and ts <= 1285) and not (user_id = 1 and user_id is not null and ts >= 1286 and ts <= 1287) and not (user_id = 1 and user_id is not null and ts >= 1288 and ts <= 1289) and not (user_id = 1 and user_id is not null and ts >= 1290 and ts <= 1291) and not (user_id = 1 and user_id is not null and ts >= 1292 and ts <= 1293) and not (user_id = 1 and user_id is not null and ts >= 1294 and ts <= 1295) and not (user_id = 1 and user_id is not null and ts >= 1296 and ts <= 1297) and not (user_id = 1 and user_id is not null and ts >= 1298 and ts <= 1299) and not (user_id = 1 and user_id is not null and ts >= 1300 and ts <= 1301) and not (user_id = 1 and user_id is not null and ts >= 1302 and ts <= 1303) and not (user_id = 1 and user_id is not null and ts >= 1304 and ts <= 1305) and not (user_id = 1 and user_id is not null and ts >= 1306 and ts <= 1307) and not (user_id = 1 and user_id is not null and ts >= 1308 and ts <= 1309) and not (user_id = 1 and user_id is not null and ts >= 1310 and ts <= 1311) and not (user_id = 1 and user_id is not null and ts >= 1312 and ts <= 1313) and not (user_id = 1 and user_id is not null and ts >= 1314 and ts <= 1315) and not (user_id = 1 and user_id is not null and ts >= 1316 and ts <= 1317) and not (user_id = 1 and user_id is not null and ts >= 1318 and ts <= 1319) and not (user_id = 1 and user_id is not null and ts >= 1320 and ts <= 1321) and not (user_id = 1 and user_id is not null and ts >= 1322 and ts <= 1323) and not (user_id = 1 and user_id is not null and ts >= 1324 and ts <= 1325) and not (user_id = 1 and user_id is not null and ts >= 1326 and ts <= 1327) and not (user_id = 1 and user_id is not null and ts >= 1328 and ts <= 1329) and not (user_id = 1 and user_id is not null and ts >= 1330 and ts <= 1331) and not (user_id = 1 and user_id is not null and ts >= 1332 and ts <= 1333) and not (user_id = 1 and user_id is not null and ts >= 1334 and ts <= 1335) and not (user_id = 1 and user_id is not null and ts >= 1336 and ts <= 1337) and not (user_id = 1 and user_id is not null and ts >= 1338 and ts <= 1339) and not (user_id = 1 and user_id is not null and ts >= 1340 and ts <= 1341) and not (user_id = 1 and user_id is not null and ts >= 1342 and ts <= 1343) and not (user_id = 1 and user_id is not null and ts >= 1344 and ts <= 1345) and not (user_id = 1 and user_id is not null and ts >= 1346 and ts <= 1347) and not (user_id = 1 and user_id is not null and ts >= 1348 and ts <= 1349) and not (user_id = 1 and user_id is not null and ts >= 1350 and ts <= 1351) and not (user_id = 1 and user_id is not null and ts >= 1352 and ts <= 1353) and not (user_id = 1 and user_id is not null and ts >= 1354 and ts <= 1355) and not (user_id = 1 and user_id is not null and ts >= 1356 and ts <= 1357) and not (user_id = 1 and user_id is not null and ts >= 1358 and ts <= 1359) and not (user_id = 1 and user_id is not null and ts >= 1360 and ts <= 1361) and not (user_id = 1 and user_id is not null and ts >= 1362 and ts <= 1363) and not (user_id = 1 and user_id is not null and ts >= 1364 and ts <= 1365) and not (user_id = 1 and user_id is not null and ts >= 1366 and ts <= 1367) and not (user_id = 1 and user_id is not null and ts >= 1368 and ts <= 1369) and not (user_id = 1 and user_id is not null and ts >= 1370 and ts <= 1371) and not (user_id = 1 and user_id is not null and ts >= 1372 and ts <= 1373) and not (user_id = 1 and user_id is not null and ts >= 1374 and ts <= 1375) and not (user_id = 1 and user_id is not null and ts >= 1376 and ts <= 1377) and not (user_id = 1 and user_id is not null and ts >= 1378 and ts <= 1379) and not (user_id = 1 and user_id is not null and ts >= 1380 and ts <= 1381) and not (user_id = 1 and user_id is not null and ts >= 1382 and ts <= 1383) and not (user_id = 1 and user_id is not null and ts >= 1384 and ts <= 1385) and not (user_id = 1 and user_id is not null and ts >= 1386 and ts <= 1387) and not (user_id = 1 and user_id is not null and ts >= 1388 and ts <= 1389) and not (user_id = 1 and user_id is not null and ts >= 1390 and ts <= 1391) and not (user_id = 1 and user_id is not null and ts >= 1392 and ts <= 1393) and not (user_id = 1 and user_id is not null and ts >= 1394 and ts <= 1395) and not (user_id = 1 and user_id is not null and ts >= 1396 and ts <= 1397) and not (user_id = 1 and user_id is not null and ts >= 1398 and ts <= 1399) and not (user_id = 1 and user_id is not null and ts >= 1400 and ts <= 1401) and not (user_id = 1 and user_id is not null and ts >= 1402 and ts <= 1403) and not (user_id = 1 and user_id is not null and ts >= 1404 and ts <= 1405) and not (user_id = 1 and user_id is not null and ts >= 1406 and ts <= 1407) and not (user_id = 1 and user_id is not null and ts >= 1408 and ts <= 1409) and not (user_id = 1 and user_id is not null and ts >= 1410 and ts <= 1411) and not (user_id = 1 and user_id is not null and ts >= 1412 and ts <= 1413) and not (user_id = 1 and user_id is not null and ts >= 1414 and ts <= 1415) and not (user_id = 1 and user_id is not null and ts >= 1416 and ts <= 1417) and not (user_id = 1 and user_id is not null and ts >= 1418 and ts <= 1419) and not (user_id = 1 and user_id is not null and ts >= 1420 and ts <= 1421) and not (user_id = 1 and user_id is not null and ts >= 1422 and ts <= 1423) and not (user_id = 1 and user_id is not null and ts >= 1424 and ts <= 1425) and not (user_id = 1 and user_id is not null and ts >= 1426 and ts <= 1427) and not (user_id = 1 and user_id is not null and ts >= 1428 and ts <= 1429) and not (user_id = 1 and user_id is not null and ts >= 1430 and ts <= 1431) and not (user_id = 1 and user_id is not null and ts >= 1432 and ts <= 1433) and not (user_id = 1 and user_id is not null and ts >= 1434 and ts <= 1435) and not (user_id = 1 and user_id is not null and ts >= 1436 and ts <= 1437) and not (user_id = 1 and user_id is not null and ts >= 1438 and ts <= 1439) and not (user_id = 1 and user_id is not null and ts >= 1440 and ts <= 1441) and not (user_id = 1 and user_id is not null and ts >= 1442 and ts <= 1443) and not (user_id = 1 and user_id is not null and ts >= 1444 and ts <= 1445) and not (user_id = 1 and user_id is not null and ts >= 1446 and ts <= 1447) and not (user_id = 1 and user_id is not null and ts >= 1448 and ts <= 1449) and not (user_id = 1 and user_id is not null and ts >= 1450 and ts <= 1451) and not (user_id = 1 and user_id is not null and ts >= 1452 and ts <= 1453) and not (user_id = 1 and user_id is not null and ts >= 1454 and ts <= 1455) and not (user_id = 1 and user_id is not null and ts >= 1456 and ts <= 1457) and not (user_id = 1 and user_id is not null and ts >= 1458 and ts <= 1459) and not (user_id = 1 and user_id is not null and ts >= 1460 and ts <= 1461) and not (user_id = 1 and user_id is not null and ts >= 1462 and ts <= 1463) and not (user_id = 1 and user_id is not null and ts >= 1464 and ts <= 1465) and not (user_id = 1 and user_id is not null and ts >= 1466 and ts <= 1467) and not (user_id = 1 and user_id is not null and ts >= 1468 and ts <= 1469) and not (user_id = 1 and user_id is not null and ts >= 1470 and ts <= 1471) and not (user_id = 1 and user_id is not null and ts >= 1472 and ts <= 1473) and not (user_id = 1 and user_id is not null and ts >= 1474 and ts <= 1475) and not (user_id = 1 and user_id is not null and ts >= 1476 and ts <= 1477) and not (user_id = 1 and user_id is not null and ts >= 1478 and ts <= 1479) and not (user_id = 1 and user_id is not null and ts >= 1480 and ts <= 1481) and not (user_id = 1 and user_id is not null and ts >= 1482 and ts <= 1483) and not (user_id = 1 and user_id is not null and ts >= 1484 and ts <= 1485) and not (user_id = 1 and user_id is not null and ts >= 1486 and ts <= 1487) and not (user_id = 1 and user_id is not null and ts >= 1488 and ts <= 1489) and not (user_id = 1 and user_id is not null and ts >= 1490 and ts <= 1491) and not (user_id = 1 and user_id is not null and ts >= 1492 and ts <= 1493) and not (user_id = 1 and user_id is not null and ts >= 1494 and ts <= 1495) and not (user_id = 1 and user_id is not null and ts >= 1496 and ts <= 1497) and not (user_id = 1 and user_id is not null and ts >= 1498 and ts <= 1499) and not (user_id = 1 and user_id is not null and ts >= 1500 and ts <= 1501) and not (user_id = 1 and user_id is not null and ts >= 1502 and ts <= 1503) and not (user_id = 1 and user_id is not null and ts >= 1504 and ts <= 1505) and not (user_id = 1 and user_id is not null and ts >= 1506 and ts <= 1507) and not (user_id = 1 and user_id is not null and ts >= 1508 and ts <= 1509) and not (user_id = 1 and user_id is not null and ts >= 1510 and ts <= 1511) and not (user_id = 1 and user_id is not null and ts >= 1512 and ts <= 1513) and not (user_id = 1 and user_id is not null and ts >= 1514 and ts <= 1515) and not (user_id = 1 and user_id is not null and ts >= 1516 and ts <= 1517) and not (user_id = 1 and user_id is not null and ts >= 1518 and ts <= 1519) and not (user_id = 1 and user_id is not null and ts >= 1520 and ts <= 1521) and not (user_id = 1 and user_id is not null and ts >= 1522 and ts <= 1523) and not (user_id = 1 and user_id is not null and ts >= 1524 and ts <= 1525) and not (user_id = 1 and user_id is not null and ts >= 1526 and ts <= 1527) and not (user_id = 1 and user_id is not null and ts >= 1528 and ts <= 1529) and not (user_id = 1 and user_id is not null and ts >= 1530 and ts <= 1531) and not (user_id = 1 and user_id is not null and ts >= 1532 and ts <= 1533) and not (user_id = 1 and user_id is not null and ts >= 1534 and ts <= 1535) and not (user_id = 1 and user_id is not null and ts >= 1536 and ts <= 1537) and not (user_id = 1 and user_id is not null and ts >= 1538 and ts <= 1539) and not (user_id = 1 and user_id is not null and ts >= 1540 and ts <= 1541) and not (user_id = 1 and user_id is not null and ts >= 1542 and ts <= 1543) and not (user_id = 1 and user_id is not null and ts >= 1544 and ts <= 1545) and not (user_id = 1 and user_id is not null and ts >= 1546 and ts <= 1547) and not (user_id = 1 and user_id is not null and ts >= 1548 and ts <= 1549) and not (user_id = 1 and user_id is not null and ts >= 1550 and ts <= 1551) and not (user_id = 1 and user_id is not null and ts >= 1552 and ts <= 1553) and not (user_id = 1 and user_id is not null and ts >= 1554 and ts <= 1555) and not (user_id = 1 and user_id is not null and ts >= 1556 and ts <= 1557) and not (user_id = 1 and user_id is not null and ts >= 1558 and ts <= 1559) and not (user_id = 1 and user_id is not null and ts >= 1560 and ts <= 1561) and not (user_id = 1 and user_id is not null and ts >= 1562 and ts <= 1563) and not (user_id = 1 and user_id is not null and ts >= 1564 and ts <= 1565) and not (user_id = 1 and user_id is not null and ts >= 1566 and ts <= 1567) and not (user_id = 1 and user_id is not null and ts >= 1568 and ts <= 1569) and not (user_id = 1 and user_id is not null and ts >= 1570 and ts <= 1571) and not (user_id = 1 and user_id is not null and ts >= 1572 and ts <= 1573) and not (user_id = 1 and user_id is not null and ts >= 1574 and ts <= 1575) and not (user_id = 1 and user_id is not null and ts >= 1576 and ts <= 1577) and not (user_id = 1 and user_id is not null and ts >= 1578 and ts <= 1579) and not (user_id = 1 and user_id is not null and ts >= 1580 and ts <= 1581) and not (user_id = 1 and user_id is not null and ts >= 1582 and ts <= 1583) and not (user_id = 1 and user_id is not null and ts >= 1584 and ts <= 1585) and not (user_id = 1 and user_id is not null and ts >= 1586 and ts <= 1587) and not (user_id = 1 and user_id is not null and ts >= 1588 and ts <= 1589) and not (user_id = 1 and user_id is not null and ts >= 1590 and ts <= 1591) and not (user_id = 1 and user_id is not null and ts >= 1592 and ts <= 1593) and not (user_id = 1 and user_id is not null and ts >= 1594 and ts <= 1595) and not (user_id = 1 and user_id is not null and ts >= 1596 and ts <= 1597) and not (user_id = 1 and user_id is not null and ts >= 1598 and ts <= 1599) and not (user_id = 1 and user_id is not null and ts >= 1600 and ts <= 1601) and not (user_id = 1 and user_id is not null and ts >= 1602 and ts <= 1603) and not (user_id = 1 and user_id is not null and ts >= 1604 and ts <= 1605) and not (user_id = 1 and user_id is not null and ts >= 1606 and ts <= 1607) and not (user_id = 1 and user_id is not null and ts >= 1608 and ts <= 1609) and not (user_id = 1 and user_id is not null and ts >= 1610 and ts <= 1611) and not (user_id = 1 and user_id is not null and ts >= 1612 and ts <= 1613) and not (user_id = 1 and user_id is not null and ts >= 1614 and ts <= 1615) and not (user_id = 1 and user_id is not null and ts >= 1616 and ts <= 1617) and not (user_id = 1 and user_id is not null and ts >= 1618 and ts <= 1619) and not (user_id = 1 and user_id is not null and ts >= 1620 and ts <= 1621) and not (user_id = 1 and user_id is not null and ts >= 1622 and ts <= 1623) and not (user_id = 1 and user_id is not null and ts >= 1624 and ts <= 1625) and not (user_id = 1 and user_id is not null and ts >= 1626 and ts <= 1627) and not (user_id = 1 and user_id is not null and ts >= 1628 and ts <= 1629) and not (user_id = 1 and user_id is not null and ts >= 1630 and ts <= 1631) and not (user_id = 1 and user_id is not null and ts >= 1632 and ts <= 1633) and not (user_id = 1 and user_id is not null and ts >= 1634 and ts <= 1635) and not (user_id = 1 and user_id is not null and ts >= 1636 and ts <= 1637) and not (user_id = 1 and user_id is not null and ts >= 1638 and ts <= 1639) and not (user_id = 1 and user_id is not null and ts >= 1640 and ts <= 1641) and not (user_id = 1 and user_id is not null and ts >= 1642 and ts <= 1643) and not (user_id = 1 and user_id is not null and ts >= 1644 and ts <= 1645) and not (user_id = 1 and user_id is not null and ts >= 1646 and ts <= 1647) and not (user_id = 1 and user_id is not null and ts >= 1648 and ts <= 1649) and not (user_id = 1 and user_id is not null and ts >= 1650 and ts <= 1651) and not (user_id = 1 and user_id is not null and ts >= 1652 and ts <= 1653) and not (user_id = 1 and user_id is not null and ts >= 1654 and ts <= 1655) and not (user_id = 1 and user_id is not null and ts >= 1656 and ts <= 1657) and not (user_id = 1 and user_id is not null and ts >= 1658 and ts <= 1659) and not (user_id = 1 and user_id is not null and ts >= 1660 and ts <= 1661) and not (user_id = 1 and user_id is not null and ts >= 1662 and ts <= 1663) and not (user_id = 1 and user_id is not null and ts >= 1664 and ts <= 1665) and not (user_id = 1 and user_id is not null and ts >= 1666 and ts <= 1667) and not (user_id = 1 and user_id is not null and ts >= 1668 and ts <= 1669) and not (user_id = 1 and user_id is not null and ts >= 1670 and ts <= 1671) and not (user_id = 1 and user_id is not null and ts >= 1672 and ts <= 1673) and not (user_id = 1 and user_id is not null and ts >= 1674 and ts <= 1675) and not (user_id = 1 and user_id is not null and ts >= 1676 and ts <= 1677) and not (user_id = 1 and user_id is not null and ts >= 1678 and ts <= 1679) and not (user_id = 1 and user_id is not null and ts >= 1680 and ts <= 1681) and not (user_id = 1 and user_id is not null and ts >= 1682 and ts <= 1683) and not (user_id = 1 and user_id is not null and ts >= 1684 and ts <= 1685) and not (user_id = 1 and user_id is not null and ts >= 1686 and ts <= 1687) and not (user_id = 1 and user_id is not null and ts >= 1688 and ts <= 1689) and not (user_id = 1 and user_id is not null and ts >= 1690 and ts <= 1691) and not (user_id = 1 and user_id is not null and ts >= 1692 and ts <= 1693) and not (user_id = 1 and user_id is not null and ts >= 1694 and ts <= 1695) and not (user_id = 1 and user_id is not null and ts >= 1696 and ts <= 1697) and not (user_id = 1 and user_id is not null and ts >= 1698 and ts <= 1699) and not (user_id = 1 and user_id is not null and ts >= 1700 and ts <= 1701) and not (user_id = 1 and user_id is not null and ts >= 1702 and ts <= 1703) and not (user_id = 1 and user_id is not null and ts >= 1704 and ts <= 1705) and not (user_id = 1 and user_id is not null and ts >= 1706 and ts <= 1707) and not (user_id = 1 and user_id is not null and ts >= 1708 and ts <= 1709) and not (user_id = 1 and user_id is not null and ts >= 1710 and ts <= 1711) and not (user_id = 1 and user_id is not null and ts >= 1712 and ts <= 1713) and not (user_id = 1 and user_id is not null and ts >= 1714 and ts <= 1715) and not (user_id = 1 and user_id is not null and ts >= 1716 and ts <= 1717) and not (user_id = 1 and user_id is not null and ts >= 1718 and ts <= 1719) and not (user_id = 1 and user_id is not null and ts >= 1720 and ts <= 1721) and not (user_id = 1 and user_id is not null and ts >= 1722 and ts <= 1723) and not (user_id = 1 and user_id is not null and ts >= 1724 and ts <= 1725) and not (user_id = 1 and user_id is not null and ts >= 1726 and ts <= 1727) and not (user_id = 1 and user_id is not null and ts >= 1728 and ts <= 1729) and not (user_id = 1 and user_id is not null and ts >= 1730 and ts <= 1731) and not (user_id = 1 and user_id is not null and ts >= 1732 and ts <= 1733) and not (user_id = 1 and user_id is not null and ts >= 1734 and ts <= 1735) and not (user_id = 1 and user_id is not null and ts >= 1736 and ts <= 1737) and not (user_id = 1 and user_id is not null and ts >= 1738 and ts <= 1739) and not (user_id = 1 and user_id is not null and ts >= 1740 and ts <= 1741) and not (user_id = 1 and user_id is not null and ts >= 1742 and ts <= 1743) and not (user_id = 1 and user_id is not null and ts >= 1744 and ts <= 1745) and not (user_id = 1 and user_id is not null and ts >= 1746 and ts <= 1747) and not (user_id = 1 and user_id is not null and ts >= 1748 and ts <= 1749) and not (user_id = 1 and user_id is not null and ts >= 1750 and ts <= 1751) and not (user_id = 1 and user_id is not null and ts >= 1752 and ts <= 1753) and not (user_id = 1 and user_id is not null and ts >= 1754 and ts <= 1755) and not (user_id = 1 and user_id is not null and ts >= 1756 and ts <= 1757) and not (user_id = 1 and user_id is not null and ts >= 1758 and ts <= 1759) and not (user_id = 1 and user_id is not null and ts >= 1760 and ts <= 1761) and not (user_id = 1 and user_id is not null and ts >= 1762 and ts <= 1763) and not (user_id = 1 and user_id is not null and ts >= 1764 and ts <= 1765) and not (user_id = 1 and user_id is not null and ts >= 1766 and ts <= 1767) and not (user_id = 1 and user_id is not null and ts >= 1768 and ts <= 1769) and not (user_id = 1 and user_id is not null and ts >= 1770 and ts <= 1771) and not (user_id = 1 and user_id is not null and ts >= 1772 and ts <= 1773) and not (user_id = 1 and user_id is not null and ts >= 1774 and ts <= 1775) and not (user_id = 1 and user_id is not null and ts >= 1776 and ts <= 1777) and not (user_id = 1 and user_id is not null and ts >= 1778 and ts <= 1779) and not (user_id = 1 and user_id is not null and ts >= 1780 and ts <= 1781) and not (user_id = 1 and user_id is not null and ts >= 1782 and ts <= 1783) and not (user_id = 1 and user_id is not null and ts >= 1784 and ts <= 1785) and not (user_id = 1 and user_id is not null and ts >= 1786 and ts <= 1787) and not (user_id = 1 and user_id is not null and ts >= 1788 and ts <= 1789) and not (user_id = 1 and user_id is not null and ts >= 1790 and ts <= 1791) and not (user_id = 1 and user_id is not null and ts >= 1792 and ts <= 1793) and not (user_id = 1 and user_id is not null and ts >= 1794 and ts <= 1795) and not (user_id = 1 and user_id is not null and ts >= 1796 and ts <= 1797) and not (user_id = 1 and user_id is not null and ts >= 1798 and ts <= 1799) and not (user_id = 1 and user_id is not null and ts >= 1800 and ts <= 1801) and not (user_id = 1 and user_id is not null and ts >= 1802 and ts <= 1803) and not (user_id = 1 and user_id is not null and ts >= 1804 and ts <= 1805) and not (user_id = 1 and user_id is not null and ts >= 1806 and ts <= 1807) and not (user_id = 1 and user_id is not null and ts >= 1808 and ts <= 1809) and not (user_id = 1 and user_id is not null and ts >= 1810 and ts <= 1811) and not (user_id = 1 and user_id is not null and ts >= 1812 and ts <= 1813) and not (user_id = 1 and user_id is not null and ts >= 1814 and ts <= 1815) and not (user_id = 1 and user_id is not null and ts >= 1816 and ts <= 1817) and not (user_id = 1 and user_id is not null and ts >= 1818 and ts <= 1819) and not (user_id = 1 and user_id is not null and ts >= 1820 and ts <= 1821) and not (user_id = 1 and user_id is not null and ts >= 1822 and ts <= 1823) and not (user_id = 1 and user_id is not null and ts >= 1824 and ts <= 1825) and not (user_id = 1 and user_id is not null and ts >= 1826 and ts <= 1827) and not (user_id = 1 and user_id is not null and ts >= 1828 and ts <= 1829) and not (user_id = 1 and user_id is not null and ts >= 1830 and ts <= 1831) and not (user_id = 1 and user_id is not null and ts >= 1832 and ts <= 1833) and not (user_id = 1 and user_id is not null and ts >= 1834 and ts <= 1835) and not (user_id = 1 and user_id is not null and ts >= 1836 and ts <= 1837) and not (user_id = 1 and user_id is not null and ts >= 1838 and ts <= 1839) and not (user_id = 1 and user_id is not null and ts >= 1840 and ts <= 1841) and not (user_id = 1 and user_id is not null and ts >= 1842 and ts <= 1843) and not (user_id = 1 and user_id is not null and ts >= 1844 and ts <= 1845) and not (user_id = 1 and user_id is not null and ts >= 1846 and ts <= 1847) and not (user_id = 1 and user_id is not null and ts >= 1848 and ts <= 1849) and not (user_id = 1 and user_id is not null and ts >= 1850 and ts <= 1851) and not (user_id = 1 and user_id is not null and ts >= 1852 and ts <= 1853) and not (user_id = 1 and user_id is not null and ts >= 1854 and ts <= 1855) and not (user_id = 1 and user_id is not null and ts >= 1856 and ts <= 1857) and not (user_id = 1 and user_id is not null and ts >= 1858 and ts <= 1859) and not (user_id = 1 and user_id is not null and ts >= 1860 and ts <= 1861) and not (user_id = 1 and user_id is not null and ts >= 1862 and ts <= 1863) and not (user_id = 1 and user_id is not null and ts >= 1864 and ts <= 1865) and not (user_id = 1 and user_id is not null and ts >= 1866 and ts <= 1867) and not (user_id = 1 and user_id is not null and ts >= 1868 and ts <= 1869) and not (user_id = 1 and user_id is not null and ts >= 1870 and ts <= 1871) and not (user_id = 1 and user_id is not null and ts >= 1872 and ts <= 1873) and not (user_id = 1 and user_id is not null and ts >= 1874 and ts <= 1875) and not (user_id = 1 and user_id is not null and ts >= 1876 and ts <= 1877) and not (user_id = 1 and user_id is not null and ts >= 1878 and ts <= 1879) and not (user_id = 1 and user_id is not null and ts >= 1880 and ts <= 1881) and not (user_id = 1 and user_id is not null and ts >= 1882 and ts <= 1883) and not (user_id = 1 and user_id is not null and ts >= 1884 and ts <= 1885) and not (user_id = 1 and user_id is not null and ts >= 1886 and ts <= 1887) and not (user_id = 1 and user_id is not null and ts >= 1888 and ts <= 1889) and not (user_id = 1 and user_id is not null and ts >= 1890 and ts <= 1891) and not (user_id = 1 and user_id is not null and ts >= 1892 and ts <= 1893) and not (user_id = 1 and user_id is not null and ts >= 1894 and ts <= 1895) and not (user_id = 1 and user_id is not null and ts >= 1896 and ts <= 1897) and not (user_id = 1 and user_id is not null and ts >= 1898 and ts <= 1899) and not (user_id = 1 and user_id is not null and ts >= 1900 and ts <= 1901) and not (user_id = 1 and user_id is not null and ts >= 1902 and ts <= 1903) and not (user_id = 1 and user_id is not null and ts >= 1904 and ts <= 1905) and not (user_id = 1 and user_id is not null and ts >= 1906 and ts <= 1907) and not (user_id = 1 and user_id is not null and ts >= 1908 and ts <= 1909) and not (user_id = 1 and user_id is not null and ts >= 1910 and ts <= 1911) and not (user_id = 1 and user_id is not null and ts >= 1912 and ts <= 1913) and not (user_id = 1 and user_id is not null and ts >= 1914 and ts <= 1915) and not (user_id = 1 and user_id is not null and ts >= 1916 and ts <= 1917) and not (user_id = 1 and user_id is not null and ts >= 1918 and ts <= 1919) and not (user_id = 1 and user_id is not null and ts >= 1920 and ts <= 1921) and not (user_id = 1 and user_id is not null and ts >= 1922 and ts <= 1923) and not (user_id = 1 and user_id is not null and ts >= 1924 and ts <= 1925) and not (user_id = 1 and user_id is not null and ts >= 1926 and ts <= 1927) and not (user_id = 1 and user_id is not null and ts >= 1928 and ts <= 1929) and not (user_id = 1 and user_id is not null and ts >= 1930 and ts <= 1931) and not (user_id = 1 and user_id is not null and ts >= 1932 and ts <= 1933) and not (user_id = 1 and user_id is not null and ts >= 1934 and ts <= 1935) and not (user_id = 1 and user_id is not null and ts >= 1936 and ts <= 1937) and not (user_id = 1 and user_id is not null and ts >= 1938 and ts <= 1939) and not (user_id = 1 and user_id is not null and ts >= 1940 and ts <= 1941) and not (user_id = 1 and user_id is not null and ts >= 1942 and ts <= 1943) and not (user_id = 1 and user_id is not null and ts >= 1944 and ts <= 1945) and not (user_id = 1 and user_id is not null and ts >= 1946 and ts <= 1947) and not (user_id = 1 and user_id is not null and ts >= 1948 and ts <= 1949) and not (user_id = 1 and user_id is not null and ts >= 1950 and ts <= 1951) and not (user_id = 1 and user_id is not null and ts >= 1952 and ts <= 1953) and not (user_id = 1 and user_id is not null and ts >= 1954 and ts <= 1955) and not (user_id = 1 and user_id is not null and ts >= 1956 and ts <= 1957) and not (user_id = 1 and user_id is not null and ts >= 1958 and ts <= 1959) and not (user_id = 1 and user_id is not null and ts >= 1960 and ts <= 1961) and not (user_id = 1 and user_id is not null and ts >= 1962 and ts <= 1963) and not (user_id = 1 and user_id is not null and ts >= 1964 and ts <= 1965) and not (user_id = 1 and user_id is not null and ts >= 1966 and ts <= 1967) and not (user_id = 1 and user_id is not null and ts >= 1968 and ts <= 1969) and not (user_id = 1 and user_id is not null and ts >= 1970 and ts <= 1971) and not (user_id = 1 and user_id is not null and ts >= 1972 and ts <= 1973) and not (user_id = 1 and user_id is not null and ts >= 1974 and ts <= 1975) and not (user_id = 1 and user_id is not null and ts >= 1976 and ts <= 1977) and not (user_id = 1 and user_id is not null and ts >= 1978 and ts <= 1979) and not (user_id = 1 and user_id is not null and ts >= 1980 and ts <= 1981) and not (user_id = 1 and user_id is not null and ts >= 1982 and ts <= 1983) and not (user_id = 1 and user_id is not null and ts >= 1984 and ts <= 1985) and not (user_id = 1 and user_id is not null and ts >= 1986 and ts <= 1987) and not (user_id = 1 and user_id is not null and ts >= 1988 and ts <= 1989) and not (user_id = 1 and user_id is not null and ts >= 1990 and ts <= 1991) and not (user_id = 1 and user_id is not null and ts >= 1992 and ts <= 1993) and not (user_id = 1 and user_id is not null and ts >= 1994 and ts <= 1995) and not (user_id = 1 and user_id is not null and ts >= 1996 and ts <= 1997) and not (user_id = 1 and user_id is not null and ts >= 1998 and ts <= 1999) and not (user_id = 1 and user_id is not null and ts >= 11000 and ts <= 11001) and not (user_id = 1 and user_id is not null and ts >= 11002 and ts <= 11003) and not (user_id = 1 and user_id is not null and ts >= 11004 and ts <= 11005) and not (user_id = 1 and user_id is not null and ts >= 11006 and ts <= 11007) and not (user_id = 1 and user_id is not null and ts >= 11008 and ts <= 11009) and not (user_id = 1 and user_id is not null and ts >= 11010 and ts <= 11011) and not (user_id = 1 and user_id is not null and ts >= 11012 and ts <= 11013) and not (user_id = 1 and user_id is not null and ts >= 11014 and ts <= 11015) and not (user_id = 1 and user_id is not null and ts >= 11016 and ts <= 11017) and not (user_id = 1 and user_id is not null and ts >= 11018 and ts <= 11019) and not (user_id = 1 and user_id is not null and ts >= 11020 and ts <= 11021) and not (user_id = 1 and user_id is not null and ts >= 11022 and ts <= 11023) and not (user_id = 1 and user_id is not null and ts >= 11024 and ts <= 11025) and not (user_id = 1 and user_id is not null and ts >= 11026 and ts <= 11027) and not (user_id = 1 and user_id is not null and ts >= 11028 and ts <= 11029) and not (user_id = 1 and user_id is not null and ts >= 11030 and ts <= 11031) and not (user_id = 1 and user_id is not null and ts >= 11032 and ts <= 11033) and not (user_id = 1 and user_id is not null and ts >= 11034 and ts <= 11035) and not (user_id = 1 and user_id is not null and ts >= 11036 and ts <= 11037) and not (user_id = 1 and user_id is not null and ts >= 11038 and ts <= 11039) and not (user_id = 1 and user_id is not null and ts >= 11040 and ts <= 11041) and not (user_id = 1 and user_id is not null and ts >= 11042 and ts <= 11043) and not (user_id = 1 and user_id is not null and ts >= 11044 and ts <= 11045) and not (user_id = 1 and user_id is not null and ts >= 11046 and ts <= 11047) and not (user_id = 1 and user_id is not null and ts >= 11048 and ts <= 11049) and not (user_id = 1 and user_id is not null and ts >= 11050 and ts <= 11051) and not (user_id = 1 and user_id is not null and ts >= 11052 and ts <= 11053) and not (user_id = 1 and user_id is not null and ts >= 11054 and ts <= 11055) and not (user_id = 1 and user_id is not null and ts >= 11056 and ts <= 11057) and not (user_id = 1 and user_id is not null and ts >= 11058 and ts <= 11059) and not (user_id = 1 and user_id is not null and ts >= 11060 and ts <= 11061) and not (user_id = 1 and user_id is not null and ts >= 11062 and ts <= 11063) and not (user_id = 1 and user_id is not null and ts >= 11064 and ts <= 11065) and not (user_id = 1 and user_id is not null and ts >= 11066 and ts <= 11067) and not (user_id = 1 and user_id is not null and ts >= 11068 and ts <= 11069) and not (user_id = 1 and user_id is not null and ts >= 11070 and ts <= 11071) and not (user_id = 1 and user_id is not null and ts >= 11072 and ts <= 11073) and not (user_id = 1 and user_id is not null and ts >= 11074 and ts <= 11075) and not (user_id = 1 and user_id is not null and ts >= 11076 and ts <= 11077) and not (user_id = 1 and user_id is not null and ts >= 11078 and ts <= 11079) and not (user_id = 1 and user_id is not null and ts >= 11080 and ts <= 11081) and not (user_id = 1 and user_id is not null and ts >= 11082 and ts <= 11083) and not (user_id = 1 and user_id is not null and ts >= 11084 and ts <= 11085) and not (user_id = 1 and user_id is not null and ts >= 11086 and ts <= 11087) and not (user_id = 1 and user_id is not null and ts >= 11088 and ts <= 11089) and not (user_id = 1 and user_id is not null and ts >= 11090 and ts <= 11091) and not (user_id = 1 and user_id is not null and ts >= 11092 and ts <= 11093) and not (user_id = 1 and user_id is not null and ts >= 11094 and ts <= 11095) and not (user_id = 1 and user_id is not null and ts >= 11096 and ts <= 11097) and not (user_id = 1 and user_id is not null and ts >= 11098 and ts <= 11099) and not (user_id = 1 and user_id is not null and ts >= 11100 and ts <= 11101) and not (user_id = 1 and user_id is not null and ts >= 11102 and ts <= 11103) and not (user_id = 1 and user_id is not null and ts >= 11104 and ts <= 11105) and not (user_id = 1 and user_id is not null and ts >= 11106 and ts <= 11107) and not (user_id = 1 and user_id is not null and ts >= 11108 and ts <= 11109) and not (user_id = 1 and user_id is not null and ts >= 11110 and ts <= 11111) and not (user_id = 1 and user_id is not null and ts >= 11112 and ts <= 11113) and not (user_id = 1 and user_id is not null and ts >= 11114 and ts <= 11115) and not (user_id = 1 and user_id is not null and ts >= 11116 and ts <= 11117) and not (user_id = 1 and user_id is not null and ts >= 11118 and ts <= 11119) and not (user_id = 1 and user_id is not null and ts >= 11120 and ts <= 11121) and not (user_id = 1 and user_id is not null and ts >= 11122 and ts <= 11123) and not (user_id = 1 and user_id is not null and ts >= 11124 and ts <= 11125) and not (user_id = 1 and user_id is not null and ts >= 11126 and ts <= 11127) and not (user_id = 1 and user_id is not null and ts >= 11128 and ts <= 11129) and not (user_id = 1 and user_id is not null and ts >= 11130 and ts <= 11131) and not (user_id = 1 and user_id is not null and ts >= 11132 and ts <= 11133) and not (user_id = 1 and user_id is not null and ts >= 11134 and ts <= 11135) and not (user_id = 1 and user_id is not null and ts >= 11136 and ts <= 11137) and not (user_id = 1 and user_id is not null and ts >= 11138 and ts <= 11139) and not (user_id = 1 and user_id is not null and ts >= 11140 and ts <= 11141) and not (user_id = 1 and user_id is not null and ts >= 11142 and ts <= 11143) and not (user_id = 1 and user_id is not null and ts >= 11144 and ts <= 11145) and not (user_id = 1 and user_id is not null and ts >= 11146 and ts <= 11147) and not (user_id = 1 and user_id is not null and ts >= 11148 and ts <= 11149) and not (user_id = 1 and user_id is not null and ts >= 11150 and ts <= 11151) and not (user_id = 1 and user_id is not null and ts >= 11152 and ts <= 11153) and not (user_id = 1 and user_id is not null and ts >= 11154 and ts <= 11155) and not (user_id = 1 and user_id is not null and ts >= 11156 and ts <= 11157) and not (user_id = 1 and user_id is not null and ts >= 11158 and ts <= 11159) and not (user_id = 1 and user_id is not null and ts >= 11160 and ts <= 11161) and not (user_id = 1 and user_id is not null and ts >= 11162 and ts <= 11163) and not (user_id = 1 and user_id is not null and ts >= 11164 and ts <= 11165) and not (user_id = 1 and user_id is not null and ts >= 11166 and ts <= 11167) and not (user_id = 1 and user_id is not null and ts >= 11168 and ts <= 11169) and not (user_id = 1 and user_id is not null and ts >= 11170 and ts <= 11171) and not (user_id = 1 and user_id is not null and ts >= 11172 and ts <= 11173) and not (user_id = 1 and user_id is not null and ts >= 11174 and ts <= 11175) and not (user_id = 1 and user_id is not null and ts >= 11176 and ts <= 11177) and not (user_id = 1 and user_id is not null and ts >= 11178 and ts <= 11179) and not (user_id = 1 and user_id is not null and ts >= 11180 and ts <= 11181) and not (user_id = 1 and user_id is not null and ts >= 11182 and ts <= 11183) and not (user_id = 1 and user_id is not null and ts >= 11184 and ts <= 11185) and not (user_id = 1 and user_id is not null and ts >= 11186 and ts <= 11187) and not (user_id = 1 and user_id is not null and ts >= 11188 and ts <= 11189) and not (user_id = 1 and user_id is not null and ts >= 11190 and ts <= 11191) and not (user_id = 1 and user_id is not null and ts >= 11192 and ts <= 11193) and not (user_id = 1 and user_id is not null and ts >= 11194 and ts <= 11195) and not (user_id = 1 and user_id is not null and ts >= 11196 and ts <= 11197) and not (user_id = 1 and user_id is not null and ts >= 11198 and ts <= 11199) and not (user_id = 1 and user_id is not null and ts >= 11200 and ts <= 11201) and not (user_id = 1 and user_id is not null and ts >= 11202 and ts <= 11203) and not (user_id = 1 and user_id is not null and ts >= 11204 and ts <= 11205) and not (user_id = 1 and user_id is not null and ts >= 11206 and ts <= 11207) and not (user_id = 1 and user_id is not null and ts >= 11208 and ts <= 11209) and not (user_id = 1 and user_id is not null and ts >= 11210 and ts <= 11211) and not (user_id = 1 and user_id is not null and ts >= 11212 and ts <= 11213) and not (user_id = 1 and user_id is not null and ts >= 11214 and ts <= 11215) and not (user_id = 1 and user_id is not null and ts >= 11216 and ts <= 11217) and not (user_id = 1 and user_id is not null and ts >= 11218 and ts <= 11219) and not (user_id = 1 and user_id is not null and ts >= 11220 and ts <= 11221) and not (user_id = 1 and user_id is not null and ts >= 11222 and ts <= 11223) and not (user_id = 1 and user_id is not null and ts >= 11224 and ts <= 11225) and not (user_id = 1 and user_id is not null and ts >= 11226 and ts <= 11227) and not (user_id = 1 and user_id is not null and ts >= 11228 and ts <= 11229) and not (user_id = 1 and user_id is not null and ts >= 11230 and ts <= 11231) and not (user_id = 1 and user_id is not null and ts >= 11232 and ts <= 11233) and not (user_id = 1 and user_id is not null and ts >= 11234 and ts <= 11235) and not (user_id = 1 and user_id is not null and ts >= 11236 and ts <= 11237) and not (user_id = 1 and user_id is not null and ts >= 11238 and ts <= 11239) and not (user_id = 1 and user_id is not null and ts >= 11240 and ts <= 11241) and not (user_id = 1 and user_id is not null and ts >= 11242 and ts <= 11243) and not (user_id = 1 and user_id is not null and ts >= 11244 and ts <= 11245) and not (user_id = 1 and user_id is not null and ts >= 11246 and ts <= 11247) and not (user_id = 1 and user_id is not null and ts >= 11248 and ts <= 11249) and not (user_id = 1 and user_id is not null and ts >= 11250 and ts <= 11251) and not (user_id = 1 and user_id is not null and ts >= 11252 and ts <= 11253) and not (user_id = 1 and user_id is not null and ts >= 11254 and ts <= 11255) and not (user_id = 1 and user_id is not null and ts >= 11256 and ts <= 11257) and not (user_id = 1 and user_id is not null and ts >= 11258 and ts <= 11259) and not (user_id = 1 and user_id is not null and ts >= 11260 and ts <= 11261) and not (user_id = 1 and user_id is not null and ts >= 11262 and ts <= 11263) and not (user_id = 1 and user_id is not null and ts >= 11264 and ts <= 11265) and not (user_id = 1 and user_id is not null and ts >= 11266 and ts <= 11267) and not (user_id = 1 and user_id is not null and ts >= 11268 and ts <= 11269) and not (user_id = 1 and user_id is not null and ts >= 11270 and ts <= 11271) and not (user_id = 1 and user_id is not null and ts >= 11272 and ts <= 11273) and not (user_id = 1 and user_id is not null and ts >= 11274 and ts <= 11275) and not (user_id = 1 and user_id is not null and ts >= 11276 and ts <= 11277) and not (user_id = 1 and user_id is not null and ts >= 11278 and ts <= 11279) and not (user_id = 1 and user_id is not null and ts >= 11280 and ts <= 11281) and not (user_id = 1 and user_id is not null and ts >= 11282 and ts <= 11283) and not (user_id = 1 and user_id is not null and ts >= 11284 and ts <= 11285) and not (user_id = 1 and user_id is not null and ts >= 11286 and ts <= 11287) and not (user_id = 1 and user_id is not null and ts >= 11288 and ts <= 11289) and not (user_id = 1 and user_id is not null and ts >= 11290 and ts <= 11291) and not (user_id = 1 and user_id is not null and ts >= 11292 and ts <= 11293) and not (user_id = 1 and user_id is not null and ts >= 11294 and ts <= 11295) and not (user_id = 1 and user_id is not null and ts >= 11296 and ts <= 11297) and not (user_id = 1 and user_id is not null and ts >= 11298 and ts <= 11299) and not (user_id = 1 and user_id is not null and ts >= 11300 and ts <= 11301) and not (user_id = 1 and user_id is not null and ts >= 11302 and ts <= 11303) and not (user_id = 1 and user_id is not null and ts >= 11304 and ts <= 11305) and not (user_id = 1 and user_id is not null and ts >= 11306 and ts <= 11307) and not (user_id = 1 and user_id is not null and ts >= 11308 and ts <= 11309) and not (user_id = 1 and user_id is not null and ts >= 11310 and ts <= 11311) and not (user_id = 1 and user_id is not null and ts >= 11312 and ts <= 11313) and not (user_id = 1 and user_id is not null and ts >= 11314 and ts <= 11315) and not (user_id = 1 and user_id is not null and ts >= 11316 and ts <= 11317) and not (user_id = 1 and user_id is not null and ts >= 11318 and ts <= 11319) and not (user_id = 1 and user_id is not null and ts >= 11320 and ts <= 11321) and not (user_id = 1 and user_id is not null and ts >= 11322 and ts <= 11323) and not (user_id = 1 and user_id is not null and ts >= 11324 and ts <= 11325) and not (user_id = 1 and user_id is not null and ts >= 11326 and ts <= 11327) and not (user_id = 1 and user_id is not null and ts >= 11328 and ts <= 11329) and not (user_id = 1 and user_id is not null and ts >= 11330 and ts <= 11331) and not (user_id = 1 and user_id is not null and ts >= 11332 and ts <= 11333) and not (user_id = 1 and user_id is not null and ts >= 11334 and ts <= 11335) and not (user_id = 1 and user_id is not null and ts >= 11336 and ts <= 11337) and not (user_id = 1 and user_id is not null and ts >= 11338 and ts <= 11339) and not (user_id = 1 and user_id is not null and ts >= 11340 and ts <= 11341) and not (user_id = 1 and user_id is not null and ts >= 11342 and ts <= 11343) and not (user_id = 1 and user_id is not null and ts >= 11344 and ts <= 11345) and not (user_id = 1 and user_id is not null and ts >= 11346 and ts <= 11347) and not (user_id = 1 and user_id is not null and ts >= 11348 and ts <= 11349) and not (user_id = 1 and user_id is not null and ts >= 11350 and ts <= 11351) and not (user_id = 1 and user_id is not null and ts >= 11352 and ts <= 11353) and not (user_id = 1 and user_id is not null and ts >= 11354 and ts <= 11355) and not (user_id = 1 and user_id is not null and ts >= 11356 and ts <= 11357) and not (user_id = 1 and user_id is not null and ts >= 11358 and ts <= 11359) and not (user_id = 1 and user_id is not null and ts >= 11360 and ts <= 11361) and not (user_id = 1 and user_id is not null and ts >= 11362 and ts <= 11363) and not (user_id = 1 and user_id is not null and ts >= 11364 and ts <= 11365) and not (user_id = 1 and user_id is not null and ts >= 11366 and ts <= 11367) and not (user_id = 1 and user_id is not null and ts >= 11368 and ts <= 11369) and not (user_id = 1 and user_id is not null and ts >= 11370 and ts <= 11371) and not (user_id = 1 and user_id is not null and ts >= 11372 and ts <= 11373) and not (user_id = 1 and user_id is not null and ts >= 11374 and ts <= 11375) and not (user_id = 1 and user_id is not null and ts >= 11376 and ts <= 11377) and not (user_id = 1 and user_id is not null and ts >= 11378 and ts <= 11379) and not (user_id = 1 and user_id is not null and ts >= 11380 and ts <= 11381) and not (user_id = 1 and user_id is not null and ts >= 11382 and ts <= 11383) and not (user_id = 1 and user_id is not null and ts >= 11384 and ts <= 11385) and not (user_id = 1 and user_id is not null and ts >= 11386 and ts <= 11387) and not (user_id = 1 and user_id is not null and ts >= 11388 and ts <= 11389) and not (user_id = 1 and user_id is not null and ts >= 11390 and ts <= 11391) and not (user_id = 1 and user_id is not null and ts >= 11392 and ts <= 11393) and not (user_id = 1 and user_id is not null and ts >= 11394 and ts <= 11395) and not (user_id = 1 and user_id is not null and ts >= 11396 and ts <= 11397) and not (user_id = 1 and user_id is not null and ts >= 11398 and ts <= 11399) and not (user_id = 1 and user_id is not null and ts >= 11400 and ts <= 11401) and not (user_id = 1 and user_id is not null and ts >= 11402 and ts <= 11403) and not (user_id = 1 and user_id is not null and ts >= 11404 and ts <= 11405) and not (user_id = 1 and user_id is not null and ts >= 11406 and ts <= 11407) and not (user_id = 1 and user_id is not null and ts >= 11408 and ts <= 11409) and not (user_id = 1 and user_id is not null and ts >= 11410 and ts <= 11411) and not (user_id = 1 and user_id is not null and ts >= 11412 and ts <= 11413) and not (user_id = 1 and user_id is not null and ts >= 11414 and ts <= 11415) and not (user_id = 1 and user_id is not null and ts >= 11416 and ts <= 11417) and not (user_id = 1 and user_id is not null and ts >= 11418 and ts <= 11419) and not (user_id = 1 and user_id is not null and ts >= 11420 and ts <= 11421) and not (user_id = 1 and user_id is not null and ts >= 11422 and ts <= 11423) and not (user_id = 1 and user_id is not null and ts >= 11424 and ts <= 11425) and not (user_id = 1 and user_id is not null and ts >= 11426 and ts <= 11427) and not (user_id = 1 and user_id is not null and ts >= 11428 and ts <= 11429) and not (user_id = 1 and user_id is not null and ts >= 11430 and ts <= 11431) and not (user_id = 1 and user_id is not null and ts >= 11432 and ts <= 11433) and not (user_id = 1 and user_id is not null and ts >= 11434 and ts <= 11435) and not (user_id = 1 and user_id is not null and ts >= 11436 and ts <= 11437) and not (user_id = 1 and user_id is not null and ts >= 11438 and ts <= 11439) and not (user_id = 1 and user_id is not null and ts >= 11440 and ts <= 11441) and not (user_id = 1 and user_id is not null and ts >= 11442 and ts <= 11443) and not (user_id = 1 and user_id is not null and ts >= 11444 and ts <= 11445) and not (user_id = 1 and user_id is not null and ts >= 11446 and ts <= 11447) and not (user_id = 1 and user_id is not null and ts >= 11448 and ts <= 11449) and not (user_id = 1 and user_id is not null and ts >= 11450 and ts <= 11451) and not (user_id = 1 and user_id is not null and ts >= 11452 and ts <= 11453) and not (user_id = 1 and user_id is not null and ts >= 11454 and ts <= 11455) and not (user_id = 1 and user_id is not null and ts >= 11456 and ts <= 11457) and not (user_id = 1 and user_id is not null and ts >= 11458 and ts <= 11459) and not (user_id = 1 and user_id is not null and ts >= 11460 and ts <= 11461) and not (user_id = 1 and user_id is not null and ts >= 11462 and ts <= 11463) and not (user_id = 1 and user_id is not null and ts >= 11464 and ts <= 11465) and not (user_id = 1 and user_id is not null and ts >= 11466 and ts <= 11467) and not (user_id = 1 and user_id is not null and ts >= 11468 and ts <= 11469) and not (user_id = 1 and user_id is not null and ts >= 11470 and ts <= 11471) and not (user_id = 1 and user_id is not null and ts >= 11472 and ts <= 11473) and not (user_id = 1 and user_id is not null and ts >= 11474 and ts <= 11475) and not (user_id = 1 and user_id is not null and ts >= 11476 and ts <= 11477) and not (user_id = 1 and user_id is not null and ts >= 11478 and ts <= 11479) and not (user_id = 1 and user_id is not null and ts >= 11480 and ts <= 11481) and not (user_id = 1 and user_id is not null and ts >= 11482 and ts <= 11483) and not (user_id = 1 and user_id is not null and ts >= 11484 and ts <= 11485) and not (user_id = 1 and user_id is not null and ts >= 11486 and ts <= 11487) and not (user_id = 1 and user_id is not null and ts >= 11488 and ts <= 11489) and not (user_id = 1 and user_id is not null and ts >= 11490 and ts <= 11491) and not (user_id = 1 and user_id is not null and ts >= 11492 and ts <= 11493) and not (user_id = 1 and user_id is not null and ts >= 11494 and ts <= 11495) and not (user_id = 1 and user_id is not null and ts >= 11496 and ts <= 11497) and not (user_id = 1 and user_id is not null and ts >= 11498 and ts <= 11499) and not (user_id = 1 and user_id is not null and ts >= 11500 and ts <= 11501) and not (user_id = 1 and user_id is not null and ts >= 11502 and ts <= 11503) and not (user_id = 1 and user_id is not null and ts >= 11504 and ts <= 11505) and not (user_id = 1 and user_id is not null and ts >= 11506 and ts <= 11507) and not (user_id = 1 and user_id is not null and ts >= 11508 and ts <= 11509) and not (user_id = 1 and user_id is not null and ts >= 11510 and ts <= 11511) and not (user_id = 1 and user_id is not null and ts >= 11512 and ts <= 11513) and not (user_id = 1 and user_id is not null and ts >= 11514 and ts <= 11515) and not (user_id = 1 and user_id is not null and ts >= 11516 and ts <= 11517) and not (user_id = 1 and user_id is not null and ts >= 11518 and ts <= 11519) and not (user_id = 1 and user_id is not null and ts >= 11520 and ts <= 11521) and not (user_id = 1 and user_id is not null and ts >= 11522 and ts <= 11523) and not (user_id = 1 and user_id is not null and ts >= 11524 and ts <= 11525) and not (user_id = 1 and user_id is not null and ts >= 11526 and ts <= 11527) and not (user_id = 1 and user_id is not null and ts >= 11528 and ts <= 11529) and not (user_id = 1 and user_id is not null and ts >= 11530 and ts <= 11531) and not (user_id = 1 and user_id is not null and ts >= 11532 and ts <= 11533) and not (user_id = 1 and user_id is not null and ts >= 11534 and ts <= 11535) and not (user_id = 1 and user_id is not null and ts >= 11536 and ts <= 11537) and not (user_id = 1 and user_id is not null and ts >= 11538 and ts <= 11539) and not (user_id = 1 and user_id is not null and ts >= 11540 and ts <= 11541) and not (user_id = 1 and user_id is not null and ts >= 11542 and ts <= 11543) and not (user_id = 1 and user_id is not null and ts >= 11544 and ts <= 11545) and not (user_id = 1 and user_id is not null and ts >= 11546 and ts <= 11547) and not (user_id = 1 and user_id is not null and ts >= 11548 and ts <= 11549) and not (user_id = 1 and user_id is not null and ts >= 11550 and ts <= 11551) and not (user_id = 1 and user_id is not null and ts >= 11552 and ts <= 11553) and not (user_id = 1 and user_id is not null and ts >= 11554 and ts <= 11555) and not (user_id = 1 and user_id is not null and ts >= 11556 and ts <= 11557) and not (user_id = 1 and user_id is not null and ts >= 11558 and ts <= 11559) and not (user_id = 1 and user_id is not null and ts >= 11560 and ts <= 11561) and not (user_id = 1 and user_id is not null and ts >= 11562 and ts <= 11563) and not (user_id = 1 and user_id is not null and ts >= 11564 and ts <= 11565) and not (user_id = 1 and user_id is not null and ts >= 11566 and ts <= 11567) and not (user_id = 1 and user_id is not null and ts >= 11568 and ts <= 11569) and not (user_id = 1 and user_id is not null and ts >= 11570 and ts <= 11571) and not (user_id = 1 and user_id is not null and ts >= 11572 and ts <= 11573) and not (user_id = 1 and user_id is not null and ts >= 11574 and ts <= 11575) and not (user_id = 1 and user_id is not null and ts >= 11576 and ts <= 11577) and not (user_id = 1 and user_id is not null and ts >= 11578 and ts <= 11579) and not (user_id = 1 and user_id is not null and ts >= 11580 and ts <= 11581) and not (user_id = 1 and user_id is not null and ts >= 11582 and ts <= 11583) and not (user_id = 1 and user_id is not null and ts >= 11584 and ts <= 11585) and not (user_id = 1 and user_id is not null and ts >= 11586 and ts <= 11587) and not (user_id = 1 and user_id is not null and ts >= 11588 and ts <= 11589) and not (user_id = 1 and user_id is not null and ts >= 11590 and ts <= 11591) and not (user_id = 1 and user_id is not null and ts >= 11592 and ts <= 11593) and not (user_id = 1 and user_id is not null and ts >= 11594 and ts <= 11595) and not (user_id = 1 and user_id is not null and ts >= 11596 and ts <= 11597) and not (user_id = 1 and user_id is not null and ts >= 11598 and ts <= 11599) and not (user_id = 1 and user_id is not null and ts >= 11600 and ts <= 11601) and not (user_id = 1 and user_id is not null and ts >= 11602 and ts <= 11603) and not (user_id = 1 and user_id is not null and ts >= 11604 and ts <= 11605) and not (user_id = 1 and user_id is not null and ts >= 11606 and ts <= 11607) and not (user_id = 1 and user_id is not null and ts >= 11608 and ts <= 11609) and not (user_id = 1 and user_id is not null and ts >= 11610 and ts <= 11611) and not (user_id = 1 and user_id is not null and ts >= 11612 and ts <= 11613) and not (user_id = 1 and user_id is not null and ts >= 11614 and ts <= 11615) and not (user_id = 1 and user_id is not null and ts >= 11616 and ts <= 11617) and not (user_id = 1 and user_id is not null and ts >= 11618 and ts <= 11619) and not (user_id = 1 and user_id is not null and ts >= 11620 and ts <= 11621) and not (user_id = 1 and user_id is not null and ts >= 11622 and ts <= 11623) and not (user_id = 1 and user_id is not null and ts >= 11624 and ts <= 11625) and not (user_id = 1 and user_id is not null and ts >= 11626 and ts <= 11627) and not (user_id = 1 and user_id is not null and ts >= 11628 and ts <= 11629) and not (user_id = 1 and user_id is not null and ts >= 11630 and ts <= 11631) and not (user_id = 1 and user_id is not null and ts >= 11632 and ts <= 11633) and not (user_id = 1 and user_id is not null and ts >= 11634 and ts <= 11635) and not (user_id = 1 and user_id is not null and ts >= 11636 and ts <= 11637) and not (user_id = 1 and user_id is not null and ts >= 11638 and ts <= 11639) and not (user_id = 1 and user_id is not null and ts >= 11640 and ts <= 11641) and not (user_id = 1 and user_id is not null and ts >= 11642 and ts <= 11643) and not (user_id = 1 and user_id is not null and ts >= 11644 and ts <= 11645) and not (user_id = 1 and user_id is not null and ts >= 11646 and ts <= 11647) and not (user_id = 1 and user_id is not null and ts >= 11648 and ts <= 11649) and not (user_id = 1 and user_id is not null and ts >= 11650 and ts <= 11651) and not (user_id = 1 and user_id is not null and ts >= 11652 and ts <= 11653) and not (user_id = 1 and user_id is not null and ts >= 11654 and ts <= 11655) and not (user_id = 1 and user_id is not null and ts >= 11656 and ts <= 11657) and not (user_id = 1 and user_id is not null and ts >= 11658 and ts <= 11659) and not (user_id = 1 and user_id is not null and ts >= 11660 and ts <= 11661) and not (user_id = 1 and user_id is not null and ts >= 11662 and ts <= 11663) and not (user_id = 1 and user_id is not null and ts >= 11664 and ts <= 11665) and not (user_id = 1 and user_id is not null and ts >= 11666 and ts <= 11667) and not (user_id = 1 and user_id is not null and ts >= 11668 and ts <= 11669) and not (user_id = 1 and user_id is not null and ts >= 11670 and ts <= 11671) and not (user_id = 1 and user_id is not null and ts >= 11672 and ts <= 11673) and not (user_id = 1 and user_id is not null and ts >= 11674 and ts <= 11675) and not (user_id = 1 and user_id is not null and ts >= 11676 and ts <= 11677) and not (user_id = 1 and user_id is not null and ts >= 11678 and ts <= 11679) and not (user_id = 1 and user_id is not null and ts >= 11680 and ts <= 11681) and not (user_id = 1 and user_id is not null and ts >= 11682 and ts <= 11683) and not (user_id = 1 and user_id is not null and ts >= 11684 and ts <= 11685) and not (user_id = 1 and user_id is not null and ts >= 11686 and ts <= 11687) and not (user_id = 1 and user_id is not null and ts >= 11688 and ts <= 11689) and not (user_id = 1 and user_id is not null and ts >= 11690 and ts <= 11691) and not (user_id = 1 and user_id is not null and ts >= 11692 and ts <= 11693) and not (user_id = 1 and user_id is not null and ts >= 11694 and ts <= 11695) and not (user_id = 1 and user_id is not null and ts >= 11696 and ts <= 11697) and not (user_id = 1 and user_id is not null and ts >= 11698 and ts <= 11699) and not (user_id = 1 and user_id is not null and ts >= 11700 and ts <= 11701) and not (user_id = 1 and user_id is not null and ts >= 11702 and ts <= 11703) and not (user_id = 1 and user_id is not null and ts >= 11704 and ts <= 11705) and not (user_id = 1 and user_id is not null and ts >= 11706 and ts <= 11707) and not (user_id = 1 and user_id is not null and ts >= 11708 and ts <= 11709) and not (user_id = 1 and user_id is not null and ts >= 11710 and ts <= 11711) and not (user_id = 1 and user_id is not null and ts >= 11712 and ts <= 11713) and not (user_id = 1 and user_id is not null and ts >= 11714 and ts <= 11715) and not (user_id = 1 and user_id is not null and ts >= 11716 and ts <= 11717) and not (user_id = 1 and user_id is not null and ts >= 11718 and ts <= 11719) and not (user_id = 1 and user_id is not null and ts >= 11720 and ts <= 11721) and not (user_id = 1 and user_id is not null and ts >= 11722 and ts <= 11723) and not (user_id = 1 and user_id is not null and ts >= 11724 and ts <= 11725) and not (user_id = 1 and user_id is not null and ts >= 11726 and ts <= 11727) and not (user_id = 1 and user_id is not null and ts >= 11728 and ts <= 11729) and not (user_id = 1 and user_id is not null and ts >= 11730 and ts <= 11731) and not (user_id = 1 and user_id is not null and ts >= 11732 and ts <= 11733) and not (user_id = 1 and user_id is not null and ts >= 11734 and ts <= 11735) and not (user_id = 1 and user_id is not null and ts >= 11736 and ts <= 11737) and not (user_id = 1 and user_id is not null and ts >= 11738 and ts <= 11739) and not (user_id = 1 and user_id is not null and ts >= 11740 and ts <= 11741) and not (user_id = 1 and user_id is not null and ts >= 11742 and ts <= 11743) and not (user_id = 1 and user_id is not null and ts >= 11744 and ts <= 11745) and not (user_id = 1 and user_id is not null and ts >= 11746 and ts <= 11747) and not (user_id = 1 and user_id is not null and ts >= 11748 and ts <= 11749) and not (user_id = 1 and user_id is not null and ts >= 11750 and ts <= 11751) and not (user_id = 1 and user_id is not null and ts >= 11752 and ts <= 11753) and not (user_id = 1 and user_id is not null and ts >= 11754 and ts <= 11755) and not (user_id = 1 and user_id is not null and ts >= 11756 and ts <= 11757) and not (user_id = 1 and user_id is not null and ts >= 11758 and ts <= 11759) and not (user_id = 1 and user_id is not null and ts >= 11760 and ts <= 11761) and not (user_id = 1 and user_id is not null and ts >= 11762 and ts <= 11763) and not (user_id = 1 and user_id is not null and ts >= 11764 and ts <= 11765) and not (user_id = 1 and user_id is not null and ts >= 11766 and ts <= 11767) and not (user_id = 1 and user_id is not null and ts >= 11768 and ts <= 11769) and not (user_id = 1 and user_id is not null and ts >= 11770 and ts <= 11771) and not (user_id = 1 and user_id is not null and ts >= 11772 and ts <= 11773) and not (user_id = 1 and user_id is not null and ts >= 11774 and ts <= 11775) and not (user_id = 1 and user_id is not null and ts >= 11776 and ts <= 11777) and not (user_id = 1 and user_id is not null and ts >= 11778 and ts <= 11779) and not (user_id = 1 and user_id is not null and ts >= 11780 and ts <= 11781) and not (user_id = 1 and user_id is not null and ts >= 11782 and ts <= 11783) and not (user_id = 1 and user_id is not null and ts >= 11784 and ts <= 11785) and not (user_id = 1 and user_id is not null and ts >= 11786 and ts <= 11787) and not (user_id = 1 and user_id is not null and ts >= 11788 and ts <= 11789) and not (user_id = 1 and user_id is not null and ts >= 11790 and ts <= 11791) and not (user_id = 1 and user_id is not null and ts >= 11792 and ts <= 11793) and not (user_id = 1 and user_id is not null and ts >= 11794 and ts <= 11795) and not (user_id = 1 and user_id is not null and ts >= 11796 and ts <= 11797) and not (user_id = 1 and user_id is not null and ts >= 11798 and ts <= 11799) and not (user_id = 1 and user_id is not null and ts >= 11800 and ts <= 11801) and not (user_id = 1 and user_id is not null and ts >= 11802 and ts <= 11803) and not (user_id = 1 and user_id is not null and ts >= 11804 and ts <= 11805) and not (user_id = 1 and user_id is not null and ts >= 11806 and ts <= 11807) and not (user_id = 1 and user_id is not null and ts >= 11808 and ts <= 11809) and not (user_id = 1 and user_id is not null and ts >= 11810 and ts <= 11811) and not (user_id = 1 and user_id is not null and ts >= 11812 and ts <= 11813) and not (user_id = 1 and user_id is not null and ts >= 11814 and ts <= 11815) and not (user_id = 1 and user_id is not null and ts >= 11816 and ts <= 11817) and not (user_id = 1 and user_id is not null and ts >= 11818 and ts <= 11819) and not (user_id = 1 and user_id is not null and ts >= 11820 and ts <= 11821) and not (user_id = 1 and user_id is not null and ts >= 11822 and ts <= 11823) and not (user_id = 1 and user_id is not null and ts >= 11824 and ts <= 11825) and not (user_id = 1 and user_id is not null and ts >= 11826 and ts <= 11827) and not (user_id = 1 and user_id is not null and ts >= 11828 and ts <= 11829) and not (user_id = 1 and user_id is not null and ts >= 11830 and ts <= 11831) and not (user_id = 1 and user_id is not null and ts >= 11832 and ts <= 11833) and not (user_id = 1 and user_id is not null and ts >= 11834 and ts <= 11835) and not (user_id = 1 and user_id is not null and ts >= 11836 and ts <= 11837) and not (user_id = 1 and user_id is not null and ts >= 11838 and ts <= 11839) and not (user_id = 1 and user_id is not null and ts >= 11840 and ts <= 11841) and not (user_id = 1 and user_id is not null and ts >= 11842 and ts <= 11843) and not (user_id = 1 and user_id is not null and ts >= 11844 and ts <= 11845) and not (user_id = 1 and user_id is not null and ts >= 11846 and ts <= 11847) and not (user_id = 1 and user_id is not null and ts >= 11848 and ts <= 11849) and not (user_id = 1 and user_id is not null and ts >= 11850 and ts <= 11851) and not (user_id = 1 and user_id is not null and ts >= 11852 and ts <= 11853) and not (user_id = 1 and user_id is not null and ts >= 11854 and ts <= 11855) and not (user_id = 1 and user_id is not null and ts >= 11856 and ts <= 11857) and not (user_id = 1 and user_id is not null and ts >= 11858 and ts <= 11859) and not (user_id = 1 and user_id is not null and ts >= 11860 and ts <= 11861) and not (user_id = 1 and user_id is not null and ts >= 11862 and ts <= 11863) and not (user_id = 1 and user_id is not null and ts >= 11864 and ts <= 11865) and not (user_id = 1 and user_id is not null and ts >= 11866 and ts <= 11867) and not (user_id = 1 and user_id is not null and ts >= 11868 and ts <= 11869) and not (user_id = 1 and user_id is not null and ts >= 11870 and ts <= 11871) and not (user_id = 1 and user_id is not null and ts >= 11872 and ts <= 11873) and not (user_id = 1 and user_id is not null and ts >= 11874 and ts <= 11875) and not (user_id = 1 and user_id is not null and ts >= 11876 and ts <= 11877) and not (user_id = 1 and user_id is not null and ts >= 11878 and ts <= 11879) and not (user_id = 1 and user_id is not null and ts >= 11880 and ts <= 11881) and not (user_id = 1 and user_id is not null and ts >= 11882 and ts <= 11883) and not (user_id = 1 and user_id is not null and ts >= 11884 and ts <= 11885) and not (user_id = 1 and user_id is not null and ts >= 11886 and ts <= 11887) and not (user_id = 1 and user_id is not null and ts >= 11888 and ts <= 11889) and not (user_id = 1 and user_id is not null and ts >= 11890 and ts <= 11891) and not (user_id = 1 and user_id is not null and ts >= 11892 and ts <= 11893) and not (user_id = 1 and user_id is not null and ts >= 11894 and ts <= 11895) and not (user_id = 1 and user_id is not null and ts >= 11896 and ts <= 11897) and not (user_id = 1 and user_id is not null and ts >= 11898 and ts <= 11899) and not (user_id = 1 and user_id is not null and ts >= 11900 and ts <= 11901) and not (user_id = 1 and user_id is not null and ts >= 11902 and ts <= 11903) and not (user_id = 1 and user_id is not null and ts >= 11904 and ts <= 11905) and not (user_id = 1 and user_id is not null and ts >= 11906 and ts <= 11907) and not (user_id = 1 and user_id is not null and ts >= 11908 and ts <= 11909) and not (user_id = 1 and user_id is not null and ts >= 11910 and ts <= 11911) and not (user_id = 1 and user_id is not null and ts >= 11912 and ts <= 11913) and not (user_id = 1 and user_id is not null and ts >= 11914 and ts <= 11915) and not (user_id = 1 and user_id is not null and ts >= 11916 and ts <= 11917) and not (user_id = 1 and user_id is not null and ts >= 11918 and ts <= 11919) and not (user_id = 1 and user_id is not null and ts >= 11920 and ts <= 11921) and not (user_id = 1 and user_id is not null and ts >= 11922 and ts <= 11923) and not (user_id = 1 and user_id is not null and ts >= 11924 and ts <= 11925) and not (user_id = 1 and user_id is not null and ts >= 11926 and ts <= 11927) and not (user_id = 1 and user_id is not null and ts >= 11928 and ts <= 11929) and not (user_id = 1 and user_id is not null and ts >= 11930 and ts <= 11931) and not (user_id = 1 and user_id is not null and ts >= 11932 and ts <= 11933) and not (user_id = 1 and user_id is not null and ts >= 11934 and ts <= 11935) and not (user_id = 1 and user_id is not null and ts >= 11936 and ts <= 11937) and not (user_id = 1 and user_id is not null and ts >= 11938 and ts <= 11939) and not (user_id = 1 and user_id is not null and ts >= 11940 and ts <= 11941) and not (user_id = 1 and user_id is not null and ts >= 11942 and ts <= 11943) and not (user_id = 1 and user_id is not null and ts >= 11944 and ts <= 11945) and not (user_id = 1 and user_id is not null and ts >= 11946 and ts <= 11947) and not (user_id = 1 and user_id is not null and ts >= 11948 and ts <= 11949) and not (user_id = 1 and user_id is not null and ts >= 11950 and ts <= 11951) and not (user_id = 1 and user_id is not null and ts >= 11952 and ts <= 11953) and not (user_id = 1 and user_id is not null and ts >= 11954 and ts <= 11955) and not (user_id = 1 and user_id is not null and ts >= 11956 and ts <= 11957) and not (user_id = 1 and user_id is not null and ts >= 11958 and ts <= 11959) and not (user_id = 1 and user_id is not null and ts >= 11960 and ts <= 11961) and not (user_id = 1 and user_id is not null and ts >= 11962 and ts <= 11963) and not (user_id = 1 and user_id is not null and ts >= 11964 and ts <= 11965) and not (user_id = 1 and user_id is not null and ts >= 11966 and ts <= 11967) and not (user_id = 1 and user_id is not null and ts >= 11968 and ts <= 11969) and not (user_id = 1 and user_id is not null and ts >= 11970 and ts <= 11971) and not (user_id = 1 and user_id is not null and ts >= 11972 and ts <= 11973) and not (user_id = 1 and user_id is not null and ts >= 11974 and ts <= 11975) and not (user_id = 1 and user_id is not null and ts >= 11976 and ts <= 11977) and not (user_id = 1 and user_id is not null and ts >= 11978 and ts <= 11979) and not (user_id = 1 and user_id is not null and ts >= 11980 and ts <= 11981) and not (user_id = 1 and user_id is not null and ts >= 11982 and ts <= 11983) and not (user_id = 1 and user_id is not null and ts >= 11984 and ts <= 11985) and not (user_id = 1 and user_id is not null and ts >= 11986 and ts <= 11987) and not (user_id = 1 and user_id is not null and ts >= 11988 and ts <= 11989) and not (user_id = 1 and user_id is not null and ts >= 11990 and ts <= 11991) and not (user_id = 1 and user_id is not null and ts >= 11992 and ts <= 11993) and ts >= 113898 and parent_id = 1 order by ts asc limit 100", + "v3-plan": "VT12001: unsupported: in scatter query: ORDER BY must reference a column in the SELECT list: ts asc", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select 1 from user where shard_key = 1 and is_removed = 1 and cmd in ('A','B','C') and not (user_id = 1 and user_id is not null and ts >= 1 and ts <= 2) and not (user_id = 1 and user_id is not null and ts >= 12 and ts <= 13) and not (user_id = 1 and user_id is not null and ts >= 14 and ts <= 15) and not (user_id = 1 and user_id is not null and ts >= 16 and ts <= 17) and not (user_id = 1 and user_id is not null and ts >= 18 and ts <= 19) and not (user_id = 1 and user_id is not null and ts >= 110 and ts <= 111) and not (user_id = 1 and user_id is not null and ts >= 112 and ts <= 113) and not (user_id = 1 and user_id is not null and ts >= 114 and ts <= 115) and not (user_id = 1 and user_id is not null and ts >= 116 and ts <= 117) and not (user_id = 1 and user_id is not null and ts >= 118 and ts <= 119) and not (user_id = 1 and user_id is not null and ts >= 120 and ts <= 121) and not (user_id = 1 and user_id is not null and ts >= 122 and ts <= 123) and not (user_id = 1 and user_id is not null and ts >= 124 and ts <= 125) and not (user_id = 1 and user_id is not null and ts >= 126 and ts <= 127) and not (user_id = 1 and user_id is not null and ts >= 128 and ts <= 129) and not (user_id = 1 and user_id is not null and ts >= 130 and ts <= 131) and not (user_id = 1 and user_id is not null and ts >= 132 and ts <= 133) and not (user_id = 1 and user_id is not null and ts >= 134 and ts <= 135) and not (user_id = 1 and user_id is not null and ts >= 136 and ts <= 137) and not (user_id = 1 and user_id is not null and ts >= 138 and ts <= 139) and not (user_id = 1 and user_id is not null and ts >= 140 and ts <= 141) and not (user_id = 1 and user_id is not null and ts >= 142 and ts <= 143) and not (user_id = 1 and user_id is not null and ts >= 144 and ts <= 145) and not (user_id = 1 and user_id is not null and ts >= 146 and ts <= 147) and not (user_id = 1 and user_id is not null and ts >= 148 and ts <= 149) and not (user_id = 1 and user_id is not null and ts >= 150 and ts <= 151) and not (user_id = 1 and user_id is not null and ts >= 152 and ts <= 153) and not (user_id = 1 and user_id is not null and ts >= 154 and ts <= 155) and not (user_id = 1 and user_id is not null and ts >= 156 and ts <= 157) and not (user_id = 1 and user_id is not null and ts >= 158 and ts <= 159) and not (user_id = 1 and user_id is not null and ts >= 160 and ts <= 161) and not (user_id = 1 and user_id is not null and ts >= 162 and ts <= 163) and not (user_id = 1 and user_id is not null and ts >= 164 and ts <= 165) and not (user_id = 1 and user_id is not null and ts >= 166 and ts <= 167) and not (user_id = 1 and user_id is not null and ts >= 168 and ts <= 169) and not (user_id = 1 and user_id is not null and ts >= 170 and ts <= 171) and not (user_id = 1 and user_id is not null and ts >= 172 and ts <= 173) and not (user_id = 1 and user_id is not null and ts >= 174 and ts <= 175) and not (user_id = 1 and user_id is not null and ts >= 176 and ts <= 177) and not (user_id = 1 and user_id is not null and ts >= 178 and ts <= 179) and not (user_id = 1 and user_id is not null and ts >= 180 and ts <= 181) and not (user_id = 1 and user_id is not null and ts >= 182 and ts <= 183) and not (user_id = 1 and user_id is not null and ts >= 184 and ts <= 185) and not (user_id = 1 and user_id is not null and ts >= 186 and ts <= 187) and not (user_id = 1 and user_id is not null and ts >= 188 and ts <= 189) and not (user_id = 1 and user_id is not null and ts >= 190 and ts <= 191) and not (user_id = 1 and user_id is not null and ts >= 192 and ts <= 193) and not (user_id = 1 and user_id is not null and ts >= 194 and ts <= 195) and not (user_id = 1 and user_id is not null and ts >= 196 and ts <= 197) and not (user_id = 1 and user_id is not null and ts >= 198 and ts <= 199) and not (user_id = 1 and user_id is not null and ts >= 1100 and ts <= 1101) and not (user_id = 1 and user_id is not null and ts >= 1102 and ts <= 1103) and not (user_id = 1 and user_id is not null and ts >= 1104 and ts <= 1105) and not (user_id = 1 and user_id is not null and ts >= 1106 and ts <= 1107) and not (user_id = 1 and user_id is not null and ts >= 1108 and ts <= 1109) and not (user_id = 1 and user_id is not null and ts >= 1110 and ts <= 1111) and not (user_id = 1 and user_id is not null and ts >= 1112 and ts <= 1113) and not (user_id = 1 and user_id is not null and ts >= 1114 and ts <= 1115) and not (user_id = 1 and user_id is not null and ts >= 1116 and ts <= 1117) and not (user_id = 1 and user_id is not null and ts >= 1118 and ts <= 1119) and not (user_id = 1 and user_id is not null and ts >= 1120 and ts <= 1121) and not (user_id = 1 and user_id is not null and ts >= 1122 and ts <= 1123) and not (user_id = 1 and user_id is not null and ts >= 1124 and ts <= 1125) and not (user_id = 1 and user_id is not null and ts >= 1126 and ts <= 1127) and not (user_id = 1 and user_id is not null and ts >= 1128 and ts <= 1129) and not (user_id = 1 and user_id is not null and ts >= 1130 and ts <= 1131) and not (user_id = 1 and user_id is not null and ts >= 1132 and ts <= 1133) and not (user_id = 1 and user_id is not null and ts >= 1134 and ts <= 1135) and not (user_id = 1 and user_id is not null and ts >= 1136 and ts <= 1137) and not (user_id = 1 and user_id is not null and ts >= 1138 and ts <= 1139) and not (user_id = 1 and user_id is not null and ts >= 1140 and ts <= 1141) and not (user_id = 1 and user_id is not null and ts >= 1142 and ts <= 1143) and not (user_id = 1 and user_id is not null and ts >= 1144 and ts <= 1145) and not (user_id = 1 and user_id is not null and ts >= 1146 and ts <= 1147) and not (user_id = 1 and user_id is not null and ts >= 1148 and ts <= 1149) and not (user_id = 1 and user_id is not null and ts >= 1150 and ts <= 1151) and not (user_id = 1 and user_id is not null and ts >= 1152 and ts <= 1153) and not (user_id = 1 and user_id is not null and ts >= 1154 and ts <= 1155) and not (user_id = 1 and user_id is not null and ts >= 1156 and ts <= 1157) and not (user_id = 1 and user_id is not null and ts >= 1158 and ts <= 1159) and not (user_id = 1 and user_id is not null and ts >= 1160 and ts <= 1161) and not (user_id = 1 and user_id is not null and ts >= 1162 and ts <= 1163) and not (user_id = 1 and user_id is not null and ts >= 1164 and ts <= 1165) and not (user_id = 1 and user_id is not null and ts >= 1166 and ts <= 1167) and not (user_id = 1 and user_id is not null and ts >= 1168 and ts <= 1169) and not (user_id = 1 and user_id is not null and ts >= 1170 and ts <= 1171) and not (user_id = 1 and user_id is not null and ts >= 1172 and ts <= 1173) and not (user_id = 1 and user_id is not null and ts >= 1174 and ts <= 1175) and not (user_id = 1 and user_id is not null and ts >= 1176 and ts <= 1177) and not (user_id = 1 and user_id is not null and ts >= 1178 and ts <= 1179) and not (user_id = 1 and user_id is not null and ts >= 1180 and ts <= 1181) and not (user_id = 1 and user_id is not null and ts >= 1182 and ts <= 1183) and not (user_id = 1 and user_id is not null and ts >= 1184 and ts <= 1185) and not (user_id = 1 and user_id is not null and ts >= 1186 and ts <= 1187) and not (user_id = 1 and user_id is not null and ts >= 1188 and ts <= 1189) and not (user_id = 1 and user_id is not null and ts >= 1190 and ts <= 1191) and not (user_id = 1 and user_id is not null and ts >= 1192 and ts <= 1193) and not (user_id = 1 and user_id is not null and ts >= 1194 and ts <= 1195) and not (user_id = 1 and user_id is not null and ts >= 1196 and ts <= 1197) and not (user_id = 1 and user_id is not null and ts >= 1198 and ts <= 1199) and not (user_id = 1 and user_id is not null and ts >= 1200 and ts <= 1201) and not (user_id = 1 and user_id is not null and ts >= 1202 and ts <= 1203) and not (user_id = 1 and user_id is not null and ts >= 1204 and ts <= 1205) and not (user_id = 1 and user_id is not null and ts >= 1206 and ts <= 1207) and not (user_id = 1 and user_id is not null and ts >= 1208 and ts <= 1209) and not (user_id = 1 and user_id is not null and ts >= 1210 and ts <= 1211) and not (user_id = 1 and user_id is not null and ts >= 1212 and ts <= 1213) and not (user_id = 1 and user_id is not null and ts >= 1214 and ts <= 1215) and not (user_id = 1 and user_id is not null and ts >= 1216 and ts <= 1217) and not (user_id = 1 and user_id is not null and ts >= 1218 and ts <= 1219) and not (user_id = 1 and user_id is not null and ts >= 1220 and ts <= 1221) and not (user_id = 1 and user_id is not null and ts >= 1222 and ts <= 1223) and not (user_id = 1 and user_id is not null and ts >= 1224 and ts <= 1225) and not (user_id = 1 and user_id is not null and ts >= 1226 and ts <= 1227) and not (user_id = 1 and user_id is not null and ts >= 1228 and ts <= 1229) and not (user_id = 1 and user_id is not null and ts >= 1230 and ts <= 1231) and not (user_id = 1 and user_id is not null and ts >= 1232 and ts <= 1233) and not (user_id = 1 and user_id is not null and ts >= 1234 and ts <= 1235) and not (user_id = 1 and user_id is not null and ts >= 1236 and ts <= 1237) and not (user_id = 1 and user_id is not null and ts >= 1238 and ts <= 1239) and not (user_id = 1 and user_id is not null and ts >= 1240 and ts <= 1241) and not (user_id = 1 and user_id is not null and ts >= 1242 and ts <= 1243) and not (user_id = 1 and user_id is not null and ts >= 1244 and ts <= 1245) and not (user_id = 1 and user_id is not null and ts >= 1246 and ts <= 1247) and not (user_id = 1 and user_id is not null and ts >= 1248 and ts <= 1249) and not (user_id = 1 and user_id is not null and ts >= 1250 and ts <= 1251) and not (user_id = 1 and user_id is not null and ts >= 1252 and ts <= 1253) and not (user_id = 1 and user_id is not null and ts >= 1254 and ts <= 1255) and not (user_id = 1 and user_id is not null and ts >= 1256 and ts <= 1257) and not (user_id = 1 and user_id is not null and ts >= 1258 and ts <= 1259) and not (user_id = 1 and user_id is not null and ts >= 1260 and ts <= 1261) and not (user_id = 1 and user_id is not null and ts >= 1262 and ts <= 1263) and not (user_id = 1 and user_id is not null and ts >= 1264 and ts <= 1265) and not (user_id = 1 and user_id is not null and ts >= 1266 and ts <= 1267) and not (user_id = 1 and user_id is not null and ts >= 1268 and ts <= 1269) and not (user_id = 1 and user_id is not null and ts >= 1270 and ts <= 1271) and not (user_id = 1 and user_id is not null and ts >= 1272 and ts <= 1273) and not (user_id = 1 and user_id is not null and ts >= 1274 and ts <= 1275) and not (user_id = 1 and user_id is not null and ts >= 1276 and ts <= 1277) and not (user_id = 1 and user_id is not null and ts >= 1278 and ts <= 1279) and not (user_id = 1 and user_id is not null and ts >= 1280 and ts <= 1281) and not (user_id = 1 and user_id is not null and ts >= 1282 and ts <= 1283) and not (user_id = 1 and user_id is not null and ts >= 1284 and ts <= 1285) and not (user_id = 1 and user_id is not null and ts >= 1286 and ts <= 1287) and not (user_id = 1 and user_id is not null and ts >= 1288 and ts <= 1289) and not (user_id = 1 and user_id is not null and ts >= 1290 and ts <= 1291) and not (user_id = 1 and user_id is not null and ts >= 1292 and ts <= 1293) and not (user_id = 1 and user_id is not null and ts >= 1294 and ts <= 1295) and not (user_id = 1 and user_id is not null and ts >= 1296 and ts <= 1297) and not (user_id = 1 and user_id is not null and ts >= 1298 and ts <= 1299) and not (user_id = 1 and user_id is not null and ts >= 1300 and ts <= 1301) and not (user_id = 1 and user_id is not null and ts >= 1302 and ts <= 1303) and not (user_id = 1 and user_id is not null and ts >= 1304 and ts <= 1305) and not (user_id = 1 and user_id is not null and ts >= 1306 and ts <= 1307) and not (user_id = 1 and user_id is not null and ts >= 1308 and ts <= 1309) and not (user_id = 1 and user_id is not null and ts >= 1310 and ts <= 1311) and not (user_id = 1 and user_id is not null and ts >= 1312 and ts <= 1313) and not (user_id = 1 and user_id is not null and ts >= 1314 and ts <= 1315) and not (user_id = 1 and user_id is not null and ts >= 1316 and ts <= 1317) and not (user_id = 1 and user_id is not null and ts >= 1318 and ts <= 1319) and not (user_id = 1 and user_id is not null and ts >= 1320 and ts <= 1321) and not (user_id = 1 and user_id is not null and ts >= 1322 and ts <= 1323) and not (user_id = 1 and user_id is not null and ts >= 1324 and ts <= 1325) and not (user_id = 1 and user_id is not null and ts >= 1326 and ts <= 1327) and not (user_id = 1 and user_id is not null and ts >= 1328 and ts <= 1329) and not (user_id = 1 and user_id is not null and ts >= 1330 and ts <= 1331) and not (user_id = 1 and user_id is not null and ts >= 1332 and ts <= 1333) and not (user_id = 1 and user_id is not null and ts >= 1334 and ts <= 1335) and not (user_id = 1 and user_id is not null and ts >= 1336 and ts <= 1337) and not (user_id = 1 and user_id is not null and ts >= 1338 and ts <= 1339) and not (user_id = 1 and user_id is not null and ts >= 1340 and ts <= 1341) and not (user_id = 1 and user_id is not null and ts >= 1342 and ts <= 1343) and not (user_id = 1 and user_id is not null and ts >= 1344 and ts <= 1345) and not (user_id = 1 and user_id is not null and ts >= 1346 and ts <= 1347) and not (user_id = 1 and user_id is not null and ts >= 1348 and ts <= 1349) and not (user_id = 1 and user_id is not null and ts >= 1350 and ts <= 1351) and not (user_id = 1 and user_id is not null and ts >= 1352 and ts <= 1353) and not (user_id = 1 and user_id is not null and ts >= 1354 and ts <= 1355) and not (user_id = 1 and user_id is not null and ts >= 1356 and ts <= 1357) and not (user_id = 1 and user_id is not null and ts >= 1358 and ts <= 1359) and not (user_id = 1 and user_id is not null and ts >= 1360 and ts <= 1361) and not (user_id = 1 and user_id is not null and ts >= 1362 and ts <= 1363) and not (user_id = 1 and user_id is not null and ts >= 1364 and ts <= 1365) and not (user_id = 1 and user_id is not null and ts >= 1366 and ts <= 1367) and not (user_id = 1 and user_id is not null and ts >= 1368 and ts <= 1369) and not (user_id = 1 and user_id is not null and ts >= 1370 and ts <= 1371) and not (user_id = 1 and user_id is not null and ts >= 1372 and ts <= 1373) and not (user_id = 1 and user_id is not null and ts >= 1374 and ts <= 1375) and not (user_id = 1 and user_id is not null and ts >= 1376 and ts <= 1377) and not (user_id = 1 and user_id is not null and ts >= 1378 and ts <= 1379) and not (user_id = 1 and user_id is not null and ts >= 1380 and ts <= 1381) and not (user_id = 1 and user_id is not null and ts >= 1382 and ts <= 1383) and not (user_id = 1 and user_id is not null and ts >= 1384 and ts <= 1385) and not (user_id = 1 and user_id is not null and ts >= 1386 and ts <= 1387) and not (user_id = 1 and user_id is not null and ts >= 1388 and ts <= 1389) and not (user_id = 1 and user_id is not null and ts >= 1390 and ts <= 1391) and not (user_id = 1 and user_id is not null and ts >= 1392 and ts <= 1393) and not (user_id = 1 and user_id is not null and ts >= 1394 and ts <= 1395) and not (user_id = 1 and user_id is not null and ts >= 1396 and ts <= 1397) and not (user_id = 1 and user_id is not null and ts >= 1398 and ts <= 1399) and not (user_id = 1 and user_id is not null and ts >= 1400 and ts <= 1401) and not (user_id = 1 and user_id is not null and ts >= 1402 and ts <= 1403) and not (user_id = 1 and user_id is not null and ts >= 1404 and ts <= 1405) and not (user_id = 1 and user_id is not null and ts >= 1406 and ts <= 1407) and not (user_id = 1 and user_id is not null and ts >= 1408 and ts <= 1409) and not (user_id = 1 and user_id is not null and ts >= 1410 and ts <= 1411) and not (user_id = 1 and user_id is not null and ts >= 1412 and ts <= 1413) and not (user_id = 1 and user_id is not null and ts >= 1414 and ts <= 1415) and not (user_id = 1 and user_id is not null and ts >= 1416 and ts <= 1417) and not (user_id = 1 and user_id is not null and ts >= 1418 and ts <= 1419) and not (user_id = 1 and user_id is not null and ts >= 1420 and ts <= 1421) and not (user_id = 1 and user_id is not null and ts >= 1422 and ts <= 1423) and not (user_id = 1 and user_id is not null and ts >= 1424 and ts <= 1425) and not (user_id = 1 and user_id is not null and ts >= 1426 and ts <= 1427) and not (user_id = 1 and user_id is not null and ts >= 1428 and ts <= 1429) and not (user_id = 1 and user_id is not null and ts >= 1430 and ts <= 1431) and not (user_id = 1 and user_id is not null and ts >= 1432 and ts <= 1433) and not (user_id = 1 and user_id is not null and ts >= 1434 and ts <= 1435) and not (user_id = 1 and user_id is not null and ts >= 1436 and ts <= 1437) and not (user_id = 1 and user_id is not null and ts >= 1438 and ts <= 1439) and not (user_id = 1 and user_id is not null and ts >= 1440 and ts <= 1441) and not (user_id = 1 and user_id is not null and ts >= 1442 and ts <= 1443) and not (user_id = 1 and user_id is not null and ts >= 1444 and ts <= 1445) and not (user_id = 1 and user_id is not null and ts >= 1446 and ts <= 1447) and not (user_id = 1 and user_id is not null and ts >= 1448 and ts <= 1449) and not (user_id = 1 and user_id is not null and ts >= 1450 and ts <= 1451) and not (user_id = 1 and user_id is not null and ts >= 1452 and ts <= 1453) and not (user_id = 1 and user_id is not null and ts >= 1454 and ts <= 1455) and not (user_id = 1 and user_id is not null and ts >= 1456 and ts <= 1457) and not (user_id = 1 and user_id is not null and ts >= 1458 and ts <= 1459) and not (user_id = 1 and user_id is not null and ts >= 1460 and ts <= 1461) and not (user_id = 1 and user_id is not null and ts >= 1462 and ts <= 1463) and not (user_id = 1 and user_id is not null and ts >= 1464 and ts <= 1465) and not (user_id = 1 and user_id is not null and ts >= 1466 and ts <= 1467) and not (user_id = 1 and user_id is not null and ts >= 1468 and ts <= 1469) and not (user_id = 1 and user_id is not null and ts >= 1470 and ts <= 1471) and not (user_id = 1 and user_id is not null and ts >= 1472 and ts <= 1473) and not (user_id = 1 and user_id is not null and ts >= 1474 and ts <= 1475) and not (user_id = 1 and user_id is not null and ts >= 1476 and ts <= 1477) and not (user_id = 1 and user_id is not null and ts >= 1478 and ts <= 1479) and not (user_id = 1 and user_id is not null and ts >= 1480 and ts <= 1481) and not (user_id = 1 and user_id is not null and ts >= 1482 and ts <= 1483) and not (user_id = 1 and user_id is not null and ts >= 1484 and ts <= 1485) and not (user_id = 1 and user_id is not null and ts >= 1486 and ts <= 1487) and not (user_id = 1 and user_id is not null and ts >= 1488 and ts <= 1489) and not (user_id = 1 and user_id is not null and ts >= 1490 and ts <= 1491) and not (user_id = 1 and user_id is not null and ts >= 1492 and ts <= 1493) and not (user_id = 1 and user_id is not null and ts >= 1494 and ts <= 1495) and not (user_id = 1 and user_id is not null and ts >= 1496 and ts <= 1497) and not (user_id = 1 and user_id is not null and ts >= 1498 and ts <= 1499) and not (user_id = 1 and user_id is not null and ts >= 1500 and ts <= 1501) and not (user_id = 1 and user_id is not null and ts >= 1502 and ts <= 1503) and not (user_id = 1 and user_id is not null and ts >= 1504 and ts <= 1505) and not (user_id = 1 and user_id is not null and ts >= 1506 and ts <= 1507) and not (user_id = 1 and user_id is not null and ts >= 1508 and ts <= 1509) and not (user_id = 1 and user_id is not null and ts >= 1510 and ts <= 1511) and not (user_id = 1 and user_id is not null and ts >= 1512 and ts <= 1513) and not (user_id = 1 and user_id is not null and ts >= 1514 and ts <= 1515) and not (user_id = 1 and user_id is not null and ts >= 1516 and ts <= 1517) and not (user_id = 1 and user_id is not null and ts >= 1518 and ts <= 1519) and not (user_id = 1 and user_id is not null and ts >= 1520 and ts <= 1521) and not (user_id = 1 and user_id is not null and ts >= 1522 and ts <= 1523) and not (user_id = 1 and user_id is not null and ts >= 1524 and ts <= 1525) and not (user_id = 1 and user_id is not null and ts >= 1526 and ts <= 1527) and not (user_id = 1 and user_id is not null and ts >= 1528 and ts <= 1529) and not (user_id = 1 and user_id is not null and ts >= 1530 and ts <= 1531) and not (user_id = 1 and user_id is not null and ts >= 1532 and ts <= 1533) and not (user_id = 1 and user_id is not null and ts >= 1534 and ts <= 1535) and not (user_id = 1 and user_id is not null and ts >= 1536 and ts <= 1537) and not (user_id = 1 and user_id is not null and ts >= 1538 and ts <= 1539) and not (user_id = 1 and user_id is not null and ts >= 1540 and ts <= 1541) and not (user_id = 1 and user_id is not null and ts >= 1542 and ts <= 1543) and not (user_id = 1 and user_id is not null and ts >= 1544 and ts <= 1545) and not (user_id = 1 and user_id is not null and ts >= 1546 and ts <= 1547) and not (user_id = 1 and user_id is not null and ts >= 1548 and ts <= 1549) and not (user_id = 1 and user_id is not null and ts >= 1550 and ts <= 1551) and not (user_id = 1 and user_id is not null and ts >= 1552 and ts <= 1553) and not (user_id = 1 and user_id is not null and ts >= 1554 and ts <= 1555) and not (user_id = 1 and user_id is not null and ts >= 1556 and ts <= 1557) and not (user_id = 1 and user_id is not null and ts >= 1558 and ts <= 1559) and not (user_id = 1 and user_id is not null and ts >= 1560 and ts <= 1561) and not (user_id = 1 and user_id is not null and ts >= 1562 and ts <= 1563) and not (user_id = 1 and user_id is not null and ts >= 1564 and ts <= 1565) and not (user_id = 1 and user_id is not null and ts >= 1566 and ts <= 1567) and not (user_id = 1 and user_id is not null and ts >= 1568 and ts <= 1569) and not (user_id = 1 and user_id is not null and ts >= 1570 and ts <= 1571) and not (user_id = 1 and user_id is not null and ts >= 1572 and ts <= 1573) and not (user_id = 1 and user_id is not null and ts >= 1574 and ts <= 1575) and not (user_id = 1 and user_id is not null and ts >= 1576 and ts <= 1577) and not (user_id = 1 and user_id is not null and ts >= 1578 and ts <= 1579) and not (user_id = 1 and user_id is not null and ts >= 1580 and ts <= 1581) and not (user_id = 1 and user_id is not null and ts >= 1582 and ts <= 1583) and not (user_id = 1 and user_id is not null and ts >= 1584 and ts <= 1585) and not (user_id = 1 and user_id is not null and ts >= 1586 and ts <= 1587) and not (user_id = 1 and user_id is not null and ts >= 1588 and ts <= 1589) and not (user_id = 1 and user_id is not null and ts >= 1590 and ts <= 1591) and not (user_id = 1 and user_id is not null and ts >= 1592 and ts <= 1593) and not (user_id = 1 and user_id is not null and ts >= 1594 and ts <= 1595) and not (user_id = 1 and user_id is not null and ts >= 1596 and ts <= 1597) and not (user_id = 1 and user_id is not null and ts >= 1598 and ts <= 1599) and not (user_id = 1 and user_id is not null and ts >= 1600 and ts <= 1601) and not (user_id = 1 and user_id is not null and ts >= 1602 and ts <= 1603) and not (user_id = 1 and user_id is not null and ts >= 1604 and ts <= 1605) and not (user_id = 1 and user_id is not null and ts >= 1606 and ts <= 1607) and not (user_id = 1 and user_id is not null and ts >= 1608 and ts <= 1609) and not (user_id = 1 and user_id is not null and ts >= 1610 and ts <= 1611) and not (user_id = 1 and user_id is not null and ts >= 1612 and ts <= 1613) and not (user_id = 1 and user_id is not null and ts >= 1614 and ts <= 1615) and not (user_id = 1 and user_id is not null and ts >= 1616 and ts <= 1617) and not (user_id = 1 and user_id is not null and ts >= 1618 and ts <= 1619) and not (user_id = 1 and user_id is not null and ts >= 1620 and ts <= 1621) and not (user_id = 1 and user_id is not null and ts >= 1622 and ts <= 1623) and not (user_id = 1 and user_id is not null and ts >= 1624 and ts <= 1625) and not (user_id = 1 and user_id is not null and ts >= 1626 and ts <= 1627) and not (user_id = 1 and user_id is not null and ts >= 1628 and ts <= 1629) and not (user_id = 1 and user_id is not null and ts >= 1630 and ts <= 1631) and not (user_id = 1 and user_id is not null and ts >= 1632 and ts <= 1633) and not (user_id = 1 and user_id is not null and ts >= 1634 and ts <= 1635) and not (user_id = 1 and user_id is not null and ts >= 1636 and ts <= 1637) and not (user_id = 1 and user_id is not null and ts >= 1638 and ts <= 1639) and not (user_id = 1 and user_id is not null and ts >= 1640 and ts <= 1641) and not (user_id = 1 and user_id is not null and ts >= 1642 and ts <= 1643) and not (user_id = 1 and user_id is not null and ts >= 1644 and ts <= 1645) and not (user_id = 1 and user_id is not null and ts >= 1646 and ts <= 1647) and not (user_id = 1 and user_id is not null and ts >= 1648 and ts <= 1649) and not (user_id = 1 and user_id is not null and ts >= 1650 and ts <= 1651) and not (user_id = 1 and user_id is not null and ts >= 1652 and ts <= 1653) and not (user_id = 1 and user_id is not null and ts >= 1654 and ts <= 1655) and not (user_id = 1 and user_id is not null and ts >= 1656 and ts <= 1657) and not (user_id = 1 and user_id is not null and ts >= 1658 and ts <= 1659) and not (user_id = 1 and user_id is not null and ts >= 1660 and ts <= 1661) and not (user_id = 1 and user_id is not null and ts >= 1662 and ts <= 1663) and not (user_id = 1 and user_id is not null and ts >= 1664 and ts <= 1665) and not (user_id = 1 and user_id is not null and ts >= 1666 and ts <= 1667) and not (user_id = 1 and user_id is not null and ts >= 1668 and ts <= 1669) and not (user_id = 1 and user_id is not null and ts >= 1670 and ts <= 1671) and not (user_id = 1 and user_id is not null and ts >= 1672 and ts <= 1673) and not (user_id = 1 and user_id is not null and ts >= 1674 and ts <= 1675) and not (user_id = 1 and user_id is not null and ts >= 1676 and ts <= 1677) and not (user_id = 1 and user_id is not null and ts >= 1678 and ts <= 1679) and not (user_id = 1 and user_id is not null and ts >= 1680 and ts <= 1681) and not (user_id = 1 and user_id is not null and ts >= 1682 and ts <= 1683) and not (user_id = 1 and user_id is not null and ts >= 1684 and ts <= 1685) and not (user_id = 1 and user_id is not null and ts >= 1686 and ts <= 1687) and not (user_id = 1 and user_id is not null and ts >= 1688 and ts <= 1689) and not (user_id = 1 and user_id is not null and ts >= 1690 and ts <= 1691) and not (user_id = 1 and user_id is not null and ts >= 1692 and ts <= 1693) and not (user_id = 1 and user_id is not null and ts >= 1694 and ts <= 1695) and not (user_id = 1 and user_id is not null and ts >= 1696 and ts <= 1697) and not (user_id = 1 and user_id is not null and ts >= 1698 and ts <= 1699) and not (user_id = 1 and user_id is not null and ts >= 1700 and ts <= 1701) and not (user_id = 1 and user_id is not null and ts >= 1702 and ts <= 1703) and not (user_id = 1 and user_id is not null and ts >= 1704 and ts <= 1705) and not (user_id = 1 and user_id is not null and ts >= 1706 and ts <= 1707) and not (user_id = 1 and user_id is not null and ts >= 1708 and ts <= 1709) and not (user_id = 1 and user_id is not null and ts >= 1710 and ts <= 1711) and not (user_id = 1 and user_id is not null and ts >= 1712 and ts <= 1713) and not (user_id = 1 and user_id is not null and ts >= 1714 and ts <= 1715) and not (user_id = 1 and user_id is not null and ts >= 1716 and ts <= 1717) and not (user_id = 1 and user_id is not null and ts >= 1718 and ts <= 1719) and not (user_id = 1 and user_id is not null and ts >= 1720 and ts <= 1721) and not (user_id = 1 and user_id is not null and ts >= 1722 and ts <= 1723) and not (user_id = 1 and user_id is not null and ts >= 1724 and ts <= 1725) and not (user_id = 1 and user_id is not null and ts >= 1726 and ts <= 1727) and not (user_id = 1 and user_id is not null and ts >= 1728 and ts <= 1729) and not (user_id = 1 and user_id is not null and ts >= 1730 and ts <= 1731) and not (user_id = 1 and user_id is not null and ts >= 1732 and ts <= 1733) and not (user_id = 1 and user_id is not null and ts >= 1734 and ts <= 1735) and not (user_id = 1 and user_id is not null and ts >= 1736 and ts <= 1737) and not (user_id = 1 and user_id is not null and ts >= 1738 and ts <= 1739) and not (user_id = 1 and user_id is not null and ts >= 1740 and ts <= 1741) and not (user_id = 1 and user_id is not null and ts >= 1742 and ts <= 1743) and not (user_id = 1 and user_id is not null and ts >= 1744 and ts <= 1745) and not (user_id = 1 and user_id is not null and ts >= 1746 and ts <= 1747) and not (user_id = 1 and user_id is not null and ts >= 1748 and ts <= 1749) and not (user_id = 1 and user_id is not null and ts >= 1750 and ts <= 1751) and not (user_id = 1 and user_id is not null and ts >= 1752 and ts <= 1753) and not (user_id = 1 and user_id is not null and ts >= 1754 and ts <= 1755) and not (user_id = 1 and user_id is not null and ts >= 1756 and ts <= 1757) and not (user_id = 1 and user_id is not null and ts >= 1758 and ts <= 1759) and not (user_id = 1 and user_id is not null and ts >= 1760 and ts <= 1761) and not (user_id = 1 and user_id is not null and ts >= 1762 and ts <= 1763) and not (user_id = 1 and user_id is not null and ts >= 1764 and ts <= 1765) and not (user_id = 1 and user_id is not null and ts >= 1766 and ts <= 1767) and not (user_id = 1 and user_id is not null and ts >= 1768 and ts <= 1769) and not (user_id = 1 and user_id is not null and ts >= 1770 and ts <= 1771) and not (user_id = 1 and user_id is not null and ts >= 1772 and ts <= 1773) and not (user_id = 1 and user_id is not null and ts >= 1774 and ts <= 1775) and not (user_id = 1 and user_id is not null and ts >= 1776 and ts <= 1777) and not (user_id = 1 and user_id is not null and ts >= 1778 and ts <= 1779) and not (user_id = 1 and user_id is not null and ts >= 1780 and ts <= 1781) and not (user_id = 1 and user_id is not null and ts >= 1782 and ts <= 1783) and not (user_id = 1 and user_id is not null and ts >= 1784 and ts <= 1785) and not (user_id = 1 and user_id is not null and ts >= 1786 and ts <= 1787) and not (user_id = 1 and user_id is not null and ts >= 1788 and ts <= 1789) and not (user_id = 1 and user_id is not null and ts >= 1790 and ts <= 1791) and not (user_id = 1 and user_id is not null and ts >= 1792 and ts <= 1793) and not (user_id = 1 and user_id is not null and ts >= 1794 and ts <= 1795) and not (user_id = 1 and user_id is not null and ts >= 1796 and ts <= 1797) and not (user_id = 1 and user_id is not null and ts >= 1798 and ts <= 1799) and not (user_id = 1 and user_id is not null and ts >= 1800 and ts <= 1801) and not (user_id = 1 and user_id is not null and ts >= 1802 and ts <= 1803) and not (user_id = 1 and user_id is not null and ts >= 1804 and ts <= 1805) and not (user_id = 1 and user_id is not null and ts >= 1806 and ts <= 1807) and not (user_id = 1 and user_id is not null and ts >= 1808 and ts <= 1809) and not (user_id = 1 and user_id is not null and ts >= 1810 and ts <= 1811) and not (user_id = 1 and user_id is not null and ts >= 1812 and ts <= 1813) and not (user_id = 1 and user_id is not null and ts >= 1814 and ts <= 1815) and not (user_id = 1 and user_id is not null and ts >= 1816 and ts <= 1817) and not (user_id = 1 and user_id is not null and ts >= 1818 and ts <= 1819) and not (user_id = 1 and user_id is not null and ts >= 1820 and ts <= 1821) and not (user_id = 1 and user_id is not null and ts >= 1822 and ts <= 1823) and not (user_id = 1 and user_id is not null and ts >= 1824 and ts <= 1825) and not (user_id = 1 and user_id is not null and ts >= 1826 and ts <= 1827) and not (user_id = 1 and user_id is not null and ts >= 1828 and ts <= 1829) and not (user_id = 1 and user_id is not null and ts >= 1830 and ts <= 1831) and not (user_id = 1 and user_id is not null and ts >= 1832 and ts <= 1833) and not (user_id = 1 and user_id is not null and ts >= 1834 and ts <= 1835) and not (user_id = 1 and user_id is not null and ts >= 1836 and ts <= 1837) and not (user_id = 1 and user_id is not null and ts >= 1838 and ts <= 1839) and not (user_id = 1 and user_id is not null and ts >= 1840 and ts <= 1841) and not (user_id = 1 and user_id is not null and ts >= 1842 and ts <= 1843) and not (user_id = 1 and user_id is not null and ts >= 1844 and ts <= 1845) and not (user_id = 1 and user_id is not null and ts >= 1846 and ts <= 1847) and not (user_id = 1 and user_id is not null and ts >= 1848 and ts <= 1849) and not (user_id = 1 and user_id is not null and ts >= 1850 and ts <= 1851) and not (user_id = 1 and user_id is not null and ts >= 1852 and ts <= 1853) and not (user_id = 1 and user_id is not null and ts >= 1854 and ts <= 1855) and not (user_id = 1 and user_id is not null and ts >= 1856 and ts <= 1857) and not (user_id = 1 and user_id is not null and ts >= 1858 and ts <= 1859) and not (user_id = 1 and user_id is not null and ts >= 1860 and ts <= 1861) and not (user_id = 1 and user_id is not null and ts >= 1862 and ts <= 1863) and not (user_id = 1 and user_id is not null and ts >= 1864 and ts <= 1865) and not (user_id = 1 and user_id is not null and ts >= 1866 and ts <= 1867) and not (user_id = 1 and user_id is not null and ts >= 1868 and ts <= 1869) and not (user_id = 1 and user_id is not null and ts >= 1870 and ts <= 1871) and not (user_id = 1 and user_id is not null and ts >= 1872 and ts <= 1873) and not (user_id = 1 and user_id is not null and ts >= 1874 and ts <= 1875) and not (user_id = 1 and user_id is not null and ts >= 1876 and ts <= 1877) and not (user_id = 1 and user_id is not null and ts >= 1878 and ts <= 1879) and not (user_id = 1 and user_id is not null and ts >= 1880 and ts <= 1881) and not (user_id = 1 and user_id is not null and ts >= 1882 and ts <= 1883) and not (user_id = 1 and user_id is not null and ts >= 1884 and ts <= 1885) and not (user_id = 1 and user_id is not null and ts >= 1886 and ts <= 1887) and not (user_id = 1 and user_id is not null and ts >= 1888 and ts <= 1889) and not (user_id = 1 and user_id is not null and ts >= 1890 and ts <= 1891) and not (user_id = 1 and user_id is not null and ts >= 1892 and ts <= 1893) and not (user_id = 1 and user_id is not null and ts >= 1894 and ts <= 1895) and not (user_id = 1 and user_id is not null and ts >= 1896 and ts <= 1897) and not (user_id = 1 and user_id is not null and ts >= 1898 and ts <= 1899) and not (user_id = 1 and user_id is not null and ts >= 1900 and ts <= 1901) and not (user_id = 1 and user_id is not null and ts >= 1902 and ts <= 1903) and not (user_id = 1 and user_id is not null and ts >= 1904 and ts <= 1905) and not (user_id = 1 and user_id is not null and ts >= 1906 and ts <= 1907) and not (user_id = 1 and user_id is not null and ts >= 1908 and ts <= 1909) and not (user_id = 1 and user_id is not null and ts >= 1910 and ts <= 1911) and not (user_id = 1 and user_id is not null and ts >= 1912 and ts <= 1913) and not (user_id = 1 and user_id is not null and ts >= 1914 and ts <= 1915) and not (user_id = 1 and user_id is not null and ts >= 1916 and ts <= 1917) and not (user_id = 1 and user_id is not null and ts >= 1918 and ts <= 1919) and not (user_id = 1 and user_id is not null and ts >= 1920 and ts <= 1921) and not (user_id = 1 and user_id is not null and ts >= 1922 and ts <= 1923) and not (user_id = 1 and user_id is not null and ts >= 1924 and ts <= 1925) and not (user_id = 1 and user_id is not null and ts >= 1926 and ts <= 1927) and not (user_id = 1 and user_id is not null and ts >= 1928 and ts <= 1929) and not (user_id = 1 and user_id is not null and ts >= 1930 and ts <= 1931) and not (user_id = 1 and user_id is not null and ts >= 1932 and ts <= 1933) and not (user_id = 1 and user_id is not null and ts >= 1934 and ts <= 1935) and not (user_id = 1 and user_id is not null and ts >= 1936 and ts <= 1937) and not (user_id = 1 and user_id is not null and ts >= 1938 and ts <= 1939) and not (user_id = 1 and user_id is not null and ts >= 1940 and ts <= 1941) and not (user_id = 1 and user_id is not null and ts >= 1942 and ts <= 1943) and not (user_id = 1 and user_id is not null and ts >= 1944 and ts <= 1945) and not (user_id = 1 and user_id is not null and ts >= 1946 and ts <= 1947) and not (user_id = 1 and user_id is not null and ts >= 1948 and ts <= 1949) and not (user_id = 1 and user_id is not null and ts >= 1950 and ts <= 1951) and not (user_id = 1 and user_id is not null and ts >= 1952 and ts <= 1953) and not (user_id = 1 and user_id is not null and ts >= 1954 and ts <= 1955) and not (user_id = 1 and user_id is not null and ts >= 1956 and ts <= 1957) and not (user_id = 1 and user_id is not null and ts >= 1958 and ts <= 1959) and not (user_id = 1 and user_id is not null and ts >= 1960 and ts <= 1961) and not (user_id = 1 and user_id is not null and ts >= 1962 and ts <= 1963) and not (user_id = 1 and user_id is not null and ts >= 1964 and ts <= 1965) and not (user_id = 1 and user_id is not null and ts >= 1966 and ts <= 1967) and not (user_id = 1 and user_id is not null and ts >= 1968 and ts <= 1969) and not (user_id = 1 and user_id is not null and ts >= 1970 and ts <= 1971) and not (user_id = 1 and user_id is not null and ts >= 1972 and ts <= 1973) and not (user_id = 1 and user_id is not null and ts >= 1974 and ts <= 1975) and not (user_id = 1 and user_id is not null and ts >= 1976 and ts <= 1977) and not (user_id = 1 and user_id is not null and ts >= 1978 and ts <= 1979) and not (user_id = 1 and user_id is not null and ts >= 1980 and ts <= 1981) and not (user_id = 1 and user_id is not null and ts >= 1982 and ts <= 1983) and not (user_id = 1 and user_id is not null and ts >= 1984 and ts <= 1985) and not (user_id = 1 and user_id is not null and ts >= 1986 and ts <= 1987) and not (user_id = 1 and user_id is not null and ts >= 1988 and ts <= 1989) and not (user_id = 1 and user_id is not null and ts >= 1990 and ts <= 1991) and not (user_id = 1 and user_id is not null and ts >= 1992 and ts <= 1993) and not (user_id = 1 and user_id is not null and ts >= 1994 and ts <= 1995) and not (user_id = 1 and user_id is not null and ts >= 1996 and ts <= 1997) and not (user_id = 1 and user_id is not null and ts >= 1998 and ts <= 1999) and not (user_id = 1 and user_id is not null and ts >= 11000 and ts <= 11001) and not (user_id = 1 and user_id is not null and ts >= 11002 and ts <= 11003) and not (user_id = 1 and user_id is not null and ts >= 11004 and ts <= 11005) and not (user_id = 1 and user_id is not null and ts >= 11006 and ts <= 11007) and not (user_id = 1 and user_id is not null and ts >= 11008 and ts <= 11009) and not (user_id = 1 and user_id is not null and ts >= 11010 and ts <= 11011) and not (user_id = 1 and user_id is not null and ts >= 11012 and ts <= 11013) and not (user_id = 1 and user_id is not null and ts >= 11014 and ts <= 11015) and not (user_id = 1 and user_id is not null and ts >= 11016 and ts <= 11017) and not (user_id = 1 and user_id is not null and ts >= 11018 and ts <= 11019) and not (user_id = 1 and user_id is not null and ts >= 11020 and ts <= 11021) and not (user_id = 1 and user_id is not null and ts >= 11022 and ts <= 11023) and not (user_id = 1 and user_id is not null and ts >= 11024 and ts <= 11025) and not (user_id = 1 and user_id is not null and ts >= 11026 and ts <= 11027) and not (user_id = 1 and user_id is not null and ts >= 11028 and ts <= 11029) and not (user_id = 1 and user_id is not null and ts >= 11030 and ts <= 11031) and not (user_id = 1 and user_id is not null and ts >= 11032 and ts <= 11033) and not (user_id = 1 and user_id is not null and ts >= 11034 and ts <= 11035) and not (user_id = 1 and user_id is not null and ts >= 11036 and ts <= 11037) and not (user_id = 1 and user_id is not null and ts >= 11038 and ts <= 11039) and not (user_id = 1 and user_id is not null and ts >= 11040 and ts <= 11041) and not (user_id = 1 and user_id is not null and ts >= 11042 and ts <= 11043) and not (user_id = 1 and user_id is not null and ts >= 11044 and ts <= 11045) and not (user_id = 1 and user_id is not null and ts >= 11046 and ts <= 11047) and not (user_id = 1 and user_id is not null and ts >= 11048 and ts <= 11049) and not (user_id = 1 and user_id is not null and ts >= 11050 and ts <= 11051) and not (user_id = 1 and user_id is not null and ts >= 11052 and ts <= 11053) and not (user_id = 1 and user_id is not null and ts >= 11054 and ts <= 11055) and not (user_id = 1 and user_id is not null and ts >= 11056 and ts <= 11057) and not (user_id = 1 and user_id is not null and ts >= 11058 and ts <= 11059) and not (user_id = 1 and user_id is not null and ts >= 11060 and ts <= 11061) and not (user_id = 1 and user_id is not null and ts >= 11062 and ts <= 11063) and not (user_id = 1 and user_id is not null and ts >= 11064 and ts <= 11065) and not (user_id = 1 and user_id is not null and ts >= 11066 and ts <= 11067) and not (user_id = 1 and user_id is not null and ts >= 11068 and ts <= 11069) and not (user_id = 1 and user_id is not null and ts >= 11070 and ts <= 11071) and not (user_id = 1 and user_id is not null and ts >= 11072 and ts <= 11073) and not (user_id = 1 and user_id is not null and ts >= 11074 and ts <= 11075) and not (user_id = 1 and user_id is not null and ts >= 11076 and ts <= 11077) and not (user_id = 1 and user_id is not null and ts >= 11078 and ts <= 11079) and not (user_id = 1 and user_id is not null and ts >= 11080 and ts <= 11081) and not (user_id = 1 and user_id is not null and ts >= 11082 and ts <= 11083) and not (user_id = 1 and user_id is not null and ts >= 11084 and ts <= 11085) and not (user_id = 1 and user_id is not null and ts >= 11086 and ts <= 11087) and not (user_id = 1 and user_id is not null and ts >= 11088 and ts <= 11089) and not (user_id = 1 and user_id is not null and ts >= 11090 and ts <= 11091) and not (user_id = 1 and user_id is not null and ts >= 11092 and ts <= 11093) and not (user_id = 1 and user_id is not null and ts >= 11094 and ts <= 11095) and not (user_id = 1 and user_id is not null and ts >= 11096 and ts <= 11097) and not (user_id = 1 and user_id is not null and ts >= 11098 and ts <= 11099) and not (user_id = 1 and user_id is not null and ts >= 11100 and ts <= 11101) and not (user_id = 1 and user_id is not null and ts >= 11102 and ts <= 11103) and not (user_id = 1 and user_id is not null and ts >= 11104 and ts <= 11105) and not (user_id = 1 and user_id is not null and ts >= 11106 and ts <= 11107) and not (user_id = 1 and user_id is not null and ts >= 11108 and ts <= 11109) and not (user_id = 1 and user_id is not null and ts >= 11110 and ts <= 11111) and not (user_id = 1 and user_id is not null and ts >= 11112 and ts <= 11113) and not (user_id = 1 and user_id is not null and ts >= 11114 and ts <= 11115) and not (user_id = 1 and user_id is not null and ts >= 11116 and ts <= 11117) and not (user_id = 1 and user_id is not null and ts >= 11118 and ts <= 11119) and not (user_id = 1 and user_id is not null and ts >= 11120 and ts <= 11121) and not (user_id = 1 and user_id is not null and ts >= 11122 and ts <= 11123) and not (user_id = 1 and user_id is not null and ts >= 11124 and ts <= 11125) and not (user_id = 1 and user_id is not null and ts >= 11126 and ts <= 11127) and not (user_id = 1 and user_id is not null and ts >= 11128 and ts <= 11129) and not (user_id = 1 and user_id is not null and ts >= 11130 and ts <= 11131) and not (user_id = 1 and user_id is not null and ts >= 11132 and ts <= 11133) and not (user_id = 1 and user_id is not null and ts >= 11134 and ts <= 11135) and not (user_id = 1 and user_id is not null and ts >= 11136 and ts <= 11137) and not (user_id = 1 and user_id is not null and ts >= 11138 and ts <= 11139) and not (user_id = 1 and user_id is not null and ts >= 11140 and ts <= 11141) and not (user_id = 1 and user_id is not null and ts >= 11142 and ts <= 11143) and not (user_id = 1 and user_id is not null and ts >= 11144 and ts <= 11145) and not (user_id = 1 and user_id is not null and ts >= 11146 and ts <= 11147) and not (user_id = 1 and user_id is not null and ts >= 11148 and ts <= 11149) and not (user_id = 1 and user_id is not null and ts >= 11150 and ts <= 11151) and not (user_id = 1 and user_id is not null and ts >= 11152 and ts <= 11153) and not (user_id = 1 and user_id is not null and ts >= 11154 and ts <= 11155) and not (user_id = 1 and user_id is not null and ts >= 11156 and ts <= 11157) and not (user_id = 1 and user_id is not null and ts >= 11158 and ts <= 11159) and not (user_id = 1 and user_id is not null and ts >= 11160 and ts <= 11161) and not (user_id = 1 and user_id is not null and ts >= 11162 and ts <= 11163) and not (user_id = 1 and user_id is not null and ts >= 11164 and ts <= 11165) and not (user_id = 1 and user_id is not null and ts >= 11166 and ts <= 11167) and not (user_id = 1 and user_id is not null and ts >= 11168 and ts <= 11169) and not (user_id = 1 and user_id is not null and ts >= 11170 and ts <= 11171) and not (user_id = 1 and user_id is not null and ts >= 11172 and ts <= 11173) and not (user_id = 1 and user_id is not null and ts >= 11174 and ts <= 11175) and not (user_id = 1 and user_id is not null and ts >= 11176 and ts <= 11177) and not (user_id = 1 and user_id is not null and ts >= 11178 and ts <= 11179) and not (user_id = 1 and user_id is not null and ts >= 11180 and ts <= 11181) and not (user_id = 1 and user_id is not null and ts >= 11182 and ts <= 11183) and not (user_id = 1 and user_id is not null and ts >= 11184 and ts <= 11185) and not (user_id = 1 and user_id is not null and ts >= 11186 and ts <= 11187) and not (user_id = 1 and user_id is not null and ts >= 11188 and ts <= 11189) and not (user_id = 1 and user_id is not null and ts >= 11190 and ts <= 11191) and not (user_id = 1 and user_id is not null and ts >= 11192 and ts <= 11193) and not (user_id = 1 and user_id is not null and ts >= 11194 and ts <= 11195) and not (user_id = 1 and user_id is not null and ts >= 11196 and ts <= 11197) and not (user_id = 1 and user_id is not null and ts >= 11198 and ts <= 11199) and not (user_id = 1 and user_id is not null and ts >= 11200 and ts <= 11201) and not (user_id = 1 and user_id is not null and ts >= 11202 and ts <= 11203) and not (user_id = 1 and user_id is not null and ts >= 11204 and ts <= 11205) and not (user_id = 1 and user_id is not null and ts >= 11206 and ts <= 11207) and not (user_id = 1 and user_id is not null and ts >= 11208 and ts <= 11209) and not (user_id = 1 and user_id is not null and ts >= 11210 and ts <= 11211) and not (user_id = 1 and user_id is not null and ts >= 11212 and ts <= 11213) and not (user_id = 1 and user_id is not null and ts >= 11214 and ts <= 11215) and not (user_id = 1 and user_id is not null and ts >= 11216 and ts <= 11217) and not (user_id = 1 and user_id is not null and ts >= 11218 and ts <= 11219) and not (user_id = 1 and user_id is not null and ts >= 11220 and ts <= 11221) and not (user_id = 1 and user_id is not null and ts >= 11222 and ts <= 11223) and not (user_id = 1 and user_id is not null and ts >= 11224 and ts <= 11225) and not (user_id = 1 and user_id is not null and ts >= 11226 and ts <= 11227) and not (user_id = 1 and user_id is not null and ts >= 11228 and ts <= 11229) and not (user_id = 1 and user_id is not null and ts >= 11230 and ts <= 11231) and not (user_id = 1 and user_id is not null and ts >= 11232 and ts <= 11233) and not (user_id = 1 and user_id is not null and ts >= 11234 and ts <= 11235) and not (user_id = 1 and user_id is not null and ts >= 11236 and ts <= 11237) and not (user_id = 1 and user_id is not null and ts >= 11238 and ts <= 11239) and not (user_id = 1 and user_id is not null and ts >= 11240 and ts <= 11241) and not (user_id = 1 and user_id is not null and ts >= 11242 and ts <= 11243) and not (user_id = 1 and user_id is not null and ts >= 11244 and ts <= 11245) and not (user_id = 1 and user_id is not null and ts >= 11246 and ts <= 11247) and not (user_id = 1 and user_id is not null and ts >= 11248 and ts <= 11249) and not (user_id = 1 and user_id is not null and ts >= 11250 and ts <= 11251) and not (user_id = 1 and user_id is not null and ts >= 11252 and ts <= 11253) and not (user_id = 1 and user_id is not null and ts >= 11254 and ts <= 11255) and not (user_id = 1 and user_id is not null and ts >= 11256 and ts <= 11257) and not (user_id = 1 and user_id is not null and ts >= 11258 and ts <= 11259) and not (user_id = 1 and user_id is not null and ts >= 11260 and ts <= 11261) and not (user_id = 1 and user_id is not null and ts >= 11262 and ts <= 11263) and not (user_id = 1 and user_id is not null and ts >= 11264 and ts <= 11265) and not (user_id = 1 and user_id is not null and ts >= 11266 and ts <= 11267) and not (user_id = 1 and user_id is not null and ts >= 11268 and ts <= 11269) and not (user_id = 1 and user_id is not null and ts >= 11270 and ts <= 11271) and not (user_id = 1 and user_id is not null and ts >= 11272 and ts <= 11273) and not (user_id = 1 and user_id is not null and ts >= 11274 and ts <= 11275) and not (user_id = 1 and user_id is not null and ts >= 11276 and ts <= 11277) and not (user_id = 1 and user_id is not null and ts >= 11278 and ts <= 11279) and not (user_id = 1 and user_id is not null and ts >= 11280 and ts <= 11281) and not (user_id = 1 and user_id is not null and ts >= 11282 and ts <= 11283) and not (user_id = 1 and user_id is not null and ts >= 11284 and ts <= 11285) and not (user_id = 1 and user_id is not null and ts >= 11286 and ts <= 11287) and not (user_id = 1 and user_id is not null and ts >= 11288 and ts <= 11289) and not (user_id = 1 and user_id is not null and ts >= 11290 and ts <= 11291) and not (user_id = 1 and user_id is not null and ts >= 11292 and ts <= 11293) and not (user_id = 1 and user_id is not null and ts >= 11294 and ts <= 11295) and not (user_id = 1 and user_id is not null and ts >= 11296 and ts <= 11297) and not (user_id = 1 and user_id is not null and ts >= 11298 and ts <= 11299) and not (user_id = 1 and user_id is not null and ts >= 11300 and ts <= 11301) and not (user_id = 1 and user_id is not null and ts >= 11302 and ts <= 11303) and not (user_id = 1 and user_id is not null and ts >= 11304 and ts <= 11305) and not (user_id = 1 and user_id is not null and ts >= 11306 and ts <= 11307) and not (user_id = 1 and user_id is not null and ts >= 11308 and ts <= 11309) and not (user_id = 1 and user_id is not null and ts >= 11310 and ts <= 11311) and not (user_id = 1 and user_id is not null and ts >= 11312 and ts <= 11313) and not (user_id = 1 and user_id is not null and ts >= 11314 and ts <= 11315) and not (user_id = 1 and user_id is not null and ts >= 11316 and ts <= 11317) and not (user_id = 1 and user_id is not null and ts >= 11318 and ts <= 11319) and not (user_id = 1 and user_id is not null and ts >= 11320 and ts <= 11321) and not (user_id = 1 and user_id is not null and ts >= 11322 and ts <= 11323) and not (user_id = 1 and user_id is not null and ts >= 11324 and ts <= 11325) and not (user_id = 1 and user_id is not null and ts >= 11326 and ts <= 11327) and not (user_id = 1 and user_id is not null and ts >= 11328 and ts <= 11329) and not (user_id = 1 and user_id is not null and ts >= 11330 and ts <= 11331) and not (user_id = 1 and user_id is not null and ts >= 11332 and ts <= 11333) and not (user_id = 1 and user_id is not null and ts >= 11334 and ts <= 11335) and not (user_id = 1 and user_id is not null and ts >= 11336 and ts <= 11337) and not (user_id = 1 and user_id is not null and ts >= 11338 and ts <= 11339) and not (user_id = 1 and user_id is not null and ts >= 11340 and ts <= 11341) and not (user_id = 1 and user_id is not null and ts >= 11342 and ts <= 11343) and not (user_id = 1 and user_id is not null and ts >= 11344 and ts <= 11345) and not (user_id = 1 and user_id is not null and ts >= 11346 and ts <= 11347) and not (user_id = 1 and user_id is not null and ts >= 11348 and ts <= 11349) and not (user_id = 1 and user_id is not null and ts >= 11350 and ts <= 11351) and not (user_id = 1 and user_id is not null and ts >= 11352 and ts <= 11353) and not (user_id = 1 and user_id is not null and ts >= 11354 and ts <= 11355) and not (user_id = 1 and user_id is not null and ts >= 11356 and ts <= 11357) and not (user_id = 1 and user_id is not null and ts >= 11358 and ts <= 11359) and not (user_id = 1 and user_id is not null and ts >= 11360 and ts <= 11361) and not (user_id = 1 and user_id is not null and ts >= 11362 and ts <= 11363) and not (user_id = 1 and user_id is not null and ts >= 11364 and ts <= 11365) and not (user_id = 1 and user_id is not null and ts >= 11366 and ts <= 11367) and not (user_id = 1 and user_id is not null and ts >= 11368 and ts <= 11369) and not (user_id = 1 and user_id is not null and ts >= 11370 and ts <= 11371) and not (user_id = 1 and user_id is not null and ts >= 11372 and ts <= 11373) and not (user_id = 1 and user_id is not null and ts >= 11374 and ts <= 11375) and not (user_id = 1 and user_id is not null and ts >= 11376 and ts <= 11377) and not (user_id = 1 and user_id is not null and ts >= 11378 and ts <= 11379) and not (user_id = 1 and user_id is not null and ts >= 11380 and ts <= 11381) and not (user_id = 1 and user_id is not null and ts >= 11382 and ts <= 11383) and not (user_id = 1 and user_id is not null and ts >= 11384 and ts <= 11385) and not (user_id = 1 and user_id is not null and ts >= 11386 and ts <= 11387) and not (user_id = 1 and user_id is not null and ts >= 11388 and ts <= 11389) and not (user_id = 1 and user_id is not null and ts >= 11390 and ts <= 11391) and not (user_id = 1 and user_id is not null and ts >= 11392 and ts <= 11393) and not (user_id = 1 and user_id is not null and ts >= 11394 and ts <= 11395) and not (user_id = 1 and user_id is not null and ts >= 11396 and ts <= 11397) and not (user_id = 1 and user_id is not null and ts >= 11398 and ts <= 11399) and not (user_id = 1 and user_id is not null and ts >= 11400 and ts <= 11401) and not (user_id = 1 and user_id is not null and ts >= 11402 and ts <= 11403) and not (user_id = 1 and user_id is not null and ts >= 11404 and ts <= 11405) and not (user_id = 1 and user_id is not null and ts >= 11406 and ts <= 11407) and not (user_id = 1 and user_id is not null and ts >= 11408 and ts <= 11409) and not (user_id = 1 and user_id is not null and ts >= 11410 and ts <= 11411) and not (user_id = 1 and user_id is not null and ts >= 11412 and ts <= 11413) and not (user_id = 1 and user_id is not null and ts >= 11414 and ts <= 11415) and not (user_id = 1 and user_id is not null and ts >= 11416 and ts <= 11417) and not (user_id = 1 and user_id is not null and ts >= 11418 and ts <= 11419) and not (user_id = 1 and user_id is not null and ts >= 11420 and ts <= 11421) and not (user_id = 1 and user_id is not null and ts >= 11422 and ts <= 11423) and not (user_id = 1 and user_id is not null and ts >= 11424 and ts <= 11425) and not (user_id = 1 and user_id is not null and ts >= 11426 and ts <= 11427) and not (user_id = 1 and user_id is not null and ts >= 11428 and ts <= 11429) and not (user_id = 1 and user_id is not null and ts >= 11430 and ts <= 11431) and not (user_id = 1 and user_id is not null and ts >= 11432 and ts <= 11433) and not (user_id = 1 and user_id is not null and ts >= 11434 and ts <= 11435) and not (user_id = 1 and user_id is not null and ts >= 11436 and ts <= 11437) and not (user_id = 1 and user_id is not null and ts >= 11438 and ts <= 11439) and not (user_id = 1 and user_id is not null and ts >= 11440 and ts <= 11441) and not (user_id = 1 and user_id is not null and ts >= 11442 and ts <= 11443) and not (user_id = 1 and user_id is not null and ts >= 11444 and ts <= 11445) and not (user_id = 1 and user_id is not null and ts >= 11446 and ts <= 11447) and not (user_id = 1 and user_id is not null and ts >= 11448 and ts <= 11449) and not (user_id = 1 and user_id is not null and ts >= 11450 and ts <= 11451) and not (user_id = 1 and user_id is not null and ts >= 11452 and ts <= 11453) and not (user_id = 1 and user_id is not null and ts >= 11454 and ts <= 11455) and not (user_id = 1 and user_id is not null and ts >= 11456 and ts <= 11457) and not (user_id = 1 and user_id is not null and ts >= 11458 and ts <= 11459) and not (user_id = 1 and user_id is not null and ts >= 11460 and ts <= 11461) and not (user_id = 1 and user_id is not null and ts >= 11462 and ts <= 11463) and not (user_id = 1 and user_id is not null and ts >= 11464 and ts <= 11465) and not (user_id = 1 and user_id is not null and ts >= 11466 and ts <= 11467) and not (user_id = 1 and user_id is not null and ts >= 11468 and ts <= 11469) and not (user_id = 1 and user_id is not null and ts >= 11470 and ts <= 11471) and not (user_id = 1 and user_id is not null and ts >= 11472 and ts <= 11473) and not (user_id = 1 and user_id is not null and ts >= 11474 and ts <= 11475) and not (user_id = 1 and user_id is not null and ts >= 11476 and ts <= 11477) and not (user_id = 1 and user_id is not null and ts >= 11478 and ts <= 11479) and not (user_id = 1 and user_id is not null and ts >= 11480 and ts <= 11481) and not (user_id = 1 and user_id is not null and ts >= 11482 and ts <= 11483) and not (user_id = 1 and user_id is not null and ts >= 11484 and ts <= 11485) and not (user_id = 1 and user_id is not null and ts >= 11486 and ts <= 11487) and not (user_id = 1 and user_id is not null and ts >= 11488 and ts <= 11489) and not (user_id = 1 and user_id is not null and ts >= 11490 and ts <= 11491) and not (user_id = 1 and user_id is not null and ts >= 11492 and ts <= 11493) and not (user_id = 1 and user_id is not null and ts >= 11494 and ts <= 11495) and not (user_id = 1 and user_id is not null and ts >= 11496 and ts <= 11497) and not (user_id = 1 and user_id is not null and ts >= 11498 and ts <= 11499) and not (user_id = 1 and user_id is not null and ts >= 11500 and ts <= 11501) and not (user_id = 1 and user_id is not null and ts >= 11502 and ts <= 11503) and not (user_id = 1 and user_id is not null and ts >= 11504 and ts <= 11505) and not (user_id = 1 and user_id is not null and ts >= 11506 and ts <= 11507) and not (user_id = 1 and user_id is not null and ts >= 11508 and ts <= 11509) and not (user_id = 1 and user_id is not null and ts >= 11510 and ts <= 11511) and not (user_id = 1 and user_id is not null and ts >= 11512 and ts <= 11513) and not (user_id = 1 and user_id is not null and ts >= 11514 and ts <= 11515) and not (user_id = 1 and user_id is not null and ts >= 11516 and ts <= 11517) and not (user_id = 1 and user_id is not null and ts >= 11518 and ts <= 11519) and not (user_id = 1 and user_id is not null and ts >= 11520 and ts <= 11521) and not (user_id = 1 and user_id is not null and ts >= 11522 and ts <= 11523) and not (user_id = 1 and user_id is not null and ts >= 11524 and ts <= 11525) and not (user_id = 1 and user_id is not null and ts >= 11526 and ts <= 11527) and not (user_id = 1 and user_id is not null and ts >= 11528 and ts <= 11529) and not (user_id = 1 and user_id is not null and ts >= 11530 and ts <= 11531) and not (user_id = 1 and user_id is not null and ts >= 11532 and ts <= 11533) and not (user_id = 1 and user_id is not null and ts >= 11534 and ts <= 11535) and not (user_id = 1 and user_id is not null and ts >= 11536 and ts <= 11537) and not (user_id = 1 and user_id is not null and ts >= 11538 and ts <= 11539) and not (user_id = 1 and user_id is not null and ts >= 11540 and ts <= 11541) and not (user_id = 1 and user_id is not null and ts >= 11542 and ts <= 11543) and not (user_id = 1 and user_id is not null and ts >= 11544 and ts <= 11545) and not (user_id = 1 and user_id is not null and ts >= 11546 and ts <= 11547) and not (user_id = 1 and user_id is not null and ts >= 11548 and ts <= 11549) and not (user_id = 1 and user_id is not null and ts >= 11550 and ts <= 11551) and not (user_id = 1 and user_id is not null and ts >= 11552 and ts <= 11553) and not (user_id = 1 and user_id is not null and ts >= 11554 and ts <= 11555) and not (user_id = 1 and user_id is not null and ts >= 11556 and ts <= 11557) and not (user_id = 1 and user_id is not null and ts >= 11558 and ts <= 11559) and not (user_id = 1 and user_id is not null and ts >= 11560 and ts <= 11561) and not (user_id = 1 and user_id is not null and ts >= 11562 and ts <= 11563) and not (user_id = 1 and user_id is not null and ts >= 11564 and ts <= 11565) and not (user_id = 1 and user_id is not null and ts >= 11566 and ts <= 11567) and not (user_id = 1 and user_id is not null and ts >= 11568 and ts <= 11569) and not (user_id = 1 and user_id is not null and ts >= 11570 and ts <= 11571) and not (user_id = 1 and user_id is not null and ts >= 11572 and ts <= 11573) and not (user_id = 1 and user_id is not null and ts >= 11574 and ts <= 11575) and not (user_id = 1 and user_id is not null and ts >= 11576 and ts <= 11577) and not (user_id = 1 and user_id is not null and ts >= 11578 and ts <= 11579) and not (user_id = 1 and user_id is not null and ts >= 11580 and ts <= 11581) and not (user_id = 1 and user_id is not null and ts >= 11582 and ts <= 11583) and not (user_id = 1 and user_id is not null and ts >= 11584 and ts <= 11585) and not (user_id = 1 and user_id is not null and ts >= 11586 and ts <= 11587) and not (user_id = 1 and user_id is not null and ts >= 11588 and ts <= 11589) and not (user_id = 1 and user_id is not null and ts >= 11590 and ts <= 11591) and not (user_id = 1 and user_id is not null and ts >= 11592 and ts <= 11593) and not (user_id = 1 and user_id is not null and ts >= 11594 and ts <= 11595) and not (user_id = 1 and user_id is not null and ts >= 11596 and ts <= 11597) and not (user_id = 1 and user_id is not null and ts >= 11598 and ts <= 11599) and not (user_id = 1 and user_id is not null and ts >= 11600 and ts <= 11601) and not (user_id = 1 and user_id is not null and ts >= 11602 and ts <= 11603) and not (user_id = 1 and user_id is not null and ts >= 11604 and ts <= 11605) and not (user_id = 1 and user_id is not null and ts >= 11606 and ts <= 11607) and not (user_id = 1 and user_id is not null and ts >= 11608 and ts <= 11609) and not (user_id = 1 and user_id is not null and ts >= 11610 and ts <= 11611) and not (user_id = 1 and user_id is not null and ts >= 11612 and ts <= 11613) and not (user_id = 1 and user_id is not null and ts >= 11614 and ts <= 11615) and not (user_id = 1 and user_id is not null and ts >= 11616 and ts <= 11617) and not (user_id = 1 and user_id is not null and ts >= 11618 and ts <= 11619) and not (user_id = 1 and user_id is not null and ts >= 11620 and ts <= 11621) and not (user_id = 1 and user_id is not null and ts >= 11622 and ts <= 11623) and not (user_id = 1 and user_id is not null and ts >= 11624 and ts <= 11625) and not (user_id = 1 and user_id is not null and ts >= 11626 and ts <= 11627) and not (user_id = 1 and user_id is not null and ts >= 11628 and ts <= 11629) and not (user_id = 1 and user_id is not null and ts >= 11630 and ts <= 11631) and not (user_id = 1 and user_id is not null and ts >= 11632 and ts <= 11633) and not (user_id = 1 and user_id is not null and ts >= 11634 and ts <= 11635) and not (user_id = 1 and user_id is not null and ts >= 11636 and ts <= 11637) and not (user_id = 1 and user_id is not null and ts >= 11638 and ts <= 11639) and not (user_id = 1 and user_id is not null and ts >= 11640 and ts <= 11641) and not (user_id = 1 and user_id is not null and ts >= 11642 and ts <= 11643) and not (user_id = 1 and user_id is not null and ts >= 11644 and ts <= 11645) and not (user_id = 1 and user_id is not null and ts >= 11646 and ts <= 11647) and not (user_id = 1 and user_id is not null and ts >= 11648 and ts <= 11649) and not (user_id = 1 and user_id is not null and ts >= 11650 and ts <= 11651) and not (user_id = 1 and user_id is not null and ts >= 11652 and ts <= 11653) and not (user_id = 1 and user_id is not null and ts >= 11654 and ts <= 11655) and not (user_id = 1 and user_id is not null and ts >= 11656 and ts <= 11657) and not (user_id = 1 and user_id is not null and ts >= 11658 and ts <= 11659) and not (user_id = 1 and user_id is not null and ts >= 11660 and ts <= 11661) and not (user_id = 1 and user_id is not null and ts >= 11662 and ts <= 11663) and not (user_id = 1 and user_id is not null and ts >= 11664 and ts <= 11665) and not (user_id = 1 and user_id is not null and ts >= 11666 and ts <= 11667) and not (user_id = 1 and user_id is not null and ts >= 11668 and ts <= 11669) and not (user_id = 1 and user_id is not null and ts >= 11670 and ts <= 11671) and not (user_id = 1 and user_id is not null and ts >= 11672 and ts <= 11673) and not (user_id = 1 and user_id is not null and ts >= 11674 and ts <= 11675) and not (user_id = 1 and user_id is not null and ts >= 11676 and ts <= 11677) and not (user_id = 1 and user_id is not null and ts >= 11678 and ts <= 11679) and not (user_id = 1 and user_id is not null and ts >= 11680 and ts <= 11681) and not (user_id = 1 and user_id is not null and ts >= 11682 and ts <= 11683) and not (user_id = 1 and user_id is not null and ts >= 11684 and ts <= 11685) and not (user_id = 1 and user_id is not null and ts >= 11686 and ts <= 11687) and not (user_id = 1 and user_id is not null and ts >= 11688 and ts <= 11689) and not (user_id = 1 and user_id is not null and ts >= 11690 and ts <= 11691) and not (user_id = 1 and user_id is not null and ts >= 11692 and ts <= 11693) and not (user_id = 1 and user_id is not null and ts >= 11694 and ts <= 11695) and not (user_id = 1 and user_id is not null and ts >= 11696 and ts <= 11697) and not (user_id = 1 and user_id is not null and ts >= 11698 and ts <= 11699) and not (user_id = 1 and user_id is not null and ts >= 11700 and ts <= 11701) and not (user_id = 1 and user_id is not null and ts >= 11702 and ts <= 11703) and not (user_id = 1 and user_id is not null and ts >= 11704 and ts <= 11705) and not (user_id = 1 and user_id is not null and ts >= 11706 and ts <= 11707) and not (user_id = 1 and user_id is not null and ts >= 11708 and ts <= 11709) and not (user_id = 1 and user_id is not null and ts >= 11710 and ts <= 11711) and not (user_id = 1 and user_id is not null and ts >= 11712 and ts <= 11713) and not (user_id = 1 and user_id is not null and ts >= 11714 and ts <= 11715) and not (user_id = 1 and user_id is not null and ts >= 11716 and ts <= 11717) and not (user_id = 1 and user_id is not null and ts >= 11718 and ts <= 11719) and not (user_id = 1 and user_id is not null and ts >= 11720 and ts <= 11721) and not (user_id = 1 and user_id is not null and ts >= 11722 and ts <= 11723) and not (user_id = 1 and user_id is not null and ts >= 11724 and ts <= 11725) and not (user_id = 1 and user_id is not null and ts >= 11726 and ts <= 11727) and not (user_id = 1 and user_id is not null and ts >= 11728 and ts <= 11729) and not (user_id = 1 and user_id is not null and ts >= 11730 and ts <= 11731) and not (user_id = 1 and user_id is not null and ts >= 11732 and ts <= 11733) and not (user_id = 1 and user_id is not null and ts >= 11734 and ts <= 11735) and not (user_id = 1 and user_id is not null and ts >= 11736 and ts <= 11737) and not (user_id = 1 and user_id is not null and ts >= 11738 and ts <= 11739) and not (user_id = 1 and user_id is not null and ts >= 11740 and ts <= 11741) and not (user_id = 1 and user_id is not null and ts >= 11742 and ts <= 11743) and not (user_id = 1 and user_id is not null and ts >= 11744 and ts <= 11745) and not (user_id = 1 and user_id is not null and ts >= 11746 and ts <= 11747) and not (user_id = 1 and user_id is not null and ts >= 11748 and ts <= 11749) and not (user_id = 1 and user_id is not null and ts >= 11750 and ts <= 11751) and not (user_id = 1 and user_id is not null and ts >= 11752 and ts <= 11753) and not (user_id = 1 and user_id is not null and ts >= 11754 and ts <= 11755) and not (user_id = 1 and user_id is not null and ts >= 11756 and ts <= 11757) and not (user_id = 1 and user_id is not null and ts >= 11758 and ts <= 11759) and not (user_id = 1 and user_id is not null and ts >= 11760 and ts <= 11761) and not (user_id = 1 and user_id is not null and ts >= 11762 and ts <= 11763) and not (user_id = 1 and user_id is not null and ts >= 11764 and ts <= 11765) and not (user_id = 1 and user_id is not null and ts >= 11766 and ts <= 11767) and not (user_id = 1 and user_id is not null and ts >= 11768 and ts <= 11769) and not (user_id = 1 and user_id is not null and ts >= 11770 and ts <= 11771) and not (user_id = 1 and user_id is not null and ts >= 11772 and ts <= 11773) and not (user_id = 1 and user_id is not null and ts >= 11774 and ts <= 11775) and not (user_id = 1 and user_id is not null and ts >= 11776 and ts <= 11777) and not (user_id = 1 and user_id is not null and ts >= 11778 and ts <= 11779) and not (user_id = 1 and user_id is not null and ts >= 11780 and ts <= 11781) and not (user_id = 1 and user_id is not null and ts >= 11782 and ts <= 11783) and not (user_id = 1 and user_id is not null and ts >= 11784 and ts <= 11785) and not (user_id = 1 and user_id is not null and ts >= 11786 and ts <= 11787) and not (user_id = 1 and user_id is not null and ts >= 11788 and ts <= 11789) and not (user_id = 1 and user_id is not null and ts >= 11790 and ts <= 11791) and not (user_id = 1 and user_id is not null and ts >= 11792 and ts <= 11793) and not (user_id = 1 and user_id is not null and ts >= 11794 and ts <= 11795) and not (user_id = 1 and user_id is not null and ts >= 11796 and ts <= 11797) and not (user_id = 1 and user_id is not null and ts >= 11798 and ts <= 11799) and not (user_id = 1 and user_id is not null and ts >= 11800 and ts <= 11801) and not (user_id = 1 and user_id is not null and ts >= 11802 and ts <= 11803) and not (user_id = 1 and user_id is not null and ts >= 11804 and ts <= 11805) and not (user_id = 1 and user_id is not null and ts >= 11806 and ts <= 11807) and not (user_id = 1 and user_id is not null and ts >= 11808 and ts <= 11809) and not (user_id = 1 and user_id is not null and ts >= 11810 and ts <= 11811) and not (user_id = 1 and user_id is not null and ts >= 11812 and ts <= 11813) and not (user_id = 1 and user_id is not null and ts >= 11814 and ts <= 11815) and not (user_id = 1 and user_id is not null and ts >= 11816 and ts <= 11817) and not (user_id = 1 and user_id is not null and ts >= 11818 and ts <= 11819) and not (user_id = 1 and user_id is not null and ts >= 11820 and ts <= 11821) and not (user_id = 1 and user_id is not null and ts >= 11822 and ts <= 11823) and not (user_id = 1 and user_id is not null and ts >= 11824 and ts <= 11825) and not (user_id = 1 and user_id is not null and ts >= 11826 and ts <= 11827) and not (user_id = 1 and user_id is not null and ts >= 11828 and ts <= 11829) and not (user_id = 1 and user_id is not null and ts >= 11830 and ts <= 11831) and not (user_id = 1 and user_id is not null and ts >= 11832 and ts <= 11833) and not (user_id = 1 and user_id is not null and ts >= 11834 and ts <= 11835) and not (user_id = 1 and user_id is not null and ts >= 11836 and ts <= 11837) and not (user_id = 1 and user_id is not null and ts >= 11838 and ts <= 11839) and not (user_id = 1 and user_id is not null and ts >= 11840 and ts <= 11841) and not (user_id = 1 and user_id is not null and ts >= 11842 and ts <= 11843) and not (user_id = 1 and user_id is not null and ts >= 11844 and ts <= 11845) and not (user_id = 1 and user_id is not null and ts >= 11846 and ts <= 11847) and not (user_id = 1 and user_id is not null and ts >= 11848 and ts <= 11849) and not (user_id = 1 and user_id is not null and ts >= 11850 and ts <= 11851) and not (user_id = 1 and user_id is not null and ts >= 11852 and ts <= 11853) and not (user_id = 1 and user_id is not null and ts >= 11854 and ts <= 11855) and not (user_id = 1 and user_id is not null and ts >= 11856 and ts <= 11857) and not (user_id = 1 and user_id is not null and ts >= 11858 and ts <= 11859) and not (user_id = 1 and user_id is not null and ts >= 11860 and ts <= 11861) and not (user_id = 1 and user_id is not null and ts >= 11862 and ts <= 11863) and not (user_id = 1 and user_id is not null and ts >= 11864 and ts <= 11865) and not (user_id = 1 and user_id is not null and ts >= 11866 and ts <= 11867) and not (user_id = 1 and user_id is not null and ts >= 11868 and ts <= 11869) and not (user_id = 1 and user_id is not null and ts >= 11870 and ts <= 11871) and not (user_id = 1 and user_id is not null and ts >= 11872 and ts <= 11873) and not (user_id = 1 and user_id is not null and ts >= 11874 and ts <= 11875) and not (user_id = 1 and user_id is not null and ts >= 11876 and ts <= 11877) and not (user_id = 1 and user_id is not null and ts >= 11878 and ts <= 11879) and not (user_id = 1 and user_id is not null and ts >= 11880 and ts <= 11881) and not (user_id = 1 and user_id is not null and ts >= 11882 and ts <= 11883) and not (user_id = 1 and user_id is not null and ts >= 11884 and ts <= 11885) and not (user_id = 1 and user_id is not null and ts >= 11886 and ts <= 11887) and not (user_id = 1 and user_id is not null and ts >= 11888 and ts <= 11889) and not (user_id = 1 and user_id is not null and ts >= 11890 and ts <= 11891) and not (user_id = 1 and user_id is not null and ts >= 11892 and ts <= 11893) and not (user_id = 1 and user_id is not null and ts >= 11894 and ts <= 11895) and not (user_id = 1 and user_id is not null and ts >= 11896 and ts <= 11897) and not (user_id = 1 and user_id is not null and ts >= 11898 and ts <= 11899) and not (user_id = 1 and user_id is not null and ts >= 11900 and ts <= 11901) and not (user_id = 1 and user_id is not null and ts >= 11902 and ts <= 11903) and not (user_id = 1 and user_id is not null and ts >= 11904 and ts <= 11905) and not (user_id = 1 and user_id is not null and ts >= 11906 and ts <= 11907) and not (user_id = 1 and user_id is not null and ts >= 11908 and ts <= 11909) and not (user_id = 1 and user_id is not null and ts >= 11910 and ts <= 11911) and not (user_id = 1 and user_id is not null and ts >= 11912 and ts <= 11913) and not (user_id = 1 and user_id is not null and ts >= 11914 and ts <= 11915) and not (user_id = 1 and user_id is not null and ts >= 11916 and ts <= 11917) and not (user_id = 1 and user_id is not null and ts >= 11918 and ts <= 11919) and not (user_id = 1 and user_id is not null and ts >= 11920 and ts <= 11921) and not (user_id = 1 and user_id is not null and ts >= 11922 and ts <= 11923) and not (user_id = 1 and user_id is not null and ts >= 11924 and ts <= 11925) and not (user_id = 1 and user_id is not null and ts >= 11926 and ts <= 11927) and not (user_id = 1 and user_id is not null and ts >= 11928 and ts <= 11929) and not (user_id = 1 and user_id is not null and ts >= 11930 and ts <= 11931) and not (user_id = 1 and user_id is not null and ts >= 11932 and ts <= 11933) and not (user_id = 1 and user_id is not null and ts >= 11934 and ts <= 11935) and not (user_id = 1 and user_id is not null and ts >= 11936 and ts <= 11937) and not (user_id = 1 and user_id is not null and ts >= 11938 and ts <= 11939) and not (user_id = 1 and user_id is not null and ts >= 11940 and ts <= 11941) and not (user_id = 1 and user_id is not null and ts >= 11942 and ts <= 11943) and not (user_id = 1 and user_id is not null and ts >= 11944 and ts <= 11945) and not (user_id = 1 and user_id is not null and ts >= 11946 and ts <= 11947) and not (user_id = 1 and user_id is not null and ts >= 11948 and ts <= 11949) and not (user_id = 1 and user_id is not null and ts >= 11950 and ts <= 11951) and not (user_id = 1 and user_id is not null and ts >= 11952 and ts <= 11953) and not (user_id = 1 and user_id is not null and ts >= 11954 and ts <= 11955) and not (user_id = 1 and user_id is not null and ts >= 11956 and ts <= 11957) and not (user_id = 1 and user_id is not null and ts >= 11958 and ts <= 11959) and not (user_id = 1 and user_id is not null and ts >= 11960 and ts <= 11961) and not (user_id = 1 and user_id is not null and ts >= 11962 and ts <= 11963) and not (user_id = 1 and user_id is not null and ts >= 11964 and ts <= 11965) and not (user_id = 1 and user_id is not null and ts >= 11966 and ts <= 11967) and not (user_id = 1 and user_id is not null and ts >= 11968 and ts <= 11969) and not (user_id = 1 and user_id is not null and ts >= 11970 and ts <= 11971) and not (user_id = 1 and user_id is not null and ts >= 11972 and ts <= 11973) and not (user_id = 1 and user_id is not null and ts >= 11974 and ts <= 11975) and not (user_id = 1 and user_id is not null and ts >= 11976 and ts <= 11977) and not (user_id = 1 and user_id is not null and ts >= 11978 and ts <= 11979) and not (user_id = 1 and user_id is not null and ts >= 11980 and ts <= 11981) and not (user_id = 1 and user_id is not null and ts >= 11982 and ts <= 11983) and not (user_id = 1 and user_id is not null and ts >= 11984 and ts <= 11985) and not (user_id = 1 and user_id is not null and ts >= 11986 and ts <= 11987) and not (user_id = 1 and user_id is not null and ts >= 11988 and ts <= 11989) and not (user_id = 1 and user_id is not null and ts >= 11990 and ts <= 11991) and not (user_id = 1 and user_id is not null and ts >= 11992 and ts <= 11993) and ts >= 113898 and parent_id = 1 order by ts asc limit 100", + "Instructions": { + "OperatorType": "Limit", + "Count": "INT64(100)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1, ts, weight_string(ts) from `user` where 1 != 1", + "OrderBy": "(1|2) ASC", + "Query": "select 1, ts, weight_string(ts) from `user` where shard_key = 1 and is_removed = 1 and cmd in ('A', 'B', 'C') and (not user_id = 1 or not user_id is not null or not ts >= 1 or not ts <= 2) and (not user_id = 1 or not user_id is not null or not ts >= 12 or not ts <= 13) and (not user_id = 1 or not user_id is not null or not ts >= 14 or not ts <= 15) and (not user_id = 1 or not user_id is not null or not ts >= 16 or not ts <= 17) and (not user_id = 1 or not user_id is not null or not ts >= 18 or not ts <= 19) and (not user_id = 1 or not user_id is not null or not ts >= 110 or not ts <= 111) and (not user_id = 1 or not user_id is not null or not ts >= 112 or not ts <= 113) and (not user_id = 1 or not user_id is not null or not ts >= 114 or not ts <= 115) and (not user_id = 1 or not user_id is not null or not ts >= 116 or not ts <= 117) and (not user_id = 1 or not user_id is not null or not ts >= 118 or not ts <= 119) and (not user_id = 1 or not user_id is not null or not ts >= 120 or not ts <= 121) and (not user_id = 1 or not user_id is not null or not ts >= 122 or not ts <= 123) and (not user_id = 1 or not user_id is not null or not ts >= 124 or not ts <= 125) and (not user_id = 1 or not user_id is not null or not ts >= 126 or not ts <= 127) and (not user_id = 1 or not user_id is not null or not ts >= 128 or not ts <= 129) and (not user_id = 1 or not user_id is not null or not ts >= 130 or not ts <= 131) and (not user_id = 1 or not user_id is not null or not ts >= 132 or not ts <= 133) and (not user_id = 1 or not user_id is not null or not ts >= 134 or not ts <= 135) and (not user_id = 1 or not user_id is not null or not ts >= 136 or not ts <= 137) and (not user_id = 1 or not user_id is not null or not ts >= 138 or not ts <= 139) and (not user_id = 1 or not user_id is not null or not ts >= 140 or not ts <= 141) and (not user_id = 1 or not user_id is not null or not ts >= 142 or not ts <= 143) and (not user_id = 1 or not user_id is not null or not ts >= 144 or not ts <= 145) and (not user_id = 1 or not user_id is not null or not ts >= 146 or not ts <= 147) and (not user_id = 1 or not user_id is not null or not ts >= 148 or not ts <= 149) and (not user_id = 1 or not user_id is not null or not ts >= 150 or not ts <= 151) and (not user_id = 1 or not user_id is not null or not ts >= 152 or not ts <= 153) and (not user_id = 1 or not user_id is not null or not ts >= 154 or not ts <= 155) and (not user_id = 1 or not user_id is not null or not ts >= 156 or not ts <= 157) and (not user_id = 1 or not user_id is not null or not ts >= 158 or not ts <= 159) and (not user_id = 1 or not user_id is not null or not ts >= 160 or not ts <= 161) and (not user_id = 1 or not user_id is not null or not ts >= 162 or not ts <= 163) and (not user_id = 1 or not user_id is not null or not ts >= 164 or not ts <= 165) and (not user_id = 1 or not user_id is not null or not ts >= 166 or not ts <= 167) and (not user_id = 1 or not user_id is not null or not ts >= 168 or not ts <= 169) and (not user_id = 1 or not user_id is not null or not ts >= 170 or not ts <= 171) and (not user_id = 1 or not user_id is not null or not ts >= 172 or not ts <= 173) and (not user_id = 1 or not user_id is not null or not ts >= 174 or not ts <= 175) and (not user_id = 1 or not user_id is not null or not ts >= 176 or not ts <= 177) and (not user_id = 1 or not user_id is not null or not ts >= 178 or not ts <= 179) and (not user_id = 1 or not user_id is not null or not ts >= 180 or not ts <= 181) and (not user_id = 1 or not user_id is not null or not ts >= 182 or not ts <= 183) and (not user_id = 1 or not user_id is not null or not ts >= 184 or not ts <= 185) and (not user_id = 1 or not user_id is not null or not ts >= 186 or not ts <= 187) and (not user_id = 1 or not user_id is not null or not ts >= 188 or not ts <= 189) and (not user_id = 1 or not user_id is not null or not ts >= 190 or not ts <= 191) and (not user_id = 1 or not user_id is not null or not ts >= 192 or not ts <= 193) and (not user_id = 1 or not user_id is not null or not ts >= 194 or not ts <= 195) and (not user_id = 1 or not user_id is not null or not ts >= 196 or not ts <= 197) and (not user_id = 1 or not user_id is not null or not ts >= 198 or not ts <= 199) and (not user_id = 1 or not user_id is not null or not ts >= 1100 or not ts <= 1101) and (not user_id = 1 or not user_id is not null or not ts >= 1102 or not ts <= 1103) and (not user_id = 1 or not user_id is not null or not ts >= 1104 or not ts <= 1105) and (not user_id = 1 or not user_id is not null or not ts >= 1106 or not ts <= 1107) and (not user_id = 1 or not user_id is not null or not ts >= 1108 or not ts <= 1109) and (not user_id = 1 or not user_id is not null or not ts >= 1110 or not ts <= 1111) and (not user_id = 1 or not user_id is not null or not ts >= 1112 or not ts <= 1113) and (not user_id = 1 or not user_id is not null or not ts >= 1114 or not ts <= 1115) and (not user_id = 1 or not user_id is not null or not ts >= 1116 or not ts <= 1117) and (not user_id = 1 or not user_id is not null or not ts >= 1118 or not ts <= 1119) and (not user_id = 1 or not user_id is not null or not ts >= 1120 or not ts <= 1121) and (not user_id = 1 or not user_id is not null or not ts >= 1122 or not ts <= 1123) and (not user_id = 1 or not user_id is not null or not ts >= 1124 or not ts <= 1125) and (not user_id = 1 or not user_id is not null or not ts >= 1126 or not ts <= 1127) and (not user_id = 1 or not user_id is not null or not ts >= 1128 or not ts <= 1129) and (not user_id = 1 or not user_id is not null or not ts >= 1130 or not ts <= 1131) and (not user_id = 1 or not user_id is not null or not ts >= 1132 or not ts <= 1133) and (not user_id = 1 or not user_id is not null or not ts >= 1134 or not ts <= 1135) and (not user_id = 1 or not user_id is not null or not ts >= 1136 or not ts <= 1137) and (not user_id = 1 or not user_id is not null or not ts >= 1138 or not ts <= 1139) and (not user_id = 1 or not user_id is not null or not ts >= 1140 or not ts <= 1141) and (not user_id = 1 or not user_id is not null or not ts >= 1142 or not ts <= 1143) and (not user_id = 1 or not user_id is not null or not ts >= 1144 or not ts <= 1145) and (not user_id = 1 or not user_id is not null or not ts >= 1146 or not ts <= 1147) and (not user_id = 1 or not user_id is not null or not ts >= 1148 or not ts <= 1149) and (not user_id = 1 or not user_id is not null or not ts >= 1150 or not ts <= 1151) and (not user_id = 1 or not user_id is not null or not ts >= 1152 or not ts <= 1153) and (not user_id = 1 or not user_id is not null or not ts >= 1154 or not ts <= 1155) and (not user_id = 1 or not user_id is not null or not ts >= 1156 or not ts <= 1157) and (not user_id = 1 or not user_id is not null or not ts >= 1158 or not ts <= 1159) and (not user_id = 1 or not user_id is not null or not ts >= 1160 or not ts <= 1161) and (not user_id = 1 or not user_id is not null or not ts >= 1162 or not ts <= 1163) and (not user_id = 1 or not user_id is not null or not ts >= 1164 or not ts <= 1165) and (not user_id = 1 or not user_id is not null or not ts >= 1166 or not ts <= 1167) and (not user_id = 1 or not user_id is not null or not ts >= 1168 or not ts <= 1169) and (not user_id = 1 or not user_id is not null or not ts >= 1170 or not ts <= 1171) and (not user_id = 1 or not user_id is not null or not ts >= 1172 or not ts <= 1173) and (not user_id = 1 or not user_id is not null or not ts >= 1174 or not ts <= 1175) and (not user_id = 1 or not user_id is not null or not ts >= 1176 or not ts <= 1177) and (not user_id = 1 or not user_id is not null or not ts >= 1178 or not ts <= 1179) and (not user_id = 1 or not user_id is not null or not ts >= 1180 or not ts <= 1181) and (not user_id = 1 or not user_id is not null or not ts >= 1182 or not ts <= 1183) and (not user_id = 1 or not user_id is not null or not ts >= 1184 or not ts <= 1185) and (not user_id = 1 or not user_id is not null or not ts >= 1186 or not ts <= 1187) and (not user_id = 1 or not user_id is not null or not ts >= 1188 or not ts <= 1189) and (not user_id = 1 or not user_id is not null or not ts >= 1190 or not ts <= 1191) and (not user_id = 1 or not user_id is not null or not ts >= 1192 or not ts <= 1193) and (not user_id = 1 or not user_id is not null or not ts >= 1194 or not ts <= 1195) and (not user_id = 1 or not user_id is not null or not ts >= 1196 or not ts <= 1197) and (not user_id = 1 or not user_id is not null or not ts >= 1198 or not ts <= 1199) and (not user_id = 1 or not user_id is not null or not ts >= 1200 or not ts <= 1201) and (not user_id = 1 or not user_id is not null or not ts >= 1202 or not ts <= 1203) and (not user_id = 1 or not user_id is not null or not ts >= 1204 or not ts <= 1205) and (not user_id = 1 or not user_id is not null or not ts >= 1206 or not ts <= 1207) and (not user_id = 1 or not user_id is not null or not ts >= 1208 or not ts <= 1209) and (not user_id = 1 or not user_id is not null or not ts >= 1210 or not ts <= 1211) and (not user_id = 1 or not user_id is not null or not ts >= 1212 or not ts <= 1213) and (not user_id = 1 or not user_id is not null or not ts >= 1214 or not ts <= 1215) and (not user_id = 1 or not user_id is not null or not ts >= 1216 or not ts <= 1217) and (not user_id = 1 or not user_id is not null or not ts >= 1218 or not ts <= 1219) and (not user_id = 1 or not user_id is not null or not ts >= 1220 or not ts <= 1221) and (not user_id = 1 or not user_id is not null or not ts >= 1222 or not ts <= 1223) and (not user_id = 1 or not user_id is not null or not ts >= 1224 or not ts <= 1225) and (not user_id = 1 or not user_id is not null or not ts >= 1226 or not ts <= 1227) and (not user_id = 1 or not user_id is not null or not ts >= 1228 or not ts <= 1229) and (not user_id = 1 or not user_id is not null or not ts >= 1230 or not ts <= 1231) and (not user_id = 1 or not user_id is not null or not ts >= 1232 or not ts <= 1233) and (not user_id = 1 or not user_id is not null or not ts >= 1234 or not ts <= 1235) and (not user_id = 1 or not user_id is not null or not ts >= 1236 or not ts <= 1237) and (not user_id = 1 or not user_id is not null or not ts >= 1238 or not ts <= 1239) and (not user_id = 1 or not user_id is not null or not ts >= 1240 or not ts <= 1241) and (not user_id = 1 or not user_id is not null or not ts >= 1242 or not ts <= 1243) and (not user_id = 1 or not user_id is not null or not ts >= 1244 or not ts <= 1245) and (not user_id = 1 or not user_id is not null or not ts >= 1246 or not ts <= 1247) and (not user_id = 1 or not user_id is not null or not ts >= 1248 or not ts <= 1249) and (not user_id = 1 or not user_id is not null or not ts >= 1250 or not ts <= 1251) and (not user_id = 1 or not user_id is not null or not ts >= 1252 or not ts <= 1253) and (not user_id = 1 or not user_id is not null or not ts >= 1254 or not ts <= 1255) and (not user_id = 1 or not user_id is not null or not ts >= 1256 or not ts <= 1257) and (not user_id = 1 or not user_id is not null or not ts >= 1258 or not ts <= 1259) and (not user_id = 1 or not user_id is not null or not ts >= 1260 or not ts <= 1261) and (not user_id = 1 or not user_id is not null or not ts >= 1262 or not ts <= 1263) and (not user_id = 1 or not user_id is not null or not ts >= 1264 or not ts <= 1265) and (not user_id = 1 or not user_id is not null or not ts >= 1266 or not ts <= 1267) and (not user_id = 1 or not user_id is not null or not ts >= 1268 or not ts <= 1269) and (not user_id = 1 or not user_id is not null or not ts >= 1270 or not ts <= 1271) and (not user_id = 1 or not user_id is not null or not ts >= 1272 or not ts <= 1273) and (not user_id = 1 or not user_id is not null or not ts >= 1274 or not ts <= 1275) and (not user_id = 1 or not user_id is not null or not ts >= 1276 or not ts <= 1277) and (not user_id = 1 or not user_id is not null or not ts >= 1278 or not ts <= 1279) and (not user_id = 1 or not user_id is not null or not ts >= 1280 or not ts <= 1281) and (not user_id = 1 or not user_id is not null or not ts >= 1282 or not ts <= 1283) and (not user_id = 1 or not user_id is not null or not ts >= 1284 or not ts <= 1285) and (not user_id = 1 or not user_id is not null or not ts >= 1286 or not ts <= 1287) and (not user_id = 1 or not user_id is not null or not ts >= 1288 or not ts <= 1289) and (not user_id = 1 or not user_id is not null or not ts >= 1290 or not ts <= 1291) and (not user_id = 1 or not user_id is not null or not ts >= 1292 or not ts <= 1293) and (not user_id = 1 or not user_id is not null or not ts >= 1294 or not ts <= 1295) and (not user_id = 1 or not user_id is not null or not ts >= 1296 or not ts <= 1297) and (not user_id = 1 or not user_id is not null or not ts >= 1298 or not ts <= 1299) and (not user_id = 1 or not user_id is not null or not ts >= 1300 or not ts <= 1301) and (not user_id = 1 or not user_id is not null or not ts >= 1302 or not ts <= 1303) and (not user_id = 1 or not user_id is not null or not ts >= 1304 or not ts <= 1305) and (not user_id = 1 or not user_id is not null or not ts >= 1306 or not ts <= 1307) and (not user_id = 1 or not user_id is not null or not ts >= 1308 or not ts <= 1309) and (not user_id = 1 or not user_id is not null or not ts >= 1310 or not ts <= 1311) and (not user_id = 1 or not user_id is not null or not ts >= 1312 or not ts <= 1313) and (not user_id = 1 or not user_id is not null or not ts >= 1314 or not ts <= 1315) and (not user_id = 1 or not user_id is not null or not ts >= 1316 or not ts <= 1317) and (not user_id = 1 or not user_id is not null or not ts >= 1318 or not ts <= 1319) and (not user_id = 1 or not user_id is not null or not ts >= 1320 or not ts <= 1321) and (not user_id = 1 or not user_id is not null or not ts >= 1322 or not ts <= 1323) and (not user_id = 1 or not user_id is not null or not ts >= 1324 or not ts <= 1325) and (not user_id = 1 or not user_id is not null or not ts >= 1326 or not ts <= 1327) and (not user_id = 1 or not user_id is not null or not ts >= 1328 or not ts <= 1329) and (not user_id = 1 or not user_id is not null or not ts >= 1330 or not ts <= 1331) and (not user_id = 1 or not user_id is not null or not ts >= 1332 or not ts <= 1333) and (not user_id = 1 or not user_id is not null or not ts >= 1334 or not ts <= 1335) and (not user_id = 1 or not user_id is not null or not ts >= 1336 or not ts <= 1337) and (not user_id = 1 or not user_id is not null or not ts >= 1338 or not ts <= 1339) and (not user_id = 1 or not user_id is not null or not ts >= 1340 or not ts <= 1341) and (not user_id = 1 or not user_id is not null or not ts >= 1342 or not ts <= 1343) and (not user_id = 1 or not user_id is not null or not ts >= 1344 or not ts <= 1345) and (not user_id = 1 or not user_id is not null or not ts >= 1346 or not ts <= 1347) and (not user_id = 1 or not user_id is not null or not ts >= 1348 or not ts <= 1349) and (not user_id = 1 or not user_id is not null or not ts >= 1350 or not ts <= 1351) and (not user_id = 1 or not user_id is not null or not ts >= 1352 or not ts <= 1353) and (not user_id = 1 or not user_id is not null or not ts >= 1354 or not ts <= 1355) and (not user_id = 1 or not user_id is not null or not ts >= 1356 or not ts <= 1357) and (not user_id = 1 or not user_id is not null or not ts >= 1358 or not ts <= 1359) and (not user_id = 1 or not user_id is not null or not ts >= 1360 or not ts <= 1361) and (not user_id = 1 or not user_id is not null or not ts >= 1362 or not ts <= 1363) and (not user_id = 1 or not user_id is not null or not ts >= 1364 or not ts <= 1365) and (not user_id = 1 or not user_id is not null or not ts >= 1366 or not ts <= 1367) and (not user_id = 1 or not user_id is not null or not ts >= 1368 or not ts <= 1369) and (not user_id = 1 or not user_id is not null or not ts >= 1370 or not ts <= 1371) and (not user_id = 1 or not user_id is not null or not ts >= 1372 or not ts <= 1373) and (not user_id = 1 or not user_id is not null or not ts >= 1374 or not ts <= 1375) and (not user_id = 1 or not user_id is not null or not ts >= 1376 or not ts <= 1377) and (not user_id = 1 or not user_id is not null or not ts >= 1378 or not ts <= 1379) and (not user_id = 1 or not user_id is not null or not ts >= 1380 or not ts <= 1381) and (not user_id = 1 or not user_id is not null or not ts >= 1382 or not ts <= 1383) and (not user_id = 1 or not user_id is not null or not ts >= 1384 or not ts <= 1385) and (not user_id = 1 or not user_id is not null or not ts >= 1386 or not ts <= 1387) and (not user_id = 1 or not user_id is not null or not ts >= 1388 or not ts <= 1389) and (not user_id = 1 or not user_id is not null or not ts >= 1390 or not ts <= 1391) and (not user_id = 1 or not user_id is not null or not ts >= 1392 or not ts <= 1393) and (not user_id = 1 or not user_id is not null or not ts >= 1394 or not ts <= 1395) and (not user_id = 1 or not user_id is not null or not ts >= 1396 or not ts <= 1397) and (not user_id = 1 or not user_id is not null or not ts >= 1398 or not ts <= 1399) and (not user_id = 1 or not user_id is not null or not ts >= 1400 or not ts <= 1401) and (not user_id = 1 or not user_id is not null or not ts >= 1402 or not ts <= 1403) and (not user_id = 1 or not user_id is not null or not ts >= 1404 or not ts <= 1405) and (not user_id = 1 or not user_id is not null or not ts >= 1406 or not ts <= 1407) and (not user_id = 1 or not user_id is not null or not ts >= 1408 or not ts <= 1409) and (not user_id = 1 or not user_id is not null or not ts >= 1410 or not ts <= 1411) and (not user_id = 1 or not user_id is not null or not ts >= 1412 or not ts <= 1413) and (not user_id = 1 or not user_id is not null or not ts >= 1414 or not ts <= 1415) and (not user_id = 1 or not user_id is not null or not ts >= 1416 or not ts <= 1417) and (not user_id = 1 or not user_id is not null or not ts >= 1418 or not ts <= 1419) and (not user_id = 1 or not user_id is not null or not ts >= 1420 or not ts <= 1421) and (not user_id = 1 or not user_id is not null or not ts >= 1422 or not ts <= 1423) and (not user_id = 1 or not user_id is not null or not ts >= 1424 or not ts <= 1425) and (not user_id = 1 or not user_id is not null or not ts >= 1426 or not ts <= 1427) and (not user_id = 1 or not user_id is not null or not ts >= 1428 or not ts <= 1429) and (not user_id = 1 or not user_id is not null or not ts >= 1430 or not ts <= 1431) and (not user_id = 1 or not user_id is not null or not ts >= 1432 or not ts <= 1433) and (not user_id = 1 or not user_id is not null or not ts >= 1434 or not ts <= 1435) and (not user_id = 1 or not user_id is not null or not ts >= 1436 or not ts <= 1437) and (not user_id = 1 or not user_id is not null or not ts >= 1438 or not ts <= 1439) and (not user_id = 1 or not user_id is not null or not ts >= 1440 or not ts <= 1441) and (not user_id = 1 or not user_id is not null or not ts >= 1442 or not ts <= 1443) and (not user_id = 1 or not user_id is not null or not ts >= 1444 or not ts <= 1445) and (not user_id = 1 or not user_id is not null or not ts >= 1446 or not ts <= 1447) and (not user_id = 1 or not user_id is not null or not ts >= 1448 or not ts <= 1449) and (not user_id = 1 or not user_id is not null or not ts >= 1450 or not ts <= 1451) and (not user_id = 1 or not user_id is not null or not ts >= 1452 or not ts <= 1453) and (not user_id = 1 or not user_id is not null or not ts >= 1454 or not ts <= 1455) and (not user_id = 1 or not user_id is not null or not ts >= 1456 or not ts <= 1457) and (not user_id = 1 or not user_id is not null or not ts >= 1458 or not ts <= 1459) and (not user_id = 1 or not user_id is not null or not ts >= 1460 or not ts <= 1461) and (not user_id = 1 or not user_id is not null or not ts >= 1462 or not ts <= 1463) and (not user_id = 1 or not user_id is not null or not ts >= 1464 or not ts <= 1465) and (not user_id = 1 or not user_id is not null or not ts >= 1466 or not ts <= 1467) and (not user_id = 1 or not user_id is not null or not ts >= 1468 or not ts <= 1469) and (not user_id = 1 or not user_id is not null or not ts >= 1470 or not ts <= 1471) and (not user_id = 1 or not user_id is not null or not ts >= 1472 or not ts <= 1473) and (not user_id = 1 or not user_id is not null or not ts >= 1474 or not ts <= 1475) and (not user_id = 1 or not user_id is not null or not ts >= 1476 or not ts <= 1477) and (not user_id = 1 or not user_id is not null or not ts >= 1478 or not ts <= 1479) and (not user_id = 1 or not user_id is not null or not ts >= 1480 or not ts <= 1481) and (not user_id = 1 or not user_id is not null or not ts >= 1482 or not ts <= 1483) and (not user_id = 1 or not user_id is not null or not ts >= 1484 or not ts <= 1485) and (not user_id = 1 or not user_id is not null or not ts >= 1486 or not ts <= 1487) and (not user_id = 1 or not user_id is not null or not ts >= 1488 or not ts <= 1489) and (not user_id = 1 or not user_id is not null or not ts >= 1490 or not ts <= 1491) and (not user_id = 1 or not user_id is not null or not ts >= 1492 or not ts <= 1493) and (not user_id = 1 or not user_id is not null or not ts >= 1494 or not ts <= 1495) and (not user_id = 1 or not user_id is not null or not ts >= 1496 or not ts <= 1497) and (not user_id = 1 or not user_id is not null or not ts >= 1498 or not ts <= 1499) and (not user_id = 1 or not user_id is not null or not ts >= 1500 or not ts <= 1501) and (not user_id = 1 or not user_id is not null or not ts >= 1502 or not ts <= 1503) and (not user_id = 1 or not user_id is not null or not ts >= 1504 or not ts <= 1505) and (not user_id = 1 or not user_id is not null or not ts >= 1506 or not ts <= 1507) and (not user_id = 1 or not user_id is not null or not ts >= 1508 or not ts <= 1509) and (not user_id = 1 or not user_id is not null or not ts >= 1510 or not ts <= 1511) and (not user_id = 1 or not user_id is not null or not ts >= 1512 or not ts <= 1513) and (not user_id = 1 or not user_id is not null or not ts >= 1514 or not ts <= 1515) and (not user_id = 1 or not user_id is not null or not ts >= 1516 or not ts <= 1517) and (not user_id = 1 or not user_id is not null or not ts >= 1518 or not ts <= 1519) and (not user_id = 1 or not user_id is not null or not ts >= 1520 or not ts <= 1521) and (not user_id = 1 or not user_id is not null or not ts >= 1522 or not ts <= 1523) and (not user_id = 1 or not user_id is not null or not ts >= 1524 or not ts <= 1525) and (not user_id = 1 or not user_id is not null or not ts >= 1526 or not ts <= 1527) and (not user_id = 1 or not user_id is not null or not ts >= 1528 or not ts <= 1529) and (not user_id = 1 or not user_id is not null or not ts >= 1530 or not ts <= 1531) and (not user_id = 1 or not user_id is not null or not ts >= 1532 or not ts <= 1533) and (not user_id = 1 or not user_id is not null or not ts >= 1534 or not ts <= 1535) and (not user_id = 1 or not user_id is not null or not ts >= 1536 or not ts <= 1537) and (not user_id = 1 or not user_id is not null or not ts >= 1538 or not ts <= 1539) and (not user_id = 1 or not user_id is not null or not ts >= 1540 or not ts <= 1541) and (not user_id = 1 or not user_id is not null or not ts >= 1542 or not ts <= 1543) and (not user_id = 1 or not user_id is not null or not ts >= 1544 or not ts <= 1545) and (not user_id = 1 or not user_id is not null or not ts >= 1546 or not ts <= 1547) and (not user_id = 1 or not user_id is not null or not ts >= 1548 or not ts <= 1549) and (not user_id = 1 or not user_id is not null or not ts >= 1550 or not ts <= 1551) and (not user_id = 1 or not user_id is not null or not ts >= 1552 or not ts <= 1553) and (not user_id = 1 or not user_id is not null or not ts >= 1554 or not ts <= 1555) and (not user_id = 1 or not user_id is not null or not ts >= 1556 or not ts <= 1557) and (not user_id = 1 or not user_id is not null or not ts >= 1558 or not ts <= 1559) and (not user_id = 1 or not user_id is not null or not ts >= 1560 or not ts <= 1561) and (not user_id = 1 or not user_id is not null or not ts >= 1562 or not ts <= 1563) and (not user_id = 1 or not user_id is not null or not ts >= 1564 or not ts <= 1565) and (not user_id = 1 or not user_id is not null or not ts >= 1566 or not ts <= 1567) and (not user_id = 1 or not user_id is not null or not ts >= 1568 or not ts <= 1569) and (not user_id = 1 or not user_id is not null or not ts >= 1570 or not ts <= 1571) and (not user_id = 1 or not user_id is not null or not ts >= 1572 or not ts <= 1573) and (not user_id = 1 or not user_id is not null or not ts >= 1574 or not ts <= 1575) and (not user_id = 1 or not user_id is not null or not ts >= 1576 or not ts <= 1577) and (not user_id = 1 or not user_id is not null or not ts >= 1578 or not ts <= 1579) and (not user_id = 1 or not user_id is not null or not ts >= 1580 or not ts <= 1581) and (not user_id = 1 or not user_id is not null or not ts >= 1582 or not ts <= 1583) and (not user_id = 1 or not user_id is not null or not ts >= 1584 or not ts <= 1585) and (not user_id = 1 or not user_id is not null or not ts >= 1586 or not ts <= 1587) and (not user_id = 1 or not user_id is not null or not ts >= 1588 or not ts <= 1589) and (not user_id = 1 or not user_id is not null or not ts >= 1590 or not ts <= 1591) and (not user_id = 1 or not user_id is not null or not ts >= 1592 or not ts <= 1593) and (not user_id = 1 or not user_id is not null or not ts >= 1594 or not ts <= 1595) and (not user_id = 1 or not user_id is not null or not ts >= 1596 or not ts <= 1597) and (not user_id = 1 or not user_id is not null or not ts >= 1598 or not ts <= 1599) and (not user_id = 1 or not user_id is not null or not ts >= 1600 or not ts <= 1601) and (not user_id = 1 or not user_id is not null or not ts >= 1602 or not ts <= 1603) and (not user_id = 1 or not user_id is not null or not ts >= 1604 or not ts <= 1605) and (not user_id = 1 or not user_id is not null or not ts >= 1606 or not ts <= 1607) and (not user_id = 1 or not user_id is not null or not ts >= 1608 or not ts <= 1609) and (not user_id = 1 or not user_id is not null or not ts >= 1610 or not ts <= 1611) and (not user_id = 1 or not user_id is not null or not ts >= 1612 or not ts <= 1613) and (not user_id = 1 or not user_id is not null or not ts >= 1614 or not ts <= 1615) and (not user_id = 1 or not user_id is not null or not ts >= 1616 or not ts <= 1617) and (not user_id = 1 or not user_id is not null or not ts >= 1618 or not ts <= 1619) and (not user_id = 1 or not user_id is not null or not ts >= 1620 or not ts <= 1621) and (not user_id = 1 or not user_id is not null or not ts >= 1622 or not ts <= 1623) and (not user_id = 1 or not user_id is not null or not ts >= 1624 or not ts <= 1625) and (not user_id = 1 or not user_id is not null or not ts >= 1626 or not ts <= 1627) and (not user_id = 1 or not user_id is not null or not ts >= 1628 or not ts <= 1629) and (not user_id = 1 or not user_id is not null or not ts >= 1630 or not ts <= 1631) and (not user_id = 1 or not user_id is not null or not ts >= 1632 or not ts <= 1633) and (not user_id = 1 or not user_id is not null or not ts >= 1634 or not ts <= 1635) and (not user_id = 1 or not user_id is not null or not ts >= 1636 or not ts <= 1637) and (not user_id = 1 or not user_id is not null or not ts >= 1638 or not ts <= 1639) and (not user_id = 1 or not user_id is not null or not ts >= 1640 or not ts <= 1641) and (not user_id = 1 or not user_id is not null or not ts >= 1642 or not ts <= 1643) and (not user_id = 1 or not user_id is not null or not ts >= 1644 or not ts <= 1645) and (not user_id = 1 or not user_id is not null or not ts >= 1646 or not ts <= 1647) and (not user_id = 1 or not user_id is not null or not ts >= 1648 or not ts <= 1649) and (not user_id = 1 or not user_id is not null or not ts >= 1650 or not ts <= 1651) and (not user_id = 1 or not user_id is not null or not ts >= 1652 or not ts <= 1653) and (not user_id = 1 or not user_id is not null or not ts >= 1654 or not ts <= 1655) and (not user_id = 1 or not user_id is not null or not ts >= 1656 or not ts <= 1657) and (not user_id = 1 or not user_id is not null or not ts >= 1658 or not ts <= 1659) and (not user_id = 1 or not user_id is not null or not ts >= 1660 or not ts <= 1661) and (not user_id = 1 or not user_id is not null or not ts >= 1662 or not ts <= 1663) and (not user_id = 1 or not user_id is not null or not ts >= 1664 or not ts <= 1665) and (not user_id = 1 or not user_id is not null or not ts >= 1666 or not ts <= 1667) and (not user_id = 1 or not user_id is not null or not ts >= 1668 or not ts <= 1669) and (not user_id = 1 or not user_id is not null or not ts >= 1670 or not ts <= 1671) and (not user_id = 1 or not user_id is not null or not ts >= 1672 or not ts <= 1673) and (not user_id = 1 or not user_id is not null or not ts >= 1674 or not ts <= 1675) and (not user_id = 1 or not user_id is not null or not ts >= 1676 or not ts <= 1677) and (not user_id = 1 or not user_id is not null or not ts >= 1678 or not ts <= 1679) and (not user_id = 1 or not user_id is not null or not ts >= 1680 or not ts <= 1681) and (not user_id = 1 or not user_id is not null or not ts >= 1682 or not ts <= 1683) and (not user_id = 1 or not user_id is not null or not ts >= 1684 or not ts <= 1685) and (not user_id = 1 or not user_id is not null or not ts >= 1686 or not ts <= 1687) and (not user_id = 1 or not user_id is not null or not ts >= 1688 or not ts <= 1689) and (not user_id = 1 or not user_id is not null or not ts >= 1690 or not ts <= 1691) and (not user_id = 1 or not user_id is not null or not ts >= 1692 or not ts <= 1693) and (not user_id = 1 or not user_id is not null or not ts >= 1694 or not ts <= 1695) and (not user_id = 1 or not user_id is not null or not ts >= 1696 or not ts <= 1697) and (not user_id = 1 or not user_id is not null or not ts >= 1698 or not ts <= 1699) and (not user_id = 1 or not user_id is not null or not ts >= 1700 or not ts <= 1701) and (not user_id = 1 or not user_id is not null or not ts >= 1702 or not ts <= 1703) and (not user_id = 1 or not user_id is not null or not ts >= 1704 or not ts <= 1705) and (not user_id = 1 or not user_id is not null or not ts >= 1706 or not ts <= 1707) and (not user_id = 1 or not user_id is not null or not ts >= 1708 or not ts <= 1709) and (not user_id = 1 or not user_id is not null or not ts >= 1710 or not ts <= 1711) and (not user_id = 1 or not user_id is not null or not ts >= 1712 or not ts <= 1713) and (not user_id = 1 or not user_id is not null or not ts >= 1714 or not ts <= 1715) and (not user_id = 1 or not user_id is not null or not ts >= 1716 or not ts <= 1717) and (not user_id = 1 or not user_id is not null or not ts >= 1718 or not ts <= 1719) and (not user_id = 1 or not user_id is not null or not ts >= 1720 or not ts <= 1721) and (not user_id = 1 or not user_id is not null or not ts >= 1722 or not ts <= 1723) and (not user_id = 1 or not user_id is not null or not ts >= 1724 or not ts <= 1725) and (not user_id = 1 or not user_id is not null or not ts >= 1726 or not ts <= 1727) and (not user_id = 1 or not user_id is not null or not ts >= 1728 or not ts <= 1729) and (not user_id = 1 or not user_id is not null or not ts >= 1730 or not ts <= 1731) and (not user_id = 1 or not user_id is not null or not ts >= 1732 or not ts <= 1733) and (not user_id = 1 or not user_id is not null or not ts >= 1734 or not ts <= 1735) and (not user_id = 1 or not user_id is not null or not ts >= 1736 or not ts <= 1737) and (not user_id = 1 or not user_id is not null or not ts >= 1738 or not ts <= 1739) and (not user_id = 1 or not user_id is not null or not ts >= 1740 or not ts <= 1741) and (not user_id = 1 or not user_id is not null or not ts >= 1742 or not ts <= 1743) and (not user_id = 1 or not user_id is not null or not ts >= 1744 or not ts <= 1745) and (not user_id = 1 or not user_id is not null or not ts >= 1746 or not ts <= 1747) and (not user_id = 1 or not user_id is not null or not ts >= 1748 or not ts <= 1749) and (not user_id = 1 or not user_id is not null or not ts >= 1750 or not ts <= 1751) and (not user_id = 1 or not user_id is not null or not ts >= 1752 or not ts <= 1753) and (not user_id = 1 or not user_id is not null or not ts >= 1754 or not ts <= 1755) and (not user_id = 1 or not user_id is not null or not ts >= 1756 or not ts <= 1757) and (not user_id = 1 or not user_id is not null or not ts >= 1758 or not ts <= 1759) and (not user_id = 1 or not user_id is not null or not ts >= 1760 or not ts <= 1761) and (not user_id = 1 or not user_id is not null or not ts >= 1762 or not ts <= 1763) and (not user_id = 1 or not user_id is not null or not ts >= 1764 or not ts <= 1765) and (not user_id = 1 or not user_id is not null or not ts >= 1766 or not ts <= 1767) and (not user_id = 1 or not user_id is not null or not ts >= 1768 or not ts <= 1769) and (not user_id = 1 or not user_id is not null or not ts >= 1770 or not ts <= 1771) and (not user_id = 1 or not user_id is not null or not ts >= 1772 or not ts <= 1773) and (not user_id = 1 or not user_id is not null or not ts >= 1774 or not ts <= 1775) and (not user_id = 1 or not user_id is not null or not ts >= 1776 or not ts <= 1777) and (not user_id = 1 or not user_id is not null or not ts >= 1778 or not ts <= 1779) and (not user_id = 1 or not user_id is not null or not ts >= 1780 or not ts <= 1781) and (not user_id = 1 or not user_id is not null or not ts >= 1782 or not ts <= 1783) and (not user_id = 1 or not user_id is not null or not ts >= 1784 or not ts <= 1785) and (not user_id = 1 or not user_id is not null or not ts >= 1786 or not ts <= 1787) and (not user_id = 1 or not user_id is not null or not ts >= 1788 or not ts <= 1789) and (not user_id = 1 or not user_id is not null or not ts >= 1790 or not ts <= 1791) and (not user_id = 1 or not user_id is not null or not ts >= 1792 or not ts <= 1793) and (not user_id = 1 or not user_id is not null or not ts >= 1794 or not ts <= 1795) and (not user_id = 1 or not user_id is not null or not ts >= 1796 or not ts <= 1797) and (not user_id = 1 or not user_id is not null or not ts >= 1798 or not ts <= 1799) and (not user_id = 1 or not user_id is not null or not ts >= 1800 or not ts <= 1801) and (not user_id = 1 or not user_id is not null or not ts >= 1802 or not ts <= 1803) and (not user_id = 1 or not user_id is not null or not ts >= 1804 or not ts <= 1805) and (not user_id = 1 or not user_id is not null or not ts >= 1806 or not ts <= 1807) and (not user_id = 1 or not user_id is not null or not ts >= 1808 or not ts <= 1809) and (not user_id = 1 or not user_id is not null or not ts >= 1810 or not ts <= 1811) and (not user_id = 1 or not user_id is not null or not ts >= 1812 or not ts <= 1813) and (not user_id = 1 or not user_id is not null or not ts >= 1814 or not ts <= 1815) and (not user_id = 1 or not user_id is not null or not ts >= 1816 or not ts <= 1817) and (not user_id = 1 or not user_id is not null or not ts >= 1818 or not ts <= 1819) and (not user_id = 1 or not user_id is not null or not ts >= 1820 or not ts <= 1821) and (not user_id = 1 or not user_id is not null or not ts >= 1822 or not ts <= 1823) and (not user_id = 1 or not user_id is not null or not ts >= 1824 or not ts <= 1825) and (not user_id = 1 or not user_id is not null or not ts >= 1826 or not ts <= 1827) and (not user_id = 1 or not user_id is not null or not ts >= 1828 or not ts <= 1829) and (not user_id = 1 or not user_id is not null or not ts >= 1830 or not ts <= 1831) and (not user_id = 1 or not user_id is not null or not ts >= 1832 or not ts <= 1833) and (not user_id = 1 or not user_id is not null or not ts >= 1834 or not ts <= 1835) and (not user_id = 1 or not user_id is not null or not ts >= 1836 or not ts <= 1837) and (not user_id = 1 or not user_id is not null or not ts >= 1838 or not ts <= 1839) and (not user_id = 1 or not user_id is not null or not ts >= 1840 or not ts <= 1841) and (not user_id = 1 or not user_id is not null or not ts >= 1842 or not ts <= 1843) and (not user_id = 1 or not user_id is not null or not ts >= 1844 or not ts <= 1845) and (not user_id = 1 or not user_id is not null or not ts >= 1846 or not ts <= 1847) and (not user_id = 1 or not user_id is not null or not ts >= 1848 or not ts <= 1849) and (not user_id = 1 or not user_id is not null or not ts >= 1850 or not ts <= 1851) and (not user_id = 1 or not user_id is not null or not ts >= 1852 or not ts <= 1853) and (not user_id = 1 or not user_id is not null or not ts >= 1854 or not ts <= 1855) and (not user_id = 1 or not user_id is not null or not ts >= 1856 or not ts <= 1857) and (not user_id = 1 or not user_id is not null or not ts >= 1858 or not ts <= 1859) and (not user_id = 1 or not user_id is not null or not ts >= 1860 or not ts <= 1861) and (not user_id = 1 or not user_id is not null or not ts >= 1862 or not ts <= 1863) and (not user_id = 1 or not user_id is not null or not ts >= 1864 or not ts <= 1865) and (not user_id = 1 or not user_id is not null or not ts >= 1866 or not ts <= 1867) and (not user_id = 1 or not user_id is not null or not ts >= 1868 or not ts <= 1869) and (not user_id = 1 or not user_id is not null or not ts >= 1870 or not ts <= 1871) and (not user_id = 1 or not user_id is not null or not ts >= 1872 or not ts <= 1873) and (not user_id = 1 or not user_id is not null or not ts >= 1874 or not ts <= 1875) and (not user_id = 1 or not user_id is not null or not ts >= 1876 or not ts <= 1877) and (not user_id = 1 or not user_id is not null or not ts >= 1878 or not ts <= 1879) and (not user_id = 1 or not user_id is not null or not ts >= 1880 or not ts <= 1881) and (not user_id = 1 or not user_id is not null or not ts >= 1882 or not ts <= 1883) and (not user_id = 1 or not user_id is not null or not ts >= 1884 or not ts <= 1885) and (not user_id = 1 or not user_id is not null or not ts >= 1886 or not ts <= 1887) and (not user_id = 1 or not user_id is not null or not ts >= 1888 or not ts <= 1889) and (not user_id = 1 or not user_id is not null or not ts >= 1890 or not ts <= 1891) and (not user_id = 1 or not user_id is not null or not ts >= 1892 or not ts <= 1893) and (not user_id = 1 or not user_id is not null or not ts >= 1894 or not ts <= 1895) and (not user_id = 1 or not user_id is not null or not ts >= 1896 or not ts <= 1897) and (not user_id = 1 or not user_id is not null or not ts >= 1898 or not ts <= 1899) and (not user_id = 1 or not user_id is not null or not ts >= 1900 or not ts <= 1901) and (not user_id = 1 or not user_id is not null or not ts >= 1902 or not ts <= 1903) and (not user_id = 1 or not user_id is not null or not ts >= 1904 or not ts <= 1905) and (not user_id = 1 or not user_id is not null or not ts >= 1906 or not ts <= 1907) and (not user_id = 1 or not user_id is not null or not ts >= 1908 or not ts <= 1909) and (not user_id = 1 or not user_id is not null or not ts >= 1910 or not ts <= 1911) and (not user_id = 1 or not user_id is not null or not ts >= 1912 or not ts <= 1913) and (not user_id = 1 or not user_id is not null or not ts >= 1914 or not ts <= 1915) and (not user_id = 1 or not user_id is not null or not ts >= 1916 or not ts <= 1917) and (not user_id = 1 or not user_id is not null or not ts >= 1918 or not ts <= 1919) and (not user_id = 1 or not user_id is not null or not ts >= 1920 or not ts <= 1921) and (not user_id = 1 or not user_id is not null or not ts >= 1922 or not ts <= 1923) and (not user_id = 1 or not user_id is not null or not ts >= 1924 or not ts <= 1925) and (not user_id = 1 or not user_id is not null or not ts >= 1926 or not ts <= 1927) and (not user_id = 1 or not user_id is not null or not ts >= 1928 or not ts <= 1929) and (not user_id = 1 or not user_id is not null or not ts >= 1930 or not ts <= 1931) and (not user_id = 1 or not user_id is not null or not ts >= 1932 or not ts <= 1933) and (not user_id = 1 or not user_id is not null or not ts >= 1934 or not ts <= 1935) and (not user_id = 1 or not user_id is not null or not ts >= 1936 or not ts <= 1937) and (not user_id = 1 or not user_id is not null or not ts >= 1938 or not ts <= 1939) and (not user_id = 1 or not user_id is not null or not ts >= 1940 or not ts <= 1941) and (not user_id = 1 or not user_id is not null or not ts >= 1942 or not ts <= 1943) and (not user_id = 1 or not user_id is not null or not ts >= 1944 or not ts <= 1945) and (not user_id = 1 or not user_id is not null or not ts >= 1946 or not ts <= 1947) and (not user_id = 1 or not user_id is not null or not ts >= 1948 or not ts <= 1949) and (not user_id = 1 or not user_id is not null or not ts >= 1950 or not ts <= 1951) and (not user_id = 1 or not user_id is not null or not ts >= 1952 or not ts <= 1953) and (not user_id = 1 or not user_id is not null or not ts >= 1954 or not ts <= 1955) and (not user_id = 1 or not user_id is not null or not ts >= 1956 or not ts <= 1957) and (not user_id = 1 or not user_id is not null or not ts >= 1958 or not ts <= 1959) and (not user_id = 1 or not user_id is not null or not ts >= 1960 or not ts <= 1961) and (not user_id = 1 or not user_id is not null or not ts >= 1962 or not ts <= 1963) and (not user_id = 1 or not user_id is not null or not ts >= 1964 or not ts <= 1965) and (not user_id = 1 or not user_id is not null or not ts >= 1966 or not ts <= 1967) and (not user_id = 1 or not user_id is not null or not ts >= 1968 or not ts <= 1969) and (not user_id = 1 or not user_id is not null or not ts >= 1970 or not ts <= 1971) and (not user_id = 1 or not user_id is not null or not ts >= 1972 or not ts <= 1973) and (not user_id = 1 or not user_id is not null or not ts >= 1974 or not ts <= 1975) and (not user_id = 1 or not user_id is not null or not ts >= 1976 or not ts <= 1977) and (not user_id = 1 or not user_id is not null or not ts >= 1978 or not ts <= 1979) and (not user_id = 1 or not user_id is not null or not ts >= 1980 or not ts <= 1981) and (not user_id = 1 or not user_id is not null or not ts >= 1982 or not ts <= 1983) and (not user_id = 1 or not user_id is not null or not ts >= 1984 or not ts <= 1985) and (not user_id = 1 or not user_id is not null or not ts >= 1986 or not ts <= 1987) and (not user_id = 1 or not user_id is not null or not ts >= 1988 or not ts <= 1989) and (not user_id = 1 or not user_id is not null or not ts >= 1990 or not ts <= 1991) and (not user_id = 1 or not user_id is not null or not ts >= 1992 or not ts <= 1993) and (not user_id = 1 or not user_id is not null or not ts >= 1994 or not ts <= 1995) and (not user_id = 1 or not user_id is not null or not ts >= 1996 or not ts <= 1997) and (not user_id = 1 or not user_id is not null or not ts >= 1998 or not ts <= 1999) and (not user_id = 1 or not user_id is not null or not ts >= 11000 or not ts <= 11001) and (not user_id = 1 or not user_id is not null or not ts >= 11002 or not ts <= 11003) and (not user_id = 1 or not user_id is not null or not ts >= 11004 or not ts <= 11005) and (not user_id = 1 or not user_id is not null or not ts >= 11006 or not ts <= 11007) and (not user_id = 1 or not user_id is not null or not ts >= 11008 or not ts <= 11009) and (not user_id = 1 or not user_id is not null or not ts >= 11010 or not ts <= 11011) and (not user_id = 1 or not user_id is not null or not ts >= 11012 or not ts <= 11013) and (not user_id = 1 or not user_id is not null or not ts >= 11014 or not ts <= 11015) and (not user_id = 1 or not user_id is not null or not ts >= 11016 or not ts <= 11017) and (not user_id = 1 or not user_id is not null or not ts >= 11018 or not ts <= 11019) and (not user_id = 1 or not user_id is not null or not ts >= 11020 or not ts <= 11021) and (not user_id = 1 or not user_id is not null or not ts >= 11022 or not ts <= 11023) and (not user_id = 1 or not user_id is not null or not ts >= 11024 or not ts <= 11025) and (not user_id = 1 or not user_id is not null or not ts >= 11026 or not ts <= 11027) and (not user_id = 1 or not user_id is not null or not ts >= 11028 or not ts <= 11029) and (not user_id = 1 or not user_id is not null or not ts >= 11030 or not ts <= 11031) and (not user_id = 1 or not user_id is not null or not ts >= 11032 or not ts <= 11033) and (not user_id = 1 or not user_id is not null or not ts >= 11034 or not ts <= 11035) and (not user_id = 1 or not user_id is not null or not ts >= 11036 or not ts <= 11037) and (not user_id = 1 or not user_id is not null or not ts >= 11038 or not ts <= 11039) and (not user_id = 1 or not user_id is not null or not ts >= 11040 or not ts <= 11041) and (not user_id = 1 or not user_id is not null or not ts >= 11042 or not ts <= 11043) and (not user_id = 1 or not user_id is not null or not ts >= 11044 or not ts <= 11045) and (not user_id = 1 or not user_id is not null or not ts >= 11046 or not ts <= 11047) and (not user_id = 1 or not user_id is not null or not ts >= 11048 or not ts <= 11049) and (not user_id = 1 or not user_id is not null or not ts >= 11050 or not ts <= 11051) and (not user_id = 1 or not user_id is not null or not ts >= 11052 or not ts <= 11053) and (not user_id = 1 or not user_id is not null or not ts >= 11054 or not ts <= 11055) and (not user_id = 1 or not user_id is not null or not ts >= 11056 or not ts <= 11057) and (not user_id = 1 or not user_id is not null or not ts >= 11058 or not ts <= 11059) and (not user_id = 1 or not user_id is not null or not ts >= 11060 or not ts <= 11061) and (not user_id = 1 or not user_id is not null or not ts >= 11062 or not ts <= 11063) and (not user_id = 1 or not user_id is not null or not ts >= 11064 or not ts <= 11065) and (not user_id = 1 or not user_id is not null or not ts >= 11066 or not ts <= 11067) and (not user_id = 1 or not user_id is not null or not ts >= 11068 or not ts <= 11069) and (not user_id = 1 or not user_id is not null or not ts >= 11070 or not ts <= 11071) and (not user_id = 1 or not user_id is not null or not ts >= 11072 or not ts <= 11073) and (not user_id = 1 or not user_id is not null or not ts >= 11074 or not ts <= 11075) and (not user_id = 1 or not user_id is not null or not ts >= 11076 or not ts <= 11077) and (not user_id = 1 or not user_id is not null or not ts >= 11078 or not ts <= 11079) and (not user_id = 1 or not user_id is not null or not ts >= 11080 or not ts <= 11081) and (not user_id = 1 or not user_id is not null or not ts >= 11082 or not ts <= 11083) and (not user_id = 1 or not user_id is not null or not ts >= 11084 or not ts <= 11085) and (not user_id = 1 or not user_id is not null or not ts >= 11086 or not ts <= 11087) and (not user_id = 1 or not user_id is not null or not ts >= 11088 or not ts <= 11089) and (not user_id = 1 or not user_id is not null or not ts >= 11090 or not ts <= 11091) and (not user_id = 1 or not user_id is not null or not ts >= 11092 or not ts <= 11093) and (not user_id = 1 or not user_id is not null or not ts >= 11094 or not ts <= 11095) and (not user_id = 1 or not user_id is not null or not ts >= 11096 or not ts <= 11097) and (not user_id = 1 or not user_id is not null or not ts >= 11098 or not ts <= 11099) and (not user_id = 1 or not user_id is not null or not ts >= 11100 or not ts <= 11101) and (not user_id = 1 or not user_id is not null or not ts >= 11102 or not ts <= 11103) and (not user_id = 1 or not user_id is not null or not ts >= 11104 or not ts <= 11105) and (not user_id = 1 or not user_id is not null or not ts >= 11106 or not ts <= 11107) and (not user_id = 1 or not user_id is not null or not ts >= 11108 or not ts <= 11109) and (not user_id = 1 or not user_id is not null or not ts >= 11110 or not ts <= 11111) and (not user_id = 1 or not user_id is not null or not ts >= 11112 or not ts <= 11113) and (not user_id = 1 or not user_id is not null or not ts >= 11114 or not ts <= 11115) and (not user_id = 1 or not user_id is not null or not ts >= 11116 or not ts <= 11117) and (not user_id = 1 or not user_id is not null or not ts >= 11118 or not ts <= 11119) and (not user_id = 1 or not user_id is not null or not ts >= 11120 or not ts <= 11121) and (not user_id = 1 or not user_id is not null or not ts >= 11122 or not ts <= 11123) and (not user_id = 1 or not user_id is not null or not ts >= 11124 or not ts <= 11125) and (not user_id = 1 or not user_id is not null or not ts >= 11126 or not ts <= 11127) and (not user_id = 1 or not user_id is not null or not ts >= 11128 or not ts <= 11129) and (not user_id = 1 or not user_id is not null or not ts >= 11130 or not ts <= 11131) and (not user_id = 1 or not user_id is not null or not ts >= 11132 or not ts <= 11133) and (not user_id = 1 or not user_id is not null or not ts >= 11134 or not ts <= 11135) and (not user_id = 1 or not user_id is not null or not ts >= 11136 or not ts <= 11137) and (not user_id = 1 or not user_id is not null or not ts >= 11138 or not ts <= 11139) and (not user_id = 1 or not user_id is not null or not ts >= 11140 or not ts <= 11141) and (not user_id = 1 or not user_id is not null or not ts >= 11142 or not ts <= 11143) and (not user_id = 1 or not user_id is not null or not ts >= 11144 or not ts <= 11145) and (not user_id = 1 or not user_id is not null or not ts >= 11146 or not ts <= 11147) and (not user_id = 1 or not user_id is not null or not ts >= 11148 or not ts <= 11149) and (not user_id = 1 or not user_id is not null or not ts >= 11150 or not ts <= 11151) and (not user_id = 1 or not user_id is not null or not ts >= 11152 or not ts <= 11153) and (not user_id = 1 or not user_id is not null or not ts >= 11154 or not ts <= 11155) and (not user_id = 1 or not user_id is not null or not ts >= 11156 or not ts <= 11157) and (not user_id = 1 or not user_id is not null or not ts >= 11158 or not ts <= 11159) and (not user_id = 1 or not user_id is not null or not ts >= 11160 or not ts <= 11161) and (not user_id = 1 or not user_id is not null or not ts >= 11162 or not ts <= 11163) and (not user_id = 1 or not user_id is not null or not ts >= 11164 or not ts <= 11165) and (not user_id = 1 or not user_id is not null or not ts >= 11166 or not ts <= 11167) and (not user_id = 1 or not user_id is not null or not ts >= 11168 or not ts <= 11169) and (not user_id = 1 or not user_id is not null or not ts >= 11170 or not ts <= 11171) and (not user_id = 1 or not user_id is not null or not ts >= 11172 or not ts <= 11173) and (not user_id = 1 or not user_id is not null or not ts >= 11174 or not ts <= 11175) and (not user_id = 1 or not user_id is not null or not ts >= 11176 or not ts <= 11177) and (not user_id = 1 or not user_id is not null or not ts >= 11178 or not ts <= 11179) and (not user_id = 1 or not user_id is not null or not ts >= 11180 or not ts <= 11181) and (not user_id = 1 or not user_id is not null or not ts >= 11182 or not ts <= 11183) and (not user_id = 1 or not user_id is not null or not ts >= 11184 or not ts <= 11185) and (not user_id = 1 or not user_id is not null or not ts >= 11186 or not ts <= 11187) and (not user_id = 1 or not user_id is not null or not ts >= 11188 or not ts <= 11189) and (not user_id = 1 or not user_id is not null or not ts >= 11190 or not ts <= 11191) and (not user_id = 1 or not user_id is not null or not ts >= 11192 or not ts <= 11193) and (not user_id = 1 or not user_id is not null or not ts >= 11194 or not ts <= 11195) and (not user_id = 1 or not user_id is not null or not ts >= 11196 or not ts <= 11197) and (not user_id = 1 or not user_id is not null or not ts >= 11198 or not ts <= 11199) and (not user_id = 1 or not user_id is not null or not ts >= 11200 or not ts <= 11201) and (not user_id = 1 or not user_id is not null or not ts >= 11202 or not ts <= 11203) and (not user_id = 1 or not user_id is not null or not ts >= 11204 or not ts <= 11205) and (not user_id = 1 or not user_id is not null or not ts >= 11206 or not ts <= 11207) and (not user_id = 1 or not user_id is not null or not ts >= 11208 or not ts <= 11209) and (not user_id = 1 or not user_id is not null or not ts >= 11210 or not ts <= 11211) and (not user_id = 1 or not user_id is not null or not ts >= 11212 or not ts <= 11213) and (not user_id = 1 or not user_id is not null or not ts >= 11214 or not ts <= 11215) and (not user_id = 1 or not user_id is not null or not ts >= 11216 or not ts <= 11217) and (not user_id = 1 or not user_id is not null or not ts >= 11218 or not ts <= 11219) and (not user_id = 1 or not user_id is not null or not ts >= 11220 or not ts <= 11221) and (not user_id = 1 or not user_id is not null or not ts >= 11222 or not ts <= 11223) and (not user_id = 1 or not user_id is not null or not ts >= 11224 or not ts <= 11225) and (not user_id = 1 or not user_id is not null or not ts >= 11226 or not ts <= 11227) and (not user_id = 1 or not user_id is not null or not ts >= 11228 or not ts <= 11229) and (not user_id = 1 or not user_id is not null or not ts >= 11230 or not ts <= 11231) and (not user_id = 1 or not user_id is not null or not ts >= 11232 or not ts <= 11233) and (not user_id = 1 or not user_id is not null or not ts >= 11234 or not ts <= 11235) and (not user_id = 1 or not user_id is not null or not ts >= 11236 or not ts <= 11237) and (not user_id = 1 or not user_id is not null or not ts >= 11238 or not ts <= 11239) and (not user_id = 1 or not user_id is not null or not ts >= 11240 or not ts <= 11241) and (not user_id = 1 or not user_id is not null or not ts >= 11242 or not ts <= 11243) and (not user_id = 1 or not user_id is not null or not ts >= 11244 or not ts <= 11245) and (not user_id = 1 or not user_id is not null or not ts >= 11246 or not ts <= 11247) and (not user_id = 1 or not user_id is not null or not ts >= 11248 or not ts <= 11249) and (not user_id = 1 or not user_id is not null or not ts >= 11250 or not ts <= 11251) and (not user_id = 1 or not user_id is not null or not ts >= 11252 or not ts <= 11253) and (not user_id = 1 or not user_id is not null or not ts >= 11254 or not ts <= 11255) and (not user_id = 1 or not user_id is not null or not ts >= 11256 or not ts <= 11257) and (not user_id = 1 or not user_id is not null or not ts >= 11258 or not ts <= 11259) and (not user_id = 1 or not user_id is not null or not ts >= 11260 or not ts <= 11261) and (not user_id = 1 or not user_id is not null or not ts >= 11262 or not ts <= 11263) and (not user_id = 1 or not user_id is not null or not ts >= 11264 or not ts <= 11265) and (not user_id = 1 or not user_id is not null or not ts >= 11266 or not ts <= 11267) and (not user_id = 1 or not user_id is not null or not ts >= 11268 or not ts <= 11269) and (not user_id = 1 or not user_id is not null or not ts >= 11270 or not ts <= 11271) and (not user_id = 1 or not user_id is not null or not ts >= 11272 or not ts <= 11273) and (not user_id = 1 or not user_id is not null or not ts >= 11274 or not ts <= 11275) and (not user_id = 1 or not user_id is not null or not ts >= 11276 or not ts <= 11277) and (not user_id = 1 or not user_id is not null or not ts >= 11278 or not ts <= 11279) and (not user_id = 1 or not user_id is not null or not ts >= 11280 or not ts <= 11281) and (not user_id = 1 or not user_id is not null or not ts >= 11282 or not ts <= 11283) and (not user_id = 1 or not user_id is not null or not ts >= 11284 or not ts <= 11285) and (not user_id = 1 or not user_id is not null or not ts >= 11286 or not ts <= 11287) and (not user_id = 1 or not user_id is not null or not ts >= 11288 or not ts <= 11289) and (not user_id = 1 or not user_id is not null or not ts >= 11290 or not ts <= 11291) and (not user_id = 1 or not user_id is not null or not ts >= 11292 or not ts <= 11293) and (not user_id = 1 or not user_id is not null or not ts >= 11294 or not ts <= 11295) and (not user_id = 1 or not user_id is not null or not ts >= 11296 or not ts <= 11297) and (not user_id = 1 or not user_id is not null or not ts >= 11298 or not ts <= 11299) and (not user_id = 1 or not user_id is not null or not ts >= 11300 or not ts <= 11301) and (not user_id = 1 or not user_id is not null or not ts >= 11302 or not ts <= 11303) and (not user_id = 1 or not user_id is not null or not ts >= 11304 or not ts <= 11305) and (not user_id = 1 or not user_id is not null or not ts >= 11306 or not ts <= 11307) and (not user_id = 1 or not user_id is not null or not ts >= 11308 or not ts <= 11309) and (not user_id = 1 or not user_id is not null or not ts >= 11310 or not ts <= 11311) and (not user_id = 1 or not user_id is not null or not ts >= 11312 or not ts <= 11313) and (not user_id = 1 or not user_id is not null or not ts >= 11314 or not ts <= 11315) and (not user_id = 1 or not user_id is not null or not ts >= 11316 or not ts <= 11317) and (not user_id = 1 or not user_id is not null or not ts >= 11318 or not ts <= 11319) and (not user_id = 1 or not user_id is not null or not ts >= 11320 or not ts <= 11321) and (not user_id = 1 or not user_id is not null or not ts >= 11322 or not ts <= 11323) and (not user_id = 1 or not user_id is not null or not ts >= 11324 or not ts <= 11325) and (not user_id = 1 or not user_id is not null or not ts >= 11326 or not ts <= 11327) and (not user_id = 1 or not user_id is not null or not ts >= 11328 or not ts <= 11329) and (not user_id = 1 or not user_id is not null or not ts >= 11330 or not ts <= 11331) and (not user_id = 1 or not user_id is not null or not ts >= 11332 or not ts <= 11333) and (not user_id = 1 or not user_id is not null or not ts >= 11334 or not ts <= 11335) and (not user_id = 1 or not user_id is not null or not ts >= 11336 or not ts <= 11337) and (not user_id = 1 or not user_id is not null or not ts >= 11338 or not ts <= 11339) and (not user_id = 1 or not user_id is not null or not ts >= 11340 or not ts <= 11341) and (not user_id = 1 or not user_id is not null or not ts >= 11342 or not ts <= 11343) and (not user_id = 1 or not user_id is not null or not ts >= 11344 or not ts <= 11345) and (not user_id = 1 or not user_id is not null or not ts >= 11346 or not ts <= 11347) and (not user_id = 1 or not user_id is not null or not ts >= 11348 or not ts <= 11349) and (not user_id = 1 or not user_id is not null or not ts >= 11350 or not ts <= 11351) and (not user_id = 1 or not user_id is not null or not ts >= 11352 or not ts <= 11353) and (not user_id = 1 or not user_id is not null or not ts >= 11354 or not ts <= 11355) and (not user_id = 1 or not user_id is not null or not ts >= 11356 or not ts <= 11357) and (not user_id = 1 or not user_id is not null or not ts >= 11358 or not ts <= 11359) and (not user_id = 1 or not user_id is not null or not ts >= 11360 or not ts <= 11361) and (not user_id = 1 or not user_id is not null or not ts >= 11362 or not ts <= 11363) and (not user_id = 1 or not user_id is not null or not ts >= 11364 or not ts <= 11365) and (not user_id = 1 or not user_id is not null or not ts >= 11366 or not ts <= 11367) and (not user_id = 1 or not user_id is not null or not ts >= 11368 or not ts <= 11369) and (not user_id = 1 or not user_id is not null or not ts >= 11370 or not ts <= 11371) and (not user_id = 1 or not user_id is not null or not ts >= 11372 or not ts <= 11373) and (not user_id = 1 or not user_id is not null or not ts >= 11374 or not ts <= 11375) and (not user_id = 1 or not user_id is not null or not ts >= 11376 or not ts <= 11377) and (not user_id = 1 or not user_id is not null or not ts >= 11378 or not ts <= 11379) and (not user_id = 1 or not user_id is not null or not ts >= 11380 or not ts <= 11381) and (not user_id = 1 or not user_id is not null or not ts >= 11382 or not ts <= 11383) and (not user_id = 1 or not user_id is not null or not ts >= 11384 or not ts <= 11385) and (not user_id = 1 or not user_id is not null or not ts >= 11386 or not ts <= 11387) and (not user_id = 1 or not user_id is not null or not ts >= 11388 or not ts <= 11389) and (not user_id = 1 or not user_id is not null or not ts >= 11390 or not ts <= 11391) and (not user_id = 1 or not user_id is not null or not ts >= 11392 or not ts <= 11393) and (not user_id = 1 or not user_id is not null or not ts >= 11394 or not ts <= 11395) and (not user_id = 1 or not user_id is not null or not ts >= 11396 or not ts <= 11397) and (not user_id = 1 or not user_id is not null or not ts >= 11398 or not ts <= 11399) and (not user_id = 1 or not user_id is not null or not ts >= 11400 or not ts <= 11401) and (not user_id = 1 or not user_id is not null or not ts >= 11402 or not ts <= 11403) and (not user_id = 1 or not user_id is not null or not ts >= 11404 or not ts <= 11405) and (not user_id = 1 or not user_id is not null or not ts >= 11406 or not ts <= 11407) and (not user_id = 1 or not user_id is not null or not ts >= 11408 or not ts <= 11409) and (not user_id = 1 or not user_id is not null or not ts >= 11410 or not ts <= 11411) and (not user_id = 1 or not user_id is not null or not ts >= 11412 or not ts <= 11413) and (not user_id = 1 or not user_id is not null or not ts >= 11414 or not ts <= 11415) and (not user_id = 1 or not user_id is not null or not ts >= 11416 or not ts <= 11417) and (not user_id = 1 or not user_id is not null or not ts >= 11418 or not ts <= 11419) and (not user_id = 1 or not user_id is not null or not ts >= 11420 or not ts <= 11421) and (not user_id = 1 or not user_id is not null or not ts >= 11422 or not ts <= 11423) and (not user_id = 1 or not user_id is not null or not ts >= 11424 or not ts <= 11425) and (not user_id = 1 or not user_id is not null or not ts >= 11426 or not ts <= 11427) and (not user_id = 1 or not user_id is not null or not ts >= 11428 or not ts <= 11429) and (not user_id = 1 or not user_id is not null or not ts >= 11430 or not ts <= 11431) and (not user_id = 1 or not user_id is not null or not ts >= 11432 or not ts <= 11433) and (not user_id = 1 or not user_id is not null or not ts >= 11434 or not ts <= 11435) and (not user_id = 1 or not user_id is not null or not ts >= 11436 or not ts <= 11437) and (not user_id = 1 or not user_id is not null or not ts >= 11438 or not ts <= 11439) and (not user_id = 1 or not user_id is not null or not ts >= 11440 or not ts <= 11441) and (not user_id = 1 or not user_id is not null or not ts >= 11442 or not ts <= 11443) and (not user_id = 1 or not user_id is not null or not ts >= 11444 or not ts <= 11445) and (not user_id = 1 or not user_id is not null or not ts >= 11446 or not ts <= 11447) and (not user_id = 1 or not user_id is not null or not ts >= 11448 or not ts <= 11449) and (not user_id = 1 or not user_id is not null or not ts >= 11450 or not ts <= 11451) and (not user_id = 1 or not user_id is not null or not ts >= 11452 or not ts <= 11453) and (not user_id = 1 or not user_id is not null or not ts >= 11454 or not ts <= 11455) and (not user_id = 1 or not user_id is not null or not ts >= 11456 or not ts <= 11457) and (not user_id = 1 or not user_id is not null or not ts >= 11458 or not ts <= 11459) and (not user_id = 1 or not user_id is not null or not ts >= 11460 or not ts <= 11461) and (not user_id = 1 or not user_id is not null or not ts >= 11462 or not ts <= 11463) and (not user_id = 1 or not user_id is not null or not ts >= 11464 or not ts <= 11465) and (not user_id = 1 or not user_id is not null or not ts >= 11466 or not ts <= 11467) and (not user_id = 1 or not user_id is not null or not ts >= 11468 or not ts <= 11469) and (not user_id = 1 or not user_id is not null or not ts >= 11470 or not ts <= 11471) and (not user_id = 1 or not user_id is not null or not ts >= 11472 or not ts <= 11473) and (not user_id = 1 or not user_id is not null or not ts >= 11474 or not ts <= 11475) and (not user_id = 1 or not user_id is not null or not ts >= 11476 or not ts <= 11477) and (not user_id = 1 or not user_id is not null or not ts >= 11478 or not ts <= 11479) and (not user_id = 1 or not user_id is not null or not ts >= 11480 or not ts <= 11481) and (not user_id = 1 or not user_id is not null or not ts >= 11482 or not ts <= 11483) and (not user_id = 1 or not user_id is not null or not ts >= 11484 or not ts <= 11485) and (not user_id = 1 or not user_id is not null or not ts >= 11486 or not ts <= 11487) and (not user_id = 1 or not user_id is not null or not ts >= 11488 or not ts <= 11489) and (not user_id = 1 or not user_id is not null or not ts >= 11490 or not ts <= 11491) and (not user_id = 1 or not user_id is not null or not ts >= 11492 or not ts <= 11493) and (not user_id = 1 or not user_id is not null or not ts >= 11494 or not ts <= 11495) and (not user_id = 1 or not user_id is not null or not ts >= 11496 or not ts <= 11497) and (not user_id = 1 or not user_id is not null or not ts >= 11498 or not ts <= 11499) and (not user_id = 1 or not user_id is not null or not ts >= 11500 or not ts <= 11501) and (not user_id = 1 or not user_id is not null or not ts >= 11502 or not ts <= 11503) and (not user_id = 1 or not user_id is not null or not ts >= 11504 or not ts <= 11505) and (not user_id = 1 or not user_id is not null or not ts >= 11506 or not ts <= 11507) and (not user_id = 1 or not user_id is not null or not ts >= 11508 or not ts <= 11509) and (not user_id = 1 or not user_id is not null or not ts >= 11510 or not ts <= 11511) and (not user_id = 1 or not user_id is not null or not ts >= 11512 or not ts <= 11513) and (not user_id = 1 or not user_id is not null or not ts >= 11514 or not ts <= 11515) and (not user_id = 1 or not user_id is not null or not ts >= 11516 or not ts <= 11517) and (not user_id = 1 or not user_id is not null or not ts >= 11518 or not ts <= 11519) and (not user_id = 1 or not user_id is not null or not ts >= 11520 or not ts <= 11521) and (not user_id = 1 or not user_id is not null or not ts >= 11522 or not ts <= 11523) and (not user_id = 1 or not user_id is not null or not ts >= 11524 or not ts <= 11525) and (not user_id = 1 or not user_id is not null or not ts >= 11526 or not ts <= 11527) and (not user_id = 1 or not user_id is not null or not ts >= 11528 or not ts <= 11529) and (not user_id = 1 or not user_id is not null or not ts >= 11530 or not ts <= 11531) and (not user_id = 1 or not user_id is not null or not ts >= 11532 or not ts <= 11533) and (not user_id = 1 or not user_id is not null or not ts >= 11534 or not ts <= 11535) and (not user_id = 1 or not user_id is not null or not ts >= 11536 or not ts <= 11537) and (not user_id = 1 or not user_id is not null or not ts >= 11538 or not ts <= 11539) and (not user_id = 1 or not user_id is not null or not ts >= 11540 or not ts <= 11541) and (not user_id = 1 or not user_id is not null or not ts >= 11542 or not ts <= 11543) and (not user_id = 1 or not user_id is not null or not ts >= 11544 or not ts <= 11545) and (not user_id = 1 or not user_id is not null or not ts >= 11546 or not ts <= 11547) and (not user_id = 1 or not user_id is not null or not ts >= 11548 or not ts <= 11549) and (not user_id = 1 or not user_id is not null or not ts >= 11550 or not ts <= 11551) and (not user_id = 1 or not user_id is not null or not ts >= 11552 or not ts <= 11553) and (not user_id = 1 or not user_id is not null or not ts >= 11554 or not ts <= 11555) and (not user_id = 1 or not user_id is not null or not ts >= 11556 or not ts <= 11557) and (not user_id = 1 or not user_id is not null or not ts >= 11558 or not ts <= 11559) and (not user_id = 1 or not user_id is not null or not ts >= 11560 or not ts <= 11561) and (not user_id = 1 or not user_id is not null or not ts >= 11562 or not ts <= 11563) and (not user_id = 1 or not user_id is not null or not ts >= 11564 or not ts <= 11565) and (not user_id = 1 or not user_id is not null or not ts >= 11566 or not ts <= 11567) and (not user_id = 1 or not user_id is not null or not ts >= 11568 or not ts <= 11569) and (not user_id = 1 or not user_id is not null or not ts >= 11570 or not ts <= 11571) and (not user_id = 1 or not user_id is not null or not ts >= 11572 or not ts <= 11573) and (not user_id = 1 or not user_id is not null or not ts >= 11574 or not ts <= 11575) and (not user_id = 1 or not user_id is not null or not ts >= 11576 or not ts <= 11577) and (not user_id = 1 or not user_id is not null or not ts >= 11578 or not ts <= 11579) and (not user_id = 1 or not user_id is not null or not ts >= 11580 or not ts <= 11581) and (not user_id = 1 or not user_id is not null or not ts >= 11582 or not ts <= 11583) and (not user_id = 1 or not user_id is not null or not ts >= 11584 or not ts <= 11585) and (not user_id = 1 or not user_id is not null or not ts >= 11586 or not ts <= 11587) and (not user_id = 1 or not user_id is not null or not ts >= 11588 or not ts <= 11589) and (not user_id = 1 or not user_id is not null or not ts >= 11590 or not ts <= 11591) and (not user_id = 1 or not user_id is not null or not ts >= 11592 or not ts <= 11593) and (not user_id = 1 or not user_id is not null or not ts >= 11594 or not ts <= 11595) and (not user_id = 1 or not user_id is not null or not ts >= 11596 or not ts <= 11597) and (not user_id = 1 or not user_id is not null or not ts >= 11598 or not ts <= 11599) and (not user_id = 1 or not user_id is not null or not ts >= 11600 or not ts <= 11601) and (not user_id = 1 or not user_id is not null or not ts >= 11602 or not ts <= 11603) and (not user_id = 1 or not user_id is not null or not ts >= 11604 or not ts <= 11605) and (not user_id = 1 or not user_id is not null or not ts >= 11606 or not ts <= 11607) and (not user_id = 1 or not user_id is not null or not ts >= 11608 or not ts <= 11609) and (not user_id = 1 or not user_id is not null or not ts >= 11610 or not ts <= 11611) and (not user_id = 1 or not user_id is not null or not ts >= 11612 or not ts <= 11613) and (not user_id = 1 or not user_id is not null or not ts >= 11614 or not ts <= 11615) and (not user_id = 1 or not user_id is not null or not ts >= 11616 or not ts <= 11617) and (not user_id = 1 or not user_id is not null or not ts >= 11618 or not ts <= 11619) and (not user_id = 1 or not user_id is not null or not ts >= 11620 or not ts <= 11621) and (not user_id = 1 or not user_id is not null or not ts >= 11622 or not ts <= 11623) and (not user_id = 1 or not user_id is not null or not ts >= 11624 or not ts <= 11625) and (not user_id = 1 or not user_id is not null or not ts >= 11626 or not ts <= 11627) and (not user_id = 1 or not user_id is not null or not ts >= 11628 or not ts <= 11629) and (not user_id = 1 or not user_id is not null or not ts >= 11630 or not ts <= 11631) and (not user_id = 1 or not user_id is not null or not ts >= 11632 or not ts <= 11633) and (not user_id = 1 or not user_id is not null or not ts >= 11634 or not ts <= 11635) and (not user_id = 1 or not user_id is not null or not ts >= 11636 or not ts <= 11637) and (not user_id = 1 or not user_id is not null or not ts >= 11638 or not ts <= 11639) and (not user_id = 1 or not user_id is not null or not ts >= 11640 or not ts <= 11641) and (not user_id = 1 or not user_id is not null or not ts >= 11642 or not ts <= 11643) and (not user_id = 1 or not user_id is not null or not ts >= 11644 or not ts <= 11645) and (not user_id = 1 or not user_id is not null or not ts >= 11646 or not ts <= 11647) and (not user_id = 1 or not user_id is not null or not ts >= 11648 or not ts <= 11649) and (not user_id = 1 or not user_id is not null or not ts >= 11650 or not ts <= 11651) and (not user_id = 1 or not user_id is not null or not ts >= 11652 or not ts <= 11653) and (not user_id = 1 or not user_id is not null or not ts >= 11654 or not ts <= 11655) and (not user_id = 1 or not user_id is not null or not ts >= 11656 or not ts <= 11657) and (not user_id = 1 or not user_id is not null or not ts >= 11658 or not ts <= 11659) and (not user_id = 1 or not user_id is not null or not ts >= 11660 or not ts <= 11661) and (not user_id = 1 or not user_id is not null or not ts >= 11662 or not ts <= 11663) and (not user_id = 1 or not user_id is not null or not ts >= 11664 or not ts <= 11665) and (not user_id = 1 or not user_id is not null or not ts >= 11666 or not ts <= 11667) and (not user_id = 1 or not user_id is not null or not ts >= 11668 or not ts <= 11669) and (not user_id = 1 or not user_id is not null or not ts >= 11670 or not ts <= 11671) and (not user_id = 1 or not user_id is not null or not ts >= 11672 or not ts <= 11673) and (not user_id = 1 or not user_id is not null or not ts >= 11674 or not ts <= 11675) and (not user_id = 1 or not user_id is not null or not ts >= 11676 or not ts <= 11677) and (not user_id = 1 or not user_id is not null or not ts >= 11678 or not ts <= 11679) and (not user_id = 1 or not user_id is not null or not ts >= 11680 or not ts <= 11681) and (not user_id = 1 or not user_id is not null or not ts >= 11682 or not ts <= 11683) and (not user_id = 1 or not user_id is not null or not ts >= 11684 or not ts <= 11685) and (not user_id = 1 or not user_id is not null or not ts >= 11686 or not ts <= 11687) and (not user_id = 1 or not user_id is not null or not ts >= 11688 or not ts <= 11689) and (not user_id = 1 or not user_id is not null or not ts >= 11690 or not ts <= 11691) and (not user_id = 1 or not user_id is not null or not ts >= 11692 or not ts <= 11693) and (not user_id = 1 or not user_id is not null or not ts >= 11694 or not ts <= 11695) and (not user_id = 1 or not user_id is not null or not ts >= 11696 or not ts <= 11697) and (not user_id = 1 or not user_id is not null or not ts >= 11698 or not ts <= 11699) and (not user_id = 1 or not user_id is not null or not ts >= 11700 or not ts <= 11701) and (not user_id = 1 or not user_id is not null or not ts >= 11702 or not ts <= 11703) and (not user_id = 1 or not user_id is not null or not ts >= 11704 or not ts <= 11705) and (not user_id = 1 or not user_id is not null or not ts >= 11706 or not ts <= 11707) and (not user_id = 1 or not user_id is not null or not ts >= 11708 or not ts <= 11709) and (not user_id = 1 or not user_id is not null or not ts >= 11710 or not ts <= 11711) and (not user_id = 1 or not user_id is not null or not ts >= 11712 or not ts <= 11713) and (not user_id = 1 or not user_id is not null or not ts >= 11714 or not ts <= 11715) and (not user_id = 1 or not user_id is not null or not ts >= 11716 or not ts <= 11717) and (not user_id = 1 or not user_id is not null or not ts >= 11718 or not ts <= 11719) and (not user_id = 1 or not user_id is not null or not ts >= 11720 or not ts <= 11721) and (not user_id = 1 or not user_id is not null or not ts >= 11722 or not ts <= 11723) and (not user_id = 1 or not user_id is not null or not ts >= 11724 or not ts <= 11725) and (not user_id = 1 or not user_id is not null or not ts >= 11726 or not ts <= 11727) and (not user_id = 1 or not user_id is not null or not ts >= 11728 or not ts <= 11729) and (not user_id = 1 or not user_id is not null or not ts >= 11730 or not ts <= 11731) and (not user_id = 1 or not user_id is not null or not ts >= 11732 or not ts <= 11733) and (not user_id = 1 or not user_id is not null or not ts >= 11734 or not ts <= 11735) and (not user_id = 1 or not user_id is not null or not ts >= 11736 or not ts <= 11737) and (not user_id = 1 or not user_id is not null or not ts >= 11738 or not ts <= 11739) and (not user_id = 1 or not user_id is not null or not ts >= 11740 or not ts <= 11741) and (not user_id = 1 or not user_id is not null or not ts >= 11742 or not ts <= 11743) and (not user_id = 1 or not user_id is not null or not ts >= 11744 or not ts <= 11745) and (not user_id = 1 or not user_id is not null or not ts >= 11746 or not ts <= 11747) and (not user_id = 1 or not user_id is not null or not ts >= 11748 or not ts <= 11749) and (not user_id = 1 or not user_id is not null or not ts >= 11750 or not ts <= 11751) and (not user_id = 1 or not user_id is not null or not ts >= 11752 or not ts <= 11753) and (not user_id = 1 or not user_id is not null or not ts >= 11754 or not ts <= 11755) and (not user_id = 1 or not user_id is not null or not ts >= 11756 or not ts <= 11757) and (not user_id = 1 or not user_id is not null or not ts >= 11758 or not ts <= 11759) and (not user_id = 1 or not user_id is not null or not ts >= 11760 or not ts <= 11761) and (not user_id = 1 or not user_id is not null or not ts >= 11762 or not ts <= 11763) and (not user_id = 1 or not user_id is not null or not ts >= 11764 or not ts <= 11765) and (not user_id = 1 or not user_id is not null or not ts >= 11766 or not ts <= 11767) and (not user_id = 1 or not user_id is not null or not ts >= 11768 or not ts <= 11769) and (not user_id = 1 or not user_id is not null or not ts >= 11770 or not ts <= 11771) and (not user_id = 1 or not user_id is not null or not ts >= 11772 or not ts <= 11773) and (not user_id = 1 or not user_id is not null or not ts >= 11774 or not ts <= 11775) and (not user_id = 1 or not user_id is not null or not ts >= 11776 or not ts <= 11777) and (not user_id = 1 or not user_id is not null or not ts >= 11778 or not ts <= 11779) and (not user_id = 1 or not user_id is not null or not ts >= 11780 or not ts <= 11781) and (not user_id = 1 or not user_id is not null or not ts >= 11782 or not ts <= 11783) and (not user_id = 1 or not user_id is not null or not ts >= 11784 or not ts <= 11785) and (not user_id = 1 or not user_id is not null or not ts >= 11786 or not ts <= 11787) and (not user_id = 1 or not user_id is not null or not ts >= 11788 or not ts <= 11789) and (not user_id = 1 or not user_id is not null or not ts >= 11790 or not ts <= 11791) and (not user_id = 1 or not user_id is not null or not ts >= 11792 or not ts <= 11793) and (not user_id = 1 or not user_id is not null or not ts >= 11794 or not ts <= 11795) and (not user_id = 1 or not user_id is not null or not ts >= 11796 or not ts <= 11797) and (not user_id = 1 or not user_id is not null or not ts >= 11798 or not ts <= 11799) and (not user_id = 1 or not user_id is not null or not ts >= 11800 or not ts <= 11801) and (not user_id = 1 or not user_id is not null or not ts >= 11802 or not ts <= 11803) and (not user_id = 1 or not user_id is not null or not ts >= 11804 or not ts <= 11805) and (not user_id = 1 or not user_id is not null or not ts >= 11806 or not ts <= 11807) and (not user_id = 1 or not user_id is not null or not ts >= 11808 or not ts <= 11809) and (not user_id = 1 or not user_id is not null or not ts >= 11810 or not ts <= 11811) and (not user_id = 1 or not user_id is not null or not ts >= 11812 or not ts <= 11813) and (not user_id = 1 or not user_id is not null or not ts >= 11814 or not ts <= 11815) and (not user_id = 1 or not user_id is not null or not ts >= 11816 or not ts <= 11817) and (not user_id = 1 or not user_id is not null or not ts >= 11818 or not ts <= 11819) and (not user_id = 1 or not user_id is not null or not ts >= 11820 or not ts <= 11821) and (not user_id = 1 or not user_id is not null or not ts >= 11822 or not ts <= 11823) and (not user_id = 1 or not user_id is not null or not ts >= 11824 or not ts <= 11825) and (not user_id = 1 or not user_id is not null or not ts >= 11826 or not ts <= 11827) and (not user_id = 1 or not user_id is not null or not ts >= 11828 or not ts <= 11829) and (not user_id = 1 or not user_id is not null or not ts >= 11830 or not ts <= 11831) and (not user_id = 1 or not user_id is not null or not ts >= 11832 or not ts <= 11833) and (not user_id = 1 or not user_id is not null or not ts >= 11834 or not ts <= 11835) and (not user_id = 1 or not user_id is not null or not ts >= 11836 or not ts <= 11837) and (not user_id = 1 or not user_id is not null or not ts >= 11838 or not ts <= 11839) and (not user_id = 1 or not user_id is not null or not ts >= 11840 or not ts <= 11841) and (not user_id = 1 or not user_id is not null or not ts >= 11842 or not ts <= 11843) and (not user_id = 1 or not user_id is not null or not ts >= 11844 or not ts <= 11845) and (not user_id = 1 or not user_id is not null or not ts >= 11846 or not ts <= 11847) and (not user_id = 1 or not user_id is not null or not ts >= 11848 or not ts <= 11849) and (not user_id = 1 or not user_id is not null or not ts >= 11850 or not ts <= 11851) and (not user_id = 1 or not user_id is not null or not ts >= 11852 or not ts <= 11853) and (not user_id = 1 or not user_id is not null or not ts >= 11854 or not ts <= 11855) and (not user_id = 1 or not user_id is not null or not ts >= 11856 or not ts <= 11857) and (not user_id = 1 or not user_id is not null or not ts >= 11858 or not ts <= 11859) and (not user_id = 1 or not user_id is not null or not ts >= 11860 or not ts <= 11861) and (not user_id = 1 or not user_id is not null or not ts >= 11862 or not ts <= 11863) and (not user_id = 1 or not user_id is not null or not ts >= 11864 or not ts <= 11865) and (not user_id = 1 or not user_id is not null or not ts >= 11866 or not ts <= 11867) and (not user_id = 1 or not user_id is not null or not ts >= 11868 or not ts <= 11869) and (not user_id = 1 or not user_id is not null or not ts >= 11870 or not ts <= 11871) and (not user_id = 1 or not user_id is not null or not ts >= 11872 or not ts <= 11873) and (not user_id = 1 or not user_id is not null or not ts >= 11874 or not ts <= 11875) and (not user_id = 1 or not user_id is not null or not ts >= 11876 or not ts <= 11877) and (not user_id = 1 or not user_id is not null or not ts >= 11878 or not ts <= 11879) and (not user_id = 1 or not user_id is not null or not ts >= 11880 or not ts <= 11881) and (not user_id = 1 or not user_id is not null or not ts >= 11882 or not ts <= 11883) and (not user_id = 1 or not user_id is not null or not ts >= 11884 or not ts <= 11885) and (not user_id = 1 or not user_id is not null or not ts >= 11886 or not ts <= 11887) and (not user_id = 1 or not user_id is not null or not ts >= 11888 or not ts <= 11889) and (not user_id = 1 or not user_id is not null or not ts >= 11890 or not ts <= 11891) and (not user_id = 1 or not user_id is not null or not ts >= 11892 or not ts <= 11893) and (not user_id = 1 or not user_id is not null or not ts >= 11894 or not ts <= 11895) and (not user_id = 1 or not user_id is not null or not ts >= 11896 or not ts <= 11897) and (not user_id = 1 or not user_id is not null or not ts >= 11898 or not ts <= 11899) and (not user_id = 1 or not user_id is not null or not ts >= 11900 or not ts <= 11901) and (not user_id = 1 or not user_id is not null or not ts >= 11902 or not ts <= 11903) and (not user_id = 1 or not user_id is not null or not ts >= 11904 or not ts <= 11905) and (not user_id = 1 or not user_id is not null or not ts >= 11906 or not ts <= 11907) and (not user_id = 1 or not user_id is not null or not ts >= 11908 or not ts <= 11909) and (not user_id = 1 or not user_id is not null or not ts >= 11910 or not ts <= 11911) and (not user_id = 1 or not user_id is not null or not ts >= 11912 or not ts <= 11913) and (not user_id = 1 or not user_id is not null or not ts >= 11914 or not ts <= 11915) and (not user_id = 1 or not user_id is not null or not ts >= 11916 or not ts <= 11917) and (not user_id = 1 or not user_id is not null or not ts >= 11918 or not ts <= 11919) and (not user_id = 1 or not user_id is not null or not ts >= 11920 or not ts <= 11921) and (not user_id = 1 or not user_id is not null or not ts >= 11922 or not ts <= 11923) and (not user_id = 1 or not user_id is not null or not ts >= 11924 or not ts <= 11925) and (not user_id = 1 or not user_id is not null or not ts >= 11926 or not ts <= 11927) and (not user_id = 1 or not user_id is not null or not ts >= 11928 or not ts <= 11929) and (not user_id = 1 or not user_id is not null or not ts >= 11930 or not ts <= 11931) and (not user_id = 1 or not user_id is not null or not ts >= 11932 or not ts <= 11933) and (not user_id = 1 or not user_id is not null or not ts >= 11934 or not ts <= 11935) and (not user_id = 1 or not user_id is not null or not ts >= 11936 or not ts <= 11937) and (not user_id = 1 or not user_id is not null or not ts >= 11938 or not ts <= 11939) and (not user_id = 1 or not user_id is not null or not ts >= 11940 or not ts <= 11941) and (not user_id = 1 or not user_id is not null or not ts >= 11942 or not ts <= 11943) and (not user_id = 1 or not user_id is not null or not ts >= 11944 or not ts <= 11945) and (not user_id = 1 or not user_id is not null or not ts >= 11946 or not ts <= 11947) and (not user_id = 1 or not user_id is not null or not ts >= 11948 or not ts <= 11949) and (not user_id = 1 or not user_id is not null or not ts >= 11950 or not ts <= 11951) and (not user_id = 1 or not user_id is not null or not ts >= 11952 or not ts <= 11953) and (not user_id = 1 or not user_id is not null or not ts >= 11954 or not ts <= 11955) and (not user_id = 1 or not user_id is not null or not ts >= 11956 or not ts <= 11957) and (not user_id = 1 or not user_id is not null or not ts >= 11958 or not ts <= 11959) and (not user_id = 1 or not user_id is not null or not ts >= 11960 or not ts <= 11961) and (not user_id = 1 or not user_id is not null or not ts >= 11962 or not ts <= 11963) and (not user_id = 1 or not user_id is not null or not ts >= 11964 or not ts <= 11965) and (not user_id = 1 or not user_id is not null or not ts >= 11966 or not ts <= 11967) and (not user_id = 1 or not user_id is not null or not ts >= 11968 or not ts <= 11969) and (not user_id = 1 or not user_id is not null or not ts >= 11970 or not ts <= 11971) and (not user_id = 1 or not user_id is not null or not ts >= 11972 or not ts <= 11973) and (not user_id = 1 or not user_id is not null or not ts >= 11974 or not ts <= 11975) and (not user_id = 1 or not user_id is not null or not ts >= 11976 or not ts <= 11977) and (not user_id = 1 or not user_id is not null or not ts >= 11978 or not ts <= 11979) and (not user_id = 1 or not user_id is not null or not ts >= 11980 or not ts <= 11981) and (not user_id = 1 or not user_id is not null or not ts >= 11982 or not ts <= 11983) and (not user_id = 1 or not user_id is not null or not ts >= 11984 or not ts <= 11985) and (not user_id = 1 or not user_id is not null or not ts >= 11986 or not ts <= 11987) and (not user_id = 1 or not user_id is not null or not ts >= 11988 or not ts <= 11989) and (not user_id = 1 or not user_id is not null or not ts >= 11990 or not ts <= 11991) and (not user_id = 1 or not user_id is not null or not ts >= 11992 or not ts <= 11993) and ts >= 113898 and parent_id = 1 order by ts asc limit :__upper_limit", + "ResultColumns": 1, + "Table": "`user`" + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json b/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json index 04cd660afb5..dc9684ad128 100644 --- a/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json @@ -741,7 +741,7 @@ "Sharded": false }, "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", - "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and TABLE_SCHEMA = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } @@ -757,7 +757,7 @@ "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", + "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_SCHEMA = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } @@ -1219,7 +1219,7 @@ "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", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname and table_schema = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\")]", "Table": "information_schema.`tables`" }, @@ -1231,7 +1231,7 @@ "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", + "Query": "select 1 as found from information_schema.views where table_schema = :__vtschemaname and table_schema = :__vtschemaname limit 1", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.views" } @@ -1249,7 +1249,7 @@ "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)", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname and table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname and table_schema = :__vtschemaname limit 1)", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.`tables`" } @@ -1272,7 +1272,7 @@ "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", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname and table_schema = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\")]", "Table": "information_schema.`tables`" }, @@ -1284,7 +1284,7 @@ "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", + "Query": "select 1 as found from information_schema.views where table_schema = :__vtschemaname and table_schema = :__vtschemaname limit 1", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.views" } @@ -1302,7 +1302,7 @@ "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)", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname and table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname and table_schema = :__vtschemaname limit 1)", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.`tables`" } diff --git a/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json b/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json index fbae05c2d61..866486fea8a 100644 --- a/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json @@ -799,7 +799,7 @@ "Sharded": false }, "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", - "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and TABLE_SCHEMA = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } @@ -815,7 +815,7 @@ "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", + "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_SCHEMA = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } @@ -1277,7 +1277,7 @@ "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", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname and table_schema = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\")]", "Table": "information_schema.`tables`" }, @@ -1289,7 +1289,7 @@ "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", + "Query": "select 1 as found from information_schema.views where table_schema = :__vtschemaname and table_schema = :__vtschemaname limit 1", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.views" } @@ -1307,7 +1307,7 @@ "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)", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname and table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname and table_schema = :__vtschemaname limit 1)", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.`tables`" } @@ -1330,7 +1330,7 @@ "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", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname and table_schema = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\")]", "Table": "information_schema.`tables`" }, @@ -1342,7 +1342,7 @@ "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", + "Query": "select 1 as found from information_schema.views where table_schema = :__vtschemaname and table_schema = :__vtschemaname limit 1", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.views" } @@ -1360,7 +1360,7 @@ "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)", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname and table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname and table_schema = :__vtschemaname limit 1)", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.`tables`" } From 97a285cc972e18b0f5d970e92a143bab3665d0fe Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 09:30:48 -0400 Subject: [PATCH 182/233] [release-16.0] Enable failures in `tools/e2e_test_race.sh` and fix races (#13654) (#14010) Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Brendan Dougherty Co-authored-by: Austen Lacy Co-authored-by: Rohit Nayak --- go/vt/vtgate/endtoend/vstream_test.go | 6 +- go/vt/vttablet/endtoend/framework/client.go | 6 ++ go/vt/vttablet/endtoend/transaction_test.go | 12 ++-- go/vt/vttablet/tabletserver/schema/engine.go | 26 ++++++++ go/vt/vttablet/tabletserver/schema/tracker.go | 25 +------ .../vttablet/tabletserver/throttle/client.go | 5 +- .../tabletserver/vstreamer/rowstreamer.go | 9 ++- .../vstreamer/rowstreamer_test.go | 36 +++++----- .../tabletserver/vstreamer/vstreamer.go | 65 +++++++++++-------- .../vstreamer/vstreamer_flaky_test.go | 15 +++-- tools/e2e_test_race.sh | 4 +- 11 files changed, 123 insertions(+), 86 deletions(-) diff --git a/go/vt/vtgate/endtoend/vstream_test.go b/go/vt/vtgate/endtoend/vstream_test.go index 4a5f7bc46ab..e5f0488de48 100644 --- a/go/vt/vtgate/endtoend/vstream_test.go +++ b/go/vt/vtgate/endtoend/vstream_test.go @@ -470,9 +470,9 @@ func TestVStreamSharded(t *testing.T) { received bool } expectedEvents := []*expectedEvent{ - {`type:FIELD field_event:{table_name:"ks.t1_sharded" fields:{name:"id1" type:INT64 table:"t1_sharded" org_table:"t1_sharded" database:"vt_ks_-80" org_name:"id1" column_length:20 charset:63 flags:53251} fields:{name:"id2" type:INT64 table:"t1_sharded" org_table:"t1_sharded" database:"vt_ks_-80" org_name:"id2" column_length:20 charset:63 flags:32768} keyspace:"ks" shard:"-80"}`, false}, + {`type:FIELD field_event:{table_name:"ks.t1_sharded" fields:{name:"id1" type:INT64 table:"t1_sharded" org_table:"t1_sharded" database:"vt_ks_-80" org_name:"id1" column_length:20 charset:63 flags:53251 column_type:"bigint(20)"} fields:{name:"id2" type:INT64 table:"t1_sharded" org_table:"t1_sharded" database:"vt_ks_-80" org_name:"id2" column_length:20 charset:63 flags:32768 column_type:"bigint(20)"} keyspace:"ks" shard:"-80"}`, false}, {`type:ROW row_event:{table_name:"ks.t1_sharded" row_changes:{after:{lengths:1 lengths:1 values:"11"}} keyspace:"ks" shard:"-80"}`, false}, - {`type:FIELD field_event:{table_name:"ks.t1_sharded" fields:{name:"id1" type:INT64 table:"t1_sharded" org_table:"t1_sharded" database:"vt_ks_80-" org_name:"id1" column_length:20 charset:63 flags:53251} fields:{name:"id2" type:INT64 table:"t1_sharded" org_table:"t1_sharded" database:"vt_ks_80-" org_name:"id2" column_length:20 charset:63 flags:32768} keyspace:"ks" shard:"80-"}`, false}, + {`type:FIELD field_event:{table_name:"ks.t1_sharded" fields:{name:"id1" type:INT64 table:"t1_sharded" org_table:"t1_sharded" database:"vt_ks_80-" org_name:"id1" column_length:20 charset:63 flags:53251 column_type:"bigint(20)"} fields:{name:"id2" type:INT64 table:"t1_sharded" org_table:"t1_sharded" database:"vt_ks_80-" org_name:"id2" column_length:20 charset:63 flags:32768 column_type:"bigint(20)"} keyspace:"ks" shard:"80-"}`, false}, {`type:ROW row_event:{table_name:"ks.t1_sharded" row_changes:{after:{lengths:1 lengths:1 values:"44"}} keyspace:"ks" shard:"80-"}`, false}, } for { @@ -497,7 +497,7 @@ func TestVStreamSharded(t *testing.T) { for _, ev := range evs { s := fmt.Sprintf("%v", ev) for _, expectedEv := range expectedEvents { - if expectedEv.ev == s { + if removeAnyDeprecatedDisplayWidths(expectedEv.ev) == removeAnyDeprecatedDisplayWidths(s) { expectedEv.received = true break } diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index ea72d2ee89d..94b16f02573 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -19,6 +19,7 @@ package framework import ( "context" "errors" + "sync" "time" "google.golang.org/protobuf/proto" @@ -40,6 +41,7 @@ type QueryClient struct { target *querypb.Target server *tabletserver.TabletServer transactionID int64 + reservedIDMu sync.Mutex reservedID int64 sessionStateChanges string } @@ -114,6 +116,8 @@ func (client *QueryClient) Commit() error { func (client *QueryClient) Rollback() error { defer func() { client.transactionID = 0 }() rID, err := client.server.Rollback(client.ctx, client.target, client.transactionID) + client.reservedIDMu.Lock() + defer client.reservedIDMu.Unlock() client.reservedID = rID if err != nil { return err @@ -293,6 +297,8 @@ func (client *QueryClient) MessageAck(name string, ids []string) (int64, error) // ReserveExecute performs a ReserveExecute. func (client *QueryClient) ReserveExecute(query string, preQueries []string, bindvars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { + client.reservedIDMu.Lock() + defer client.reservedIDMu.Unlock() if client.reservedID != 0 { return nil, errors.New("already reserved a connection") } diff --git a/go/vt/vttablet/endtoend/transaction_test.go b/go/vt/vttablet/endtoend/transaction_test.go index 6751e60f9ad..8f6546df5f1 100644 --- a/go/vt/vttablet/endtoend/transaction_test.go +++ b/go/vt/vttablet/endtoend/transaction_test.go @@ -321,7 +321,7 @@ func TestShutdownGracePeriod(t *testing.T) { err := client.Begin(false) require.NoError(t, err) go func() { - _, err = client.Execute("select sleep(10) from dual", nil) + _, err := client.Execute("select sleep(10) from dual", nil) assert.Error(t, err) }() @@ -346,7 +346,7 @@ func TestShutdownGracePeriod(t *testing.T) { err = client.Begin(false) require.NoError(t, err) go func() { - _, err = client.Execute("select sleep(11) from dual", nil) + _, err := client.Execute("select sleep(11) from dual", nil) assert.Error(t, err) }() @@ -373,7 +373,7 @@ func TestShutdownGracePeriodWithStreamExecute(t *testing.T) { err := client.Begin(false) require.NoError(t, err) go func() { - _, err = client.StreamExecute("select sleep(10) from dual", nil) + _, err := client.StreamExecute("select sleep(10) from dual", nil) assert.Error(t, err) }() @@ -398,7 +398,7 @@ func TestShutdownGracePeriodWithStreamExecute(t *testing.T) { err = client.Begin(false) require.NoError(t, err) go func() { - _, err = client.StreamExecute("select sleep(11) from dual", nil) + _, err := client.StreamExecute("select sleep(11) from dual", nil) assert.Error(t, err) }() @@ -425,7 +425,7 @@ func TestShutdownGracePeriodWithReserveExecute(t *testing.T) { err := client.Begin(false) require.NoError(t, err) go func() { - _, err = client.ReserveExecute("select sleep(10) from dual", nil, nil) + _, err := client.ReserveExecute("select sleep(10) from dual", nil, nil) assert.Error(t, err) }() @@ -450,7 +450,7 @@ func TestShutdownGracePeriodWithReserveExecute(t *testing.T) { err = client.Begin(false) require.NoError(t, err) go func() { - _, err = client.ReserveExecute("select sleep(11) from dual", nil, nil) + _, err := client.ReserveExecute("select sleep(11) from dual", nil, nil) assert.Error(t, err) }() diff --git a/go/vt/vttablet/tabletserver/schema/engine.go b/go/vt/vttablet/tabletserver/schema/engine.go index e29c57bbd73..215b37a1c6a 100644 --- a/go/vt/vttablet/tabletserver/schema/engine.go +++ b/go/vt/vttablet/tabletserver/schema/engine.go @@ -673,6 +673,32 @@ func (se *Engine) GetSchema() map[string]*Table { return tables } +// MarshalMinimalSchema returns a protobuf encoded binlogdata.MinimalSchema +func (se *Engine) MarshalMinimalSchema() ([]byte, error) { + se.mu.Lock() + defer se.mu.Unlock() + dbSchema := &binlogdatapb.MinimalSchema{ + Tables: make([]*binlogdatapb.MinimalTable, 0, len(se.tables)), + } + for _, table := range se.tables { + dbSchema.Tables = append(dbSchema.Tables, newMinimalTable(table)) + } + return dbSchema.MarshalVT() +} + +func newMinimalTable(st *Table) *binlogdatapb.MinimalTable { + table := &binlogdatapb.MinimalTable{ + Name: st.Name.String(), + Fields: st.Fields, + } + pkc := make([]int64, len(st.PKColumns)) + for i, pk := range st.PKColumns { + pkc[i] = int64(pk) + } + table.PKColumns = pkc + return table +} + // GetConnection returns a connection from the pool func (se *Engine) GetConnection(ctx context.Context) (*connpool.DBConn, error) { return se.conns.Get(ctx, nil) diff --git a/go/vt/vttablet/tabletserver/schema/tracker.go b/go/vt/vttablet/tabletserver/schema/tracker.go index f3345b0a972..3297aa82915 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker.go +++ b/go/vt/vttablet/tabletserver/schema/tracker.go @@ -23,8 +23,6 @@ import ( "sync" "time" - "google.golang.org/protobuf/proto" - "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/mysql" @@ -220,14 +218,10 @@ func (tr *Tracker) schemaUpdated(gtid string, ddl string, timestamp int64) error } func (tr *Tracker) saveCurrentSchemaToDb(ctx context.Context, gtid, ddl string, timestamp int64) error { - tables := tr.engine.GetSchema() - dbSchema := &binlogdatapb.MinimalSchema{ - Tables: []*binlogdatapb.MinimalTable{}, - } - for _, table := range tables { - dbSchema.Tables = append(dbSchema.Tables, newMinimalTable(table)) + blob, err := tr.engine.MarshalMinimalSchema() + if err != nil { + return err } - blob, _ := proto.Marshal(dbSchema) conn, err := tr.engine.GetConnection(ctx) if err != nil { @@ -245,19 +239,6 @@ func (tr *Tracker) saveCurrentSchemaToDb(ctx context.Context, gtid, ddl string, return nil } -func newMinimalTable(st *Table) *binlogdatapb.MinimalTable { - table := &binlogdatapb.MinimalTable{ - Name: st.Name.String(), - Fields: st.Fields, - } - var pkc []int64 - for _, pk := range st.PKColumns { - pkc = append(pkc, int64(pk)) - } - table.PKColumns = pkc - return table -} - func encodeString(in string) string { buf := bytes.NewBuffer(nil) sqltypes.NewVarChar(in).EncodeSQL(buf) diff --git a/go/vt/vttablet/tabletserver/throttle/client.go b/go/vt/vttablet/tabletserver/throttle/client.go index 10fe910d264..240ac7a0260 100644 --- a/go/vt/vttablet/tabletserver/throttle/client.go +++ b/go/vt/vttablet/tabletserver/throttle/client.go @@ -50,7 +50,8 @@ type Client struct { checkType ThrottleCheckType flags CheckFlags - lastSuccessfulThrottle int64 + lastSuccessfulThrottleMu sync.Mutex + lastSuccessfulThrottle int64 } // NewProductionClient creates a client suitable for foreground/production jobs, which have normal priority. @@ -94,6 +95,8 @@ func (c *Client) ThrottleCheckOK(ctx context.Context, overrideAppName string) (t // no throttler return true } + c.lastSuccessfulThrottleMu.Lock() + defer c.lastSuccessfulThrottleMu.Unlock() if c.lastSuccessfulThrottle >= atomic.LoadInt64(&throttleTicks) { // if last check was OK just very recently there is no need to check again return true diff --git a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go index 67be0513e67..560546d7c04 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go @@ -153,9 +153,14 @@ func (rs *rowStreamer) buildPlan() error { return err } ti := &Table{ - Name: st.Name, - Fields: st.Fields, + Name: st.Name, } + + ti.Fields, err = getFields(rs.ctx, rs.cp, st.Name, rs.cp.DBName(), st.Fields) + if err != nil { + return err + } + // The plan we build is identical to the one for vstreamer. // This is because the row format of a read is identical // to the row format of a binlog event. So, the same diff --git a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer_test.go index 2a9ac5a47ff..4115a006c37 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer_test.go @@ -72,7 +72,7 @@ func TestStreamRowsScan(t *testing.T) { // t1: simulates rollup, with non-pk column wantStream = []string{ - `fields:{name:"1" type:INT64} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id" type:INT32}`, + `fields:{name:"1" type:INT64} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id" type:INT32}`, `rows:{lengths:1 lengths:3 values:"1aaa"} rows:{lengths:1 lengths:3 values:"1bbb"} lastpk:{lengths:1 values:"2"}`, } wantQuery = "select id, val from t1 order by id" @@ -80,7 +80,7 @@ func TestStreamRowsScan(t *testing.T) { // t1: simulates rollup, with pk and non-pk column wantStream = []string{ - `fields:{name:"1" type:INT64} fields:{name:"id" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id" type:INT32}`, + `fields:{name:"1" type:INT64} fields:{name:"id" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id" type:INT32}`, `rows:{lengths:1 lengths:1 lengths:3 values:"11aaa"} rows:{lengths:1 lengths:1 lengths:3 values:"12bbb"} lastpk:{lengths:1 values:"2"}`, } wantQuery = "select id, val from t1 order by id" @@ -88,7 +88,7 @@ func TestStreamRowsScan(t *testing.T) { // t1: no pk in select list wantStream = []string{ - `fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id" type:INT32}`, + `fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id" type:INT32}`, `rows:{lengths:3 values:"aaa"} rows:{lengths:3 values:"bbb"} lastpk:{lengths:1 values:"2"}`, } wantQuery = "select id, val from t1 order by id" @@ -96,7 +96,7 @@ func TestStreamRowsScan(t *testing.T) { // t1: all rows wantStream = []string{ - `fields:{name:"id" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id" type:INT32}`, + `fields:{name:"id" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id" type:INT32}`, `rows:{lengths:1 lengths:3 values:"1aaa"} rows:{lengths:1 lengths:3 values:"2bbb"} lastpk:{lengths:1 values:"2"}`, } wantQuery = "select id, val from t1 order by id" @@ -104,7 +104,7 @@ func TestStreamRowsScan(t *testing.T) { // t1: lastpk=1 wantStream = []string{ - `fields:{name:"id" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id" type:INT32}`, + `fields:{name:"id" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id" type:INT32}`, `rows:{lengths:1 lengths:3 values:"2bbb"} lastpk:{lengths:1 values:"2"}`, } wantQuery = "select id, val from t1 where (id > 1) order by id" @@ -112,7 +112,7 @@ func TestStreamRowsScan(t *testing.T) { // t1: different column ordering wantStream = []string{ - `fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63} fields:{name:"id" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id" column_length:11 charset:63} pkfields:{name:"id" type:INT32}`, + `fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} fields:{name:"id" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id" column_length:11 charset:63 column_type:"int(11)"} pkfields:{name:"id" type:INT32}`, `rows:{lengths:3 lengths:1 values:"aaa1"} rows:{lengths:3 lengths:1 values:"bbb2"} lastpk:{lengths:1 values:"2"}`, } wantQuery = "select id, val from t1 order by id" @@ -120,7 +120,7 @@ func TestStreamRowsScan(t *testing.T) { // t2: all rows wantStream = []string{ - `fields:{name:"id1" type:INT32 table:"t2" org_table:"t2" database:"vttest" org_name:"id1" column_length:11 charset:63} fields:{name:"id2" type:INT32 table:"t2" org_table:"t2" database:"vttest" org_name:"id2" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t2" org_table:"t2" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id1" type:INT32} pkfields:{name:"id2" type:INT32}`, + `fields:{name:"id1" type:INT32 table:"t2" org_table:"t2" database:"vttest" org_name:"id1" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"id2" type:INT32 table:"t2" org_table:"t2" database:"vttest" org_name:"id2" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t2" org_table:"t2" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id1" type:INT32} pkfields:{name:"id2" type:INT32}`, `rows:{lengths:1 lengths:1 lengths:3 values:"12aaa"} rows:{lengths:1 lengths:1 lengths:3 values:"13bbb"} lastpk:{lengths:1 lengths:1 values:"13"}`, } wantQuery = "select id1, id2, val from t2 order by id1, id2" @@ -128,7 +128,7 @@ func TestStreamRowsScan(t *testing.T) { // t2: lastpk=1,2 wantStream = []string{ - `fields:{name:"id1" type:INT32 table:"t2" org_table:"t2" database:"vttest" org_name:"id1" column_length:11 charset:63} fields:{name:"id2" type:INT32 table:"t2" org_table:"t2" database:"vttest" org_name:"id2" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t2" org_table:"t2" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id1" type:INT32} pkfields:{name:"id2" type:INT32}`, + `fields:{name:"id1" type:INT32 table:"t2" org_table:"t2" database:"vttest" org_name:"id1" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"id2" type:INT32 table:"t2" org_table:"t2" database:"vttest" org_name:"id2" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t2" org_table:"t2" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id1" type:INT32} pkfields:{name:"id2" type:INT32}`, `rows:{lengths:1 lengths:1 lengths:3 values:"13bbb"} lastpk:{lengths:1 lengths:1 values:"13"}`, } wantQuery = "select id1, id2, val from t2 where (id1 = 1 and id2 > 2) or (id1 > 1) order by id1, id2" @@ -136,7 +136,7 @@ func TestStreamRowsScan(t *testing.T) { // t3: all rows wantStream = []string{ - `fields:{name:"id" type:INT32 table:"t3" org_table:"t3" database:"vttest" org_name:"id" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t3" org_table:"t3" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id" type:INT32} pkfields:{name:"val" type:VARBINARY}`, + `fields:{name:"id" type:INT32 table:"t3" org_table:"t3" database:"vttest" org_name:"id" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t3" org_table:"t3" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id" type:INT32} pkfields:{name:"val" type:VARBINARY}`, `rows:{lengths:1 lengths:3 values:"1aaa"} rows:{lengths:1 lengths:3 values:"2bbb"} lastpk:{lengths:1 lengths:3 values:"2bbb"}`, } wantQuery = "select id, val from t3 order by id, val" @@ -144,7 +144,7 @@ func TestStreamRowsScan(t *testing.T) { // t3: lastpk: 1,'aaa' wantStream = []string{ - `fields:{name:"id" type:INT32 table:"t3" org_table:"t3" database:"vttest" org_name:"id" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t3" org_table:"t3" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id" type:INT32} pkfields:{name:"val" type:VARBINARY}`, + `fields:{name:"id" type:INT32 table:"t3" org_table:"t3" database:"vttest" org_name:"id" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t3" org_table:"t3" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id" type:INT32} pkfields:{name:"val" type:VARBINARY}`, `rows:{lengths:1 lengths:3 values:"2bbb"} lastpk:{lengths:1 lengths:3 values:"2bbb"}`, } wantQuery = "select id, val from t3 where (id = 1 and val > 'aaa') or (id > 1) order by id, val" @@ -152,7 +152,7 @@ func TestStreamRowsScan(t *testing.T) { // t4: all rows wantStream = []string{ - `fields:{name:"id1" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id1" column_length:11 charset:63} fields:{name:"id2" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id2" column_length:11 charset:63} fields:{name:"id3" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id3" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t4" org_table:"t4" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id1" type:INT32} pkfields:{name:"id2" type:INT32} pkfields:{name:"id3" type:INT32}`, + `fields:{name:"id1" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id1" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"id2" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id2" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"id3" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id3" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t4" org_table:"t4" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id1" type:INT32} pkfields:{name:"id2" type:INT32} pkfields:{name:"id3" type:INT32}`, `rows:{lengths:1 lengths:1 lengths:1 lengths:3 values:"123aaa"} rows:{lengths:1 lengths:1 lengths:1 lengths:3 values:"234bbb"} lastpk:{lengths:1 lengths:1 lengths:1 values:"234"}`, } wantQuery = "select id1, id2, id3, val from t4 order by id1, id2, id3" @@ -160,7 +160,7 @@ func TestStreamRowsScan(t *testing.T) { // t4: lastpk: 1,2,3 wantStream = []string{ - `fields:{name:"id1" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id1" column_length:11 charset:63} fields:{name:"id2" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id2" column_length:11 charset:63} fields:{name:"id3" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id3" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t4" org_table:"t4" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id1" type:INT32} pkfields:{name:"id2" type:INT32} pkfields:{name:"id3" type:INT32}`, + `fields:{name:"id1" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id1" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"id2" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id2" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"id3" type:INT32 table:"t4" org_table:"t4" database:"vttest" org_name:"id3" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t4" org_table:"t4" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id1" type:INT32} pkfields:{name:"id2" type:INT32} pkfields:{name:"id3" type:INT32}`, `rows:{lengths:1 lengths:1 lengths:1 lengths:3 values:"234bbb"} lastpk:{lengths:1 lengths:1 lengths:1 values:"234"}`, } wantQuery = "select id1, id2, id3, val from t4 where (id1 = 1 and id2 = 2 and id3 > 3) or (id1 = 1 and id2 > 2) or (id1 > 1) order by id1, id2, id3" @@ -255,7 +255,7 @@ func TestStreamRowsKeyRange(t *testing.T) { // Only the first row should be returned, but lastpk should be 6. wantStream := []string{ - `fields:{name:"id1" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id1" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id1" type:INT32}`, + `fields:{name:"id1" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id1" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id1" type:INT32}`, `rows:{lengths:1 lengths:3 values:"1aaa"} lastpk:{lengths:1 values:"6"}`, } wantQuery := "select id1, val from t1 order by id1" @@ -287,7 +287,7 @@ func TestStreamRowsFilterInt(t *testing.T) { time.Sleep(1 * time.Second) wantStream := []string{ - `fields:{name:"id1" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id1" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id1" type:INT32}`, + `fields:{name:"id1" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id1" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id1" type:INT32}`, `rows:{lengths:1 lengths:3 values:"1aaa"} rows:{lengths:1 lengths:3 values:"4ddd"} lastpk:{lengths:1 values:"5"}`, } wantQuery := "select id1, id2, val from t1 order by id1" @@ -320,7 +320,7 @@ func TestStreamRowsFilterVarBinary(t *testing.T) { time.Sleep(1 * time.Second) wantStream := []string{ - `fields:{name:"id1" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id1" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id1" type:INT32}`, + `fields:{name:"id1" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id1" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id1" type:INT32}`, `rows:{lengths:1 lengths:6 values:"2newton"} rows:{lengths:1 lengths:6 values:"3newton"} rows:{lengths:1 lengths:6 values:"5newton"} lastpk:{lengths:1 values:"6"}`, } wantQuery := "select id1, val from t1 order by id1" @@ -346,7 +346,7 @@ func TestStreamRowsMultiPacket(t *testing.T) { engine.se.Reload(context.Background()) wantStream := []string{ - `fields:{name:"id" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id" column_length:11 charset:63} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63} pkfields:{name:"id" type:INT32}`, + `fields:{name:"id" type:INT32 table:"t1" org_table:"t1" database:"vttest" org_name:"id" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t1" org_table:"t1" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id" type:INT32}`, `rows:{lengths:1 lengths:3 values:"1234"} rows:{lengths:1 lengths:4 values:"26789"} rows:{lengths:1 lengths:1 values:"31"} lastpk:{lengths:1 values:"3"}`, `rows:{lengths:1 lengths:10 values:"42345678901"} lastpk:{lengths:1 values:"4"}`, `rows:{lengths:1 lengths:1 values:"52"} lastpk:{lengths:1 values:"5"}`, @@ -415,7 +415,9 @@ func checkStream(t *testing.T, query string, lastpk []sqltypes.Value, wantQuery re, _ := regexp.Compile(` flags:[\d]+`) srows = re.ReplaceAllString(srows, "") - if srows != wantStream[i] { + want := env.RemoveAnyDeprecatedDisplayWidths(wantStream[i]) + + if srows != want { ch <- fmt.Errorf("stream %d:\n%s, want\n%s", i, srows, wantStream[i]) } i++ diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go index 7cc98794312..8f35facb7f9 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go @@ -24,6 +24,7 @@ import ( "time" "google.golang.org/protobuf/encoding/prototext" + "google.golang.org/protobuf/proto" "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/timer" @@ -161,7 +162,7 @@ func (vs *vstreamer) Cancel() { // Stream streams binlog events. func (vs *vstreamer) Stream() error { - //defer vs.cancel() + // defer vs.cancel() ctx := context.Background() vs.vse.vstreamerCount.Add(1) defer func() { @@ -784,39 +785,16 @@ func (vs *vstreamer) buildTableColumns(tm *mysql.TableMap) ([]*querypb.Field, er } // Columns should be truncated to match those in tm. - fields = st.Fields[:len(tm.Types)] - extColInfos, err := vs.getExtColInfos(tm.Name, tm.Database) + fieldsCopy, err := getFields(vs.ctx, vs.cp, tm.Name, tm.Database, st.Fields[:len(tm.Types)]) if err != nil { return nil, err } - for _, field := range fields { - // we want the MySQL column type info so that we can properly handle - // ambiguous binlog events and other cases where the internal types - // don't match the MySQL column type. One example being that in binlog - // events CHAR columns with a binary collation are indistinguishable - // from BINARY columns. - if extColInfo, ok := extColInfos[field.Name]; ok { - field.ColumnType = extColInfo.columnType - } - } - return fields, nil -} - -// additional column attributes from information_schema.columns. Currently only column_type is used, but -// we expect to add more in the future -type extColInfo struct { - columnType string -} - -func encodeString(in string) string { - buf := bytes.NewBuffer(nil) - sqltypes.NewVarChar(in).EncodeSQL(buf) - return buf.String() + return fieldsCopy, nil } -func (vs *vstreamer) getExtColInfos(table, database string) (map[string]*extColInfo, error) { +func getExtColInfos(ctx context.Context, cp dbconfigs.Connector, table, database string) (map[string]*extColInfo, error) { extColInfos := make(map[string]*extColInfo) - conn, err := vs.cp.Connect(vs.ctx) + conn, err := cp.Connect(ctx) if err != nil { return nil, err } @@ -836,6 +814,37 @@ func (vs *vstreamer) getExtColInfos(table, database string) (map[string]*extColI return extColInfos, nil } +func getFields(ctx context.Context, cp dbconfigs.Connector, table, database string, fields []*querypb.Field) ([]*querypb.Field, error) { + // Make a deep copy of the schema.Engine fields as they are pointers and + // will be modified by adding ColumnType below + fieldsCopy := make([]*querypb.Field, len(fields)) + for i, field := range fields { + fieldsCopy[i] = proto.Clone(field).(*querypb.Field) + } + extColInfos, err := getExtColInfos(ctx, cp, table, database) + if err != nil { + return nil, err + } + for _, field := range fieldsCopy { + if colInfo, ok := extColInfos[field.Name]; ok { + field.ColumnType = colInfo.columnType + } + } + return fieldsCopy, nil +} + +// additional column attributes from information_schema.columns. Currently only column_type is used, but +// we expect to add more in the future +type extColInfo struct { + columnType string +} + +func encodeString(in string) string { + buf := bytes.NewBuffer(nil) + sqltypes.NewVarChar(in).EncodeSQL(buf) + return buf.String() +} + func (vs *vstreamer) processJournalEvent(vevents []*binlogdatapb.VEvent, plan *streamerPlan, rows mysql.Rows) ([]*binlogdatapb.VEvent, error) { // Get DbName params, err := vs.cp.MysqlParams() diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_flaky_test.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_flaky_test.go index 72ad570ac66..c2a1a03c1c3 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_flaky_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_flaky_test.go @@ -419,8 +419,8 @@ func TestVStreamCopySimpleFlow(t *testing.T) { tablePKs = append(tablePKs, getTablePK("t1", 1)) tablePKs = append(tablePKs, getTablePK("t2", 2)) - t1FieldEvent := []string{"begin", "type:FIELD field_event:{table_name:\"t1\" fields:{name:\"id11\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id11\" column_length:11 charset:63} fields:{name:\"id12\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id12\" column_length:11 charset:63}}"} - t2FieldEvent := []string{"begin", "type:FIELD field_event:{table_name:\"t2\" fields:{name:\"id21\" type:INT32 table:\"t2\" org_table:\"t2\" database:\"vttest\" org_name:\"id21\" column_length:11 charset:63} fields:{name:\"id22\" type:INT32 table:\"t2\" org_table:\"t2\" database:\"vttest\" org_name:\"id22\" column_length:11 charset:63}}"} + t1FieldEvent := []string{"begin", "type:FIELD field_event:{table_name:\"t1\" fields:{name:\"id11\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id11\" column_length:11 charset:63 column_type:\"int(11)\"} fields:{name:\"id12\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id12\" column_length:11 charset:63 column_type:\"int(11)\"}}"} + t2FieldEvent := []string{"begin", "type:FIELD field_event:{table_name:\"t2\" fields:{name:\"id21\" type:INT32 table:\"t2\" org_table:\"t2\" database:\"vttest\" org_name:\"id21\" column_length:11 charset:63 column_type:\"int(11)\"} fields:{name:\"id22\" type:INT32 table:\"t2\" org_table:\"t2\" database:\"vttest\" org_name:\"id22\" column_length:11 charset:63 column_type:\"int(11)\"}}"} t1Events := []string{} t2Events := []string{} for i := 1; i <= 10; i++ { @@ -504,7 +504,7 @@ func TestVStreamCopyWithDifferentFilters(t *testing.T) { var expectedEvents = []string{ "type:BEGIN", - "type:FIELD field_event:{table_name:\"t1\" fields:{name:\"id1\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id1\" column_length:11 charset:63} fields:{name:\"id2\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id2\" column_length:11 charset:63}}", + "type:FIELD field_event:{table_name:\"t1\" fields:{name:\"id1\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id1\" column_length:11 charset:63 column_type:\"int(11)\"} fields:{name:\"id2\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id2\" column_length:11 charset:63 column_type:\"int(11)\"}}", "type:GTID", "type:ROW row_event:{table_name:\"t1\" row_changes:{after:{lengths:1 lengths:1 values:\"12\"}}}", "type:LASTPK last_p_k_event:{table_last_p_k:{table_name:\"t1\" lastpk:{rows:{lengths:1 values:\"1\"}}}}", @@ -513,7 +513,7 @@ func TestVStreamCopyWithDifferentFilters(t *testing.T) { "type:LASTPK last_p_k_event:{table_last_p_k:{table_name:\"t1\"} completed:true}", "type:COMMIT", "type:BEGIN", - "type:FIELD field_event:{table_name:\"t2a\" fields:{name:\"id1\" type:INT32 table:\"t2a\" org_table:\"t2a\" database:\"vttest\" org_name:\"id1\" column_length:11 charset:63} fields:{name:\"id2\" type:INT32 table:\"t2a\" org_table:\"t2a\" database:\"vttest\" org_name:\"id2\" column_length:11 charset:63}}", + "type:FIELD field_event:{table_name:\"t2a\" fields:{name:\"id1\" type:INT32 table:\"t2a\" org_table:\"t2a\" database:\"vttest\" org_name:\"id1\" column_length:11 charset:63 column_type:\"int(11)\"} fields:{name:\"id2\" type:INT32 table:\"t2a\" org_table:\"t2a\" database:\"vttest\" org_name:\"id2\" column_length:11 charset:63 column_type:\"int(11)\"}}", "type:ROW row_event:{table_name:\"t2a\" row_changes:{after:{lengths:1 lengths:1 values:\"14\"}}}", "type:LASTPK last_p_k_event:{table_last_p_k:{table_name:\"t2a\" lastpk:{rows:{lengths:1 values:\"1\"}}}}", "type:COMMIT", @@ -521,7 +521,7 @@ func TestVStreamCopyWithDifferentFilters(t *testing.T) { "type:LASTPK last_p_k_event:{table_last_p_k:{table_name:\"t2a\"} completed:true}", "type:COMMIT", "type:BEGIN", - "type:FIELD field_event:{table_name:\"t2b\" fields:{name:\"id1\" type:VARCHAR table:\"t2b\" org_table:\"t2b\" database:\"vttest\" org_name:\"id1\" column_length:80 charset:45} fields:{name:\"id2\" type:INT32 table:\"t2b\" org_table:\"t2b\" database:\"vttest\" org_name:\"id2\" column_length:11 charset:63}}", + "type:FIELD field_event:{table_name:\"t2b\" fields:{name:\"id1\" type:VARCHAR table:\"t2b\" org_table:\"t2b\" database:\"vttest\" org_name:\"id1\" column_length:80 charset:45 column_type:\"varchar(20)\"} fields:{name:\"id2\" type:INT32 table:\"t2b\" org_table:\"t2b\" database:\"vttest\" org_name:\"id2\" column_length:11 charset:63 column_type:\"int(11)\"}}", "type:ROW row_event:{table_name:\"t2b\" row_changes:{after:{lengths:1 lengths:1 values:\"a5\"}}}", "type:ROW row_event:{table_name:\"t2b\" row_changes:{after:{lengths:1 lengths:1 values:\"b6\"}}}", "type:LASTPK last_p_k_event:{table_last_p_k:{table_name:\"t2b\" lastpk:{rows:{lengths:1 values:\"b\"}}}}", @@ -567,8 +567,11 @@ func TestVStreamCopyWithDifferentFilters(t *testing.T) { } got := ev.String() want := expectedEvents[i] + + want = env.RemoveAnyDeprecatedDisplayWidths(want) + if !strings.HasPrefix(got, want) { - errGoroutine = fmt.Errorf("Event %d did not match, want %s, got %s", i, want, got) + errGoroutine = fmt.Errorf("event %d did not match, want %s, got %s", i, want, got) return errGoroutine } } diff --git a/tools/e2e_test_race.sh b/tools/e2e_test_race.sh index 7dad5b259a3..b072e1261e2 100755 --- a/tools/e2e_test_race.sh +++ b/tools/e2e_test_race.sh @@ -38,9 +38,11 @@ packages_with_tests=$(echo "$packages_with_tests" | grep -vE "go/test/endtoend" # endtoend tests should be in a directory called endtoend all_e2e_tests=$(echo "$packages_with_tests" | cut -d" " -f1) +set -exo pipefail + # Run all endtoend tests. echo "$all_e2e_tests" | xargs go test $VT_GO_PARALLEL -race 2>&1 | tee $temp_log_file -if [ ${PIPESTATUS[0]} -ne 0 ]; then +if [ ${PIPESTATUS[1]} -ne 0 ]; then if grep "WARNING: DATA RACE" -q $temp_log_file; then echo echo "ERROR: go test -race found a data race. See log above." From bacffedad9b4aabfedb1d6778378bc10eb0bd172 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 14:13:49 -0700 Subject: [PATCH 183/233] [release-16.0] Fix vtcombo DBDDL plugin race condition (#13117) (#13741) Signed-off-by: Jaskanwal Pawar <32091345+jspawar@users.noreply.github.com> Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Arthur Schreiber --- go/cmd/vtcombo/plugin_dbddl.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/go/cmd/vtcombo/plugin_dbddl.go b/go/cmd/vtcombo/plugin_dbddl.go index 49a7a601fb1..1a95e073308 100644 --- a/go/cmd/vtcombo/plugin_dbddl.go +++ b/go/cmd/vtcombo/plugin_dbddl.go @@ -18,6 +18,7 @@ package main import ( "context" + "sync" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/vtgate/engine" @@ -29,7 +30,9 @@ var globalCreateDb func(ctx context.Context, ks *vttestpb.Keyspace) error var globalDropDb func(ctx context.Context, ksName string) error // DBDDL doesn't need to store any state - we use the global variables above instead -type DBDDL struct{} +type DBDDL struct { + mu sync.Mutex +} // CreateDatabase implements the engine.DBDDLPlugin interface func (plugin *DBDDL) CreateDatabase(ctx context.Context, name string) error { @@ -39,6 +42,8 @@ func (plugin *DBDDL) CreateDatabase(ctx context.Context, name string) error { Name: "0", }}, } + plugin.mu.Lock() + defer plugin.mu.Unlock() return globalCreateDb(ctx, ks) } From d4fb7f6be89c596cd80ea59fb7d8a6517ca95502 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 07:39:01 +0530 Subject: [PATCH 184/233] [release-16.0] fix: cost to include subshard opcode (#14023) (#14026) Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- .../planbuilder/testdata/from_cases.json | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/go/vt/vtgate/planbuilder/testdata/from_cases.json b/go/vt/vtgate/planbuilder/testdata/from_cases.json index 5687c950bdc..cfc673ad3af 100644 --- a/go/vt/vtgate/planbuilder/testdata/from_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/from_cases.json @@ -6499,5 +6499,90 @@ "zlookup_unique.t1" ] } + }, + { + "comment": "join query using table with muticolumn vindex", + "query": "select 1 from multicol_tbl m1 join multicol_tbl m2 on m1.cola = m2.cola", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select 1 from multicol_tbl m1 join multicol_tbl m2 on m1.cola = m2.cola", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0", + "JoinVars": { + "m1_cola": 1 + }, + "TableName": "multicol_tbl_multicol_tbl", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1, m1.cola from multicol_tbl as m1 where 1 != 1", + "Query": "select 1, m1.cola from multicol_tbl as m1", + "Table": "multicol_tbl" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from multicol_tbl as m2 where 1 != 1", + "Query": "select 1 from multicol_tbl as m2 where m2.cola = :m1_cola", + "Table": "multicol_tbl" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select 1 from multicol_tbl m1 join multicol_tbl m2 on m1.cola = m2.cola", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:1", + "JoinVars": { + "m1_cola": 0 + }, + "TableName": "multicol_tbl_multicol_tbl", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select m1.cola, 1 from multicol_tbl as m1 where 1 != 1", + "Query": "select m1.cola, 1 from multicol_tbl as m1", + "Table": "multicol_tbl" + }, + { + "OperatorType": "Route", + "Variant": "SubShard", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from multicol_tbl as m2 where 1 != 1", + "Query": "select 1 from multicol_tbl as m2 where m2.cola = :m1_cola", + "Table": "multicol_tbl", + "Values": [ + ":m1_cola" + ], + "Vindex": "multicolIdx" + } + ] + }, + "TablesUsed": [ + "user.multicol_tbl" + ] + } } ] From 44f7c361c2389d70c00a48e09e2e57a293af8e1f Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 11:49:48 +0530 Subject: [PATCH 185/233] [release-16.0] moved timeout test to different package (#14028) (#14031) Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- .../endtoend/vtgate/queries/misc/main_test.go | 6 +- .../endtoend/vtgate/queries/misc/misc_test.go | 57 +-------- .../vtgate/queries/timeout/main_test.go | 110 ++++++++++++++++++ .../vtgate/queries/timeout/schema.sql | 5 + .../vtgate/queries/timeout/timeout_test.go | 100 ++++++++++++++++ .../vtgate/queries/timeout/uschema.sql | 5 + .../vtgate/queries/timeout/vschema.json | 18 +++ test/config.json | 9 ++ 8 files changed, 249 insertions(+), 61 deletions(-) create mode 100644 go/test/endtoend/vtgate/queries/timeout/main_test.go create mode 100644 go/test/endtoend/vtgate/queries/timeout/schema.sql create mode 100644 go/test/endtoend/vtgate/queries/timeout/timeout_test.go create mode 100644 go/test/endtoend/vtgate/queries/timeout/uschema.sql create mode 100644 go/test/endtoend/vtgate/queries/timeout/vschema.json diff --git a/go/test/endtoend/vtgate/queries/misc/main_test.go b/go/test/endtoend/vtgate/queries/misc/main_test.go index d71dc55ef46..a3858284884 100644 --- a/go/test/endtoend/vtgate/queries/misc/main_test.go +++ b/go/test/endtoend/vtgate/queries/misc/main_test.go @@ -62,9 +62,7 @@ func TestMain(m *testing.M) { } clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, - "--queryserver-config-max-result-size", "1000000", - "--queryserver-config-query-timeout", "200", - "--queryserver-config-query-pool-timeout", "200") + "--queryserver-config-max-result-size", "1000000") // Start Unsharded keyspace ukeyspace := &cluster.Keyspace{ Name: uks, @@ -86,8 +84,6 @@ func TestMain(m *testing.M) { return 1 } - clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, - "--query-timeout", "100") // Start vtgate err = clusterInstance.StartVtgate() if err != nil { diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index 14448989956..094ccc040bf 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -24,8 +24,6 @@ import ( "testing" _ "github.com/go-sql-driver/mysql" - - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "vitess.io/vitess/go/test/endtoend/cluster" @@ -97,58 +95,6 @@ func TestInvalidDateTimeTimestampVals(t *testing.T) { require.Error(t, err) } -func TestQueryTimeoutWithDual(t *testing.T) { - mcmp, closer := start(t) - defer closer() - - _, err := utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.04) from dual") - assert.NoError(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.24) from dual") - assert.Error(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "set @@session.query_timeout=20") - require.NoError(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.04) from dual") - assert.Error(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.01) from dual") - assert.NoError(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=500 */ sleep(0.24) from dual") - assert.NoError(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=10 */ sleep(0.04) from dual") - assert.Error(t, err) - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=15 */ sleep(0.001) from dual") - assert.NoError(t, err) -} - -func TestQueryTimeoutWithTables(t *testing.T) { - mcmp, closer := start(t) - defer closer() - - // unsharded - utils.Exec(t, mcmp.VtConn, "insert /*vt+ QUERY_TIMEOUT_MS=1000 */ into uks.unsharded(id1) values (1),(2),(3),(4),(5)") - for i := 0; i < 12; i++ { - utils.Exec(t, mcmp.VtConn, "insert /*vt+ QUERY_TIMEOUT_MS=1000 */ into uks.unsharded(id1) select id1+5 from uks.unsharded") - } - - utils.Exec(t, mcmp.VtConn, "select count(*) from uks.unsharded where id1 > 31") - utils.Exec(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=100 */ count(*) from uks.unsharded where id1 > 31") - - // the query usually takes more than 5ms to return. So this should fail. - _, err := utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=1 */ count(*) from uks.unsharded where id1 > 31") - require.Error(t, err) - assert.Contains(t, err.Error(), "context deadline exceeded") - assert.Contains(t, err.Error(), "(errno 1317) (sqlstate 70100)") - - // sharded - utils.Exec(t, mcmp.VtConn, "insert /*vt+ QUERY_TIMEOUT_MS=1000 */ into ks_misc.t1(id1, id2) values (1,2),(2,4),(3,6),(4,8),(5,10)") - - // sleep take in seconds, so 0.1 is 100ms - utils.Exec(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=500 */ sleep(0.1) from t1 where id1 = 1") - _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=20 */ sleep(0.1) from t1 where id1 = 1") - require.Error(t, err) - assert.Contains(t, err.Error(), "context deadline exceeded") - assert.Contains(t, err.Error(), "(errno 1317) (sqlstate 70100)") -} - // TestIntervalWithMathFunctions tests that the Interval keyword can be used with math functions. func TestIntervalWithMathFunctions(t *testing.T) { mcmp, closer := start(t) @@ -214,7 +160,7 @@ func TestHighNumberOfParams(t *testing.T) { 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...) + r, err := db.Query(fmt.Sprintf("SELECT 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 @@ -237,6 +183,5 @@ func TestBuggyOuterJoin(t *testing.T) { defer closer() mcmp.Exec("insert into t1(id1, id2) values (1,2), (42,5), (5, 42)") - mcmp.Exec("select t1.id1, t2.id1 from t1 left join t1 as t2 on t2.id1 = t2.id2") } diff --git a/go/test/endtoend/vtgate/queries/timeout/main_test.go b/go/test/endtoend/vtgate/queries/timeout/main_test.go new file mode 100644 index 00000000000..d71dc55ef46 --- /dev/null +++ b/go/test/endtoend/vtgate/queries/timeout/main_test.go @@ -0,0 +1,110 @@ +/* +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 misc + +import ( + _ "embed" + "flag" + "fmt" + "os" + "testing" + + "vitess.io/vitess/go/test/endtoend/utils" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/test/endtoend/cluster" +) + +var ( + clusterInstance *cluster.LocalProcessCluster + vtParams mysql.ConnParams + mysqlParams mysql.ConnParams + keyspaceName = "ks_misc" + uks = "uks" + cell = "test_misc" + + //go:embed uschema.sql + uschemaSQL string + + //go:embed schema.sql + schemaSQL string + + //go:embed vschema.json + vschema string +) + +func TestMain(m *testing.M) { + defer cluster.PanicHandler(nil) + flag.Parse() + + exitCode := func() int { + clusterInstance = cluster.NewCluster(cell, "localhost") + defer clusterInstance.Teardown() + + // Start topo server + err := clusterInstance.StartTopo() + if err != nil { + return 1 + } + + clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, + "--queryserver-config-max-result-size", "1000000", + "--queryserver-config-query-timeout", "200", + "--queryserver-config-query-pool-timeout", "200") + // Start Unsharded keyspace + ukeyspace := &cluster.Keyspace{ + Name: uks, + SchemaSQL: uschemaSQL, + } + err = clusterInstance.StartUnshardedKeyspace(*ukeyspace, 0, false) + if err != nil { + return 1 + } + + // Start keyspace + keyspace := &cluster.Keyspace{ + Name: keyspaceName, + SchemaSQL: schemaSQL, + VSchema: vschema, + } + err = clusterInstance.StartKeyspace(*keyspace, []string{"-80", "80-"}, 0, false) + if err != nil { + return 1 + } + + clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, + "--query-timeout", "100") + // Start vtgate + err = clusterInstance.StartVtgate() + if err != nil { + return 1 + } + + vtParams = clusterInstance.GetVTParams(keyspaceName) + + // create mysql instance and connection parameters + conn, closer, err := utils.NewMySQL(clusterInstance, keyspaceName, schemaSQL) + if err != nil { + fmt.Println(err) + return 1 + } + defer closer() + mysqlParams = conn + return m.Run() + }() + os.Exit(exitCode) +} diff --git a/go/test/endtoend/vtgate/queries/timeout/schema.sql b/go/test/endtoend/vtgate/queries/timeout/schema.sql new file mode 100644 index 00000000000..ceac0c07e6d --- /dev/null +++ b/go/test/endtoend/vtgate/queries/timeout/schema.sql @@ -0,0 +1,5 @@ +create table if not exists t1( + id1 bigint, + id2 bigint, + primary key(id1) +) Engine=InnoDB; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/timeout/timeout_test.go b/go/test/endtoend/vtgate/queries/timeout/timeout_test.go new file mode 100644 index 00000000000..b6c7a0bc7f5 --- /dev/null +++ b/go/test/endtoend/vtgate/queries/timeout/timeout_test.go @@ -0,0 +1,100 @@ +/* +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 misc + +import ( + "testing" + + _ "github.com/go-sql-driver/mysql" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/test/endtoend/utils" +) + +func start(t *testing.T) (utils.MySQLCompare, func()) { + mcmp, err := utils.NewMySQLCompare(t, vtParams, mysqlParams) + require.NoError(t, err) + + deleteAll := func() { + tables := []string{"t1", "uks.unsharded"} + for _, table := range tables { + _, _ = mcmp.ExecAndIgnore("delete from " + table) + } + } + + deleteAll() + + return mcmp, func() { + deleteAll() + mcmp.Close() + cluster.PanicHandler(t) + } +} + +func TestQueryTimeoutWithDual(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + _, err := utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.04) from dual") + assert.NoError(t, err) + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.24) from dual") + assert.Error(t, err) + _, err = utils.ExecAllowError(t, mcmp.VtConn, "set @@session.query_timeout=20") + require.NoError(t, err) + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.04) from dual") + assert.Error(t, err) + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(0.01) from dual") + assert.NoError(t, err) + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=500 */ sleep(0.24) from dual") + assert.NoError(t, err) + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=10 */ sleep(0.04) from dual") + assert.Error(t, err) + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=15 */ sleep(0.001) from dual") + assert.NoError(t, err) +} + +func TestQueryTimeoutWithTables(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + // unsharded + utils.Exec(t, mcmp.VtConn, "insert /*vt+ QUERY_TIMEOUT_MS=1000 */ into uks.unsharded(id1) values (1),(2),(3),(4),(5)") + for i := 0; i < 12; i++ { + utils.Exec(t, mcmp.VtConn, "insert /*vt+ QUERY_TIMEOUT_MS=1000 */ into uks.unsharded(id1) select id1+5 from uks.unsharded") + } + + utils.Exec(t, mcmp.VtConn, "select count(*) from uks.unsharded where id1 > 31") + utils.Exec(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=100 */ count(*) from uks.unsharded where id1 > 31") + + // the query usually takes more than 5ms to return. So this should fail. + _, err := utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=1 */ count(*) from uks.unsharded where id1 > 31") + require.Error(t, err) + assert.Contains(t, err.Error(), "context deadline exceeded") + assert.Contains(t, err.Error(), "(errno 1317) (sqlstate 70100)") + + // sharded + utils.Exec(t, mcmp.VtConn, "insert /*vt+ QUERY_TIMEOUT_MS=1000 */ into ks_misc.t1(id1, id2) values (1,2),(2,4),(3,6),(4,8),(5,10)") + + // sleep take in seconds, so 0.1 is 100ms + utils.Exec(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=500 */ sleep(0.1) from t1 where id1 = 1") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ PLANNER=gen4 QUERY_TIMEOUT_MS=20 */ sleep(0.1) from t1 where id1 = 1") + require.Error(t, err) + assert.Contains(t, err.Error(), "context deadline exceeded") + assert.Contains(t, err.Error(), "(errno 1317) (sqlstate 70100)") +} diff --git a/go/test/endtoend/vtgate/queries/timeout/uschema.sql b/go/test/endtoend/vtgate/queries/timeout/uschema.sql new file mode 100644 index 00000000000..6ba158b134e --- /dev/null +++ b/go/test/endtoend/vtgate/queries/timeout/uschema.sql @@ -0,0 +1,5 @@ +create table unsharded( + id1 bigint, + id2 bigint, + key(id1) +) Engine=InnoDB; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/timeout/vschema.json b/go/test/endtoend/vtgate/queries/timeout/vschema.json new file mode 100644 index 00000000000..60aa2bc9c07 --- /dev/null +++ b/go/test/endtoend/vtgate/queries/timeout/vschema.json @@ -0,0 +1,18 @@ +{ + "sharded": true, + "vindexes": { + "hash": { + "type": "hash" + } + }, + "tables": { + "t1": { + "column_vindexes": [ + { + "column": "id1", + "name": "hash" + } + ] + } + } +} \ No newline at end of file diff --git a/test/config.json b/test/config.json index 511e632e4ad..cdb39f95d2d 100644 --- a/test/config.json +++ b/test/config.json @@ -558,6 +558,15 @@ "RetryMax": 1, "Tags": [] }, + "vtgate_queries_timeout": { + "File": "unused.go", + "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/queries/timeout"], + "Command": [], + "Manual": false, + "Shard": "vtgate_queries", + "RetryMax": 1, + "Tags": [] + }, "vtgate_queries_normalize": { "File": "unused.go", "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/queries/normalize"], From 73e8ae1e415fdc25d9209f06556d3ce2142f67c2 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Wed, 20 Sep 2023 10:25:05 +0200 Subject: [PATCH 186/233] Backport [release-16.0] Flakes: Add recently added 'select rows_copied' query to ignore list #13993 (#14040) Signed-off-by: Rohit Nayak --- .../vreplication/external_connector_test.go | 2 -- .../tabletmanager/vreplication/framework_test.go | 1 + .../tabletmanager/vreplication/journal_test.go | 4 ---- .../tabletmanager/vreplication/vcopier_test.go | 16 ---------------- .../vreplication/vplayer_flaky_test.go | 6 ------ 5 files changed, 1 insertion(+), 28 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go b/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go index e2b1b8bf100..24e6cb0dbc3 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go @@ -181,7 +181,6 @@ func getExpectedVreplicationQueries(t *testing.T, pos string) []string { if pos == "" { return []string{ "/insert into _vt.vreplication", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "begin", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", @@ -191,7 +190,6 @@ func getExpectedVreplicationQueries(t *testing.T, pos string) []string { } return []string{ "/insert into _vt.vreplication", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running'", } } diff --git a/go/vt/vttablet/tabletmanager/vreplication/framework_test.go b/go/vt/vttablet/tabletmanager/vreplication/framework_test.go index cdb07485427..7588cbf7fa8 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/framework_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/framework_test.go @@ -488,6 +488,7 @@ func shouldIgnoreQuery(query string) bool { ", time_throttled=", // update of last throttle time, can happen out-of-band, so can't test for it ", component_throttled=", // update of last throttle time, can happen out-of-band, so can't test for it "context cancel", + "SELECT rows_copied FROM _vt.vreplication WHERE id=", } if sidecardb.MatchesInitQuery(query) { return true diff --git a/go/vt/vttablet/tabletmanager/vreplication/journal_test.go b/go/vt/vttablet/tabletmanager/vreplication/journal_test.go index 611f0f4ac3b..9dfdee766d1 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/journal_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/journal_test.go @@ -77,7 +77,6 @@ func TestJournalOneToOne(t *testing.T) { fmt.Sprintf("delete from _vt.vreplication where id=%d", firstID), "commit", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running', message='' where id.*", )) @@ -146,8 +145,6 @@ func TestJournalOneToMany(t *testing.T) { "commit", "/update _vt.vreplication set message='Picked source tablet.*", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running', message='' where id.*", "/update _vt.vreplication set state='Running', message='' where id.*", )) @@ -210,7 +207,6 @@ func TestJournalTablePresent(t *testing.T) { fmt.Sprintf("delete from _vt.vreplication where id=%d", firstID), "commit", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running', message='' where id.*", )) diff --git a/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go b/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go index 8d979a569c4..92a44336e9f 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go @@ -171,7 +171,6 @@ func testPlayerCopyCharPK(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", "insert into dst(idc,val) values ('a\\0',1)", @@ -279,7 +278,6 @@ func testPlayerCopyVarcharPKCaseInsensitive(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", // Copy mode. @@ -403,7 +401,6 @@ func testPlayerCopyVarcharCompositePKCaseSensitiveCollation(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", // Copy mode. @@ -478,7 +475,6 @@ func testPlayerCopyTablesWithFK(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "select @@foreign_key_checks;", // Create the list of tables to copy and transition to Copying state. "begin", @@ -611,7 +607,6 @@ func testPlayerCopyTables(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", // Create the list of tables to copy and transition to Copying state. "begin", "/insert into _vt.copy_state", @@ -751,7 +746,6 @@ func testPlayerCopyBigTable(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", // The first fast-forward has no starting point. So, it just saves the current position. "/update _vt.vreplication set state='Copying'", @@ -882,7 +876,6 @@ func testPlayerCopyWildcardRule(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", // The first fast-forward has no starting point. So, it just saves the current position. @@ -1044,7 +1037,6 @@ func testPlayerCopyTableContinuation(t *testing.T) { expectNontxQueries(t, qh.Expect( // Catchup "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "insert into dst1(id,val) select 1, 'insert in' from dual where (1,1) <= (6,6)", "insert into dst1(id,val) select 7, 'insert out' from dual where (7,7) <= (6,6)", "update dst1 set val='updated' where id=3 and (3,3) <= (6,6)", @@ -1175,7 +1167,6 @@ func testPlayerCopyWildcardTableContinuation(t *testing.T) { "/insert into _vt.vreplication", "/update _vt.vreplication set state = 'Copying'", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", ).Then(func(expect qh.ExpectationSequencer) qh.ExpectationSequencer { if !optimizeInsertsEnabled { expect = expect.Then(qh.Immediately("insert into dst(id,val) select 4, 'new' from dual where (4) <= (2)")) @@ -1272,7 +1263,6 @@ func TestPlayerCopyWildcardTableContinuationWithOptimizeInserts(t *testing.T) { "/insert into _vt.vreplication", "/update _vt.vreplication set state = 'Copying'", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", // Copy "insert into dst(id,val) values (3,'uncopied'), (4,'new')", `/insert into _vt.copy_state .*`, @@ -1326,7 +1316,6 @@ func testPlayerCopyTablesNone(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "begin", "/update _vt.vreplication set state='Stopped'", "commit", @@ -1381,7 +1370,6 @@ func testPlayerCopyTablesStopAfterCopy(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", // Create the list of tables to copy and transition to Copying state. "begin", "/insert into _vt.copy_state", @@ -1466,7 +1454,6 @@ func testPlayerCopyTableCancel(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", // Create the list of tables to copy and transition to Copying state. "begin", "/insert into _vt.copy_state", @@ -1555,7 +1542,6 @@ func testPlayerCopyTablesWithGeneratedColumn(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message=", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state", // The first fast-forward has no starting point. So, it just saves the current position. @@ -1628,7 +1614,6 @@ func testCopyTablesWithInvalidDates(t *testing.T) { expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", // Create the list of tables to copy and transition to Copying state. "begin", "/insert into _vt.copy_state", @@ -1726,7 +1711,6 @@ func testCopyInvisibleColumns(t *testing.T) { expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message=", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", // The first fast-forward has no starting point. So, it just saves the current position. diff --git a/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go b/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go index 4570d16824d..60378c8924a 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go @@ -1623,7 +1623,6 @@ func TestPlayerDDL(t *testing.T) { "/update.*'Running'", // Second update is from vreplicator. "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update.*'Running'", "begin", fmt.Sprintf("/update.*'%s'", pos2), @@ -1788,7 +1787,6 @@ func TestPlayerStopPos(t *testing.T) { "/update.*'Running'", // Second update is from vreplicator. "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update.*'Running'", "begin", "insert into yes(id,val) values (1,'aaa')", @@ -1814,7 +1812,6 @@ func TestPlayerStopPos(t *testing.T) { "/update.*'Running'", // Second update is from vreplicator. "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update.*'Running'", "begin", // Since 'no' generates empty transactions that are skipped by @@ -1833,7 +1830,6 @@ func TestPlayerStopPos(t *testing.T) { "/update.*'Running'", // Second update is from vreplicator. "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update.*'Running'", "/update.*'Stopped'.*already reached", )) @@ -2455,7 +2451,6 @@ func TestRestartOnVStreamEnd(t *testing.T) { }) expectDBClientQueries(t, qh.Expect( "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running'", "begin", "insert into t1(id,val) values (2,'aaa')", @@ -2911,7 +2906,6 @@ func startVReplication(t *testing.T, bls *binlogdatapb.BinlogSource, pos string) expectDBClientQueries(t, qh.Expect( "/insert into _vt.vreplication", "/update _vt.vreplication set message='Picked source tablet.*", - "/SELECT rows_copied FROM _vt.vreplication WHERE id=.+", "/update _vt.vreplication set state='Running'", )) var once sync.Once From e3f01ed7b52961b54f05e158d5324321fde62b5b Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 13:09:51 +0300 Subject: [PATCH 187/233] [release-16.0] TableGC: support DROP VIEW (#14020) (#14044) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- .../tabletmanager/tablegc/tablegc_test.go | 17 ++++ go/vt/vttablet/tabletserver/gc/tablegc.go | 84 +++++++++++------- .../vttablet/tabletserver/gc/tablegc_test.go | 87 +++++++++++++++++++ 3 files changed, 159 insertions(+), 29 deletions(-) diff --git a/go/test/endtoend/tabletmanager/tablegc/tablegc_test.go b/go/test/endtoend/tabletmanager/tablegc/tablegc_test.go index a29999de675..eb869b6a84c 100644 --- a/go/test/endtoend/tabletmanager/tablegc/tablegc_test.go +++ b/go/test/endtoend/tabletmanager/tablegc/tablegc_test.go @@ -18,6 +18,7 @@ package tablegc import ( "context" "flag" + "fmt" "os" "testing" "time" @@ -413,3 +414,19 @@ func TestPurgeView(t *testing.T) { validateTableExists(t, "t1") validateAnyState(t, 1024, schema.EvacTableGCState, schema.DropTableGCState, schema.TableDroppedGCState) } + +func TestDropView(t *testing.T) { + viewName, err := schema.GenerateGCTableName(schema.DropTableGCState, time.Now().Add(tableTransitionExpiration)) // shortly in the future + require.NoError(t, err) + createStatement := fmt.Sprintf("create or replace view %s as select 1", viewName) + + _, err = primaryTablet.VttabletProcess.QueryTablet(createStatement, keyspaceName, true) + require.NoError(t, err) + + // view should be there, because the timestamp hint is still in the near future. + validateTableExists(t, viewName) + + time.Sleep(tableTransitionExpiration / 2) + // But by now, after the above sleep, the view's timestamp hint is in the past, and we expect TableGC to have dropped the view. + validateTableDoesNotExist(t, viewName) +} diff --git a/go/vt/vttablet/tabletserver/gc/tablegc.go b/go/vt/vttablet/tabletserver/gc/tablegc.go index 87beab04ef0..3c9613b57ed 100644 --- a/go/vt/vttablet/tabletserver/gc/tablegc.go +++ b/go/vt/vttablet/tabletserver/gc/tablegc.go @@ -71,9 +71,15 @@ var ( sqlPurgeTable = `delete from %a limit 50` sqlShowVtTables = `show full tables like '\_vt\_%'` sqlDropTable = "drop table if exists `%a`" + sqlDropView = "drop view if exists `%a`" purgeReentranceFlag int64 ) +type gcTable struct { + tableName string + isBaseTable bool +} + // transitionRequest encapsulates a request to transition a table to next state type transitionRequest struct { fromTableName string @@ -226,7 +232,7 @@ func (collector *TableGC) Close() { // operate is the main entry point for the table garbage collector operation and logic. func (collector *TableGC) operate(ctx context.Context) { - dropTablesChan := make(chan string) + dropTablesChan := make(chan *gcTable) purgeRequestsChan := make(chan bool) transitionRequestsChan := make(chan *transitionRequest) @@ -254,7 +260,11 @@ func (collector *TableGC) operate(ctx context.Context) { case <-tableCheckTicker.C: { log.Info("TableGC: tableCheckTicker") - _ = collector.checkTables(ctx, dropTablesChan, transitionRequestsChan) + if gcTables, err := collector.readTables(ctx); err != nil { + log.Errorf("TableGC: error while reading tables: %+v", err) + } else { + _ = collector.checkTables(ctx, gcTables, dropTablesChan, transitionRequestsChan) + } } case <-purgeReentranceTicker.C: { @@ -289,11 +299,11 @@ func (collector *TableGC) operate(ctx context.Context) { }() } - case dropTableName := <-dropTablesChan: + case dropTable := <-dropTablesChan: { - log.Info("TableGC: dropTablesChan") - if err := collector.dropTable(ctx, dropTableName); err != nil { - log.Errorf("TableGC: error dropping table %s: %+v", dropTableName, err) + log.Infof("TableGC: found %v in dropTablesChan", dropTable.tableName) + if err := collector.dropTable(ctx, dropTable.tableName, dropTable.isBaseTable); err != nil { + log.Errorf("TableGC: error dropping table %s: %+v", dropTable.tableName, err) } } case transition := <-transitionRequestsChan: @@ -331,7 +341,7 @@ func (collector *TableGC) nextState(fromState schema.TableGCState) *schema.Table // generateTansition creates a transition request, based on current state and taking configured lifecycleStates // into consideration (we may skip some states) -func (collector *TableGC) generateTansition(ctx context.Context, fromState schema.TableGCState, fromTableName string, isBaseTable bool, uuid string) *transitionRequest { +func (collector *TableGC) generateTansition(ctx context.Context, fromState schema.TableGCState, fromTableName string, isBaseTable bool, uuid string) *transitionRequest { // nolint nextState := collector.nextState(fromState) if nextState == nil { return nil @@ -377,29 +387,39 @@ func (collector *TableGC) shouldTransitionTable(tableName string) (shouldTransit return true, state, uuid, nil } -// checkTables looks for potential GC tables in the MySQL server+schema. -// It lists _vt_% tables, then filters through those which are due-date. -// It then applies the necessary operation per table. -func (collector *TableGC) checkTables(ctx context.Context, dropTablesChan chan<- string, transitionRequestsChan chan<- *transitionRequest) error { +// readTables reads the list of _vt_% tables from the database +func (collector *TableGC) readTables(ctx context.Context) (gcTables []*gcTable, err error) { + log.Infof("TableGC: read tables") + conn, err := collector.pool.Get(ctx, nil) if err != nil { - return err + return nil, err } defer conn.Recycle() - log.Infof("TableGC: check tables") - res, err := conn.Exec(ctx, sqlShowVtTables, math.MaxInt32, true) if err != nil { - return err + return nil, err } for _, row := range res.Rows { tableName := row[0].ToString() tableType := row[1].ToString() isBaseTable := (tableType == "BASE TABLE") + gcTables = append(gcTables, &gcTable{tableName: tableName, isBaseTable: isBaseTable}) + } + return gcTables, nil +} + +// checkTables looks for potential GC tables in the MySQL server+schema. +// It lists _vt_% tables, then filters through those which are due-date. +// It then applies the necessary operation per table. +func (collector *TableGC) checkTables(ctx context.Context, gcTables []*gcTable, dropTablesChan chan<- *gcTable, transitionRequestsChan chan<- *transitionRequest) error { + log.Infof("TableGC: check tables") - shouldTransition, state, uuid, err := collector.shouldTransitionTable(tableName) + for i := range gcTables { + table := gcTables[i] // we capture as local variable as we will later use this in a goroutine + shouldTransition, state, uuid, err := collector.shouldTransitionTable(table.tableName) if err != nil { log.Errorf("TableGC: error while checking tables: %+v", err) @@ -410,28 +430,30 @@ func (collector *TableGC) checkTables(ctx context.Context, dropTablesChan chan<- continue } - log.Infof("TableGC: will operate on table %s", tableName) + log.Infof("TableGC: will operate on table %s", table.tableName) if state == schema.HoldTableGCState { // Hold period expired. Moving to next state - collector.submitTransitionRequest(ctx, transitionRequestsChan, state, tableName, isBaseTable, uuid) + collector.submitTransitionRequest(ctx, transitionRequestsChan, state, table.tableName, table.isBaseTable, uuid) } if state == schema.PurgeTableGCState { - if isBaseTable { + if table.isBaseTable { // This table needs to be purged. Make sure to enlist it (we may already have) - collector.addPurgingTable(tableName) + collector.addPurgingTable(table.tableName) } else { // This is a view. We don't need to delete rows from views. Just transition into next phase - collector.submitTransitionRequest(ctx, transitionRequestsChan, state, tableName, isBaseTable, uuid) + collector.submitTransitionRequest(ctx, transitionRequestsChan, state, table.tableName, table.isBaseTable, uuid) } } if state == schema.EvacTableGCState { // This table was in EVAC state for the required period. It will transition into DROP state - collector.submitTransitionRequest(ctx, transitionRequestsChan, state, tableName, isBaseTable, uuid) + collector.submitTransitionRequest(ctx, transitionRequestsChan, state, table.tableName, table.isBaseTable, uuid) } if state == schema.DropTableGCState { // This table needs to be dropped immediately. - go func() { dropTablesChan <- tableName }() + go func() { + dropTablesChan <- table + }() } } @@ -527,21 +549,25 @@ func (collector *TableGC) purge(ctx context.Context) (tableName string, err erro // dropTable runs an actual DROP TABLE statement, and marks the end of the line for the // tables' GC lifecycle. -func (collector *TableGC) dropTable(ctx context.Context, tableName string) error { - conn, err := collector.pool.Get(ctx, nil) +func (collector *TableGC) dropTable(ctx context.Context, tableName string, isBaseTable bool) error { + conn, err := dbconnpool.NewDBConnection(ctx, collector.env.Config().DB.DbaWithDB()) if err != nil { return err } - defer conn.Recycle() + defer conn.Close() - parsed := sqlparser.BuildParsedQuery(sqlDropTable, tableName) + sqlDrop := sqlDropTable + if !isBaseTable { + sqlDrop = sqlDropView + } + parsed := sqlparser.BuildParsedQuery(sqlDrop, tableName) log.Infof("TableGC: dropping table: %s", tableName) - _, err = conn.Exec(ctx, parsed.Query, 1, true) + _, err = conn.ExecuteFetch(parsed.Query, 1, false) if err != nil { return err } - log.Infof("TableGC: dropped table: %s", tableName) + log.Infof("TableGC: dropped table: %s, isBaseTable: %v", tableName, isBaseTable) return nil } diff --git a/go/vt/vttablet/tabletserver/gc/tablegc_test.go b/go/vt/vttablet/tabletserver/gc/tablegc_test.go index de6ad401f95..cb3e1d8bb77 100644 --- a/go/vt/vttablet/tabletserver/gc/tablegc_test.go +++ b/go/vt/vttablet/tabletserver/gc/tablegc_test.go @@ -17,11 +17,14 @@ limitations under the License. package gc import ( + "context" "testing" + "time" "vitess.io/vitess/go/vt/schema" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNextTableToPurge(t *testing.T) { @@ -219,3 +222,87 @@ func TestShouldTransitionTable(t *testing.T) { } } } + +func TestCheckTables(t *testing.T) { + collector := &TableGC{ + isOpen: 0, + purgingTables: map[string]bool{}, + } + var err error + collector.lifecycleStates, err = schema.ParseGCLifecycle("hold,purge,evac,drop") + require.NoError(t, err) + + gcTables := []*gcTable{ + { + tableName: "_vt_something_that_isnt_a_gc_table", + isBaseTable: true, + }, + { + tableName: "_vt_HOLD_11111111111111111111111111111111_20990920093324", // 2099 is in the far future + isBaseTable: true, + }, + { + tableName: "_vt_HOLD_22222222222222222222222222222222_20200920093324", + isBaseTable: true, + }, + { + tableName: "_vt_DROP_33333333333333333333333333333333_20200919083451", + isBaseTable: true, + }, + { + tableName: "_vt_DROP_44444444444444444444444444444444_20200919083451", + isBaseTable: false, + }, + } + // one gcTable above is irrelevant, does not have a GC table name + // one will not transition: its date is 2099 + expectResponses := len(gcTables) - 2 + expectDropTables := []*gcTable{ + { + tableName: "_vt_DROP_33333333333333333333333333333333_20200919083451", + isBaseTable: true, + }, + { + tableName: "_vt_DROP_44444444444444444444444444444444_20200919083451", + isBaseTable: false, + }, + } + expectTransitionRequests := []*transitionRequest{ + { + fromTableName: "_vt_HOLD_22222222222222222222222222222222_20200920093324", + isBaseTable: true, + toGCState: schema.PurgeTableGCState, + uuid: "22222222222222222222222222222222", + }, + } + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + defer cancel() + dropTablesChan := make(chan *gcTable) + transitionRequestsChan := make(chan *transitionRequest) + + err = collector.checkTables(ctx, gcTables, dropTablesChan, transitionRequestsChan) + assert.NoError(t, err) + + var responses int + var foundDropTables []*gcTable + var foundTransitionRequests []*transitionRequest + for { + if responses == expectResponses { + break + } + select { + case <-ctx.Done(): + assert.FailNow(t, "timeout") + return + case gcTable := <-dropTablesChan: + responses++ + foundDropTables = append(foundDropTables, gcTable) + case request := <-transitionRequestsChan: + responses++ + foundTransitionRequests = append(foundTransitionRequests, request) + } + } + assert.ElementsMatch(t, expectDropTables, foundDropTables) + assert.ElementsMatch(t, expectTransitionRequests, foundTransitionRequests) +} From cef2617cdc159900e605e28b2a7d701080b2e809 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 20 Sep 2023 13:10:22 +0300 Subject: [PATCH 188/233] [release-16.0] OnlineDDL: cleanup cancelled migration artifacts; support `--retain-artifacts=` DDL strategy flag (#14029) (#14036) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- .../scheduler/onlineddl_scheduler_test.go | 54 +++++++++++++ go/vt/schema/ddl_strategy.go | 39 +++++++++- go/vt/schema/ddl_strategy_test.go | 76 +++++++++++++++++++ go/vt/vttablet/onlineddl/executor.go | 5 ++ go/vt/vttablet/onlineddl/schema.go | 2 +- 5 files changed, 174 insertions(+), 2 deletions(-) diff --git a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go index 2b068df643d..e3254817c18 100644 --- a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go +++ b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go @@ -870,6 +870,60 @@ func testScheduler(t *testing.T) { }) }) + t.Run("Cleanup artifacts", func(t *testing.T) { + // Create a migration with a low --retain-artifacts value. + // We will cancel the migration and expect the artifact to be cleaned. + t.Run("start migration", func(t *testing.T) { + t1uuid = testOnlineDDLStatement(t, createParams(trivialAlterT1Statement, ddlStrategy+" --postpone-completion --retain-artifacts=1s", "vtctl", "", "", true)) // skip wait + onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusRunning) + }) + var artifacts []string + t.Run("validate artifact exists", func(t *testing.T) { + rs := onlineddl.ReadMigrations(t, &vtParams, t1uuid) + require.NotNil(t, rs) + row := rs.Named().Row() + require.NotNil(t, row) + + artifacts = textutil.SplitDelimitedList(row.AsString("artifacts", "")) + assert.NotEmpty(t, artifacts) + assert.Equal(t, 1, len(artifacts)) + checkTable(t, artifacts[0], true) + + retainArtifactsSeconds := row.AsInt64("retain_artifacts_seconds", 0) + assert.Equal(t, int64(1), retainArtifactsSeconds) // due to --retain-artifacts=1s + }) + t.Run("cancel migration", func(t *testing.T) { + onlineddl.CheckCancelMigration(t, &vtParams, shards, t1uuid, true) + status := onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusFailed, schema.OnlineDDLStatusCancelled) + fmt.Printf("# Migration status (for debug purposes): <%s>\n", status) + onlineddl.CheckMigrationStatus(t, &vtParams, shards, t1uuid, schema.OnlineDDLStatusCancelled) + }) + t.Run("wait for cleanup", func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), normalWaitTime) + defer cancel() + + for { + rs := onlineddl.ReadMigrations(t, &vtParams, t1uuid) + require.NotNil(t, rs) + row := rs.Named().Row() + require.NotNil(t, row) + if !row["cleanup_timestamp"].IsNull() { + // This is what we've been waiting for + break + } + select { + case <-ctx.Done(): + assert.Fail(t, "timeout waiting for cleanup") + return + case <-time.After(time.Second): + } + } + }) + t.Run("validate artifact does not exist", func(t *testing.T) { + checkTable(t, artifacts[0], false) + }) + }) + // INSTANT DDL instantDDLCapable, err := capableOf(mysql.InstantAddLastColumnFlavorCapability) require.NoError(t, err) diff --git a/go/vt/schema/ddl_strategy.go b/go/vt/schema/ddl_strategy.go index d56b8004ab8..c75de3ad7e7 100644 --- a/go/vt/schema/ddl_strategy.go +++ b/go/vt/schema/ddl_strategy.go @@ -19,12 +19,15 @@ package schema import ( "fmt" "regexp" + "strconv" + "time" "github.com/google/shlex" ) var ( - strategyParserRegexp = regexp.MustCompile(`^([\S]+)\s+(.*)$`) + strategyParserRegexp = regexp.MustCompile(`^([\S]+)\s+(.*)$`) + retainArtifactsFlagRegexp = regexp.MustCompile(fmt.Sprintf(`^[-]{1,2}%s=(.*?)$`, retainArtifactsFlag)) ) const ( @@ -39,6 +42,7 @@ const ( allowConcurrentFlag = "allow-concurrent" preferInstantDDL = "prefer-instant-ddl" fastRangeRotationFlag = "fast-range-rotation" + retainArtifactsFlag = "retain-artifacts" vreplicationTestSuite = "vreplication-test-suite" allowForeignKeysFlag = "unsafe-allow-foreign-keys" ) @@ -102,6 +106,9 @@ func ParseDDLStrategy(strategyVariable string) (*DDLStrategySetting, error) { default: return nil, fmt.Errorf("Unknown online DDL strategy: '%v'", strategy) } + if _, err := setting.RetainArtifactsDuration(); err != nil { + return nil, err + } return setting, nil } @@ -177,6 +184,33 @@ func (setting *DDLStrategySetting) IsFastRangeRotationFlag() bool { return setting.hasFlag(fastRangeRotationFlag) } +// isRetainArtifactsFlag returns true when given option denotes a `--retain-artifacts=[...]` flag +func isRetainArtifactsFlag(opt string) (string, bool) { + submatch := retainArtifactsFlagRegexp.FindStringSubmatch(opt) + if len(submatch) == 0 { + return "", false + } + return submatch[1], true +} + +// RetainArtifactsDuration returns a the duration indicated by --retain-artifacts +func (setting *DDLStrategySetting) RetainArtifactsDuration() (d time.Duration, err error) { + // We do some ugly manual parsing of --retain-artifacts + opts, _ := shlex.Split(setting.Options) + for _, opt := range opts { + if val, isRetainArtifacts := isRetainArtifactsFlag(opt); isRetainArtifacts { + // value is possibly quoted + if s, err := strconv.Unquote(val); err == nil { + val = s + } + if val != "" { + d, err = time.ParseDuration(val) + } + } + } + return d, err +} + // IsVreplicationTestSuite checks if strategy options include --vreplicatoin-test-suite func (setting *DDLStrategySetting) IsVreplicationTestSuite() bool { return setting.hasFlag(vreplicationTestSuite) @@ -192,6 +226,9 @@ func (setting *DDLStrategySetting) RuntimeOptions() []string { opts, _ := shlex.Split(setting.Options) validOpts := []string{} for _, opt := range opts { + if _, ok := isRetainArtifactsFlag(opt); ok { + continue + } switch { case isFlag(opt, declarativeFlag): case isFlag(opt, skipTopoFlag): diff --git a/go/vt/schema/ddl_strategy_test.go b/go/vt/schema/ddl_strategy_test.go index 610cb8b9ed3..b42df37024e 100644 --- a/go/vt/schema/ddl_strategy_test.go +++ b/go/vt/schema/ddl_strategy_test.go @@ -19,6 +19,7 @@ package schema import ( "strings" "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -38,6 +39,69 @@ func TestIsDirect(t *testing.T) { assert.True(t, DDLStrategy("something").IsDirect()) } +func TestIsExpireArtifactsFlag(t *testing.T) { + tt := []struct { + s string + expect bool + val string + d time.Duration + }{ + { + s: "something", + }, + { + s: "-retain-artifacts", + }, + { + s: "--retain-artifacts", + }, + { + s: "--retain-artifacts=", + expect: true, + }, + { + s: "--retain-artifacts=0", + expect: true, + val: "0", + d: 0, + }, + { + s: "-retain-artifacts=0", + expect: true, + val: "0", + d: 0, + }, + { + s: "--retain-artifacts=1m", + expect: true, + val: "1m", + d: time.Minute, + }, + { + s: `--retain-artifacts="1m"`, + expect: true, + val: `"1m"`, + d: time.Minute, + }, + } + for _, ts := range tt { + t.Run(ts.s, func(t *testing.T) { + setting, err := ParseDDLStrategy("online " + ts.s) + assert.NoError(t, err) + + val, isRetainArtifacts := isRetainArtifactsFlag(ts.s) + assert.Equal(t, ts.expect, isRetainArtifacts) + assert.Equal(t, ts.val, val) + + if ts.expect { + d, err := setting.RetainArtifactsDuration() + assert.NoError(t, err) + assert.Equal(t, ts.d, d) + } + }) + } +} + func TestParseDDLStrategy(t *testing.T) { tt := []struct { strategyVariable string @@ -52,6 +116,7 @@ func TestParseDDLStrategy(t *testing.T) { fastOverRevertible bool fastRangeRotation bool allowForeignKeys bool + expireArtifacts time.Duration runtimeOptions string err error }{ @@ -166,6 +231,13 @@ func TestParseDDLStrategy(t *testing.T) { runtimeOptions: "", allowForeignKeys: true, }, + { + strategyVariable: "vitess --retain-artifacts=4m", + strategy: DDLStrategyVitess, + options: "--retain-artifacts=4m", + runtimeOptions: "", + expireArtifacts: 4 * time.Minute, + }, } for _, ts := range tt { t.Run(ts.strategyVariable, func(t *testing.T) { @@ -190,4 +262,8 @@ func TestParseDDLStrategy(t *testing.T) { _, err := ParseDDLStrategy("other") assert.Error(t, err) } + { + _, err := ParseDDLStrategy("online --retain-artifacts=3") + assert.Error(t, err) + } } diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index 62e22cf3fda..071deb99aa9 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -4723,6 +4723,11 @@ func (e *Executor) SubmitMigration( revertedUUID, _ := onlineDDL.GetRevertUUID() // Empty value if the migration is not actually a REVERT. Safe to ignore error. retainArtifactsSeconds := int64((retainOnlineDDLTables).Seconds()) + if retainArtifacts, _ := onlineDDL.StrategySetting().RetainArtifactsDuration(); retainArtifacts != 0 { + // Explicit retention indicated by `--retain-artifact` DDL strategy flag for this migration. Override! + retainArtifactsSeconds = int64((retainArtifacts).Seconds()) + } + _, allowConcurrentMigration := e.allowConcurrentMigration(onlineDDL) submitQuery, err := sqlparser.ParseAndBind(sqlInsertMigration, sqltypes.StringBindVariable(onlineDDL.UUID), diff --git a/go/vt/vttablet/onlineddl/schema.go b/go/vt/vttablet/onlineddl/schema.go index c4a6d96953b..45d5f46e4a6 100644 --- a/go/vt/vttablet/onlineddl/schema.go +++ b/go/vt/vttablet/onlineddl/schema.go @@ -339,7 +339,7 @@ const ( log_path FROM _vt.schema_migrations WHERE - migration_status IN ('complete', 'failed') + migration_status IN ('complete', 'cancelled', 'failed') AND cleanup_timestamp IS NULL AND completed_timestamp <= IF(retain_artifacts_seconds=0, NOW() - INTERVAL %a SECOND, From b84480e189b480e95207cfa704ca4090c797e90d Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 22 Sep 2023 18:36:48 -0400 Subject: [PATCH 189/233] [release-16.0] update docgen to embed commit ID in autogenerated doc frontmatter (#14056) (#14073) Signed-off-by: Andrew Mason Co-authored-by: Andrew Mason --- go/cmd/internal/docgen/docgen.go | 38 ++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/go/cmd/internal/docgen/docgen.go b/go/cmd/internal/docgen/docgen.go index 6fe461e5af7..b319d296448 100644 --- a/go/cmd/internal/docgen/docgen.go +++ b/go/cmd/internal/docgen/docgen.go @@ -46,6 +46,7 @@ import ( "fmt" "io/fs" "os" + "os/exec" "path/filepath" "strings" @@ -57,6 +58,10 @@ import ( // written to `dir`. The root command is also renamed to _index.md to remain // compatible with the vitessio/website content structure expectations. func GenerateMarkdownTree(cmd *cobra.Command, dir string) error { + sha, err := getCommitID("HEAD") + if err != nil { + return fmt.Errorf("failed to get commit id for HEAD: %w", err) + } switch fi, err := os.Stat(dir); { case errors.Is(err, fs.ErrNotExist): if err := os.MkdirAll(dir, 0755); err != nil { @@ -69,7 +74,7 @@ func GenerateMarkdownTree(cmd *cobra.Command, dir string) error { } recursivelyDisableAutoGenTags(cmd) - if err := doc.GenMarkdownTreeCustom(cmd, dir, frontmatterFilePrepender, linkHandler); err != nil { + if err := doc.GenMarkdownTreeCustom(cmd, dir, frontmatterFilePrepender(sha), linkHandler); err != nil { return err } @@ -91,22 +96,37 @@ func recursivelyDisableAutoGenTags(root *cobra.Command) { } } +func getCommitID(ref string) (string, error) { + gitShow := exec.Command("git", "show", "--pretty=format:%H", "--no-patch", ref) + out, err := gitShow.Output() + if err != nil { + return "", err + } + + return string(out), nil +} + const frontmatter = `--- title: %s series: %s +commit: %s --- ` -func frontmatterFilePrepender(filename string) string { - name := filepath.Base(filename) - base := strings.TrimSuffix(name, filepath.Ext(name)) +func frontmatterFilePrepender(sha string) func(filename string) string { + return func(filename string) string { + name := filepath.Base(filename) + base := strings.TrimSuffix(name, filepath.Ext(name)) - root, cmdName, ok := strings.Cut(base, "_") - if !ok { // no `_`, so not a subcommand - cmdName = root - } + root, cmdName, ok := strings.Cut(base, "_") + if !ok { // no `_`, so not a subcommand + cmdName = root + } - return fmt.Sprintf(frontmatter, cmdName, root) + cmdName = strings.ReplaceAll(cmdName, "_", " ") + + return fmt.Sprintf(frontmatter, cmdName, root, sha) + } } func linkHandler(filename string) string { From 61232353832ae72d569fdb892da6ec96c3dff150 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 27 Sep 2023 18:22:57 -0400 Subject: [PATCH 190/233] [release-16.0] VDiff: properly split cell values in record when using TabletPicker (#14099) (#14102) Signed-off-by: Matt Lord Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Matt Lord --- go/test/endtoend/vreplication/vdiff2_test.go | 33 +++++++----- .../vreplication/vdiff_helper_test.go | 6 ++- .../tabletmanager/vdiff/engine_test.go | 5 +- .../tabletmanager/vdiff/table_differ.go | 51 +++++++++++-------- 4 files changed, 57 insertions(+), 38 deletions(-) diff --git a/go/test/endtoend/vreplication/vdiff2_test.go b/go/test/endtoend/vreplication/vdiff2_test.go index 82e2b24f4b3..0627e39b775 100644 --- a/go/test/endtoend/vreplication/vdiff2_test.go +++ b/go/test/endtoend/vreplication/vdiff2_test.go @@ -103,8 +103,7 @@ var testCases = []*testCase{ } func TestVDiff2(t *testing.T) { - allCellNames = "zone1" - defaultCellName := "zone1" + allCellNames = "zone5,zone1,zone2,zone3,zone4" sourceKs := "product" sourceShards := []string{"0"} targetKs := "customer" @@ -112,14 +111,19 @@ func TestVDiff2(t *testing.T) { // This forces us to use multiple vstream packets even with small test tables extraVTTabletArgs = []string{"--vstream_packet_size=1"} - vc = NewVitessCluster(t, "TestVDiff2", []string{allCellNames}, mainClusterConfig) + vc = NewVitessCluster(t, "TestVDiff2", strings.Split(allCellNames, ","), mainClusterConfig) require.NotNil(t, vc) - defaultCell = vc.Cells[defaultCellName] - cells := []*Cell{defaultCell} + zone1 := vc.Cells["zone1"] + zone2 := vc.Cells["zone2"] + zone3 := vc.Cells["zone3"] + defaultCell = zone1 defer vc.TearDown(t) - vc.AddKeyspace(t, cells, sourceKs, strings.Join(sourceShards, ","), initialProductVSchema, initialProductSchema, 0, 0, 100, sourceKsOpts) + // The primary tablet is only added in the first cell. + // We ONLY add primary tablets in this test. + _, err := vc.AddKeyspace(t, []*Cell{zone2, zone1, zone3}, sourceKs, strings.Join(sourceShards, ","), initialProductVSchema, initialProductSchema, 0, 0, 100, sourceKsOpts) + require.NoError(t, err) vtgate = defaultCell.Vtgates[0] require.NotNil(t, vtgate) @@ -139,7 +143,9 @@ func TestVDiff2(t *testing.T) { generateMoreCustomers(t, sourceKs, 100) - _, err := vc.AddKeyspace(t, cells, targetKs, strings.Join(targetShards, ","), customerVSchema, customerSchema, 0, 0, 200, targetKsOpts) + // The primary tablet is only added in the first cell. + // We ONLY add primary tablets in this test. + tks, err := vc.AddKeyspace(t, []*Cell{zone3, zone1, zone2}, targetKs, strings.Join(targetShards, ","), customerVSchema, customerSchema, 0, 0, 200, targetKsOpts) require.NoError(t, err) for _, shard := range targetShards { require.NoError(t, cluster.WaitForHealthyShard(vc.VtctldClient, targetKs, shard)) @@ -147,15 +153,15 @@ func TestVDiff2(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - testWorkflow(t, vc, tc, cells) + // Primary tablets for any new shards are added in the first cell. + testWorkflow(t, vc, tc, tks, []*Cell{zone3, zone2, zone1}) }) } } -func testWorkflow(t *testing.T, vc *VitessCluster, tc *testCase, cells []*Cell) { +func testWorkflow(t *testing.T, vc *VitessCluster, tc *testCase, tks *Keyspace, cells []*Cell) { arrTargetShards := strings.Split(tc.targetShards, ",") if tc.typ == "Reshard" { - tks := vc.Cells[cells[0].Name].Keyspaces[tc.targetKs] require.NoError(t, vc.AddShards(t, cells, tks, tc.targetShards, 0, 0, tc.tabletBaseID, targetKsOpts)) for _, shard := range arrTargetShards { require.NoError(t, cluster.WaitForHealthyShard(vc.VtctldClient, tc.targetKs, shard)) @@ -168,6 +174,7 @@ func testWorkflow(t *testing.T, vc *VitessCluster, tc *testCase, cells []*Cell) if tc.typ == "Reshard" { args = append(args, "--source_shards", tc.sourceShards, "--target_shards", tc.targetShards) } + args = append(args, "--cells", allCellNames) args = append(args, "--tables", tc.tables) args = append(args, "Create") args = append(args, ksWorkflow) @@ -180,14 +187,14 @@ func testWorkflow(t *testing.T, vc *VitessCluster, tc *testCase, cells []*Cell) updateTableStats(t, tab, tc.tables) // need to do this in order to test progress reports } - vdiff(t, tc.targetKs, tc.workflow, cells[0].Name, true, true, nil) + vdiff(t, tc.targetKs, tc.workflow, allCellNames, true, true, nil) if tc.autoRetryError { - testAutoRetryError(t, tc, cells[0].Name) + testAutoRetryError(t, tc, allCellNames) } if tc.resume { - testResume(t, tc, cells[0].Name) + testResume(t, tc, allCellNames) } // These are done here so that we have a valid workflow to test the commands against diff --git a/go/test/endtoend/vreplication/vdiff_helper_test.go b/go/test/endtoend/vreplication/vdiff_helper_test.go index 35b3b3f5d26..6035063902d 100644 --- a/go/test/endtoend/vreplication/vdiff_helper_test.go +++ b/go/test/endtoend/vreplication/vdiff_helper_test.go @@ -173,7 +173,11 @@ func doVdiff2(t *testing.T, keyspace, workflow, cells string, want *expectedVDif func performVDiff2Action(t *testing.T, ksWorkflow, cells, action, actionArg string, expectError bool, extraFlags ...string) (uuid string, output string) { var err error - args := []string{"VDiff", "--", "--tablet_types=primary", "--source_cell=" + cells, "--format=json"} + // This will always result in us using a PRIMARY tablet, which is all + // we start in many e2e tests, but it avoids the tablet picker logic + // where when you ONLY specify the PRIMARY type it then picks the + // shard's primary and ignores any cell settings. + args := []string{"VDiff", "--", "--tablet_types=in_order:primary,replica", "--source_cell=" + cells, "--format=json"} if len(extraFlags) > 0 { args = append(args, extraFlags...) } diff --git a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go index cfb9651fb11..55a211475d2 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go @@ -19,6 +19,7 @@ package vdiff import ( "context" "fmt" + "strings" "testing" "github.com/google/uuid" @@ -106,8 +107,8 @@ func TestVDiff(t *testing.T) { MaxRows: 100, }, PickerOptions: &tabletmanagerdatapb.VDiffPickerOptions{ - SourceCell: tstenv.Cells[0], - TargetCell: tstenv.Cells[0], + SourceCell: strings.Join(tstenv.Cells, ","), + TargetCell: strings.Join(tstenv.Cells, ","), TabletTypes: "primary", }, ReportOptions: &tabletmanagerdatapb.VDiffReportOptions{ diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go index f3aa73aaee3..799f95d080e 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go @@ -20,6 +20,7 @@ import ( "context" "encoding/json" "fmt" + "strings" "sync" "time" @@ -121,7 +122,7 @@ func (td *tableDiffer) initialize(ctx context.Context) error { } }() - if err := td.selectTablets(ctx, td.wd.opts.PickerOptions.SourceCell, td.wd.opts.PickerOptions.TabletTypes); err != nil { + if err := td.selectTablets(ctx); err != nil { return err } if err := td.syncSourceStreams(ctx); err != nil { @@ -199,16 +200,22 @@ func (td *tableDiffer) forEachSource(cb func(source *migrationSource) error) err return allErrors.AggrError(vterrors.Aggregate) } -func (td *tableDiffer) selectTablets(ctx context.Context, cell, tabletTypes string) error { - var wg sync.WaitGroup - ct := td.wd.ct - var err1, err2 error +func (td *tableDiffer) selectTablets(ctx context.Context) error { + var ( + wg sync.WaitGroup + sourceErr, targetErr error + targetTablet *topodata.Tablet + ) + + // The cells from the vdiff record are a comma separated list. + sourceCells := strings.Split(td.wd.opts.PickerOptions.SourceCell, ",") + targetCells := strings.Split(td.wd.opts.PickerOptions.TargetCell, ",") // For Mount+Migrate, the source tablets will be in a different // Vitess cluster with its own TopoServer. - sourceTopoServer := ct.ts - if ct.externalCluster != "" { - extTS, err := ct.ts.OpenExternalVitessClusterServer(ctx, ct.externalCluster) + sourceTopoServer := td.wd.ct.ts + if td.wd.ct.externalCluster != "" { + extTS, err := td.wd.ct.ts.OpenExternalVitessClusterServer(ctx, td.wd.ct.externalCluster) if err != nil { return err } @@ -217,12 +224,12 @@ func (td *tableDiffer) selectTablets(ctx context.Context, cell, tabletTypes stri wg.Add(1) go func() { defer wg.Done() - err1 = td.forEachSource(func(source *migrationSource) error { - tablet, err := pickTablet(ctx, sourceTopoServer, cell, ct.sourceKeyspace, source.shard, tabletTypes) + sourceErr = td.forEachSource(func(source *migrationSource) error { + sourceTablet, err := pickTablet(ctx, sourceTopoServer, sourceCells, td.wd.ct.sourceKeyspace, source.shard, td.wd.opts.PickerOptions.TabletTypes) if err != nil { return err } - source.tablet = tablet + source.tablet = sourceTablet return nil }) }() @@ -230,26 +237,26 @@ func (td *tableDiffer) selectTablets(ctx context.Context, cell, tabletTypes stri wg.Add(1) go func() { defer wg.Done() - tablet, err2 := pickTablet(ctx, ct.ts, td.wd.opts.PickerOptions.TargetCell, ct.vde.thisTablet.Keyspace, - ct.vde.thisTablet.Shard, td.wd.opts.PickerOptions.TabletTypes) - if err2 != nil { + targetTablet, targetErr = pickTablet(ctx, td.wd.ct.ts, targetCells, td.wd.ct.vde.thisTablet.Keyspace, td.wd.ct.vde.thisTablet.Shard, + td.wd.opts.PickerOptions.TabletTypes) + if targetErr != nil { return } - ct.targetShardStreamer = &shardStreamer{ - tablet: tablet, - shard: tablet.Shard, + td.wd.ct.targetShardStreamer = &shardStreamer{ + tablet: targetTablet, + shard: targetTablet.Shard, } }() wg.Wait() - if err1 != nil { - return err1 + if sourceErr != nil { + return sourceErr } - return err2 + return targetErr } -func pickTablet(ctx context.Context, ts *topo.Server, cell, keyspace, shard, tabletTypes string) (*topodata.Tablet, error) { - tp, err := discovery.NewTabletPicker(ts, []string{cell}, keyspace, shard, tabletTypes) +func pickTablet(ctx context.Context, ts *topo.Server, cells []string, keyspace, shard, tabletTypes string) (*topodata.Tablet, error) { + tp, err := discovery.NewTabletPicker(ts, cells, keyspace, shard, tabletTypes) if err != nil { return nil, err } From 00d252138deb6e17ea81aa2b182aef67dbd877aa Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 28 Sep 2023 05:59:10 -0400 Subject: [PATCH 191/233] [release-16.0] anonymize homedirs in generated docs (#14101) (#14105) Signed-off-by: Andrew Mason Co-authored-by: Andrew Mason --- go/cmd/internal/docgen/docgen.go | 115 +++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/go/cmd/internal/docgen/docgen.go b/go/cmd/internal/docgen/docgen.go index b319d296448..16b237ea15f 100644 --- a/go/cmd/internal/docgen/docgen.go +++ b/go/cmd/internal/docgen/docgen.go @@ -49,6 +49,7 @@ import ( "os/exec" "path/filepath" "strings" + "sync" "github.com/spf13/cobra" "github.com/spf13/cobra/doc" @@ -84,6 +85,120 @@ func GenerateMarkdownTree(cmd *cobra.Command, dir string) error { return fmt.Errorf("failed to index doc (generated at %s) into proper position (%s): %w", rootDocPath, indexDocPath, err) } + if err := anonymizeHomedir(indexDocPath); err != nil { + return fmt.Errorf("failed to anonymize homedir in help text for command %s: %w", indexDocPath, err) + } + + if err := restructure(dir, dir, cmd.Name(), cmd.Commands()); err != nil { + return err + } + + return nil +} + +/* +_index.md (aka vtctldclient.md) +vtctldclient_AddCellInfo.md +vtctldclient_movetables.md +vtctldclient_movetables_show.md + +becomes + +_index.md +vtctldclient_AddCellInfo.md +vtctldclient_movetables/ + _index.md + vtctldclient_movetables_show.md +*/ + +func restructure(rootDir string, dir string, name string, commands []*cobra.Command) error { + for _, cmd := range commands { + fullCmdFilename := strings.Join([]string{name, cmd.Name()}, "_") + + children := cmd.Commands() + + switch { + case len(children) > 0: + // Command (top-level or not) with children. + // 1. Set up a directory for its children. + // 2. Move its doc into that dir as "_index.md" + // 3. Restructure its children. + cmdDir := filepath.Join(dir, fullCmdFilename) + if err := os.MkdirAll(cmdDir, 0755); err != nil { + return fmt.Errorf("failed to create subdir for %s: %w", fullCmdFilename, err) + } + + indexFile := filepath.Join(cmdDir, "_index.md") + if err := os.Rename(filepath.Join(rootDir, fullCmdFilename+".md"), indexFile); err != nil { + return fmt.Errorf("failed to move index doc for command %s with children: %w", fullCmdFilename, err) + } + + if err := anonymizeHomedir(indexFile); err != nil { + return fmt.Errorf("failed to anonymize homedir in help text for command %s: %w", indexFile, err) + } + + if err := restructure(rootDir, cmdDir, fullCmdFilename, children); err != nil { + return fmt.Errorf("failed to restructure child commands for %s: %w", fullCmdFilename, err) + } + case rootDir != dir: + // Sub-command without children. + // 1. Move its doc into the directory for its parent, name unchanged. + if cmd.Name() == "help" { + // all commands with children have their own "help" subcommand, + // which we do not generate docs for + continue + } + + oldName := filepath.Join(rootDir, fullCmdFilename+".md") + newName := filepath.Join(dir, fullCmdFilename+".md") + + if err := os.Rename(oldName, newName); err != nil { + return fmt.Errorf("failed to move child command %s to its parent's dir: %w", fullCmdFilename, err) + } + + sed := newParentLinkSedCommand(name, newName) + if out, err := sed.CombinedOutput(); err != nil { + return fmt.Errorf("failed to rewrite links to parent command in child %s: %w (extra: %s)", newName, err, out) + } + + if err := anonymizeHomedir(newName); err != nil { + return fmt.Errorf("failed to anonymize homedir in help text for command %s: %w", newName, err) + } + default: + // Top-level command without children. Nothing to restructure. + continue + } + } + + return nil +} + +func newParentLinkSedCommand(parent string, file string) *exec.Cmd { + return exec.Command("sed", "-i", "", "-e", fmt.Sprintf("s:(./%s/):(../):i", parent), file) +} + +var ( + wd string + once sync.Once +) + +func anonymizeHomedir(file string) (err error) { + once.Do(func() { + // Only do this once per run. + wd, err = os.Getwd() + }) + if err != nil { + return err + } + + // We're replacing the stuff inside the square brackets in the example sed + // below: + // 's:Paths to search for config files in. (default \[.*\])$:Paths to search for config files in. (default \[$WORKDIR\]):' + sed := exec.Command("sed", "-i", "", "-e", fmt.Sprintf("s:%s:$WORKDIR:i", wd), file) + if out, err := sed.CombinedOutput(); err != nil { + return fmt.Errorf("%w: %s", err, out) + } + return nil } From cbbf9fd4435fe0ed1b05c7e6928537e324336a0d Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 28 Sep 2023 15:30:34 -0400 Subject: [PATCH 192/233] [release-16.0] bugfix: change column name and type to json (#14093) (#14116) Signed-off-by: Olga Shestopalova Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Signed-off-by: Matt Lord Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Olga Shestopalova Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: Matt Lord --- .../testdata/rename-retype-json/after_columns | 1 + .../testdata/rename-retype-json/alter | 1 + .../rename-retype-json/before_columns | 1 + .../testdata/rename-retype-json/create.sql | 22 +++++++++ .../vreplication/replicator_plan_test.go | 49 +++++++++++++++++++ .../vreplication/table_plan_builder.go | 21 +++++++- .../tabletserver/vstreamer/planbuilder.go | 21 +++++++- .../vstreamer/planbuilder_test.go | 19 +++++++ 8 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/after_columns create mode 100644 go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/alter create mode 100644 go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/before_columns create mode 100644 go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/create.sql diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/after_columns b/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/after_columns new file mode 100644 index 00000000000..99f86097862 --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/after_columns @@ -0,0 +1 @@ +id, c1j diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/alter b/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/alter new file mode 100644 index 00000000000..f2e64ff0894 --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/alter @@ -0,0 +1 @@ +change column c1 c1j json diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/before_columns b/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/before_columns new file mode 100644 index 00000000000..b791aa0d27a --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/before_columns @@ -0,0 +1 @@ +id, c1 diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/create.sql b/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/create.sql new file mode 100644 index 00000000000..5280498e9fd --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/rename-retype-json/create.sql @@ -0,0 +1,22 @@ +drop table if exists onlineddl_test; +create table onlineddl_test ( + id int auto_increment, + c1 int not null, + primary key (id) +) auto_increment=1; + +insert into onlineddl_test values (1, 11); +insert into onlineddl_test values (2, 13); + +drop event if exists onlineddl_test; +delimiter ;; +create event onlineddl_test + on schedule every 1 second + starts current_timestamp + ends current_timestamp + interval 60 second + on completion not preserve + enable + do +begin + insert into onlineddl_test values (null, 17); +end ;; diff --git a/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go b/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go index 8b97f02dc1e..780b1c0d064 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go @@ -414,6 +414,55 @@ func TestBuildPlayerPlan(t *testing.T) { }, }, }, + }, { + input: &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "t1", + Filter: "select c1, convert(c using utf8mb4) as c2 from t1", + }}, + }, + plan: &TestReplicatorPlan{ + VStreamFilter: &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "t1", + Filter: "select c1, convert(c using utf8mb4) as c2 from t1", + }}, + }, + TargetTables: []string{"t1"}, + TablePlans: map[string]*TestTablePlan{ + "t1": { + TargetName: "t1", + SendRule: "t1", + PKReferences: []string{"c1"}, + InsertFront: "insert into t1(c1,c2)", + InsertValues: "(:a_c1,convert(:a_c using utf8mb4))", + Insert: "insert into t1(c1,c2) values (:a_c1,convert(:a_c using utf8mb4))", + Update: "update t1 set c2=convert(:a_c using utf8mb4) where c1=:b_c1", + Delete: "delete from t1 where c1=:b_c1", + }, + }, + }, + planpk: &TestReplicatorPlan{ + VStreamFilter: &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "t1", + Filter: "select c1, convert(c using utf8mb4) as c2, pk1, pk2 from t1", + }}, + }, + TargetTables: []string{"t1"}, + TablePlans: map[string]*TestTablePlan{ + "t1": { + TargetName: "t1", + SendRule: "t1", + PKReferences: []string{"c1", "pk1", "pk2"}, + InsertFront: "insert into t1(c1,c2)", + InsertValues: "(:a_c1,convert(:a_c using utf8mb4))", + Insert: "insert into t1(c1,c2) select :a_c1, convert(:a_c using utf8mb4) from dual where (:a_pk1,:a_pk2) <= (1,'aaa')", + Update: "update t1 set c2=convert(:a_c using utf8mb4) where c1=:b_c1 and (:b_pk1,:b_pk2) <= (1,'aaa')", + Delete: "delete from t1 where c1=:b_c1 and (:b_pk1,:b_pk2) <= (1,'aaa')", + }, + }, + }, }, { // Keywords as names. input: &binlogdatapb.Filter{ diff --git a/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go b/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go index d899be92fa7..4e8141f164f 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go +++ b/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go @@ -420,9 +420,28 @@ func (tpb *tablePlanBuilder) analyzeExpr(selExpr sqlparser.SelectExpr) (*colExpr references: make(map[string]bool), } if expr, ok := aliased.Expr.(*sqlparser.ConvertUsingExpr); ok { + // Here we find the actual column name in the convert, in case + // this is a column rename and the AS is the new column. + // For example, in convert(c1 using utf8mb4) as c2, we want to find + // c1, because c1 exists in the current table whereas c2 is the renamed column + // in the desired table. + var colName sqlparser.IdentifierCI + err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *sqlparser.ColName: + if !node.Qualifier.IsEmpty() { + return false, fmt.Errorf("unsupported qualifier for column: %v", sqlparser.String(node)) + } + colName = node.Name + } + return true, nil + }, aliased.Expr) + if err != nil { + return nil, fmt.Errorf("failed to find column name for convert using expression: %v, %v", sqlparser.String(aliased.Expr), err) + } selExpr := &sqlparser.ConvertUsingExpr{ Type: "utf8mb4", - Expr: &sqlparser.ColName{Name: as}, + Expr: &sqlparser.ColName{Name: colName}, } cexpr.expr = expr cexpr.operation = opExpr diff --git a/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go b/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go index d45dceda1b5..0378d04c373 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go +++ b/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go @@ -698,7 +698,26 @@ func (plan *Plan) analyzeExpr(vschema *localVSchema, selExpr sqlparser.SelectExp FixedValue: sqltypes.NewInt64(num), }, nil case *sqlparser.ConvertUsingExpr: - colnum, err := findColumn(plan.Table, aliased.As) + // Here we find the actual column name in the convert, in case + // this is a column rename and the AS is the new column. + // For example, in convert(c1 using utf8mb4) as c2, we want to find + // c1, because c1 exists in the current table whereas c2 is the renamed column + // in the desired table. + var colName sqlparser.IdentifierCI + err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *sqlparser.ColName: + if !node.Qualifier.IsEmpty() { + return false, fmt.Errorf("unsupported qualifier for column: %v", sqlparser.String(node)) + } + colName = node.Name + } + return true, nil + }, aliased.Expr) + if err != nil { + return ColExpr{}, fmt.Errorf("failed to find column name for convert using expression: %v, %v", sqlparser.String(aliased.Expr), err) + } + colnum, err := findColumn(plan.Table, colName) if err != nil { return ColExpr{}, err } diff --git a/go/vt/vttablet/tabletserver/vstreamer/planbuilder_test.go b/go/vt/vttablet/tabletserver/vstreamer/planbuilder_test.go index 4ec57b15b7d..d1caac6370c 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/planbuilder_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/planbuilder_test.go @@ -427,6 +427,25 @@ func TestPlanBuilder(t *testing.T) { KeyRange: nil, }}, }, + }, { + inTable: t1, + inRule: &binlogdatapb.Rule{Match: "t1", Filter: "select convert(val using utf8mb4) as val2, id as id from t1"}, + outPlan: &Plan{ + ColExprs: []ColExpr{{ + ColNum: 1, + Field: &querypb.Field{ + Name: "val", + Type: sqltypes.VarBinary, + }, + }, { + ColNum: 0, + Field: &querypb.Field{ + Name: "id", + Type: sqltypes.Int64, + }, + }}, + convertUsingUTF8Columns: map[string]bool{"val": true}, + }, }, { inTable: regional, inRule: &binlogdatapb.Rule{Match: "regional", Filter: "select id, keyspace_id() from regional"}, From 13b3d153e17170a57d627a80934b702f35aad677 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 28 Sep 2023 17:02:32 -0500 Subject: [PATCH 193/233] [release-16.0] Remove FOSSA Test from CI until we can do it in a secure way (#14119) (#14121) Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Rohit Nayak --- .github/workflows/static_checks_etc.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index bc010c67d2c..4082e9775b5 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -31,12 +31,6 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' uses: actions/checkout@v3 - - name: Run FOSSA scan and upload build data - if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: fossa-contrib/fossa-action@v1 - with: - fossa-api-key: 76d7483ea206d530d9452e44bffe7ba8 - - name: Check for changes in Go files if: steps.skip-workflow.outputs.skip-workflow == 'false' uses: frouioui/paths-filter@main From 69d3255e549b929d65db7f76c788105921395e3f Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 29 Sep 2023 09:45:01 +0200 Subject: [PATCH 194/233] [release-16.0] VDiff: Cleanup the controller for a VDiff before deleting it (#14107) (#14124) Signed-off-by: Matt Lord Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Matt Lord --- go/vt/vttablet/tabletmanager/vdiff/action.go | 72 +++++++++++++++++-- .../tabletmanager/vdiff/action_test.go | 70 ++++++++++++++---- .../tabletmanager/vdiff/controller.go | 18 +++-- go/vt/vttablet/tabletmanager/vdiff/schema.go | 18 ++--- .../tabletmanager/vdiff/table_differ.go | 4 ++ .../tabletmanager/vdiff/workflow_differ.go | 6 ++ go/vt/wrangler/workflow.go | 21 +++--- 7 files changed, 163 insertions(+), 46 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/vdiff/action.go b/go/vt/vttablet/tabletmanager/vdiff/action.go index df8fb8854bf..ba09d8914ad 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/action.go +++ b/go/vt/vttablet/tabletmanager/vdiff/action.go @@ -25,6 +25,7 @@ import ( "github.com/google/uuid" + "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vterrors" @@ -155,7 +156,12 @@ func (vde *Engine) handleCreateResumeAction(ctx context.Context, dbClient binlog var err error options := req.Options - query := fmt.Sprintf(sqlGetVDiffID, encodeString(req.VdiffUuid)) + query, err := sqlparser.ParseAndBind(sqlGetVDiffID, + sqltypes.StringBindVariable(req.VdiffUuid), + ) + if err != nil { + return err + } if qr, err = dbClient.ExecuteFetch(query, 1); err != nil { return err } @@ -295,20 +301,74 @@ func (vde *Engine) handleStopAction(ctx context.Context, dbClient binlogplayer.D } func (vde *Engine) handleDeleteAction(ctx context.Context, dbClient binlogplayer.DBClient, action VDiffAction, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error { - var err error - query := "" + vde.mu.Lock() + defer vde.mu.Unlock() + var deleteQuery string + cleanupController := func(controller *controller) { + if controller == nil { + return + } + controller.Stop() + delete(vde.controllers, controller.id) + } switch req.ActionArg { case AllActionArg: - query = fmt.Sprintf(sqlDeleteVDiffs, encodeString(req.Keyspace), encodeString(req.Workflow)) + // We need to stop any running controllers before we delete + // the vdiff records. + query, err := sqlparser.ParseAndBind(sqlGetVDiffIDsByKeyspaceWorkflow, + sqltypes.StringBindVariable(req.Keyspace), + sqltypes.StringBindVariable(req.Workflow), + ) + if err != nil { + return err + } + res, err := dbClient.ExecuteFetch(query, -1) + if err != nil { + return err + } + for _, row := range res.Named().Rows { + cleanupController(vde.controllers[row.AsInt64("id", -1)]) + } + deleteQuery, err = sqlparser.ParseAndBind(sqlDeleteVDiffs, + sqltypes.StringBindVariable(req.Keyspace), + sqltypes.StringBindVariable(req.Workflow), + ) + if err != nil { + return err + } default: uuid, err := uuid.Parse(req.ActionArg) if err != nil { return fmt.Errorf("action argument %s not supported", req.ActionArg) } - query = fmt.Sprintf(sqlDeleteVDiffByUUID, encodeString(uuid.String())) + // We need to be sure that the controller is stopped, if + // it's still running, before we delete the vdiff record. + query, err := sqlparser.ParseAndBind(sqlGetVDiffID, + sqltypes.StringBindVariable(uuid.String()), + ) + if err != nil { + return err + } + res, err := dbClient.ExecuteFetch(query, 1) + if err != nil { + return err + } + row := res.Named().Row() // Must only be one + if row == nil { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "no vdiff found for UUID %s on tablet %v", + uuid, vde.thisTablet.Alias) + } + cleanupController(vde.controllers[row.AsInt64("id", -1)]) + deleteQuery, err = sqlparser.ParseAndBind(sqlDeleteVDiffByUUID, + sqltypes.StringBindVariable(uuid.String()), + ) + if err != nil { + return err + } } - if _, err = dbClient.ExecuteFetch(query, 1); err != nil { + // Execute the query which deletes the vdiff record(s). + if _, err := dbClient.ExecuteFetch(deleteQuery, 1); err != nil { return err } diff --git a/go/vt/vttablet/tabletmanager/vdiff/action_test.go b/go/vt/vttablet/tabletmanager/vdiff/action_test.go index 6c3106f5310..9bbfbaa4d68 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/action_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/action_test.go @@ -42,6 +42,10 @@ func TestPerformVDiffAction(t *testing.T) { keyspace := "ks" workflow := "wf" uuid := uuid.New().String() + type queryAndResult struct { + query string + result *sqltypes.Result // Optional if you need a non-empty result + } tests := []struct { name string vde *Engine @@ -49,7 +53,7 @@ func TestPerformVDiffAction(t *testing.T) { preFunc func() error postFunc func() error want *tabletmanagerdatapb.VDiffResponse - expectQueries []string + expectQueries []queryAndResult wantErr error }{ { @@ -72,9 +76,13 @@ func TestPerformVDiffAction(t *testing.T) { preFunc: func() error { return tstenv.TopoServ.CreateCellInfo(ctx, "zone100_test", &topodatapb.CellInfo{}) }, - expectQueries: []string{ - fmt.Sprintf("select id as id from _vt.vdiff where vdiff_uuid = %s", encodeString(uuid)), - fmt.Sprintf(`insert into _vt.vdiff(keyspace, workflow, state, options, shard, db_name, vdiff_uuid) values('', '', 'pending', '{\"picker_options\":{\"source_cell\":\"cell1,zone100_test\",\"target_cell\":\"cell1,zone100_test\"}}', '0', 'vt_vttest', %s)`, encodeString(uuid)), + expectQueries: []queryAndResult{ + { + query: fmt.Sprintf("select id as id from _vt.vdiff where vdiff_uuid = %s", encodeString(uuid)), + }, + { + query: fmt.Sprintf(`insert into _vt.vdiff(keyspace, workflow, state, options, shard, db_name, vdiff_uuid) values('', '', 'pending', '{\"picker_options\":{\"source_cell\":\"cell1,zone100_test\",\"target_cell\":\"cell1,zone100_test\"}}', '0', 'vt_vttest', %s)`, encodeString(uuid)), + }, }, postFunc: func() error { return tstenv.TopoServ.DeleteCellInfo(ctx, "zone100_test", true) @@ -102,9 +110,13 @@ func TestPerformVDiffAction(t *testing.T) { Cells: cells, }) }, - expectQueries: []string{ - fmt.Sprintf("select id as id from _vt.vdiff where vdiff_uuid = %s", encodeString(uuid)), - fmt.Sprintf(`insert into _vt.vdiff(keyspace, workflow, state, options, shard, db_name, vdiff_uuid) values('', '', 'pending', '{\"picker_options\":{\"source_cell\":\"all\",\"target_cell\":\"all\"}}', '0', 'vt_vttest', %s)`, encodeString(uuid)), + expectQueries: []queryAndResult{ + { + query: fmt.Sprintf("select id as id from _vt.vdiff where vdiff_uuid = %s", encodeString(uuid)), + }, + { + query: fmt.Sprintf(`insert into _vt.vdiff(keyspace, workflow, state, options, shard, db_name, vdiff_uuid) values('', '', 'pending', '{\"picker_options\":{\"source_cell\":\"all\",\"target_cell\":\"all\"}}', '0', 'vt_vttest', %s)`, encodeString(uuid)), + }, }, postFunc: func() error { if err := tstenv.TopoServ.DeleteCellInfo(ctx, "zone100_test", true); err != nil { @@ -119,9 +131,21 @@ func TestPerformVDiffAction(t *testing.T) { Action: string(DeleteAction), ActionArg: uuid, }, - expectQueries: []string{ - fmt.Sprintf(`delete from vd, vdt using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) + expectQueries: []queryAndResult{ + { + query: fmt.Sprintf("select id as id from _vt.vdiff where vdiff_uuid = %s", encodeString(uuid)), + result: sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id", + "int64", + ), + "1", + ), + }, + { + query: fmt.Sprintf(`delete from vd, vdt using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) where vd.vdiff_uuid = %s`, encodeString(uuid)), + }, }, }, { @@ -132,10 +156,23 @@ func TestPerformVDiffAction(t *testing.T) { Keyspace: keyspace, Workflow: workflow, }, - expectQueries: []string{ - fmt.Sprintf(`delete from vd, vdt, vdl using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) + expectQueries: []queryAndResult{ + { + query: fmt.Sprintf("select id as id from _vt.vdiff where keyspace = %s and workflow = %s", encodeString(keyspace), encodeString(workflow)), + result: sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id", + "int64", + ), + "1", + "2", + ), + }, + { + query: fmt.Sprintf(`delete from vd, vdt, vdl using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) left join _vt.vdiff_log as vdl on (vd.id = vdl.vdiff_id) where vd.keyspace = %s and vd.workflow = %s`, encodeString(keyspace), encodeString(workflow)), + }, }, }, } @@ -148,10 +185,14 @@ func TestPerformVDiffAction(t *testing.T) { if tt.vde == nil { tt.vde = vdiffenv.vde } - for _, query := range tt.expectQueries { - vdiffenv.dbClient.ExpectRequest(query, &sqltypes.Result{}, nil) + for _, queryResult := range tt.expectQueries { + if queryResult.result == nil { + queryResult.result = &sqltypes.Result{} + } + vdiffenv.dbClient.ExpectRequest(queryResult.query, queryResult.result, nil) } got, err := tt.vde.PerformVDiffAction(ctx, tt.req) + vdiffenv.dbClient.Wait() if tt.wantErr != nil && !vterrors.Equals(err, tt.wantErr) { t.Errorf("Engine.PerformVDiffAction() error = %v, wantErr %v", err, tt.wantErr) return @@ -163,6 +204,9 @@ func TestPerformVDiffAction(t *testing.T) { err := tt.postFunc() require.NoError(t, err, "post function failed: %v", err) } + // No VDiffs should be running anymore. + require.Equal(t, 0, len(vdiffenv.vde.controllers), "expected no controllers to be running, but found %d", + len(vdiffenv.vde.controllers)) }) } } diff --git a/go/vt/vttablet/tabletmanager/vdiff/controller.go b/go/vt/vttablet/tabletmanager/vdiff/controller.go index 86d5c8b1822..f24230eb0e0 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/controller.go +++ b/go/vt/vttablet/tabletmanager/vdiff/controller.go @@ -23,19 +23,19 @@ import ( "strings" "time" - "vitess.io/vitess/go/vt/proto/tabletmanagerdata" - "vitess.io/vitess/go/vt/vterrors" - "google.golang.org/protobuf/encoding/prototext" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/log" - binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/proto/tabletmanagerdata" "vitess.io/vitess/go/vt/topo" + "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tmclient" + + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) /* @@ -177,6 +177,8 @@ func (ct *controller) start(ctx context.Context, dbClient binlogplayer.DBClient) select { case <-ctx.Done(): return vterrors.Errorf(vtrpcpb.Code_CANCELED, "context has expired") + case <-ct.done: + return vterrors.Errorf(vtrpcpb.Code_CANCELED, "vdiff was stopped") default: } ct.workflowFilter = fmt.Sprintf("where workflow = %s and db_name = %s", encodeString(ct.workflow), encodeString(ct.vde.dbName)) @@ -190,6 +192,8 @@ func (ct *controller) start(ctx context.Context, dbClient binlogplayer.DBClient) select { case <-ctx.Done(): return vterrors.Errorf(vtrpcpb.Code_CANCELED, "context has expired") + case <-ct.done: + return vterrors.Errorf(vtrpcpb.Code_CANCELED, "vdiff was stopped") default: } source := newMigrationSource() @@ -306,9 +310,9 @@ func (ct *controller) saveErrorState(ctx context.Context, saveErr error) error { log.Warningf("Failed to persist vdiff error state: %v. Will retry in %s", err, retryDelay.String()) select { case <-ctx.Done(): - return fmt.Errorf("engine is shutting down") + return vterrors.Errorf(vtrpcpb.Code_CANCELED, "engine is shutting down") case <-ct.done: - return fmt.Errorf("vdiff was stopped") + return vterrors.Errorf(vtrpcpb.Code_CANCELED, "vdiff was stopped") case <-time.After(retryDelay): if retryDelay < maxRetryDelay { retryDelay = time.Duration(float64(retryDelay) * 1.5) diff --git a/go/vt/vttablet/tabletmanager/vdiff/schema.go b/go/vt/vttablet/tabletmanager/vdiff/schema.go index fa226aa2c74..619c0e5cc79 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/schema.go +++ b/go/vt/vttablet/tabletmanager/vdiff/schema.go @@ -28,9 +28,9 @@ const ( sqlGetVDiffByID = "select * from _vt.vdiff where id = %d" sqlDeleteVDiffs = `delete from vd, vdt, vdl using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) left join _vt.vdiff_log as vdl on (vd.id = vdl.vdiff_id) - where vd.keyspace = %s and vd.workflow = %s` + where vd.keyspace = %a and vd.workflow = %a` sqlDeleteVDiffByUUID = `delete from vd, vdt using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) - where vd.vdiff_uuid = %s` + where vd.vdiff_uuid = %a` sqlVDiffSummary = `select vd.state as vdiff_state, vd.last_error as last_error, vdt.table_name as table_name, vd.vdiff_uuid as 'uuid', vdt.state as table_state, vdt.table_rows as table_rows, vd.started_at as started_at, vdt.rows_compared as rows_compared, vd.completed_at as completed_at, @@ -41,12 +41,14 @@ const ( sqlUpdateVDiffState = "update _vt.vdiff set state = %s, last_error = %s %s where id = %d" sqlUpdateVDiffStopped = `update _vt.vdiff as vd, _vt.vdiff_table as vdt set vd.state = 'stopped', vdt.state = 'stopped', vd.last_error = '' where vd.id = vdt.vdiff_id and vd.id = %d and vd.state != 'completed'` - sqlGetVReplicationEntry = "select * from _vt.vreplication %s" - sqlGetVDiffsToRun = "select * from _vt.vdiff where state in ('started','pending')" // what VDiffs have not been stopped or completed - sqlGetVDiffsToRetry = "select * from _vt.vdiff where state = 'error' and json_unquote(json_extract(options, '$.core_options.auto_retry')) = 'true'" - sqlGetVDiffID = "select id as id from _vt.vdiff where vdiff_uuid = %s" - sqlGetAllVDiffs = "select * from _vt.vdiff order by id desc" - sqlGetAllTableRows = "select table_name as table_name, table_rows as table_rows from INFORMATION_SCHEMA.TABLES where table_schema = %s and table_name in (%s)" + sqlGetVReplicationEntry = "select * from _vt.vreplication %s" + sqlGetVDiffsToRun = "select * from _vt.vdiff where state in ('started','pending')" // what VDiffs have not been stopped or completed + sqlGetVDiffsToRetry = "select * from _vt.vdiff where state = 'error' and json_unquote(json_extract(options, '$.core_options.auto_retry')) = 'true'" + sqlGetVDiffID = "select id as id from _vt.vdiff where vdiff_uuid = %a" + sqlGetVDiffIDsByKeyspaceWorkflow = "select id as id from _vt.vdiff where keyspace = %a and workflow = %a" + sqlGetAllVDiffs = "select * from _vt.vdiff order by id desc" + sqlGetTableRows = "select table_rows as table_rows from INFORMATION_SCHEMA.TABLES where table_schema = %a and table_name = %a" + sqlGetAllTableRows = "select table_name as table_name, table_rows as table_rows from INFORMATION_SCHEMA.TABLES where table_schema = %s and table_name in (%s)" sqlNewVDiffTable = "insert into _vt.vdiff_table(vdiff_id, table_name, state, table_rows) values(%d, %s, 'pending', %d)" sqlGetVDiffTable = `select vdt.lastpk as lastpk, vdt.mismatch as mismatch, vdt.report as report diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go index 799f95d080e..58757bdd672 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go @@ -409,6 +409,8 @@ func (td *tableDiffer) streamOneShard(ctx context.Context, participant *shardStr case participant.result <- result: case <-ctx.Done(): return vterrors.Wrap(ctx.Err(), "VStreamRows") + case <-td.wd.ct.done: + return vterrors.Errorf(vtrpcpb.Code_CANCELED, "vdiff was stopped") } return nil }) @@ -490,6 +492,8 @@ func (td *tableDiffer) diff(ctx context.Context, rowsToCompare int64, debug, onl select { case <-ctx.Done(): return nil, vterrors.Errorf(vtrpcpb.Code_CANCELED, "context has expired") + case <-td.wd.ct.done: + return nil, vterrors.Errorf(vtrpcpb.Code_CANCELED, "vdiff was stopped") default: } diff --git a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go index 35236b50d79..0671d676c7f 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go @@ -97,6 +97,8 @@ func (wd *workflowDiffer) diffTable(ctx context.Context, dbClient binlogplayer.D select { case <-ctx.Done(): return vterrors.Errorf(vtrpcpb.Code_CANCELED, "context has expired") + case <-wd.ct.done: + return vterrors.Errorf(vtrpcpb.Code_CANCELED, "vdiff was stopped") default: } @@ -141,6 +143,8 @@ func (wd *workflowDiffer) diff(ctx context.Context) error { select { case <-ctx.Done(): return vterrors.Errorf(vtrpcpb.Code_CANCELED, "context has expired") + case <-wd.ct.done: + return vterrors.Errorf(vtrpcpb.Code_CANCELED, "vdiff was stopped") default: } @@ -160,6 +164,8 @@ func (wd *workflowDiffer) diff(ctx context.Context) error { select { case <-ctx.Done(): return vterrors.Errorf(vtrpcpb.Code_CANCELED, "context has expired") + case <-wd.ct.done: + return vterrors.Errorf(vtrpcpb.Code_CANCELED, "vdiff was stopped") default: } query := fmt.Sprintf(sqlGetVDiffTable, wd.ct.id, encodeString(td.table.Name)) diff --git a/go/vt/wrangler/workflow.go b/go/vt/wrangler/workflow.go index fbdeb58dd17..46c1a629a20 100644 --- a/go/vt/wrangler/workflow.go +++ b/go/vt/wrangler/workflow.go @@ -16,6 +16,7 @@ import ( "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vtctl/workflow" "vitess.io/vitess/go/vt/vtgate/evalengine" + vdiff2 "vitess.io/vitess/go/vt/vttablet/tabletmanager/vdiff" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -703,20 +704,16 @@ func (vrw *VReplicationWorkflow) GetCopyProgress() (*CopyProgress, error) { // region Workflow related utility functions -// deleteWorkflowVDiffData cleans up any potential VDiff related data associated with the workflow on the given tablet +// deleteWorkflowVDiffData cleans up any potential VDiff related data associated +// with the workflow on the given tablet. func (wr *Wrangler) deleteWorkflowVDiffData(ctx context.Context, tablet *topodatapb.Tablet, workflow string) { - sqlDeleteVDiffs := `delete from vd, vdt, vdl using _vt.vdiff as vd inner join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) - inner join _vt.vdiff_log as vdl on (vd.id = vdl.vdiff_id) - where vd.keyspace = %s and vd.workflow = %s` - query := fmt.Sprintf(sqlDeleteVDiffs, encodeString(tablet.Keyspace), encodeString(workflow)) - rows := -1 - if _, err := wr.tmc.ExecuteFetchAsDba(ctx, tablet, false, &tabletmanagerdatapb.ExecuteFetchAsDbaRequest{ - Query: []byte(query), - MaxRows: uint64(rows), + if _, err := wr.tmc.VDiff(ctx, tablet, &tabletmanagerdatapb.VDiffRequest{ + Keyspace: tablet.Keyspace, + Workflow: workflow, + Action: string(vdiff2.DeleteAction), + ActionArg: vdiff2.AllActionArg, }); err != nil { - if sqlErr, ok := err.(*mysql.SQLError); ok && sqlErr.Num != mysql.ERNoSuchTable { // the tables may not exist if no vdiffs have been run - wr.Logger().Errorf("Error deleting vdiff data for %s.%s workflow: %v", tablet.Keyspace, workflow, err) - } + log.Errorf("Error deleting vdiff data for %s.%s workflow: %v", tablet.Keyspace, workflow, err) } } From 12cdda12a54ec6e65e38e0a832258945bcc984bc Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 29 Sep 2023 19:53:58 +0530 Subject: [PATCH 195/233] Code freeze of `release-16.0` for `v16.0.5` (#14132) Signed-off-by: Manan Gupta --- .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 efe1d6e8856..1bb74feee50 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 d5be0db04d5cde2dfeb1df13a07ec9762720ff45 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 11:01:46 -0500 Subject: [PATCH 196/233] [release-16.0] docker: add dedicated vtorc container (#14126) (#14146) Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- docker/k8s/Dockerfile | 1 + docker/k8s/vtorc/Dockerfile | 38 +++++++++++++++++++++++++++++++++++++ docker/release.sh | 5 +++++ 3 files changed, 44 insertions(+) create mode 100644 docker/k8s/vtorc/Dockerfile diff --git a/docker/k8s/Dockerfile b/docker/k8s/Dockerfile index 30ff33952bc..1967aea538e 100644 --- a/docker/k8s/Dockerfile +++ b/docker/k8s/Dockerfile @@ -51,6 +51,7 @@ COPY --from=base /vt/bin/vtgate /vt/bin/ COPY --from=base /vt/bin/vttablet /vt/bin/ COPY --from=base /vt/bin/vtbackup /vt/bin/ COPY --from=base /vt/bin/vtadmin /vt/bin/ +COPY --from=base /vt/bin/vtorc /vt/bin/ # copy web admin files COPY --from=base $VTROOT/web /vt/web/ diff --git a/docker/k8s/vtorc/Dockerfile b/docker/k8s/vtorc/Dockerfile new file mode 100644 index 00000000000..b62b30ee676 --- /dev/null +++ b/docker/k8s/vtorc/Dockerfile @@ -0,0 +1,38 @@ +# 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. + +ARG VT_BASE_VER=latest +ARG DEBIAN_VER=stable-slim + +FROM vitess/k8s:${VT_BASE_VER} AS k8s + +FROM debian:${DEBIAN_VER} + +# Set up Vitess environment (just enough to run pre-built Go binaries) +ENV VTROOT /vt + +# Prepare directory structure. +RUN mkdir -p /vt/bin && mkdir -p /vtdataroot + +# Copy certs to allow https calls +COPY --from=k8s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt + +# Copy binaries +COPY --from=k8s /vt/bin/vtorc /vt/bin/ + +# add vitess user/group and add permissions +RUN groupadd -r --gid 2000 vitess && \ + useradd -r -g vitess --uid 1000 vitess && \ + chown -R vitess:vitess /vt && \ + chown -R vitess:vitess /vtdataroot diff --git a/docker/release.sh b/docker/release.sh index 1fa6c57326c..5e2a4d9aa74 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -21,6 +21,11 @@ do docker push vitess/vtadmin:$vt_base_version-$debian_version if [[ $debian_version == $default_debian_version ]]; then docker push vitess/vtadmin:$vt_base_version; fi + docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/vtorc:$vt_base_version-$debian_version k8s/vtorc + docker tag vitess/vtorc:$vt_base_version-$debian_version vitess/vtorc:$vt_base_version + docker push vitess/vtorc:$vt_base_version-$debian_version + if [[ $debian_version == $default_debian_version ]]; then docker push vitess/vtorc:$vt_base_version; fi + docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/vtgate:$vt_base_version-$debian_version k8s/vtgate docker tag vitess/vtgate:$vt_base_version-$debian_version vitess/vtgate:$vt_base_version docker push vitess/vtgate:$vt_base_version-$debian_version From 51f0ad1b71958bc11eb267f659d76d7a56fdb3eb Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 11:02:29 -0500 Subject: [PATCH 197/233] [release-16.0] Fix for "text type with an unknown/unsupported collation cannot be hashed" error (#13852) (#13863) Co-authored-by: Harshit Gangal --- .../endtoend/preparestmt/stmt_methods_test.go | 21 +++++++++++++++++++ go/vt/vtgate/semantics/semantic_state.go | 10 +++++++++ 2 files changed, 31 insertions(+) diff --git a/go/test/endtoend/preparestmt/stmt_methods_test.go b/go/test/endtoend/preparestmt/stmt_methods_test.go index 21369ea4d3a..24fb58bff81 100644 --- a/go/test/endtoend/preparestmt/stmt_methods_test.go +++ b/go/test/endtoend/preparestmt/stmt_methods_test.go @@ -436,3 +436,24 @@ func TestShowColumns(t *testing.T) { require.Len(t, cols, 6) require.False(t, rows.Next()) } + +func TestBinaryColumn(t *testing.T) { + defer cluster.PanicHandler(t) + dbo := Connect(t, "interpolateParams=false") + defer dbo.Close() + + _, err := dbo.Query(`SELECT DISTINCT + BINARY table_info.table_name AS table_name, + table_info.create_options AS create_options, + table_info.table_comment AS table_comment + FROM information_schema.tables AS table_info + JOIN information_schema.columns AS column_info + ON BINARY column_info.table_name = BINARY table_info.table_name + WHERE + table_info.table_schema = ? + AND column_info.table_schema = ? + -- Exclude views. + AND table_info.table_type = 'BASE TABLE' + ORDER BY BINARY table_info.table_name`, keyspaceName, keyspaceName) + require.NoError(t, err) +} diff --git a/go/vt/vtgate/semantics/semantic_state.go b/go/vt/vtgate/semantics/semantic_state.go index b3163ae7fb0..08e37bd7489 100644 --- a/go/vt/vtgate/semantics/semantic_state.go +++ b/go/vt/vtgate/semantics/semantic_state.go @@ -238,6 +238,16 @@ func (st *SemTable) TypeFor(e sqlparser.Expr) *querypb.Type { if found { return &typ.Type } + + // We add a lot of WeightString() expressions to queries at late stages of the planning, + // which means that they don't have any type information. We can safely assume that they + // are VarBinary, since that's the only type that WeightString() can return. + _, isWS := e.(*sqlparser.WeightStringFuncExpr) + if isWS { + typ := sqltypes.VarBinary + return &typ + } + return nil } From fd462ffb108911b0b1cccf6eed4b7f1f4c7421db Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Tue, 3 Oct 2023 19:41:09 +0530 Subject: [PATCH 198/233] Release of v16.0.5 (#14135) Co-authored-by: Florent Poinsard --- .github/workflows/code_freeze.yml | 2 +- changelog/16.0/16.0.5/changelog.md | 55 +++++++++++++++++++ changelog/16.0/16.0.5/release_notes.md | 7 +++ changelog/16.0/16.0.5/summary.md | 0 changelog/16.0/README.md | 4 ++ 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 | 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 +- 21 files changed, 148 insertions(+), 82 deletions(-) create mode 100644 changelog/16.0/16.0.5/changelog.md create mode 100644 changelog/16.0/16.0.5/release_notes.md create mode 100644 changelog/16.0/16.0.5/summary.md diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 1bb74feee50..efe1d6e8856 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/16.0/16.0.5/changelog.md b/changelog/16.0/16.0.5/changelog.md new file mode 100644 index 00000000000..d5a13b56c02 --- /dev/null +++ b/changelog/16.0/16.0.5/changelog.md @@ -0,0 +1,55 @@ +# Changelog of Vitess v16.0.5 + +### Bug fixes +#### Build/CI + * [release-16.0] Make `Static Code Checks Etc` fail if the `./changelog` folder is out-of-date (#14003) [#14005](https://github.com/vitessio/vitess/pull/14005) + * [release-16.0] Enable failures in `tools/e2e_test_race.sh` and fix races (#13654) [#14010](https://github.com/vitessio/vitess/pull/14010) +#### Cluster management + * [release-16.0] Fix `BackupShard` to get its options from its own flags (#13813) [#13819](https://github.com/vitessio/vitess/pull/13819) + * [release-16.0] Fix: convertBoolToSemiSyncAction method to account for all semi sync actions (#13075) [#13958](https://github.com/vitessio/vitess/pull/13958) +#### Online DDL + * [release-16.0] OnlineDDL: fix nil 'completed_timestamp' for cancelled migrations (#13928) [#13936](https://github.com/vitessio/vitess/pull/13936) + * [release-16.0] OnlineDDL: cleanup cancelled migration artifacts; support `--retain-artifacts=` DDL strategy flag (#14029) [#14036](https://github.com/vitessio/vitess/pull/14036) + * [release-16.0] TableGC: support DROP VIEW (#14020) [#14044](https://github.com/vitessio/vitess/pull/14044) + * [release-16.0] bugfix: change column name and type to json (#14093) [#14116](https://github.com/vitessio/vitess/pull/14116) +#### Query Serving + * [release-16.0] Fix for "text type with an unknown/unsupported collation cannot be hashed" error (#13852) [#13863](https://github.com/vitessio/vitess/pull/13863) + * [release-16.0] handle large number of predicates without timing out (#13979) [#13981](https://github.com/vitessio/vitess/pull/13981) + * [release-16.0] fix data race in join engine primitive olap streaming mode execution (#14012) [#14015](https://github.com/vitessio/vitess/pull/14015) + * [release-16.0] fix: cost to include subshard opcode (#14023) [#14026](https://github.com/vitessio/vitess/pull/14026) +#### VReplication + * [release-16.0] Flakes: skip flaky check that ETA for a VReplication VDiff2 Progress command is in the future. (#13804) [#13816](https://github.com/vitessio/vitess/pull/13816) + * [release-16.0] copy over existing vreplication rows copied to local counter if resuming from another tablet (#13949) [#13962](https://github.com/vitessio/vitess/pull/13962) + * [release-16.0] VDiff: correct handling of default source and target cells (#13969) [#13983](https://github.com/vitessio/vitess/pull/13983) + * Backport [release-16.0] Flakes: Add recently added 'select rows_copied' query to ignore list #13993 [#14040](https://github.com/vitessio/vitess/pull/14040) + * [release-16.0] VDiff: properly split cell values in record when using TabletPicker (#14099) [#14102](https://github.com/vitessio/vitess/pull/14102) + * [release-16.0] VDiff: Cleanup the controller for a VDiff before deleting it (#14107) [#14124](https://github.com/vitessio/vitess/pull/14124) +#### VTCombo + * [release-16.0] Fix vtcombo DBDDL plugin race condition (#13117) [#13741](https://github.com/vitessio/vitess/pull/13741) +### CI/Build +#### Documentation + * [release-16.0] update docgen to embed commit ID in autogenerated doc frontmatter (#14056) [#14073](https://github.com/vitessio/vitess/pull/14073) +#### General + * [release-16.0] Upgrade the Golang version to `go1.20.8` [#13932](https://github.com/vitessio/vitess/pull/13932) +#### VTorc + * [release-16.0] docker: add dedicated vtorc container (#14126) [#14146](https://github.com/vitessio/vitess/pull/14146) +### Documentation +#### Documentation + * [release-16.0] anonymize homedirs in generated docs (#14101) [#14105](https://github.com/vitessio/vitess/pull/14105) +### Enhancement +#### VReplication + * [release-16.0] MoveTables: add flag to specify that routing rules should not be created when a movetables workflow is created [#13858](https://github.com/vitessio/vitess/pull/13858) +### Internal Cleanup +#### Build/CI + * [release-16.0] Use Debian Bullseye in Bootstrap (#13757) [#13921](https://github.com/vitessio/vitess/pull/13921) +#### Query Serving + * [release-16.0] moved timeout test to different package (#14028) [#14031](https://github.com/vitessio/vitess/pull/14031) +### Release +#### General + * Code freeze of `release-16.0` for `v16.0.5` [#14132](https://github.com/vitessio/vitess/pull/14132) +### Testing +#### Build/CI + * [release-16.0] Remove FOSSA Test from CI until we can do it in a secure way (#14119) [#14121](https://github.com/vitessio/vitess/pull/14121) +#### VReplication + * [release-16.0] Flakes: empty vtdataroot before starting a new vreplication e2e test (#13803) [#13821](https://github.com/vitessio/vitess/pull/13821) + diff --git a/changelog/16.0/16.0.5/release_notes.md b/changelog/16.0/16.0.5/release_notes.md new file mode 100644 index 00000000000..e988f5fdbd0 --- /dev/null +++ b/changelog/16.0/16.0.5/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v16.0.5 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/16.0/16.0.5/changelog.md). + +The release includes 29 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @app/github-actions, @app/vitess-bot, @arthurschreiber, @rohit-nayak-ps + diff --git a/changelog/16.0/16.0.5/summary.md b/changelog/16.0/16.0.5/summary.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/changelog/16.0/README.md b/changelog/16.0/README.md index 75b3f3a0a1f..d45a817ad48 100644 --- a/changelog/16.0/README.md +++ b/changelog/16.0/README.md @@ -1,5 +1,9 @@ ## v16.0 The dedicated team for this release can be found [here](team.md). +* **[16.0.5](16.0.5)** + * [Changelog](16.0.5/changelog.md) + * [Release Notes](16.0.5/release_notes.md) + * **[16.0.4](16.0.4)** * [Changelog](16.0.4/changelog.md) * [Release Notes](16.0.4/release_notes.md) diff --git a/docker/release.sh b/docker/release.sh index 5e2a4d9aa74..c982bc58add 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.5-SNAPSHOT' +vt_base_version='v16.0.5' 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 108e7cc0d69..cf4d7e1ab32 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:v16.0.4 + image: vitess/lite:v16.0.5 ports: - "15000:$WEB_PORT" - "$GRPC_PORT" @@ -81,7 +81,7 @@ services: condition: service_healthy vtgate: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 ports: - "15099:$WEB_PORT" - "$GRPC_PORT" @@ -111,7 +111,7 @@ services: condition: service_healthy schemaload: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 command: - sh - -c @@ -144,12 +144,12 @@ services: environment: - KEYSPACES=$KEYSPACE - GRPC_PORT=15999 - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - .:/script vttablet100: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 ports: - "15100:$WEB_PORT" - "$GRPC_PORT" @@ -181,7 +181,7 @@ services: retries: 15 vttablet101: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 ports: - "15101:$WEB_PORT" - "$GRPC_PORT" @@ -213,7 +213,7 @@ services: retries: 15 vttablet102: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 ports: - "15102:$WEB_PORT" - "$GRPC_PORT" @@ -245,7 +245,7 @@ services: retries: 15 vttablet103: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 ports: - "15103:$WEB_PORT" - "$GRPC_PORT" @@ -277,7 +277,7 @@ services: retries: 15 vtorc: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 command: ["sh", "-c", "/script/vtorc-up.sh"] depends_on: - vtctld @@ -307,7 +307,7 @@ services: retries: 15 vreplication: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - ".:/script" environment: diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index 37553ac10f8..f61de1b6af5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - .:/script set_keyspace_durability_policy: @@ -115,7 +115,7 @@ services: environment: - KEYSPACES=test_keyspace lookup_keyspace - GRPC_PORT=15999 - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - .:/script vtctld: @@ -143,7 +143,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 ports: - 15000:8080 - "15999" @@ -160,7 +160,7 @@ services: --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 ports: - 15099:8080 - "15999" @@ -182,7 +182,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 ports: - 15302:8080 - "15999" diff --git a/examples/compose/vtcompose/docker-compose.test.yml b/examples/compose/vtcompose/docker-compose.test.yml index 40eb9d39bba..f44dbd6b6c1 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - .:/script set_keyspace_durability_policy_test_keyspace: @@ -117,7 +117,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=test_keyspace - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - .:/script set_keyspace_durability_policy_unsharded_keyspace: @@ -130,7 +130,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=unsharded_keyspace - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - .:/script vtctld: @@ -159,7 +159,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 ports: - 15000:8080 - "15999" @@ -176,7 +176,7 @@ services: ''grpc-vtgateservice'' --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 ports: - 15099:8080 - "15999" @@ -199,7 +199,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 ports: - 15301:8080 - "15999" diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index 8ef6dcec387..c3dfbae4bac 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 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:v16.0.4 + image: vitess/lite:v16.0.5 ports: - "15000:%[1]d" - "%[2]d" @@ -696,7 +696,7 @@ func generateVtgate(opts vtOptions) string { - op: add path: /services/vtgate value: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 ports: - "15099:%[1]d" - "%[2]d" @@ -738,7 +738,7 @@ func generateVTOrc(dbInfo externalDbInfo, keyspaceInfoMap map[string]keyspaceInf - op: add path: /services/vtorc value: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - ".:/script" environment: @@ -763,7 +763,7 @@ func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - op: add path: /services/vreplication value: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - ".:/script" environment: @@ -791,7 +791,7 @@ func generateSetKeyspaceDurabilityPolicy( - op: add path: /services/set_keyspace_durability_policy_%[3]s value: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - ".:/script" environment: @@ -828,7 +828,7 @@ func generateSchemaload( - op: add path: /services/schemaload_%[7]s value: - image: vitess/lite:v16.0.4 + image: vitess/lite:v16.0.5 volumes: - ".:/script" environment: diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index 51311f1dbfb..642e6dbc9a2 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:v16.0.4 - vtadmin: vitess/vtadmin:v16.0.4 - vtgate: vitess/lite:v16.0.4 - vttablet: vitess/lite:v16.0.4 - vtbackup: vitess/lite:v16.0.4 - vtorc: vitess/lite:v16.0.4 + vtctld: vitess/lite:v16.0.5 + vtadmin: vitess/vtadmin:v16.0.5 + vtgate: vitess/lite:v16.0.5 + vttablet: vitess/lite:v16.0.5 + vtbackup: vitess/lite:v16.0.5 + vtorc: vitess/lite:v16.0.5 mysqld: - mysql80Compatible: vitess/lite:v16.0.4 + mysql80Compatible: vitess/lite:v16.0.5 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 0f28bc2ee10..15a6220a9b3 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:v16.0.4 - vtadmin: vitess/vtadmin:v16.0.4 - vtgate: vitess/lite:v16.0.4 - vttablet: vitess/lite:v16.0.4 - vtbackup: vitess/lite:v16.0.4 - vtorc: vitess/lite:v16.0.4 + vtctld: vitess/lite:v16.0.5 + vtadmin: vitess/vtadmin:v16.0.5 + vtgate: vitess/lite:v16.0.5 + vttablet: vitess/lite:v16.0.5 + vtbackup: vitess/lite:v16.0.5 + vtorc: vitess/lite:v16.0.5 mysqld: - mysql80Compatible: vitess/lite:v16.0.4 + mysql80Compatible: vitess/lite:v16.0.5 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 83bc869ee25..e39661a3f0b 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:v16.0.4 - vtadmin: vitess/vtadmin:v16.0.4 - vtgate: vitess/lite:v16.0.4 - vttablet: vitess/lite:v16.0.4 - vtbackup: vitess/lite:v16.0.4 - vtorc: vitess/lite:v16.0.4 + vtctld: vitess/lite:v16.0.5 + vtadmin: vitess/vtadmin:v16.0.5 + vtgate: vitess/lite:v16.0.5 + vttablet: vitess/lite:v16.0.5 + vtbackup: vitess/lite:v16.0.5 + vtorc: vitess/lite:v16.0.5 mysqld: - mysql80Compatible: vitess/lite:v16.0.4 + mysql80Compatible: vitess/lite:v16.0.5 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 68c51aecdc0..41911fe7ab0 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:v16.0.4 - vtadmin: vitess/vtadmin:v16.0.4 - vtgate: vitess/lite:v16.0.4 - vttablet: vitess/lite:v16.0.4 - vtbackup: vitess/lite:v16.0.4 - vtorc: vitess/lite:v16.0.4 + vtctld: vitess/lite:v16.0.5 + vtadmin: vitess/vtadmin:v16.0.5 + vtgate: vitess/lite:v16.0.5 + vttablet: vitess/lite:v16.0.5 + vtbackup: vitess/lite:v16.0.5 + vtorc: vitess/lite:v16.0.5 mysqld: - mysql80Compatible: vitess/lite:v16.0.4 + mysql80Compatible: vitess/lite:v16.0.5 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/operator.yaml b/examples/operator/operator.yaml index 82dbee746c5..12b00eab89c 100644 --- a/examples/operator/operator.yaml +++ b/examples/operator/operator.yaml @@ -6145,7 +6145,7 @@ spec: fieldPath: metadata.name - name: OPERATOR_NAME value: vitess-operator - image: planetscale/vitess-operator:v2.9.4 + image: planetscale/vitess-operator:v2.9.5 name: vitess-operator resources: limits: diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index 0f2e11ff73c..aa52a46c62b 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 = "16.0.5-SNAPSHOT" +const versionName = "16.0.5" diff --git a/java/client/pom.xml b/java/client/pom.xml index edf3b3fcf0e..6e0374e6d23 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.5-SNAPSHOT + 16.0.5 vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 183d94bfe3c..186ea78b644 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.5-SNAPSHOT + 16.0.5 vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 975eebf948a..63745a055de 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.5-SNAPSHOT + 16.0.5 vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index bf7d0892154..8890260f455 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.5-SNAPSHOT + 16.0.5 vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 909efd2631c..85e5677a09d 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.5-SNAPSHOT + 16.0.5 pom Vitess Java Client libraries [Parent] From 00c75910576dd8cd49a8c462f33f70d6a99af77c Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 3 Oct 2023 10:58:13 -0500 Subject: [PATCH 199/233] Back to dev mode after v16.0.5 (#14170) 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 c982bc58add..6e0e0e0e580 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.5' +vt_base_version='v16.0.6-SNAPSHOT' debian_versions='buster bullseye' default_debian_version='bullseye' diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index aa52a46c62b..d8ab30407b7 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 = "16.0.5" +const versionName = "16.0.6-SNAPSHOT" diff --git a/java/client/pom.xml b/java/client/pom.xml index 6e0374e6d23..f9bc829e85b 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.5 + 16.0.6-SNAPSHOT vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 186ea78b644..5c19b596c79 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.5 + 16.0.6-SNAPSHOT vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 63745a055de..356ac1ae471 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.5 + 16.0.6-SNAPSHOT vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 8890260f455..57003a8987d 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.5 + 16.0.6-SNAPSHOT vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 85e5677a09d..55c86fe1279 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.5 + 16.0.6-SNAPSHOT pom Vitess Java Client libraries [Parent] From 786a532ca78f703819e766e80a8f2447245f29d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 19:53:25 -0500 Subject: [PATCH 200/233] [release-16.0] Upgrade the Golang version to `go1.20.9` (#14194) Co-authored-by: frouioui Co-authored-by: Florent Poinsard --- .github/workflows/assign_milestone.yml | 2 +- .github/workflows/check_make_vtadmin_authz_testgen.yml | 2 +- .github/workflows/check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr_mysql57.yml | 2 +- .../cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .github/workflows/cluster_endtoend_mysql_server_vault.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_scheduler.yml | 2 +- .../cluster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- ...luster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl.yml | 2 +- .../workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_consul.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_tablegc.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_throttler.yml | 2 +- ...uster_endtoend_tabletmanager_throttler_custom_config.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .../workflows/cluster_endtoend_topo_connection_cache.yml | 2 +- .../cluster_endtoend_vreplication_across_db_versions.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_basic.yml | 2 +- .../workflows/cluster_endtoend_vreplication_cellalias.yml | 2 +- ...ster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .../workflows/cluster_endtoend_vreplication_multicell.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_v2.yml | 2 +- .github/workflows/cluster_endtoend_vstream_failover.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_false.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_true.yml | 2 +- .../cluster_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- ...uster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_general_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_godriver.yml | 2 +- .../workflows/cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .../workflows/cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_reservedconn.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .../workflows/cluster_endtoend_vtgate_schema_tracker.yml | 2 +- .../cluster_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_consul.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_transaction.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_unsharded.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .github/workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 2 +- .github/workflows/docker_test_cluster_10.yml | 2 +- .github/workflows/docker_test_cluster_25.yml | 2 +- .github/workflows/e2e_race.yml | 2 +- .github/workflows/endtoend.yml | 2 +- .github/workflows/local_example.yml | 2 +- .github/workflows/region_example.yml | 2 +- .github/workflows/sonar_analysis.yml | 2 +- .github/workflows/static_checks_etc.yml | 2 +- .github/workflows/unit_race.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- .github/workflows/update_golang_version.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 2 +- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 2 +- .../upgrade_downgrade_test_backups_manual_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries.yml | 2 +- ...de_downgrade_test_query_serving_queries_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_schema.yml | 2 +- ...ade_downgrade_test_query_serving_schema_next_release.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 2 +- docker/lite/Dockerfile.ubi7.mysql80 | 2 +- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 2 +- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 2 +- docker/lite/Dockerfile.ubi8.mysql80 | 2 +- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- test.go | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_docker.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/dockerfile.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 128 files changed, 132 insertions(+), 128 deletions(-) diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index 626d3ce14a2..cc81c3fa519 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index c000f3198b0..0e7b5b1e9f3 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -48,7 +48,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 874707c67fd..e69a5d96d22 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -50,7 +50,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 056ac512f72..543fa0b5afc 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 e83444b95ef..b738d5d7005 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 7e9d597df57..08057c45c74 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 aee8d491ae8..a1e19ee0eef 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 f99601db059..d6ad7779bc1 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 9e6b0777821..8ca63c0c564 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index ada7ccbbd34..9de116120f1 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index 530ad9eae39..3e9bfcb6afe 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 175f53b7bda..180371926e0 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 602c9ab999a..309a357c444 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 c00a972dd78..7f2cd0aff37 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 4c72209f226..0b685ec1e41 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 4cffa4caaef..8f5711d3337 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 703eab7a8ea..9a8d376555a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 1d1429f2bfe..97624be4006 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 fc552f7e37f..00f92ebded4 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 84139168bdd..c7a1a1be9c9 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 5566aa2e550..058cf793338 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 97e3f002034..5dff49290cf 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 55f5c2b3b7a..6f4baf5ef14 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 8dc65820b73..b5bdc90f092 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 13509e70e3a..be1ebda7509 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 2cfa7d12d4e..bb7bfd815b1 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 8e960d3c41f..86f1f383ef9 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 1d18b2b36a8..e5399496b42 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 3dbbba573aa..bd8bb05b660 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 378c9609417..b41c6831895 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 d9e6653d5cf..58bd8ecf50d 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 e4732868da5..b73c8f62cb9 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 5a2081689ea..29dcdaf2599 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 cc71bd5e0b0..46c618b1114 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 596f2c36e49..1a78b6cdf3c 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 220d45d58be..563643224cf 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 1e25a842831..3e6bcfebcbc 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 3027b28c6b8..26ccab72210 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 d33783d257b..f46ce4f2c89 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 9b245c8595f..a9efd5ba0ce 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 91edcb9d8e2..661d63d6e3a 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 d43f4664968..24f42d11ddd 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 5c7868b0e32..9d7184fa458 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 e1c4699b65a..1d8701019c0 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 42042071cf8..6702663bc6c 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 675b64e64be..aa1eebd1f24 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 dff7a842287..ab53f0afd17 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index ff17a63b767..52b4d7ea35f 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 bc07125f1f3..7bed6e46422 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 3aaee43af92..e9b715ab3f1 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 3161053fd68..3c6346c6d70 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 6982c6acfda..7ee89ec48bb 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 26d1b198a4f..4e44823567f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 13015700fe7..b6c93eb12b7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 fe8de9d9d5a..a2515d2a02a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 de53010f685..31f2ee5b616 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 be356d8c781..6d123980f44 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 6b59f050a63..b45b5f2fa40 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 1ec982dc81e..6cd02b5332d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 05881d09d98..3d2b2488159 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 8d20c0b43e0..c9c20f284a2 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 a2671328e77..9745a5510d7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 fca95a26844..cf34a6bfc32 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 3ab6ca26a25..d2e13b4c2ad 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 d4ba377f7c6..c982eb6b67a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 ea65dce089c..1f6187e0ac1 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 af73b945d39..06aaee5f8a2 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 e8ded8b55be..69d689e256a 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 36529fc6e31..ccc2f6f8d01 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 21b82d83b78..7147a6c4a86 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 3e53566f9a1..620d8681626 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 fc5a0def074..f4a0175e435 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 39d618b51c1..1ad3c2d3fec 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 fa110a24b0d..60dd330232a 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 669231f287a..19465632595 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -42,7 +42,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Get base dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 677cd49a146..043a830881c 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index a236185dea7..c0364142e6e 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index f6b3f644914..3005812c04c 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index f4b2e2635c5..735beb123d6 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index fa28f46fd7e..8482707ded6 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index f0b04fd3947..7787bf5a07a 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index faed1845135..3a43f6a81cd 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index c9e44063562..5ef89372b34 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS run: | diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 4082e9775b5..fda49b622ac 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -100,7 +100,7 @@ jobs: 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@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index f36c7190974..46f787c4960 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -55,7 +55,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 621068ff45f..9916fa788a5 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index bc8b8502779..577e7c6d412 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index a80f234f6b8..7d760163c2c 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 20621f503ed..d4f91ed011b 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -83,7 +83,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 1b57d54b1ce..fa41629cefe 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -86,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 7bfac25cd38..c9f6b0f5b60 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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 b93e75f03e2..49b35fb122f 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 79ab3b038e0..c5452f1dc29 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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 a29b87c25be..a47f352bab2 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 5080fcfaf1d..ec4717d3423 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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 7ef97bbeae4..3ee8a7da6ba 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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 00761ba186f..66ebda21dec 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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 20458bd2a08..14fe6f27a8a 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 9539f83f3b8..4a0a2d160f8 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 965fb92786e..7778aae043b 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/Makefile b/Makefile index b69bb168707..94ba17aed6c 100644 --- a/Makefile +++ b/Makefile @@ -275,7 +275,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=14.7 +BOOTSTRAP_VERSION=14.8 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index ca1110e9af4..d45f920eb46 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.20.8 || echo "Go version reported: `go version`. Version 1.20.8+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.20.9 || echo "Go version reported: `go version`. Version 1.20.9+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 24cd4b22cec..f85e6cf33f6 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index 9e60efde5f2..906249ed173 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index bcb1669601d..06a8318d302 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index c872d140a72..18346f89fcf 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index 59a4567696c..7bc0d3d22e8 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -80,4 +80,8 @@ List of changes between bootstrap image versions. ## [14.7] - 2023-09-06 ### Changes -- Use Debian Bullseye as base bootstrap image in order to continue upgrading the Golang version \ No newline at end of file +- Use Debian Bullseye as base bootstrap image in order to continue upgrading the Golang version + +## [14.8] - 2023-10-05 +### Changes +- Update build to golang 1.20.9 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 243d8425dd6..54fa2fd07ed 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.20.8-bullseye +FROM --platform=linux/amd64 golang:1.20.9-bullseye # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index 152446b2160..d584b293481 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index f395d03d36d..2ed22dc6e96 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index 0bdd2390243..55b8b547059 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index 85ac23141c3..c8306361c4c 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index dba735d9947..3ff700e5149 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index e43a30e018e..70e41f5d04f 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index df61310f844..9cf5b6ac627 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index 57ed183fa36..3e004926ba7 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index b18e35a2573..1c0a4f5880a 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index 235f4fc6a47..aabb4526225 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index b983a7b4ce4..06afe9af9f0 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index d520780387d..06781a39f3f 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index 2aefd753c02..f8de5bf9504 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index ab1e6efd104..fa42de8135e 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/test.go b/test.go index 2e7f566a110..9334a718107 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "14.7", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "14.8", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index 4e7e0b5c056..ae75b8c44e6 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python 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 e359ed94539..8f7e5b61ebf 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - 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_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index c986126632a..264508e60d8 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -68,7 +68,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index c1187ec0527..71626f393b6 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.7 +ARG bootstrap_version=14.8 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index f281f5e0137..b735176aea8 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -59,7 +59,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.8 + go-version: 1.20.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' From 38eccb9e304b0a5992c902aadbd2c5dbc86674f0 Mon Sep 17 00:00:00 2001 From: Patrick Carnahan Date: Mon, 7 Aug 2023 20:34:55 +0000 Subject: [PATCH 201/233] add new lock syntax for mysql8 Signed-off-by: Patrick Carnahan Signed-off-by: Arthur Schreiber --- go/vt/sqlparser/ast_funcs.go | 10 + go/vt/sqlparser/constants.go | 16 +- go/vt/sqlparser/keywords.go | 3 + go/vt/sqlparser/parse_test.go | 10 + go/vt/sqlparser/sql.go | 9919 +++++++++++----------- go/vt/sqlparser/sql.y | 20 + go/vt/sqlparser/testdata/union_cases.txt | 2 +- 7 files changed, 5059 insertions(+), 4921 deletions(-) diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index bc427c16636..1278b0379e7 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -1188,6 +1188,16 @@ func (lock Lock) ToString() string { return NoLockStr case ForUpdateLock: return ForUpdateStr + case ForUpdateLockNoWait: + return ForUpdateNoWaitStr + case ForUpdateLockSkipLocked: + return ForUpdateSkipLockedStr + case ForShareLock: + return ForShareStr + case ForShareLockNoWait: + return ForShareNoWaitStr + case ForShareLockSkipLocked: + return ForShareSkipLockedStr case ShareModeLock: return ShareModeStr default: diff --git a/go/vt/sqlparser/constants.go b/go/vt/sqlparser/constants.go index 81f2e067563..330afeaed05 100644 --- a/go/vt/sqlparser/constants.go +++ b/go/vt/sqlparser/constants.go @@ -25,9 +25,14 @@ const ( SQLCalcFoundRowsStr = "sql_calc_found_rows " // Select.Lock - NoLockStr = "" - ForUpdateStr = " for update" - ShareModeStr = " lock in share mode" + NoLockStr = "" + ForUpdateStr = " for update" + ForUpdateNoWaitStr = " for update nowait" + ForUpdateSkipLockedStr = " for update skip locked" + ForShareStr = " for share" + ForShareNoWaitStr = " for share nowait" + ForShareSkipLockedStr = " for share skip locked" + ShareModeStr = " lock in share mode" // Select.Cache SQLCacheStr = "sql_cache " @@ -466,6 +471,11 @@ const ( NoLock Lock = iota ForUpdateLock ShareModeLock + ForShareLock + ForShareLockNoWait + ForShareLockSkipLocked + ForUpdateLockNoWait + ForUpdateLockSkipLocked ) // Constants for Enum Type - TrimType diff --git a/go/vt/sqlparser/keywords.go b/go/vt/sqlparser/keywords.go index 54cf96c5011..6152b0ed527 100644 --- a/go/vt/sqlparser/keywords.go +++ b/go/vt/sqlparser/keywords.go @@ -404,6 +404,7 @@ var keywords = []keyword{ {"localtimestamp", LOCALTIMESTAMP}, {"locate", LOCATE}, {"lock", LOCK}, + {"locked", LOCKED}, {"logs", LOGS}, {"long", UNUSED}, {"longblob", LONGBLOB}, @@ -448,6 +449,7 @@ var keywords = []keyword{ {"none", NONE}, {"not", NOT}, {"now", NOW}, + {"nowait", NOWAIT}, {"no_write_to_binlog", NO_WRITE_TO_BINLOG}, {"nth_value", NTH_VALUE}, {"ntile", NTILE}, @@ -563,6 +565,7 @@ var keywords = []keyword{ {"signal", UNUSED}, {"signed", SIGNED}, {"simple", SIMPLE}, + {"skip", SKIP}, {"slow", SLOW}, {"smallint", SMALLINT}, {"snapshot", SNAPSHOT}, diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 89113f61836..d5acbbc2092 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -371,8 +371,18 @@ var ( input: "select /* distinct */ distinct 1 from t", }, { input: "select /* straight_join */ straight_join 1 from t", + }, { + input: "select /* for share */ 1 from t for share", + }, { + input: "select /* for share */ 1 from t for share nowait", + }, { + input: "select /* for share */ 1 from t for share skip locked", }, { input: "select /* for update */ 1 from t for update", + }, { + input: "select /* for update */ 1 from t for update nowait", + }, { + input: "select /* for update */ 1 from t for update skip locked", }, { input: "select /* lock in share mode */ 1 from t lock in share mode", }, { diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 97bfdc33834..3824c0b981b 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -1381,7 +1381,7 @@ var yyExca = [...]int{ 241, 805, -2, 803, -1, 118, - 238, 1457, + 238, 1462, -2, 131, -1, 120, 1, 158, @@ -1397,76 +1397,76 @@ var yyExca = [...]int{ 345, 165, -2, 529, -1, 810, - 87, 1474, + 87, 1479, -2, 1328, -1, 811, - 87, 1475, - 221, 1479, + 87, 1480, + 221, 1484, -2, 1329, -1, 812, - 221, 1478, + 221, 1483, -2, 40, -1, 892, 60, 879, -2, 894, - -1, 978, + -1, 979, 249, 41, 254, 41, -2, 416, - -1, 1063, + -1, 1064, 1, 577, 665, 577, -2, 165, - -1, 1362, - 221, 1479, + -1, 1363, + 221, 1484, -2, 1329, - -1, 1510, + -1, 1511, 60, 880, -2, 899, - -1, 1511, + -1, 1512, 60, 881, -2, 900, - -1, 1562, + -1, 1567, 135, 165, 176, 165, 345, 165, -2, 455, - -1, 1643, + -1, 1648, 136, 405, 244, 405, -2, 509, - -1, 1652, + -1, 1657, 249, 42, 254, 42, -2, 417, - -1, 2011, - 221, 1483, - -2, 1477, - -1, 2012, - 221, 1479, - -2, 1475, - -1, 2112, + -1, 2016, + 221, 1488, + -2, 1482, + -1, 2017, + 221, 1484, + -2, 1480, + -1, 2119, 135, 165, 176, 165, 345, 165, -2, 456, - -1, 2119, + -1, 2126, 26, 186, -2, 188, - -1, 2486, + -1, 2493, 78, 96, 88, 96, -2, 958, - -1, 2555, + -1, 2562, 640, 693, -2, 667, - -1, 2722, - 50, 1425, - -2, 1419, - -1, 3375, + -1, 2729, + 50, 1430, + -2, 1424, + -1, 3382, 640, 693, -2, 681, - -1, 3464, + -1, 3471, 90, 625, 95, 625, 105, 625, @@ -1512,1029 +1512,1267 @@ var yyExca = [...]int{ 217, 625, 218, 625, 219, 625, - -2, 1836, + -2, 1841, } const yyPrivate = 57344 -const yyLast = 47659 +const yyLast = 48056 var yyAct = [...]int{ - 1518, 821, 3537, 3123, 3548, 3122, 813, 3356, 3441, 814, - 3124, 3505, 3462, 684, 3506, 2950, 3093, 1565, 1878, 3406, - 1771, 2060, 1129, 2872, 3429, 2040, 2774, 2781, 3340, 3288, - 2832, 3338, 2837, 2834, 2833, 2831, 2836, 2835, 1824, 2823, - 2735, 5, 3080, 2738, 2109, 781, 885, 3328, 3152, 2183, - 2420, 2459, 2386, 2851, 2681, 666, 2739, 2736, 2989, 2042, - 1525, 3157, 2852, 775, 774, 694, 2789, 2064, 663, 2983, - 2616, 2080, 3009, 2854, 2733, 2446, 2723, 2002, 2975, 2171, - 2552, 1075, 2146, 2471, 2520, 2878, 2600, 1621, 2151, 940, - 2214, 2521, 159, 2522, 2083, 1127, 2097, 664, 2452, 2438, - 662, 1999, 1972, 2084, 41, 39, 2422, 1874, 1973, 1893, - 2592, 2085, 1104, 2192, 1650, 1832, 145, 908, 2170, 2072, - 2231, 2153, 2513, 973, 968, 1554, 986, 2488, 1534, 1668, - 1374, 2087, 96, 909, 1492, 887, 676, 1512, 1851, 1897, - 1302, 1657, 1287, 947, 944, 976, 1767, 979, 2168, 776, - 1749, 2142, 2143, 1553, 974, 948, 671, 1010, 975, 926, - 1539, 899, 659, 928, 1358, 1334, 1823, 896, 1969, 95, - 81, 1125, 780, 103, 100, 40, 101, 1118, 1776, 163, - 1616, 2065, 123, 121, 1642, 128, 122, 897, 895, 894, - 129, 1059, 921, 102, 80, 653, 670, 2007, 1378, 1382, - 3365, 2545, 94, 3538, 3081, 2, 89, 2185, 2186, 2187, - 2185, 2820, 3391, 2575, 2574, 2229, 2543, 916, 920, 3073, - 1734, 1488, 632, 3489, 2608, 3036, 2609, 3387, 902, 91, - 124, 91, 638, 1839, 3127, 1838, 130, 1837, 3392, 941, - 598, 91, 1836, 1015, 2037, 2038, 1835, 1834, 107, 108, - 109, 1303, 112, 1807, 889, 118, 893, 3386, 187, 990, - 1854, 593, 656, 966, 657, 654, 903, 912, 3483, 935, - 918, 918, 651, 652, 886, 911, 888, 2274, 989, 1298, - 3127, 1023, 881, 882, 883, 884, 2418, 2719, 892, 1303, - 2842, 1519, 2565, 658, 936, 2008, 3509, 1016, 1019, 1020, - 124, 1906, 2448, 964, 963, 1012, 965, 962, 952, 910, - 957, 2685, 830, 831, 832, 3558, 923, 924, 1029, 1030, - 1031, 3126, 1034, 1035, 1036, 1037, 1319, 186, 1040, 1041, - 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, - 1052, 1053, 1054, 1055, 1056, 1032, 2840, 934, 778, 779, - 3493, 125, 3472, 147, 830, 831, 832, 3504, 3387, 1313, - 2218, 3442, 3528, 2955, 168, 3491, 2954, 3126, 124, 2842, - 3470, 2216, 2846, 2568, 3341, 3492, 2387, 1844, 2897, 3476, - 3477, 3284, 2839, 3283, 2162, 1014, 3086, 2791, 2792, 3087, - 3490, 632, 1013, 3519, 3471, 158, 632, 1313, 3294, 3487, - 3105, 146, 1289, 186, 2217, 82, 3094, 2156, 82, 3430, - 82, 91, 3438, 2211, 2548, 3370, 82, 2283, 3293, 84, - 165, 1883, 3467, 166, 3104, 2840, 2917, 125, 1631, 147, - 2582, 2583, 633, 1111, 2462, 1113, 3448, 1555, 2068, 1556, - 168, 2419, 134, 135, 157, 156, 185, 2497, 2771, 2772, - 2496, 2846, 2039, 2498, 3170, 961, 2770, 1068, 1069, 2463, - 2607, 1316, 1062, 1317, 1318, 1309, 2104, 2105, 1301, 1816, - 1817, 158, 2280, 1110, 1112, 2591, 2103, 146, 3448, 934, - 778, 779, 2281, 91, 2843, 3510, 91, 1094, 91, 1071, - 879, 1299, 1122, 878, 91, 2790, 165, 956, 1058, 166, - 958, 1288, 2546, 1309, 3357, 1082, 3511, 2793, 1099, 1100, - 1083, 1082, 1095, 959, 2509, 2986, 1083, 1088, 1644, 1645, - 157, 156, 185, 632, 1081, 2650, 1080, 2122, 2121, 2455, - 2456, 2905, 2874, 632, 2275, 2276, 2278, 2277, 2903, 632, - 646, 2272, 1815, 1819, 650, 151, 132, 154, 139, 131, - 1551, 152, 153, 644, 2155, 2879, 2593, 2578, 169, 1496, - 2232, 2193, 3316, 2843, 3317, 2553, 3540, 175, 140, 1750, - 2867, 927, 632, 1115, 1033, 1097, 1098, 1108, 2868, 1120, - 1103, 1109, 143, 141, 136, 137, 138, 142, 2252, 1724, - 2253, 1114, 2254, 1064, 133, 2595, 3075, 3074, 961, 3484, - 953, 633, 2237, 144, 1096, 1121, 633, 955, 954, 1089, - 1101, 2255, 1039, 1038, 2068, 1107, 2236, 961, 1057, 2876, - 1102, 151, 1646, 154, 2875, 1643, 2234, 152, 153, 186, - 2066, 2067, 3268, 1725, 169, 1726, 3071, 999, 960, 988, - 969, 997, 2196, 175, 970, 1335, 2244, 2240, 2242, 2243, - 2241, 2245, 2246, 125, 2684, 3131, 959, 2238, 2235, 2081, - 970, 1755, 1499, 937, 931, 929, 168, 2894, 1336, 1337, - 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, 1008, - 1007, 1078, 1061, 1084, 1085, 1086, 1087, 1006, 1005, 2793, - 2651, 160, 1004, 186, 1003, 1002, 1308, 1305, 1306, 1307, - 1312, 1314, 1311, 1001, 1310, 996, 1349, 1123, 1124, 2502, - 1635, 1009, 1349, 945, 1304, 945, 3559, 125, 982, 943, - 2281, 3516, 165, 1656, 945, 166, 967, 3364, 2544, 3552, - 168, 1116, 981, 633, 1308, 1305, 1306, 1307, 1312, 1314, - 1311, 987, 1310, 633, 1768, 922, 991, 981, 185, 633, - 3070, 993, 1304, 2599, 1370, 994, 992, 2596, 1018, 2423, - 2425, 1025, 2222, 1280, 981, 2169, 2580, 160, 1017, 155, - 1352, 1353, 1354, 1355, 1552, 827, 995, 827, 2215, 2511, - 1366, 960, 633, 2221, 1000, 1060, 165, 827, 998, 166, - 1764, 1092, 2612, 1290, 2547, 937, 931, 929, 2295, 1026, - 960, 2813, 1281, 1282, 2577, 1629, 2066, 2067, 1628, 3475, - 2563, 2987, 185, 988, 1627, 1356, 3444, 2159, 2567, 1765, - 1625, 597, 592, 1320, 2590, 3125, 2213, 2589, 988, 1360, - 148, 1655, 3485, 149, 1736, 1735, 1737, 1738, 1739, 3034, - 3035, 1350, 1351, 3353, 3023, 155, 3005, 1754, 3443, 2493, - 2458, 2395, 1375, 3474, 1886, 1543, 85, 2160, 3444, 3103, - 169, 1451, 2566, 161, 2158, 1073, 120, 2453, 2110, 175, - 173, 3125, 988, 1297, 1758, 930, 1756, 1757, 1349, 1759, - 1760, 1346, 2769, 905, 2602, 1907, 1119, 2844, 2845, 2601, - 3443, 3378, 1380, 1011, 1381, 1520, 1522, 1384, 2161, 1908, - 2848, 1077, 1067, 1079, 1070, 2282, 148, 90, 2157, 149, - 90, 181, 90, 1105, 1777, 987, 115, 2602, 90, 3066, - 2999, 2636, 2601, 2233, 169, 2939, 2424, 1828, 1761, 1557, - 987, 1898, 1487, 175, 2536, 1503, 981, 984, 985, 161, - 945, 3520, 3166, 1319, 978, 982, 173, 1898, 3550, 2312, - 1318, 3551, 3041, 3549, 162, 167, 164, 170, 171, 172, - 174, 176, 177, 178, 179, 977, 2844, 2845, 1319, 3040, - 180, 182, 183, 184, 987, 2200, 1024, 1317, 1318, 2848, - 1021, 1665, 1457, 1458, 1459, 1460, 1461, 181, 116, 1664, - 2210, 1654, 988, 160, 1091, 1751, 1487, 1752, 1856, 1486, - 1753, 2208, 999, 1500, 997, 1093, 2205, 930, 3560, 3408, - 1493, 3512, 1857, 1347, 1348, 1855, 2895, 2205, 1480, 3024, - 2212, 901, 3346, 1504, 1744, 1505, 103, 100, 1905, 101, - 162, 167, 164, 170, 171, 172, 174, 176, 177, 178, - 179, 1846, 1848, 1849, 1076, 2209, 180, 182, 183, 184, - 1319, 1742, 3524, 1519, 3409, 1063, 2207, 160, 3554, 1502, - 1106, 1778, 3276, 1506, 1521, 1847, 1648, 3347, 3100, 889, - 3101, 3275, 2339, 1490, 1319, 3266, 1535, 2004, 1316, 3116, - 1317, 1318, 886, 3115, 1319, 2309, 1524, 2638, 1743, 1641, - 3048, 888, 3047, 1501, 987, 3561, 1773, 1507, 3037, 991, - 981, 1660, 1719, 1316, 993, 1317, 1318, 1319, 994, 992, - 1701, 1658, 1658, 1623, 2821, 1741, 1548, 1549, 988, 2287, - 2288, 2289, 1335, 1632, 1633, 1634, 1670, 1659, 1671, 2809, - 1673, 1675, 2518, 1319, 1679, 1681, 1683, 1685, 1687, 1662, - 830, 831, 832, 1624, 2351, 1336, 1337, 1338, 1339, 1340, - 1341, 1342, 1344, 1343, 1345, 1346, 1638, 1639, 2308, 1651, - 1519, 2517, 1637, 1630, 2516, 161, 1697, 1903, 3297, 1700, - 1781, 1702, 173, 1731, 2165, 1745, 1904, 1785, 1319, 1787, - 1788, 1789, 1790, 1729, 1728, 1316, 1794, 1317, 1318, 1727, - 1709, 1710, 1519, 1779, 1780, 1717, 1715, 1716, 1806, 1341, - 1342, 1344, 1343, 1345, 1346, 1947, 1711, 1784, 1705, 1316, - 1708, 1317, 1318, 181, 1791, 1792, 1793, 1769, 3514, 1316, - 987, 1317, 1318, 1707, 1319, 2871, 981, 984, 985, 161, - 945, 1706, 1677, 638, 978, 982, 173, 1730, 3031, 638, - 1775, 1284, 1316, 124, 1317, 1318, 964, 963, 2073, 2074, - 962, 2500, 638, 2181, 2180, 1551, 162, 167, 164, 170, - 171, 172, 174, 176, 177, 178, 179, 97, 1316, 1783, - 1317, 1318, 180, 182, 183, 184, 3513, 181, 98, 2617, - 2179, 2178, 1319, 2177, 2176, 1528, 1804, 2444, 3539, 1319, - 3500, 1519, 1519, 1805, 1939, 1928, 1929, 1930, 1931, 1941, - 1932, 1933, 1934, 1946, 1942, 1935, 1936, 1943, 1944, 1945, - 1937, 1938, 1940, 1316, 3373, 1317, 1318, 1335, 1319, 2611, - 162, 167, 164, 170, 171, 172, 174, 176, 177, 178, - 179, 1529, 3372, 1519, 1315, 1519, 180, 182, 183, 184, - 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, - 1346, 2004, 1881, 1881, 3350, 2001, 1319, 1879, 1879, 1316, - 3349, 1317, 1318, 2619, 2003, 3348, 1335, 3361, 3366, 1331, - 1882, 1332, 2349, 3522, 1519, 2912, 1852, 3271, 825, 3255, - 1901, 3254, 1315, 1519, 1902, 1333, 1347, 1348, 1330, 1336, - 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, - 3165, 1859, 3018, 1861, 1862, 1863, 1864, 1865, 1866, 1867, - 1868, 1869, 1870, 1871, 1872, 1873, 3163, 1316, 1965, 1317, - 1318, 97, 3112, 1850, 1316, 3302, 1317, 1318, 99, 2444, - 3437, 1860, 98, 2629, 2628, 2627, 1485, 1484, 2621, 1483, - 2625, 1519, 2620, 3045, 2618, 3030, 1997, 2444, 3416, 2623, - 2880, 1812, 1813, 1316, 2877, 1317, 1318, 106, 2622, 2444, - 3412, 81, 2812, 1829, 81, 2811, 40, 1853, 105, 40, - 104, 2026, 2010, 2527, 2011, 1487, 2624, 2626, 1840, 1841, - 1842, 1843, 1961, 3399, 1519, 3084, 3363, 1519, 1520, 2033, - 2514, 1316, 1482, 1317, 1318, 3279, 1519, 1858, 1336, 1337, - 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, 1360, - 2227, 2000, 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, - 1345, 1346, 2057, 2226, 1885, 2063, 1899, 1887, 1888, 2444, - 3267, 3301, 1890, 2045, 918, 918, 1895, 1808, 1519, 3259, - 1900, 1774, 1486, 3084, 1519, 2444, 3082, 2009, 2205, 1519, - 3003, 1519, 3258, 1913, 1914, 1915, 1916, 1917, 1918, 1919, - 1920, 1921, 1922, 1740, 2078, 1732, 2011, 1948, 1949, 1950, - 1951, 1952, 1953, 1955, 1722, 1960, 1718, 1962, 1963, 1964, - 1714, 1966, 1967, 1968, 1713, 1974, 1975, 1976, 1977, 1978, - 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, - 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1712, 1998, - 2119, 2005, 2006, 918, 1530, 918, 918, 918, 918, 918, - 100, 2050, 101, 2051, 2166, 2018, 2019, 2020, 2021, 2022, - 2023, 2024, 2025, 1959, 2027, 2028, 2029, 2030, 2031, 2009, - 100, 99, 101, 1970, 2128, 2129, 2130, 2131, 1117, 1319, - 2056, 2014, 2015, 2114, 902, 2113, 3092, 2032, 2123, 2554, - 2124, 2125, 2126, 2127, 2044, 2095, 2532, 1892, 1894, 2360, - 1519, 2118, 918, 2802, 2801, 2460, 2134, 2135, 2136, 2137, - 2799, 2800, 2797, 2798, 2998, 2058, 1315, 2117, 1909, 1910, - 1911, 1912, 2797, 2796, 2069, 2070, 2468, 1519, 2148, 2154, - 1519, 2076, 1923, 2281, 2576, 2489, 2101, 935, 1620, 2557, - 2100, 2034, 2194, 2460, 2099, 2550, 2551, 1970, 2116, 3000, - 2108, 2091, 2115, 1339, 1340, 1341, 1342, 1344, 1343, 1345, - 1346, 828, 936, 2004, 3263, 2440, 829, 2191, 2489, 2444, - 2443, 2164, 2305, 1519, 1319, 105, 1880, 2468, 2013, 2206, - 99, 2016, 2017, 1323, 1324, 1325, 1326, 1327, 1328, 1329, - 1321, 2149, 2138, 2140, 2141, 2145, 2300, 2764, 2490, 2199, - 1884, 1519, 2202, 990, 2203, 2167, 2163, 2281, 2492, 2175, - 2734, 2150, 3404, 1658, 1316, 2998, 1317, 1318, 1620, 1619, - 2219, 2998, 989, 1319, 1563, 1562, 2149, 2198, 2201, 2197, - 1319, 2490, 3377, 2444, 1319, 2055, 2468, 2205, 2305, 1319, - 2467, 2281, 2959, 2223, 1315, 2220, 3049, 2224, 2225, 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, 865, - 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, - 876, 2265, 2266, 2230, 2799, 2468, 2268, 3050, 3051, 3052, - 2707, 2102, 2824, 2305, 1319, 2269, 2360, 3454, 1519, 1316, - 2336, 1317, 1318, 2335, 3452, 1519, 2298, 2205, 3450, 1519, - 2303, 2188, 1319, 2306, 3067, 2307, 2071, 1523, 2035, 1884, - 2314, 1852, 1830, 2347, 2316, 2317, 2318, 2010, 1814, 2011, - 1763, 1550, 2258, 972, 2324, 2325, 2326, 2327, 2328, 2329, - 2330, 2331, 2332, 2333, 971, 2291, 891, 2293, 1316, 91, - 1317, 1318, 3480, 3419, 3290, 1316, 2777, 1317, 1318, 1316, - 1526, 1317, 1318, 3256, 1316, 3177, 1317, 1318, 3065, 3062, - 2340, 2341, 2342, 2343, 2344, 2292, 2346, 2271, 3325, 1519, - 2348, 3043, 2922, 2921, 2353, 2354, 1622, 2355, 1693, 2147, - 2358, 2279, 2359, 2869, 2826, 2524, 2362, 1519, 2822, 2558, - 2366, 2778, 2299, 1319, 2371, 2372, 2373, 2374, 2144, 2139, - 2133, 2523, 1853, 2132, 2290, 1747, 1653, 2385, 1319, 2388, - 2389, 1649, 1319, 1618, 91, 2780, 117, 2391, 2393, 1316, - 3053, 1317, 1318, 1062, 2396, 2397, 2398, 2399, 2400, 1694, - 1695, 1696, 2873, 2775, 3291, 2407, 2408, 1316, 2409, 1317, - 1318, 2412, 2414, 2057, 2297, 2416, 2311, 2162, 1319, 2524, - 2791, 2792, 2048, 1319, 3534, 2428, 3532, 2776, 1881, 106, - 3507, 1689, 3385, 1879, 3010, 3011, 3016, 3054, 3055, 3056, - 105, 2313, 104, 1810, 1335, 2429, 2294, 3323, 1519, 1319, - 3311, 99, 2320, 2321, 2322, 2323, 2302, 1319, 3013, 2818, - 2782, 1335, 3320, 1519, 1319, 2345, 2301, 1336, 1337, 1338, - 1339, 1340, 1341, 1342, 1344, 1343, 1345, 1346, 1690, 1691, - 1692, 2817, 1319, 2427, 1336, 1337, 1338, 1339, 1340, 1341, - 1342, 1344, 1343, 1345, 1346, 2816, 3015, 1375, 1316, 2464, - 1317, 1318, 3306, 1519, 2430, 1811, 2432, 2969, 2319, 2734, - 1519, 2445, 1319, 1316, 2537, 1317, 1318, 1316, 2259, 1317, - 1318, 3147, 1319, 3146, 2756, 2334, 1319, 2054, 2790, 2757, - 2754, 2753, 2752, 2974, 1519, 2755, 3381, 1517, 1513, 1319, - 2793, 2967, 1519, 3292, 2062, 1319, 2454, 1493, 2964, 1519, - 2417, 1527, 1514, 1316, 3004, 1317, 1318, 2712, 1316, 2711, - 1317, 1318, 2991, 3156, 2483, 3345, 2962, 1519, 2437, 3158, - 2990, 3145, 2510, 2512, 2441, 1487, 2442, 2052, 2053, 1516, - 2457, 1515, 2994, 2721, 1316, 2503, 1317, 1318, 1762, 877, - 2487, 2549, 1316, 2795, 1317, 1318, 2927, 1519, 2507, 1316, - 1319, 1317, 1318, 2528, 2491, 1319, 2910, 1519, 2494, 1028, - 2415, 1519, 2154, 1027, 1535, 97, 2501, 1316, 2504, 1317, - 1318, 1319, 99, 2413, 1519, 2888, 98, 1319, 2523, 2392, - 1519, 906, 811, 40, 1319, 2758, 2515, 2477, 2478, 907, - 2605, 1319, 2482, 1283, 1907, 2484, 1319, 1316, 2573, 1317, - 1318, 2996, 1532, 2564, 2525, 99, 2779, 1316, 1908, 1317, - 1318, 1316, 1319, 1317, 1318, 125, 2533, 97, 2534, 1319, - 3546, 2538, 2539, 2540, 1316, 2814, 1317, 1318, 98, 1319, - 1316, 2570, 1317, 1318, 2965, 1641, 191, 2073, 2074, 191, - 2519, 2262, 643, 2526, 3459, 2559, 2560, 649, 2529, 2530, - 2640, 2641, 2642, 2643, 2644, 2375, 1519, 3362, 191, 3286, - 2794, 2367, 1519, 2569, 2481, 2724, 2726, 2059, 1531, 2649, - 914, 915, 2251, 191, 2727, 2937, 2710, 2250, 2249, 2248, - 2933, 1319, 2247, 2976, 2709, 1316, 2285, 1317, 1318, 104, - 1316, 2594, 1317, 1318, 3333, 2615, 2919, 105, 649, 191, - 649, 2571, 2630, 2918, 2597, 106, 1316, 2603, 1317, 1318, - 2604, 2645, 1316, 2915, 1317, 1318, 105, 3153, 104, 1316, - 3332, 1317, 1318, 2614, 106, 2613, 1316, 99, 1317, 1318, - 3314, 1316, 3164, 1317, 1318, 105, 2984, 104, 3162, 1319, - 2631, 3161, 3154, 3063, 2995, 2633, 2993, 1316, 2827, 1317, - 1318, 2189, 1636, 1319, 1316, 3135, 1317, 1318, 106, 913, - 2460, 3536, 3535, 3, 1316, 2411, 1317, 1318, 2440, 105, - 2652, 2337, 2686, 2046, 1544, 1536, 2688, 110, 111, 2610, - 3535, 2783, 3536, 3351, 2000, 2787, 2000, 2654, 3029, 904, - 1827, 1825, 2786, 10, 9, 93, 2743, 1826, 918, 2660, - 8, 2634, 2635, 1, 1286, 2637, 1285, 3033, 2639, 2670, - 2671, 2672, 2673, 2674, 2761, 3469, 1316, 610, 1317, 1318, - 2714, 2691, 2687, 2410, 2689, 2036, 2788, 1491, 2646, 2647, - 2648, 2784, 3508, 3465, 3466, 1733, 2785, 2406, 2746, 2740, - 2653, 1723, 2763, 2655, 2656, 2657, 1773, 3095, 1971, 2658, - 2659, 3287, 2830, 1974, 2661, 2195, 2632, 2663, 2702, 3061, - 2665, 2666, 2667, 2668, 2152, 2715, 980, 2713, 2669, 1974, - 1974, 1974, 1974, 1974, 1316, 150, 1317, 1318, 2728, 2729, - 2703, 2704, 2705, 2111, 2691, 2112, 2706, 918, 1316, 3432, - 1317, 1318, 114, 2759, 2692, 2693, 2694, 2695, 2696, 2697, - 895, 894, 2747, 2698, 2699, 2750, 2700, 2731, 2701, 2716, - 2850, 2748, 2749, 2765, 2751, 2662, 2766, 2664, 938, 2767, - 113, 983, 2690, 1090, 2190, 2773, 2745, 3085, 2508, 2120, - 1569, 1567, 1568, 2675, 2676, 2677, 2678, 1566, 1571, 1570, - 2804, 2890, 2737, 2091, 2806, 2805, 100, 2737, 101, 2896, - 2338, 2938, 1818, 2732, 645, 2480, 639, 188, 1558, 2857, - 2858, 2907, 2908, 2909, 1319, 2911, 2913, 2154, 893, 1319, - 2828, 2091, 2091, 2091, 2091, 2091, 2849, 1537, 2762, 2920, - 2864, 1319, 2951, 1022, 2924, 2925, 2926, 2928, 2929, 2930, - 2931, 2091, 600, 2932, 2091, 2934, 2935, 2936, 1319, 2803, - 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, - 2881, 2807, 2808, 2884, 2883, 2886, 2887, 2228, 2956, 1319, - 606, 2960, 1367, 2961, 2963, 1319, 2966, 2968, 1809, 2970, - 2971, 2972, 2973, 2829, 2901, 2898, 2899, 2979, 2900, 2825, - 2892, 2902, 2891, 2904, 2708, 2906, 2495, 933, 2405, 925, - 1319, 2047, 2431, 2404, 932, 1319, 3264, 2742, 2988, 2720, - 1319, 2722, 2447, 2725, 2953, 2403, 1319, 2718, 3344, 3155, - 3417, 2957, 3001, 3002, 2505, 1533, 3006, 2958, 2310, 1896, - 1319, 1357, 2402, 2088, 1319, 3130, 2473, 2476, 2477, 2478, - 2474, 1845, 2475, 2479, 668, 2982, 3010, 3011, 667, 1316, - 1319, 1317, 1318, 2401, 1316, 665, 1317, 1318, 2433, 2390, - 2461, 1322, 815, 2977, 2978, 2980, 1316, 2421, 1317, 1318, - 1545, 2472, 1319, 2470, 2985, 2469, 1319, 2260, 3007, 2992, - 2096, 2914, 3012, 1316, 2384, 1317, 1318, 3008, 3461, 2383, - 2997, 2090, 1319, 2086, 2382, 2923, 2439, 3021, 3022, 766, - 2381, 3017, 765, 3014, 1316, 1319, 1317, 1318, 677, 669, - 1316, 1319, 1317, 1318, 2380, 3019, 1319, 661, 2379, 764, - 763, 2857, 2858, 3027, 1319, 191, 3026, 191, 3068, 3069, - 191, 3028, 3083, 2856, 2378, 1316, 1319, 1317, 1318, 3020, - 1316, 3445, 1317, 1318, 3044, 1316, 3046, 1317, 1318, 3089, - 3090, 1316, 2579, 1317, 1318, 2870, 2377, 1319, 2581, 2506, - 2376, 649, 2866, 649, 649, 1316, 1319, 1317, 1318, 1316, - 1300, 1317, 1318, 1319, 3102, 1509, 2370, 3106, 655, 951, - 2893, 3368, 2284, 649, 191, 1316, 2916, 1317, 1318, 2369, - 2473, 2476, 2477, 2478, 2474, 2368, 2475, 2479, 1508, 1926, - 2365, 1927, 3375, 1319, 3117, 2838, 3091, 1316, 2364, 1317, - 1318, 1316, 1362, 1317, 1318, 3079, 2819, 2091, 2555, 3121, - 2363, 2182, 66, 44, 3339, 3038, 3039, 1316, 3405, 1317, - 1318, 3129, 762, 759, 3132, 3133, 1319, 3134, 2682, 3136, - 1316, 2361, 1317, 1318, 2683, 3388, 1316, 3107, 1317, 1318, - 2357, 1316, 3389, 1317, 1318, 758, 3390, 2356, 1954, 1316, - 1296, 1317, 1318, 1293, 3482, 3064, 1820, 92, 35, 34, - 33, 1316, 32, 1317, 1318, 31, 25, 24, 3072, 23, - 22, 21, 3076, 3077, 3078, 3150, 28, 2352, 20, 19, - 3128, 18, 1316, 2841, 1317, 1318, 3503, 3545, 3088, 1319, - 1881, 1316, 119, 1317, 1318, 1879, 53, 50, 1316, 48, - 1317, 1318, 127, 126, 3111, 51, 47, 3179, 1065, 45, - 2350, 3171, 30, 29, 17, 16, 2740, 3160, 3173, 3159, - 2740, 15, 3151, 14, 3175, 13, 3167, 3169, 1316, 12, - 1317, 1318, 11, 7, 1517, 1513, 6, 38, 37, 27, - 36, 3180, 3181, 3108, 1362, 3109, 26, 4, 3110, 1514, - 3278, 3113, 3114, 1319, 2542, 3183, 2184, 3265, 0, 3285, - 3118, 1316, 0, 1317, 1318, 0, 0, 0, 0, 0, - 3120, 0, 0, 2315, 1510, 1511, 1516, 0, 1515, 3295, - 3296, 0, 3298, 3262, 3299, 3300, 3261, 3269, 3260, 3303, - 3304, 3305, 3137, 3307, 3310, 3138, 3308, 3139, 3140, 1881, - 3141, 191, 3142, 3309, 1879, 649, 649, 3143, 3277, 3319, - 3321, 3322, 3324, 3326, 3327, 3329, 3312, 3282, 2737, 3281, - 0, 191, 0, 0, 1316, 3119, 1317, 1318, 0, 0, - 0, 0, 3168, 0, 0, 0, 0, 2304, 0, 0, - 0, 649, 0, 3176, 191, 40, 3178, 3313, 0, 0, - 0, 0, 0, 3359, 0, 0, 649, 3315, 3182, 0, - 3289, 3318, 191, 0, 0, 0, 3334, 3335, 0, 3355, - 3337, 3336, 0, 0, 0, 0, 3257, 0, 0, 0, - 0, 0, 0, 0, 3352, 0, 2740, 0, 1316, 0, - 1317, 1318, 0, 0, 0, 0, 0, 3358, 0, 649, - 0, 3272, 3273, 3274, 0, 0, 0, 0, 0, 0, - 0, 0, 1362, 0, 0, 0, 0, 0, 649, 649, - 0, 649, 0, 649, 649, 0, 649, 649, 649, 649, - 649, 649, 0, 0, 0, 0, 0, 0, 0, 1362, - 0, 0, 1362, 649, 1362, 191, 0, 0, 3360, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3354, 0, 191, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 649, 3384, - 191, 0, 3379, 0, 3367, 0, 3342, 0, 0, 0, - 0, 0, 3374, 0, 649, 3376, 191, 0, 0, 3400, - 0, 0, 3371, 0, 0, 3401, 3402, 0, 0, 0, - 0, 0, 191, 0, 0, 0, 0, 0, 0, 191, - 0, 0, 0, 0, 0, 0, 0, 3413, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 649, 3394, 3403, - 0, 3395, 0, 0, 0, 0, 3343, 0, 0, 0, - 0, 0, 0, 3439, 3440, 0, 0, 0, 0, 0, - 0, 0, 3410, 0, 0, 0, 0, 3449, 3451, 3453, - 3446, 3418, 0, 0, 3447, 3420, 3423, 3431, 3428, 3425, - 3424, 3422, 3427, 3426, 0, 0, 0, 0, 0, 0, - 0, 0, 3481, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3457, 0, 0, 0, 0, 0, 3460, - 0, 0, 0, 3478, 3468, 3473, 0, 0, 0, 0, - 0, 3488, 3446, 0, 0, 0, 3447, 0, 0, 40, - 3382, 3486, 3499, 0, 0, 0, 0, 0, 0, 826, - 0, 0, 83, 3289, 3434, 0, 3415, 0, 3497, 0, - 0, 3502, 0, 3396, 0, 0, 3397, 0, 3398, 0, - 0, 0, 0, 0, 0, 3521, 3523, 3525, 0, 0, - 0, 2737, 3515, 3518, 0, 1881, 3517, 0, 1773, 0, - 1879, 0, 0, 3527, 3526, 0, 0, 1370, 3533, 0, - 3531, 0, 3530, 0, 0, 0, 0, 3544, 3383, 3541, - 3446, 0, 649, 649, 3447, 40, 3393, 0, 3547, 0, - 0, 3553, 3555, 3556, 3557, 649, 0, 3529, 0, 0, - 638, 890, 0, 83, 191, 0, 0, 0, 0, 0, - 1881, 0, 0, 0, 0, 1879, 3564, 3565, 3563, 0, - 0, 0, 890, 0, 3309, 0, 0, 3562, 0, 0, - 0, 0, 3479, 0, 0, 0, 0, 950, 0, 0, - 0, 0, 0, 0, 632, 0, 0, 0, 0, 0, - 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1362, 3494, 0, 3495, 0, 3496, 0, 0, - 0, 0, 0, 649, 0, 0, 0, 0, 0, 1362, - 0, 0, 0, 0, 0, 0, 629, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 649, 649, 0, 0, 0, 0, + 1519, 821, 3130, 3131, 813, 1883, 3129, 3544, 3555, 3363, + 814, 684, 3448, 3512, 2116, 3513, 2957, 3469, 1570, 2065, + 1130, 1776, 3413, 3100, 3436, 2879, 2781, 2788, 663, 3295, + 3347, 909, 2045, 2839, 2844, 2841, 2840, 780, 2830, 2838, + 40, 1128, 2843, 1829, 2742, 2842, 5, 3345, 3087, 885, + 2745, 3159, 2047, 776, 2796, 3335, 2393, 2427, 2688, 2858, + 1526, 666, 2746, 2190, 2996, 2743, 3164, 2990, 2071, 2859, + 2623, 775, 1011, 774, 1489, 694, 2466, 781, 2861, 2090, + 3016, 2087, 2740, 2982, 2453, 664, 2007, 2527, 2730, 2153, + 2885, 662, 2178, 2158, 2607, 2528, 1626, 2529, 2559, 2104, + 2221, 941, 2478, 2092, 41, 2459, 910, 887, 2091, 1513, + 159, 2445, 2429, 39, 1898, 1977, 1978, 1105, 1673, 889, + 2004, 893, 2012, 2599, 2177, 2079, 1655, 145, 2238, 1837, + 2160, 2520, 969, 1559, 2495, 1539, 96, 676, 2094, 1375, + 912, 1493, 1902, 2199, 974, 1076, 658, 100, 101, 1856, + 1754, 1303, 2175, 1288, 1662, 949, 977, 975, 1772, 948, + 2149, 976, 2072, 671, 899, 945, 1544, 1558, 2150, 980, + 2013, 927, 929, 1879, 1974, 95, 1359, 103, 1335, 1828, + 896, 1126, 1119, 81, 1911, 1781, 1621, 128, 895, 129, + 163, 123, 121, 122, 1060, 897, 102, 894, 670, 89, + 987, 80, 1383, 653, 922, 1379, 94, 3372, 2552, 3545, + 1647, 2192, 2193, 2194, 2192, 3088, 2827, 2582, 2581, 2236, + 1013, 598, 917, 921, 2550, 1739, 3080, 91, 1304, 3496, + 3043, 91, 902, 1030, 1031, 1032, 2849, 1035, 1036, 1037, + 1038, 124, 3398, 1041, 1042, 1043, 1044, 1045, 1046, 1047, + 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, + 942, 1016, 130, 632, 2615, 830, 831, 832, 3399, 91, + 2616, 3134, 903, 654, 3394, 937, 936, 886, 1304, 3393, + 638, 1844, 3134, 888, 2, 2042, 2043, 966, 1859, 990, + 1843, 1842, 2847, 2849, 1841, 1840, 830, 831, 832, 935, + 778, 779, 911, 1839, 967, 1812, 2846, 2281, 1017, 1020, + 1021, 124, 965, 964, 963, 656, 1299, 657, 2853, 2425, + 186, 2726, 2225, 3490, 2169, 2455, 1033, 107, 108, 109, + 3565, 112, 1320, 991, 118, 91, 1314, 187, 638, 1520, + 593, 2572, 3516, 632, 125, 3449, 147, 2163, 958, 2847, + 953, 651, 652, 1530, 1528, 1024, 2692, 168, 3133, 3511, + 3500, 881, 882, 883, 884, 3498, 2224, 892, 3535, 3133, + 935, 778, 779, 2962, 2068, 2853, 2961, 2067, 186, 124, + 3394, 2223, 632, 1531, 1529, 3499, 1314, 2575, 158, 3455, + 3497, 3348, 2394, 1849, 146, 924, 925, 2904, 3291, 3290, + 1015, 3093, 125, 659, 3094, 3526, 1014, 3301, 3494, 632, + 82, 82, 3112, 165, 632, 168, 166, 3377, 82, 2290, + 3455, 84, 1290, 82, 629, 3101, 3479, 3437, 3445, 2218, + 2850, 3300, 1888, 3111, 2469, 134, 135, 157, 156, 185, + 3474, 2924, 1310, 1636, 3477, 1302, 2589, 2590, 1560, 2504, + 1561, 2075, 2503, 3483, 3484, 2505, 2778, 2779, 2509, 2470, + 3177, 2798, 2799, 2111, 2112, 1821, 1822, 1317, 3478, 1318, + 1319, 165, 614, 633, 166, 2426, 2777, 2614, 2287, 2110, + 2598, 1100, 1101, 1095, 2288, 612, 879, 2850, 91, 91, + 878, 1123, 1310, 2044, 2162, 2553, 91, 185, 3364, 1083, + 957, 91, 1083, 959, 1084, 1096, 1089, 1084, 913, 2516, + 2993, 919, 919, 2881, 1112, 1082, 1114, 1081, 2657, 2129, + 2128, 1289, 632, 928, 2279, 609, 2462, 2463, 1300, 632, + 632, 3517, 2912, 2910, 624, 1820, 1059, 646, 151, 132, + 154, 139, 131, 1824, 152, 153, 650, 644, 2886, 619, + 1556, 169, 3518, 633, 1111, 1113, 3323, 1497, 3324, 622, + 175, 140, 2600, 1034, 2282, 2283, 2285, 2284, 962, 2797, + 1069, 1070, 2075, 2560, 2200, 143, 141, 136, 137, 138, + 142, 2800, 2874, 1102, 2585, 1729, 2244, 133, 2239, 3547, + 2875, 1755, 633, 1103, 1116, 1121, 144, 1097, 1090, 1063, + 1104, 962, 1072, 954, 1122, 2882, 1098, 1099, 1065, 169, + 956, 955, 2602, 2883, 3082, 938, 932, 930, 175, 633, + 3081, 2262, 1040, 2241, 633, 599, 960, 601, 615, 1730, + 635, 1731, 634, 605, 1760, 603, 607, 616, 608, 1039, + 602, 2245, 613, 2073, 2074, 604, 617, 618, 621, 625, + 626, 627, 623, 620, 3491, 611, 636, 3275, 1109, 960, + 1000, 3078, 1110, 2251, 2247, 2249, 2250, 2248, 2252, 2253, + 998, 2203, 1115, 1309, 1306, 1307, 1308, 1313, 1315, 1312, + 1336, 1311, 1500, 2658, 160, 970, 938, 932, 930, 971, + 2259, 1305, 2260, 3138, 2261, 2243, 1108, 2088, 971, 2691, + 1009, 1008, 2901, 1337, 1338, 1339, 1340, 1341, 1342, 1343, + 1345, 1344, 1346, 1347, 1371, 1007, 1006, 1005, 1004, 1003, + 1002, 997, 1640, 1309, 1306, 1307, 1308, 1313, 1315, 1312, + 1010, 1311, 633, 1361, 3371, 2551, 1117, 2242, 1350, 633, + 633, 1305, 160, 1350, 2800, 1079, 3566, 1085, 1086, 1087, + 1088, 961, 946, 989, 962, 1058, 944, 2166, 1353, 1354, + 1355, 1356, 155, 3523, 2073, 2074, 2288, 968, 1367, 3451, + 946, 1124, 1125, 827, 1557, 3077, 946, 827, 1661, 1093, + 1019, 983, 2587, 982, 961, 1773, 982, 2554, 2222, 2176, + 1018, 923, 2518, 2430, 2432, 2603, 2229, 2167, 2228, 1769, + 3451, 3450, 1291, 2820, 2165, 1027, 2994, 1001, 2584, 3559, + 1634, 1281, 1282, 1283, 2606, 827, 1357, 999, 1633, 1062, + 1632, 989, 2570, 148, 2619, 1770, 149, 931, 1630, 2302, + 597, 592, 3450, 2851, 2852, 2220, 1351, 1352, 2168, 1741, + 1740, 1742, 1743, 1744, 3041, 3042, 2855, 1763, 2164, 1761, + 1762, 2597, 1764, 1765, 2596, 988, 161, 3492, 85, 989, + 992, 982, 3132, 173, 1487, 994, 637, 2574, 3110, 995, + 993, 3360, 3030, 3132, 3012, 2500, 2465, 2402, 1891, 1548, + 1452, 1074, 989, 3482, 1026, 2460, 1660, 630, 120, 2117, + 2851, 2852, 1347, 2624, 1912, 1521, 1523, 1350, 931, 1381, + 1385, 1382, 631, 2855, 181, 2776, 1106, 2289, 1913, 1759, + 1298, 2573, 90, 90, 161, 906, 1120, 1501, 1782, 3385, + 90, 173, 1061, 988, 1503, 90, 1080, 3481, 1507, 1012, + 2609, 2946, 1078, 3073, 889, 2608, 3006, 961, 1504, 2240, + 1488, 1833, 1071, 1766, 1068, 1320, 115, 162, 167, 164, + 170, 171, 172, 174, 176, 177, 178, 179, 1562, 2643, + 2431, 988, 181, 180, 182, 183, 184, 982, 985, 986, + 1903, 946, 2319, 1903, 2543, 979, 983, 2626, 2609, 1851, + 1853, 1854, 1092, 2608, 988, 1458, 1459, 1460, 1461, 1462, + 982, 985, 986, 1094, 946, 989, 1505, 1506, 979, 983, + 100, 101, 3173, 1852, 1488, 162, 167, 164, 170, 171, + 172, 174, 176, 177, 178, 179, 3527, 1494, 116, 978, + 1481, 180, 182, 183, 184, 1319, 1320, 3048, 3557, 2219, + 103, 3558, 989, 3556, 1318, 1319, 3047, 1910, 2207, 1637, + 1638, 1639, 1670, 1669, 1667, 1659, 2217, 2636, 2635, 2634, + 2215, 2902, 2628, 1107, 2632, 1000, 2627, 1756, 2625, 1757, + 998, 2212, 1758, 2630, 1321, 1783, 2212, 2294, 2295, 2296, + 1522, 1702, 2629, 3519, 1705, 1077, 1707, 1064, 3567, 1653, + 1317, 1491, 1318, 1319, 3031, 886, 1502, 3415, 3353, 2645, + 2631, 2633, 901, 1376, 1525, 1778, 1724, 988, 888, 1025, + 2216, 1646, 1320, 1022, 2009, 2214, 1714, 1715, 2006, 3561, + 3531, 1520, 1720, 1721, 1665, 1320, 1675, 2008, 1676, 3283, + 1678, 1680, 3282, 1706, 1684, 1686, 1688, 1690, 1692, 1553, + 1554, 825, 3416, 3354, 988, 3273, 3107, 2346, 3108, 992, + 982, 1664, 638, 1320, 994, 3123, 3122, 1629, 995, 993, + 1338, 1339, 1340, 1341, 1342, 1343, 1345, 1344, 1346, 1347, + 1644, 1317, 1642, 1318, 1319, 3568, 1656, 2080, 2081, 996, + 1342, 1343, 1345, 1344, 1346, 1347, 1508, 1749, 1336, 2784, + 2618, 3055, 3054, 1643, 3044, 2828, 1663, 1663, 2816, 2525, + 1710, 1340, 1341, 1342, 1343, 1345, 1344, 1346, 1347, 1784, + 1785, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1345, 1344, + 1346, 1347, 1861, 1789, 2524, 1747, 1520, 830, 831, 832, + 1796, 1797, 1798, 1908, 2785, 1736, 1862, 1348, 1349, 1860, + 1774, 2523, 1909, 2172, 1750, 1786, 1734, 1317, 2009, 1318, + 1319, 1748, 1790, 1635, 1792, 1793, 1794, 1795, 2787, 1320, + 1317, 1799, 1318, 1319, 1733, 124, 965, 964, 963, 1732, + 1722, 1716, 1713, 1811, 1712, 1711, 2782, 1324, 1325, 1326, + 1327, 1328, 1329, 1330, 1322, 1320, 1682, 1788, 1317, 1746, + 1318, 1319, 1336, 2798, 2799, 1332, 2878, 1333, 1285, 1735, + 2783, 3038, 638, 2507, 638, 1320, 1556, 1809, 3520, 1810, + 1320, 1334, 1348, 1349, 1331, 1337, 1338, 1339, 1340, 1341, + 1342, 1343, 1345, 1344, 1346, 1347, 1336, 3380, 1540, 1520, + 1320, 3379, 2307, 2789, 2188, 2187, 2186, 2185, 2184, 2183, + 3357, 1533, 40, 3529, 1520, 40, 2451, 3546, 2358, 1337, + 1338, 1339, 1340, 1341, 1342, 1343, 1345, 1344, 1346, 1347, + 3507, 1520, 97, 1886, 1886, 1628, 1884, 1884, 1887, 3461, + 1520, 1320, 1864, 98, 1866, 1867, 1868, 1869, 1870, 1871, + 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1534, 2356, 3459, + 1520, 1906, 1316, 1520, 1317, 1907, 1318, 1319, 1316, 1520, + 3373, 2797, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1345, + 1344, 1346, 1347, 2800, 3457, 1520, 2451, 3444, 1487, 1857, + 1317, 106, 1318, 1319, 1361, 1855, 2451, 3423, 1520, 1970, + 1865, 3356, 105, 3355, 104, 2451, 3419, 3309, 106, 1320, + 1317, 1904, 1318, 1319, 3278, 1317, 3262, 1318, 1319, 105, + 3261, 104, 3172, 1966, 3170, 3332, 1520, 2002, 3406, 1520, + 99, 3091, 3370, 3286, 1520, 1317, 1952, 1318, 1319, 2451, + 3274, 3308, 1817, 1818, 3119, 1486, 1485, 1484, 3052, 1858, + 3091, 1520, 2031, 2016, 2015, 81, 3037, 1834, 81, 2451, + 3089, 3266, 1780, 2887, 1488, 2212, 1520, 1964, 2884, 1521, + 2038, 2819, 1520, 3265, 2014, 1320, 1317, 1975, 1318, 1319, + 1320, 1336, 2818, 2301, 1320, 3010, 1520, 3099, 1320, 1520, + 2561, 1863, 2534, 3330, 1520, 2367, 1520, 2539, 1537, 2786, + 2005, 2809, 2808, 2062, 1337, 1338, 1339, 1340, 1341, 1342, + 1343, 1345, 1344, 1346, 1347, 2521, 2055, 1890, 2056, 2806, + 2807, 2804, 2805, 1897, 1899, 1944, 1933, 1934, 1935, 1936, + 1946, 1937, 1938, 1939, 1951, 1947, 1940, 1941, 1948, 1949, + 1950, 1942, 1943, 1945, 1317, 2039, 1318, 1319, 1483, 2016, + 2085, 1975, 1914, 1915, 1916, 1917, 1336, 2019, 2020, 3327, + 1520, 2804, 2803, 2125, 1536, 2126, 1928, 2234, 3313, 1520, + 2014, 2098, 2981, 1520, 100, 101, 2475, 1520, 1320, 1337, + 1338, 1339, 1340, 1341, 1342, 1343, 1345, 1344, 1346, 1347, + 1320, 2288, 2583, 3005, 100, 101, 1625, 2564, 1320, 2557, + 2558, 2354, 1320, 2061, 2018, 2233, 1320, 2021, 2022, 2173, + 1317, 2070, 1318, 1319, 2050, 1317, 2496, 1318, 1319, 1317, + 1813, 1318, 1319, 1317, 1779, 1318, 1319, 2451, 2450, 97, + 2135, 2136, 2137, 2138, 1745, 1320, 99, 2312, 1520, 902, + 98, 1889, 1520, 1316, 2037, 2447, 1737, 1727, 2496, 1723, + 2121, 2049, 2130, 99, 2131, 2132, 2133, 2134, 2120, 1719, + 99, 2060, 2974, 1520, 2102, 1718, 1717, 1625, 1624, 2063, + 2141, 2142, 2143, 2144, 2790, 1520, 1568, 1567, 2794, 2497, + 1535, 1118, 2971, 1520, 105, 2793, 2969, 1520, 2213, 2499, + 2155, 1520, 2083, 2124, 91, 1520, 2474, 2161, 937, 936, + 1845, 1846, 1847, 1848, 2201, 2108, 2123, 2107, 2106, 3007, + 2122, 2497, 1520, 1317, 2467, 1318, 1319, 3411, 2312, 2795, + 3521, 2288, 3384, 2451, 2791, 1317, 2475, 1318, 1319, 2792, + 2966, 2741, 2171, 1317, 2198, 1318, 1319, 1317, 2771, 1318, + 1319, 1317, 3005, 1318, 1319, 2806, 2212, 2714, 2288, 1892, + 1893, 2475, 2109, 1316, 1895, 2312, 919, 919, 1900, 2152, + 2174, 2170, 1905, 2145, 2147, 2148, 2206, 2156, 2182, 2209, + 1317, 2210, 1318, 1319, 2467, 1918, 1919, 1920, 1921, 1922, + 1923, 1924, 1925, 1926, 1927, 2367, 2475, 2226, 990, 1953, + 1954, 1955, 1956, 1957, 1958, 1960, 2208, 1965, 2205, 1967, + 1968, 1969, 2156, 1971, 1972, 1973, 2204, 1979, 1980, 1981, + 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, + 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, + 2227, 2003, 991, 2010, 2011, 919, 2343, 919, 919, 919, + 919, 919, 1663, 2342, 2212, 2195, 3005, 2023, 2024, 2025, + 2026, 2027, 2028, 2029, 2030, 2078, 2032, 2033, 2034, 2035, + 2036, 1524, 2237, 2040, 2230, 1889, 1835, 1819, 2231, 2232, + 2298, 2305, 2300, 1768, 3056, 2310, 1555, 1320, 2313, 1698, + 2314, 891, 973, 972, 1320, 2321, 3487, 3426, 1320, 2323, + 2324, 2325, 2016, 2015, 919, 2316, 2919, 3297, 1527, 2331, + 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2265, + 2272, 2273, 1320, 2306, 3263, 2275, 3184, 3072, 1857, 3069, + 2076, 2077, 3050, 2304, 2276, 3057, 3058, 3059, 2299, 2880, + 1699, 1700, 1701, 2929, 2831, 2347, 2348, 2349, 2350, 2351, + 2928, 2353, 1627, 2154, 2876, 2355, 2115, 1320, 2833, 2360, + 2361, 2829, 2362, 2278, 1320, 2365, 2565, 2366, 1320, 91, + 2531, 2369, 1520, 2151, 1320, 2373, 2326, 2286, 2315, 2378, + 2379, 2380, 2381, 3368, 2146, 1320, 2140, 2139, 1858, 1752, + 1658, 1654, 2392, 2341, 2395, 2396, 1320, 1623, 117, 1063, + 2297, 1320, 2398, 2400, 3298, 1320, 2934, 1520, 2530, 2403, + 2404, 2405, 2406, 2407, 1320, 3060, 2169, 2157, 1694, 1320, + 2414, 2415, 1317, 2416, 1318, 1319, 2419, 2421, 2062, 1317, + 2423, 1318, 1319, 1317, 2318, 1318, 1319, 2053, 3017, 3018, + 2435, 2917, 1520, 1886, 3541, 1815, 1884, 2436, 2422, 1520, + 3539, 1320, 2420, 1520, 3514, 3392, 2531, 1317, 3304, 1318, + 1319, 1320, 3061, 3062, 3063, 1695, 1696, 1697, 3318, 2399, + 1520, 3020, 2825, 2824, 1320, 2823, 2741, 2544, 1320, 2266, + 2382, 1520, 3388, 3023, 3022, 2374, 1520, 2760, 2309, 2352, + 3270, 2434, 1317, 2759, 1318, 1319, 3299, 2069, 2308, 1317, + 1532, 1318, 1319, 1317, 3074, 1318, 1319, 1816, 2763, 1317, + 1320, 1318, 1319, 2764, 904, 40, 2765, 1320, 2484, 2485, + 1317, 2471, 1318, 1319, 2489, 2059, 1320, 2491, 2437, 2452, + 2439, 1317, 1320, 1318, 1319, 3025, 1317, 3011, 1318, 1319, + 1317, 3163, 1318, 1319, 2719, 2976, 2718, 3352, 1320, 1317, + 2761, 1318, 1319, 1320, 1317, 2762, 1318, 1319, 2972, 2731, + 2733, 2448, 2944, 905, 2728, 1320, 2490, 3165, 2734, 1494, + 2461, 2998, 2424, 2802, 2480, 2483, 2484, 2485, 2481, 2997, + 2482, 2486, 3001, 1767, 3017, 3018, 1317, 2444, 1318, 1319, + 2517, 2519, 2449, 1320, 2940, 877, 1317, 1320, 1318, 1319, + 1488, 2926, 2535, 1320, 2464, 2514, 2556, 1029, 1320, 1317, + 2925, 1318, 1319, 1317, 1320, 1318, 1319, 2526, 1028, 907, + 2510, 2494, 1912, 97, 3154, 2533, 3153, 908, 2498, 2895, + 2536, 2537, 2922, 2501, 98, 2580, 1913, 2418, 1284, 97, + 2530, 2508, 2161, 2612, 2571, 1317, 99, 1318, 1319, 2417, + 98, 125, 1317, 1320, 1318, 1319, 2511, 3003, 1320, 2080, + 2081, 1317, 2522, 1318, 1319, 99, 1320, 1317, 3553, 1318, + 1319, 1320, 2578, 2821, 3152, 1320, 3466, 2413, 2269, 3369, + 2532, 2412, 3293, 1317, 1320, 1318, 1319, 2411, 1317, 2540, + 1318, 1319, 2410, 2541, 2545, 2546, 2547, 2320, 2409, 2801, + 1317, 2488, 1318, 1319, 2064, 915, 916, 2717, 2327, 2328, + 2329, 2330, 2258, 1646, 1320, 2716, 2577, 2647, 2648, 2649, + 2650, 2651, 2622, 2257, 2566, 2567, 2256, 1320, 1317, 2255, + 1318, 1319, 1317, 2254, 1318, 1319, 2656, 2408, 1317, 2983, + 1318, 1319, 2397, 1317, 2292, 1318, 1319, 1320, 104, 1317, + 2391, 1318, 1319, 1376, 106, 2390, 3340, 3339, 3321, 2389, + 2576, 1320, 3171, 3160, 3169, 105, 106, 104, 2388, 2637, + 105, 2601, 3168, 3161, 1518, 1514, 2639, 105, 2621, 2610, + 3070, 2652, 2611, 2620, 1320, 2604, 3002, 3000, 1317, 1515, + 1318, 1319, 1320, 1317, 2834, 1318, 1319, 2196, 2387, 1320, + 2991, 1317, 1641, 1318, 1319, 914, 1317, 2467, 1318, 1319, + 1317, 2386, 1318, 1319, 2057, 2058, 1517, 2640, 1516, 1317, + 3142, 1318, 1319, 2480, 2483, 2484, 2485, 2481, 106, 2482, + 2486, 2385, 3543, 3542, 2698, 2669, 2447, 2671, 2659, 105, + 2344, 104, 2051, 2693, 1549, 2384, 1541, 2695, 3542, 1317, + 99, 1318, 1319, 2682, 2683, 2684, 2685, 110, 111, 2005, + 1320, 2005, 1317, 2750, 1318, 1319, 3543, 3358, 2383, 3, + 3036, 93, 1540, 2638, 2667, 2098, 2377, 1832, 1, 1287, + 10, 2768, 1317, 2376, 1318, 1319, 1286, 3040, 2738, 2677, + 2678, 2679, 2680, 2681, 3476, 610, 1317, 2698, 1318, 1319, + 893, 2041, 1492, 2098, 2098, 2098, 2098, 2098, 2694, 2753, + 2696, 1778, 2721, 2744, 2697, 3515, 2770, 2722, 2744, 1317, + 2661, 1318, 1319, 2098, 3472, 1830, 2098, 1317, 9, 1318, + 1319, 2709, 1831, 3473, 1317, 8, 1318, 1319, 2747, 1738, + 1728, 3102, 2713, 1320, 2375, 1976, 2720, 3294, 2723, 2837, + 2202, 3068, 2735, 2736, 2159, 981, 150, 2118, 2119, 3439, + 114, 939, 113, 984, 1091, 2772, 2197, 895, 2773, 3092, + 2755, 2756, 2515, 2758, 2754, 2857, 894, 2757, 2127, 2766, + 1574, 1572, 2752, 1573, 1571, 1576, 100, 101, 1575, 2774, + 2903, 2345, 2945, 2814, 2815, 1317, 1823, 1318, 1319, 1518, + 1514, 645, 2487, 639, 2836, 188, 1563, 1542, 2897, 2958, + 2780, 1023, 600, 2810, 1515, 2813, 2812, 2811, 2235, 606, + 1368, 2710, 2711, 2712, 1814, 2715, 2502, 2372, 2914, 2915, + 2916, 934, 2918, 2920, 2864, 926, 2865, 2052, 2438, 1511, + 1512, 1517, 933, 1516, 3271, 2749, 2927, 2161, 2856, 2835, + 2995, 2931, 2932, 2933, 2935, 2936, 2937, 2938, 2727, 2729, + 2939, 2454, 2941, 2942, 2943, 2871, 2732, 2947, 2948, 2949, + 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2725, 1317, 3351, + 1318, 1319, 2888, 2891, 3162, 2963, 3424, 2617, 2967, 2890, + 2968, 2970, 2512, 2973, 2975, 2899, 2977, 2978, 2979, 2980, + 2898, 1538, 2965, 2317, 2986, 1901, 919, 1358, 2908, 2641, + 2642, 2905, 2906, 2644, 2907, 2095, 2646, 2909, 3137, 2911, + 1850, 2913, 668, 667, 665, 2440, 2468, 1323, 815, 2428, + 1550, 2479, 2477, 2476, 2267, 2960, 2653, 2654, 2655, 3008, + 3009, 1320, 2964, 3013, 2103, 1320, 2893, 2894, 2660, 3019, + 1320, 2662, 2663, 2664, 3015, 3468, 2097, 2665, 2666, 2093, + 2446, 1979, 2668, 766, 765, 2670, 677, 1320, 2672, 2673, + 2674, 2675, 669, 661, 764, 763, 2676, 1979, 1979, 1979, + 1979, 1979, 1320, 3033, 2863, 2984, 2985, 2989, 3452, 2586, + 2877, 2987, 2588, 1320, 2513, 919, 2873, 1320, 1301, 2098, + 2992, 1510, 2699, 2700, 2701, 2702, 2703, 2704, 2999, 655, + 952, 2705, 2706, 2900, 2707, 3004, 2708, 3375, 3024, 2291, + 3014, 2923, 1509, 1320, 1931, 2371, 1932, 3382, 3021, 2370, + 2845, 3086, 2826, 2562, 2368, 2189, 811, 66, 1320, 3028, + 3029, 3027, 3026, 3075, 3076, 44, 2864, 3346, 2865, 3090, + 3034, 2364, 3412, 3035, 762, 759, 3139, 3045, 3046, 3140, + 3141, 2739, 3051, 2689, 3053, 2690, 2363, 3096, 3097, 3395, + 3396, 758, 3397, 1959, 1297, 1294, 1317, 2359, 1318, 1319, + 1317, 2357, 1318, 1319, 3489, 1317, 2769, 1318, 1319, 1825, + 191, 3109, 92, 191, 3113, 35, 643, 34, 33, 32, + 31, 649, 1317, 25, 1318, 1319, 24, 2322, 23, 22, + 3079, 21, 191, 28, 3083, 3084, 3085, 1317, 20, 1318, + 1319, 3124, 2311, 3098, 19, 18, 2848, 191, 1317, 3510, + 1318, 1319, 1317, 3552, 1318, 1319, 3128, 119, 53, 50, + 48, 127, 126, 51, 47, 3118, 1066, 2832, 3136, 3508, + 45, 30, 649, 191, 649, 29, 3143, 17, 1317, 1591, + 1318, 1319, 16, 15, 14, 3114, 13, 12, 11, 7, + 6, 38, 37, 1317, 27, 1318, 1319, 36, 26, 4, + 2549, 2191, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3126, 0, 3135, 0, 3157, + 0, 0, 0, 0, 0, 0, 0, 1886, 0, 0, + 1884, 3186, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 40, 0, 2921, + 0, 0, 0, 3178, 0, 0, 0, 3158, 0, 2744, + 3167, 3166, 3180, 2930, 3182, 0, 0, 0, 0, 0, + 3176, 3174, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2747, 0, 3285, 0, 2747, + 0, 0, 3272, 0, 0, 0, 3292, 0, 3190, 0, + 0, 0, 0, 3187, 3188, 0, 0, 0, 0, 0, + 0, 0, 0, 1579, 0, 0, 3302, 3303, 0, 3305, + 0, 3306, 3307, 0, 0, 3267, 3310, 3311, 3312, 3268, + 3314, 3317, 3315, 3316, 3269, 0, 1886, 0, 3284, 1884, + 3319, 0, 0, 3296, 3288, 0, 3326, 3328, 3329, 3331, + 3333, 3334, 3336, 3279, 3280, 3281, 3276, 0, 0, 0, + 0, 3289, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3320, 0, 0, + 3366, 0, 0, 0, 0, 0, 0, 1592, 3322, 0, + 0, 0, 3325, 0, 3362, 0, 0, 0, 0, 0, + 3344, 3341, 3342, 0, 3361, 3343, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3359, 0, + 0, 0, 0, 3071, 0, 0, 3350, 3365, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2747, 0, 0, 0, 1605, + 1608, 1609, 1610, 1611, 1612, 1613, 3095, 1614, 1615, 1617, + 1618, 1616, 1619, 1620, 1593, 1594, 1595, 1596, 1577, 1578, + 1606, 0, 1580, 3367, 1581, 1582, 1583, 1584, 1585, 1586, + 1587, 1588, 1589, 0, 0, 1590, 1597, 1598, 1599, 1600, + 0, 1601, 1602, 1603, 1604, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3391, 3386, 0, 0, + 0, 3115, 0, 3116, 0, 0, 3117, 0, 0, 3120, + 3121, 40, 3378, 0, 0, 3381, 3407, 3383, 3125, 0, + 0, 0, 3408, 3409, 0, 0, 0, 0, 3127, 0, + 0, 0, 0, 3374, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3420, 0, 0, 0, 0, 0, + 3144, 0, 0, 3145, 0, 3146, 3147, 0, 3148, 3401, + 3149, 0, 3402, 0, 0, 3150, 0, 0, 3390, 0, + 3446, 3447, 3410, 0, 0, 0, 3400, 3422, 0, 0, + 0, 0, 0, 3417, 3456, 3458, 3460, 40, 3453, 3454, + 3175, 3427, 2744, 3425, 3438, 0, 3430, 3435, 3432, 3431, + 0, 3183, 3429, 0, 3185, 3434, 3296, 3441, 3433, 3488, + 0, 0, 0, 0, 0, 0, 3189, 0, 0, 191, + 0, 191, 3464, 0, 191, 1607, 0, 0, 0, 186, + 3485, 3475, 3480, 3467, 3264, 0, 0, 0, 0, 0, + 3453, 3454, 3495, 0, 0, 0, 0, 0, 0, 3506, + 3493, 0, 0, 125, 0, 649, 0, 649, 649, 0, + 0, 0, 0, 0, 1371, 0, 168, 0, 3504, 3509, + 0, 0, 0, 0, 0, 0, 0, 649, 191, 0, + 0, 0, 3528, 3530, 3532, 0, 0, 3522, 0, 0, + 0, 0, 1886, 1778, 3524, 1884, 3537, 3525, 0, 0, + 0, 0, 3533, 0, 3536, 3534, 1363, 3540, 3538, 0, + 0, 0, 0, 0, 3551, 0, 0, 0, 3453, 3454, + 3548, 0, 165, 0, 0, 166, 0, 3554, 0, 0, + 3563, 3564, 3560, 0, 3562, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3349, 0, 0, 1886, 185, 0, + 1884, 3569, 3571, 3572, 3316, 0, 3570, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2555, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 125, 0, 147, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 614, 3542, 0, 3543, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 612, 0, 0, - 0, 0, 0, 0, 2012, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1363, 158, + 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, + 169, 0, 0, 0, 0, 0, 0, 0, 0, 175, + 0, 0, 0, 0, 165, 0, 0, 166, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3389, 0, + 0, 0, 0, 0, 0, 0, 1649, 1650, 157, 156, + 185, 0, 0, 0, 0, 191, 0, 0, 0, 649, + 649, 3403, 0, 0, 3404, 0, 3405, 0, 0, 0, + 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 649, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 609, 0, 0, - 0, 0, 0, 0, 0, 0, 624, 191, 0, 0, - 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, - 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 622, 0, 0, 0, 0, 191, 0, 0, 649, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, - 0, 0, 0, 649, 0, 0, 2012, 191, 0, 191, - 0, 191, 191, 0, 633, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, + 0, 649, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 599, 0, 601, - 615, 0, 635, 0, 634, 605, 0, 603, 607, 616, - 608, 0, 602, 0, 613, 0, 0, 604, 617, 618, - 621, 625, 626, 627, 623, 620, 0, 611, 636, 0, - 0, 186, 0, 649, 0, 0, 0, 0, 0, 0, - 0, 0, 1640, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 125, 0, 147, 0, 0, - 649, 0, 0, 0, 0, 0, 649, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 160, 0, 0, 0, 0, 0, 151, + 1651, 154, 0, 1648, 649, 152, 153, 0, 0, 0, + 3486, 0, 169, 0, 0, 0, 0, 1363, 0, 0, + 0, 175, 0, 649, 649, 0, 649, 0, 649, 649, + 0, 649, 649, 649, 649, 649, 649, 0, 0, 0, + 0, 3501, 0, 3502, 1363, 3503, 0, 1363, 649, 1363, + 191, 0, 0, 0, 0, 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, + 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 186, 0, 649, 0, 191, 0, 0, 0, 0, + 0, 0, 1645, 0, 0, 0, 0, 0, 0, 649, + 0, 191, 0, 0, 0, 125, 0, 147, 0, 0, + 0, 0, 0, 3549, 0, 3550, 0, 191, 168, 0, + 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, + 0, 0, 0, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 649, 0, 0, 160, 0, 0, 0, 158, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, - 0, 0, 0, 649, 0, 0, 0, 0, 649, 0, - 0, 0, 649, 649, 165, 0, 0, 166, 0, 0, + 0, 0, 0, 0, 0, 161, 0, 1591, 0, 0, + 0, 0, 173, 0, 165, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1644, 1645, 157, 156, + 0, 0, 0, 0, 0, 0, 1649, 1650, 157, 156, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 191, 0, 0, 0, 0, 0, 0, 191, 0, 0, - 0, 0, 0, 0, 0, 0, 191, 191, 0, 0, - 191, 0, 191, 0, 0, 0, 0, 0, 0, 191, - 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 155, 0, 0, 0, 0, 1495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 0, 0, 0, 0, 0, 0, 637, 0, + 0, 0, 826, 0, 0, 83, 162, 167, 164, 170, + 171, 172, 174, 176, 177, 178, 179, 0, 0, 0, + 0, 0, 180, 182, 183, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 148, 595, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, - 1646, 154, 0, 1643, 0, 152, 153, 0, 1126, 630, - 1126, 1126, 169, 0, 0, 0, 0, 0, 0, 0, - 0, 175, 0, 0, 631, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1362, 0, 2012, - 0, 0, 0, 0, 0, 0, 0, 0, 890, 1359, - 1364, 1365, 0, 1368, 0, 1369, 1371, 1372, 1373, 0, - 1376, 1377, 1379, 1379, 0, 1379, 1383, 1383, 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, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, - 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, - 1447, 1448, 1449, 0, 0, 160, 0, 1450, 0, 1452, - 1453, 1454, 1455, 1456, 0, 0, 0, 0, 0, 0, - 0, 0, 1383, 1383, 1383, 1383, 1383, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1462, 1463, 1464, 1465, - 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, - 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, - 0, 0, 0, 0, 0, 0, 191, 1489, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, - 0, 0, 0, 155, 0, 0, 0, 0, 649, 0, + 1651, 154, 0, 1648, 880, 152, 153, 649, 649, 0, + 0, 1579, 169, 0, 0, 0, 0, 161, 0, 0, + 649, 175, 0, 0, 173, 0, 0, 0, 0, 191, + 0, 0, 0, 0, 890, 0, 83, 0, 0, 0, + 0, 0, 0, 0, 0, 947, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 890, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 951, 0, 0, 0, 0, 0, 0, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1363, 0, 0, + 0, 0, 0, 0, 0, 1592, 0, 0, 649, 0, + 0, 0, 0, 0, 1363, 0, 0, 0, 162, 167, + 164, 170, 171, 172, 174, 176, 177, 178, 179, 0, + 0, 0, 0, 0, 180, 182, 183, 184, 0, 649, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1605, 1608, 1609, + 1610, 1611, 1612, 1613, 0, 1614, 1615, 1617, 1618, 1616, + 1619, 1620, 1593, 1594, 1595, 1596, 1577, 1578, 1606, 2017, + 1580, 0, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, + 1589, 0, 0, 1590, 1597, 1598, 1599, 1600, 0, 1601, + 1602, 1603, 1604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 191, 155, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 191, 0, 0, 0, 0, 191, 0, 0, - 1495, 0, 0, 0, 0, 0, 890, 0, 0, 0, - 890, 0, 0, 0, 0, 0, 890, 0, 0, 0, - 0, 0, 0, 0, 148, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 191, 0, 0, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, + 0, 0, 649, 0, 0, 2017, 191, 0, 191, 0, + 191, 191, 0, 0, 148, 0, 0, 149, 0, 0, + 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 0, 0, - 0, 0, 0, 0, 173, 649, 0, 0, 0, 0, - 0, 191, 0, 0, 0, 0, 0, 810, 191, 0, + 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 649, 0, 0, 0, 0, 0, 0, 649, - 0, 0, 0, 0, 0, 181, 0, 0, 649, 0, + 0, 0, 0, 1607, 0, 0, 0, 0, 0, 0, + 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, + 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1362, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 628, 191, 191, 191, - 191, 191, 648, 0, 0, 0, 0, 0, 162, 167, + 0, 0, 0, 0, 0, 0, 0, 0, 162, 167, 164, 170, 171, 172, 174, 176, 177, 178, 179, 0, - 0, 191, 191, 0, 180, 182, 183, 184, 0, 0, - 0, 0, 0, 3201, 3203, 3202, 3220, 3221, 3222, 3223, - 3224, 3225, 3226, 716, 191, 0, 0, 0, 0, 0, - 0, 0, 0, 648, 0, 648, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 182, 183, 184, 0, 0, + 0, 0, 649, 0, 0, 0, 0, 649, 0, 0, + 0, 649, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1126, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, + 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, + 0, 0, 0, 0, 0, 191, 191, 0, 0, 191, + 0, 191, 0, 0, 0, 0, 0, 0, 191, 0, + 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, + 0, 1067, 0, 1073, 0, 0, 1075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1293, 1127, 0, 1127, 1127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 649, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1363, 0, 2017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 890, 1360, 1365, 1366, 0, 1369, 0, 1370, 1372, + 1373, 1374, 0, 1377, 1378, 1380, 1380, 0, 1380, 1384, + 1384, 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, 1428, 1429, 1430, 1431, 1432, 1433, 1434, + 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, + 1445, 1446, 1447, 1448, 1449, 1450, 0, 0, 0, 0, + 1451, 0, 1453, 1454, 1455, 1456, 1457, 0, 0, 0, + 0, 0, 0, 0, 0, 1384, 1384, 1384, 1384, 1384, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1463, + 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, + 1474, 1475, 1476, 0, 0, 0, 0, 191, 0, 0, + 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, + 1490, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 191, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 0, 0, 0, 1362, 0, 0, 649, 649, - 1362, 191, 191, 191, 191, 191, 0, 0, 0, 0, - 0, 0, 0, 191, 0, 0, 0, 0, 0, 191, - 0, 191, 0, 0, 191, 191, 191, 0, 0, 1126, - 1126, 0, 0, 0, 0, 0, 0, 3207, 0, 0, - 0, 0, 0, 83, 0, 0, 83, 0, 0, 0, - 0, 0, 3215, 3216, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 191, 0, 0, 0, 0, 191, 0, + 0, 0, 0, 1496, 0, 82, 42, 43, 84, 890, + 0, 0, 0, 890, 0, 0, 0, 0, 0, 890, + 0, 1552, 0, 0, 0, 88, 0, 0, 0, 46, + 73, 74, 0, 71, 75, 0, 0, 0, 0, 1569, + 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 0, 0, 1362, 0, 0, 0, - 0, 649, 0, 0, 0, 0, 191, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 191, 0, 0, 0, 782, 3501, 695, 786, 697, 783, - 784, 0, 693, 696, 785, 1586, 0, 0, 0, 191, - 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 714, 715, 3200, 3204, 3205, 3206, 3217, 3218, 3219, 3227, - 3229, 747, 3228, 3230, 3231, 3232, 3235, 3236, 3237, 3238, - 3233, 3234, 3239, 3184, 3188, 3185, 3186, 3187, 3199, 3189, - 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3240, - 3241, 3242, 3243, 3244, 3245, 3210, 3214, 3213, 3211, 3212, - 3208, 3209, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 649, 0, 787, 0, 788, 0, 0, 792, - 0, 0, 0, 794, 793, 0, 795, 761, 760, 0, - 0, 789, 790, 0, 791, 0, 0, 0, 0, 0, - 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 82, 42, 43, 84, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1574, - 0, 88, 0, 0, 0, 46, 73, 74, 0, 71, - 75, 0, 0, 0, 0, 0, 0, 0, 72, 0, - 0, 0, 0, 0, 0, 0, 0, 191, 2089, 3246, - 3247, 3248, 3249, 3250, 3251, 3252, 3253, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, - 0, 0, 0, 0, 0, 0, 191, 0, 0, 91, - 0, 0, 0, 0, 0, 0, 648, 1279, 648, 648, - 0, 0, 0, 0, 0, 0, 191, 0, 0, 191, - 191, 191, 0, 1587, 0, 0, 0, 0, 648, 649, - 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 950, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1361, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 950, 0, 0, 649, 649, 649, 649, - 0, 0, 0, 0, 0, 1600, 1603, 1604, 1605, 1606, - 1607, 1608, 0, 1609, 1610, 1612, 1613, 1611, 1614, 1615, - 1588, 1589, 1590, 1591, 1572, 1573, 1601, 0, 1575, 0, - 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 0, - 0, 1585, 1592, 1593, 1594, 1595, 0, 1596, 1597, 1598, - 1599, 0, 0, 0, 0, 0, 0, 49, 52, 55, - 54, 57, 0, 70, 0, 0, 79, 76, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1494, 0, 0, 0, 0, 0, 0, 0, - 58, 87, 86, 0, 0, 68, 69, 56, 0, 0, - 0, 0, 191, 77, 78, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1361, - 0, 1362, 0, 0, 0, 0, 649, 0, 649, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 595, - 0, 0, 0, 0, 0, 60, 61, 0, 62, 63, - 64, 65, 0, 0, 0, 0, 0, 0, 880, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 648, 648, 0, 0, 2286, 0, 0, 0, 649, 0, - 0, 1602, 0, 0, 0, 0, 0, 0, 0, 946, - 0, 191, 0, 0, 649, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 648, 649, 0, 0, - 0, 0, 0, 2296, 0, 0, 0, 0, 0, 0, - 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1617, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1626, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, - 0, 649, 649, 0, 648, 0, 1652, 0, 0, 0, - 0, 85, 0, 0, 1661, 0, 0, 1361, 1663, 0, - 0, 1666, 1667, 648, 648, 0, 648, 0, 648, 648, - 649, 648, 648, 648, 648, 648, 648, 0, 0, 0, - 0, 0, 0, 0, 1361, 1698, 1699, 1361, 648, 1361, - 0, 1704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 768, - 0, 0, 0, 90, 0, 0, 0, 0, 0, 2394, - 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1766, 0, 0, 648, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, - 0, 2426, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 189, 0, 191, 596, 0, 0, 890, + 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, + 0, 59, 191, 0, 0, 0, 0, 0, 0, 191, + 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 648, 649, 191, 596, 0, 0, 0, 0, - 2465, 2466, 0, 0, 0, 0, 0, 0, 0, 2089, - 900, 0, 890, 2485, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 919, 919, 67, - 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, - 0, 0, 0, 0, 649, 0, 1586, 0, 0, 0, - 0, 0, 0, 0, 1362, 0, 649, 0, 0, 0, + 0, 0, 1708, 0, 0, 1363, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, + 191, 191, 191, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1753, 0, 0, + 0, 0, 191, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 191, 0, 0, 0, 1787, + 0, 0, 0, 0, 0, 0, 1791, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 649, 1802, 1803, 1804, + 1805, 1806, 1807, 1808, 0, 0, 0, 0, 0, 0, + 0, 49, 52, 55, 54, 57, 0, 70, 0, 0, + 79, 76, 0, 0, 0, 0, 0, 0, 1127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 649, 2012, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 649, 58, 87, 86, 0, 0, 68, + 69, 56, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 191, 649, 0, 0, - 0, 0, 0, 0, 0, 0, 2562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 649, 0, 0, 0, 0, 0, 0, 0, 649, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 61, 0, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 648, 648, 0, - 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, - 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 0, 0, 0, 0, 191, 0, - 1574, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 0, 649, 0, 0, 0, 0, 0, 0, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 191, 0, 0, 0, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 649, 0, 0, 0, 1363, 0, 0, 649, + 649, 1363, 191, 191, 191, 191, 191, 0, 0, 0, + 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, + 191, 0, 191, 0, 0, 191, 191, 191, 0, 0, + 0, 1838, 0, 1127, 1127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 83, 0, 91, + 83, 0, 828, 0, 0, 0, 816, 829, 830, 831, + 832, 817, 0, 0, 818, 819, 0, 820, 0, 0, + 0, 191, 0, 0, 0, 85, 0, 0, 0, 0, + 0, 825, 833, 834, 649, 0, 0, 1363, 0, 0, + 0, 0, 649, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1361, 0, 0, - 0, 0, 0, 0, 0, 0, 1889, 0, 648, 0, - 0, 0, 0, 0, 1361, 1066, 0, 1072, 0, 0, - 1074, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1587, 0, 0, 0, 0, 648, - 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2866, 2867, + 191, 0, 0, 191, 0, 0, 0, 90, 0, 0, + 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, + 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, + 875, 876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2679, 0, 0, - 0, 0, 0, 0, 1292, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, - 0, 0, 0, 0, 0, 0, 1600, 1603, 1604, 1605, - 1606, 1607, 1608, 0, 1609, 1610, 1612, 1613, 1611, 1614, - 1615, 1588, 1589, 1590, 1591, 1572, 1573, 1601, 0, 1575, - 2089, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, - 0, 0, 1585, 1592, 1593, 1594, 1595, 648, 1596, 1597, - 1598, 1599, 0, 2741, 0, 83, 0, 0, 2089, 2089, - 2089, 2089, 2089, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 648, 0, 0, 0, 2089, 0, - 0, 2089, 0, 0, 0, 0, 0, 0, 648, 0, - 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2868, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 191, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2847, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2855, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, - 0, 0, 0, 0, 0, 2172, 2173, 2174, 0, 0, - 0, 0, 596, 0, 596, 0, 0, 596, 0, 0, - 0, 0, 1602, 0, 0, 648, 0, 0, 0, 0, - 0, 648, 1661, 0, 0, 1661, 0, 1661, 0, 0, - 0, 91, 0, 2204, 828, 0, 0, 0, 816, 829, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2082, 0, 0, 0, 0, 0, 0, 0, 2086, 0, + 2089, 0, 0, 1838, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, + 2869, 2870, 0, 0, 0, 0, 2096, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 768, 0, 0, 0, 191, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, + 191, 191, 191, 0, 0, 0, 0, 0, 0, 0, + 649, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 189, 951, 0, + 596, 782, 0, 0, 786, 0, 783, 784, 0, 0, + 0, 785, 0, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 0, 0, 0, 0, 0, 649, 649, 649, + 649, 951, 0, 0, 900, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 920, 920, 0, 0, 0, 0, 0, 0, 0, + 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 91, 0, 0, 828, 0, 0, 0, 816, 829, 830, 831, 832, 817, 0, 0, 818, 819, 0, 820, - 0, 0, 0, 0, 767, 0, 0, 0, 0, 0, - 0, 596, 0, 825, 833, 834, 0, 0, 648, 0, - 0, 0, 0, 648, 1547, 0, 0, 648, 648, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1363, - 0, 0, 1564, 0, 0, 0, 0, 0, 0, 0, + 0, 1838, 0, 0, 0, 0, 0, 0, 2246, 0, + 0, 0, 0, 825, 833, 834, 0, 2263, 2264, 0, + 0, 2268, 0, 0, 0, 0, 0, 0, 0, 0, + 2271, 0, 0, 191, 0, 0, 0, 2274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2859, 2860, 0, 0, 0, 0, 0, 0, 0, 647, + 0, 0, 1363, 0, 0, 0, 0, 649, 0, 649, + 2866, 2867, 0, 2277, 0, 0, 0, 0, 0, 0, 0, 0, 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, 865, 866, 867, 868, 869, 870, 871, 872, - 873, 874, 875, 876, 0, 0, 0, 0, 0, 0, - 942, 0, 949, 0, 2089, 1703, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 648, 3025, 0, 0, + 873, 874, 875, 876, 0, 0, 0, 0, 0, 649, + 0, 0, 2293, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 191, 0, 0, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, + 0, 0, 0, 0, 0, 2868, 0, 0, 0, 0, + 0, 2303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2861, 0, 0, 0, 0, - 1748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1782, 0, 0, 0, 0, 0, 0, 1786, - 0, 0, 1361, 0, 648, 0, 0, 0, 0, 0, - 1797, 1798, 1799, 1800, 1801, 1802, 1803, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, + 0, 0, 649, 649, 0, 0, 0, 0, 0, 0, + 0, 3208, 3210, 3209, 3227, 3228, 3229, 3230, 3231, 3232, + 3233, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 649, 2869, 2870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2862, 2863, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 900, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 782, 0, 0, 786, 0, 783, 784, - 0, 0, 0, 785, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3144, 0, 3148, 3149, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1363, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 2433, + 0, 0, 0, 0, 0, 0, 191, 628, 0, 0, + 0, 0, 0, 648, 0, 0, 0, 890, 0, 0, + 0, 0, 0, 0, 649, 191, 0, 0, 0, 0, + 2493, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2472, 2473, 0, 0, 0, 0, 0, 0, 0, 2096, + 0, 0, 890, 2492, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 648, 0, 648, 0, 0, 0, + 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1363, 0, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2542, 0, 0, 0, 0, 0, + 0, 649, 2017, 0, 0, 0, 596, 0, 596, 0, + 0, 596, 0, 0, 0, 3214, 0, 0, 0, 0, + 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, + 3222, 3223, 0, 0, 0, 0, 0, 191, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2569, 0, 0, 0, + 2591, 2592, 2593, 2594, 2595, 596, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 649, 0, 1838, 2605, 0, 0, 0, 0, + 0, 0, 782, 1364, 695, 786, 697, 783, 784, 0, + 693, 696, 785, 0, 649, 0, 0, 2613, 0, 191, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 649, 0, 649, 0, 0, 0, 714, 715, + 3207, 3211, 3212, 3213, 3224, 3225, 3226, 3234, 3236, 747, + 3235, 3237, 3238, 3239, 3242, 3243, 3244, 3245, 3240, 3241, + 3246, 3191, 3195, 3192, 3193, 3194, 3206, 3196, 3197, 3198, + 3199, 3200, 3201, 3202, 3203, 3204, 3205, 3247, 3248, 3249, + 3250, 3251, 3252, 3217, 3221, 3220, 3218, 3219, 3215, 3216, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 787, 0, 788, 0, 0, 792, 0, 0, + 0, 794, 793, 0, 795, 761, 760, 0, 0, 789, + 790, 0, 791, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1364, 0, 2686, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 767, 0, 0, 3253, 3254, 3255, + 3256, 3257, 3258, 3259, 3260, 0, 0, 0, 0, 0, + 2096, 0, 596, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 900, 2748, 0, 83, 0, 0, 2096, 2096, + 2096, 2096, 2096, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 0, 2096, 647, + 0, 2096, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, + 0, 0, 0, 2822, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2860, + 943, 0, 950, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2872, 1364, 2854, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2862, 0, 0, 0, 0, + 0, 0, 2889, 0, 0, 2892, 0, 0, 0, 0, + 0, 1364, 0, 0, 1364, 0, 1364, 596, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 828, 0, 2009, + 0, 0, 829, 0, 0, 0, 0, 1725, 0, 0, + 0, 0, 1885, 0, 0, 0, 0, 648, 1280, 648, + 648, 0, 596, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1777, 648, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, + 0, 596, 0, 0, 0, 0, 0, 0, 1362, 0, + 1800, 1801, 596, 596, 596, 596, 596, 596, 596, 0, + 0, 0, 0, 0, 2988, 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, 865, 866, 867, 868, 869, + 870, 871, 872, 873, 874, 875, 876, 828, 0, 0, + 0, 0, 829, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2741, 0, 83, 0, 2741, 0, 0, 0, 0, 0, - 0, 0, 648, 0, 0, 0, 1363, 0, 0, 1363, - 0, 1363, 596, 648, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2096, 0, 0, 0, 0, 3049, + 0, 0, 0, 0, 0, 0, 0, 3032, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3064, + 0, 0, 3065, 3066, 3067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1720, 0, 1833, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2499, 0, - 0, 3270, 0, 1772, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, + 1362, 0, 0, 0, 0, 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, 865, 866, 867, 868, 869, + 870, 871, 872, 873, 874, 875, 876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, - 0, 0, 0, 0, 0, 1795, 1796, 596, 596, 596, - 596, 596, 596, 596, 0, 0, 0, 0, 0, 0, - 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 648, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, - 0, 0, 0, 0, 648, 0, 0, 0, 1661, 1661, - 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, - 2741, 0, 0, 0, 0, 0, 0, 0, 0, 1361, - 2572, 0, 0, 0, 1385, 1386, 1387, 1388, 1389, 1390, - 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, - 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, - 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, - 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, - 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, - 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, - 1472, 1473, 1474, 1475, 0, 0, 0, 0, 0, 0, - 648, 0, 0, 0, 0, 0, 0, 0, 3369, 0, - 0, 0, 0, 1128, 0, 1128, 1128, 0, 0, 2075, - 0, 0, 0, 0, 0, 0, 83, 2079, 0, 2082, - 0, 0, 1833, 0, 0, 1291, 0, 0, 0, 0, - 0, 596, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 648, 1364, 0, 0, 0, 0, 0, + 0, 0, 0, 1622, 0, 0, 920, 920, 0, 0, + 0, 1364, 0, 1631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 648, 0, 1657, 0, + 0, 0, 0, 0, 0, 3151, 1666, 3155, 3156, 1362, + 1668, 0, 0, 1671, 1672, 648, 648, 0, 648, 0, + 648, 648, 0, 648, 648, 648, 648, 648, 648, 0, + 2748, 0, 83, 0, 2748, 0, 1362, 1703, 1704, 1362, + 648, 1362, 0, 1709, 0, 920, 1777, 920, 920, 920, + 920, 920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, - 0, 0, 0, 648, 0, 0, 0, 3414, 0, 1363, - 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, - 0, 919, 919, 0, 0, 0, 1363, 0, 0, 0, - 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, + 0, 0, 0, 1129, 0, 1129, 1129, 0, 1771, 1725, + 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3277, 0, 0, 920, 1292, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 900, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 648, 596, 0, 0, 0, 0, + 0, 0, 1777, 596, 0, 596, 0, 596, 2105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, - 1361, 0, 0, 648, 648, 1361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 919, 1772, 919, 919, 919, 919, 919, 0, 0, 3498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2810, 0, 0, 0, - 1833, 0, 0, 0, 1720, 0, 0, 2239, 0, 0, - 0, 0, 0, 0, 0, 0, 2256, 2257, 648, 919, - 2261, 1361, 0, 0, 0, 0, 648, 0, 0, 2264, - 0, 0, 0, 900, 0, 0, 2267, 1497, 1498, 0, + 2748, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1386, 1387, 1388, 1389, 1390, 1391, + 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, + 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, + 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, + 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, + 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, + 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, + 1473, 1474, 1475, 1476, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3387, 3376, 648, + 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 648, 0, 0, 0, 83, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1498, 1499, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, - 0, 0, 0, 1772, 596, 0, 596, 0, 596, 2098, - 0, 0, 2270, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1541, 0, 0, 0, 2889, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1559, 0, + 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 596, 0, 0, 596, 0, 2270, 648, + 0, 0, 0, 0, 1546, 596, 0, 0, 0, 1362, + 0, 0, 596, 0, 0, 0, 0, 3421, 1894, 1564, + 648, 0, 83, 0, 0, 0, 1362, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 648, 648, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1674, 1674, 0, 1674, 0, 1674, 1674, 0, 1683, + 1674, 1674, 1674, 1674, 1674, 0, 0, 0, 0, 0, + 0, 648, 0, 0, 0, 0, 943, 0, 0, 0, + 0, 0, 0, 1364, 0, 1777, 0, 0, 0, 3505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 942, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1751, 0, 0, 0, 0, 0, 0, 0, 648, + 0, 0, 0, 0, 0, 0, 0, 1775, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 648, 0, 0, 648, 0, 0, + 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, - 1669, 1669, 0, 1669, 0, 1669, 1669, 0, 1678, 1669, - 1669, 1669, 1669, 1669, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1746, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, + 0, 0, 1725, 0, 648, 0, 0, 0, 0, 0, + 0, 2179, 2180, 2181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3032, 0, 0, 0, 0, 0, 0, 596, 0, 0, - 828, 0, 0, 0, 596, 829, 0, 0, 0, 1128, - 0, 0, 0, 596, 596, 1880, 0, 596, 0, 2263, - 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, - 0, 0, 0, 596, 648, 648, 0, 0, 0, 0, + 0, 648, 0, 0, 0, 0, 0, 648, 1666, 0, + 0, 1666, 0, 1666, 0, 0, 0, 0, 0, 2211, + 596, 0, 0, 0, 0, 596, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 648, 0, 0, 0, 0, 648, + 0, 0, 0, 648, 648, 1129, 1129, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 0, 0, 0, 0, 2548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 648, 648, 648, 648, 0, 0, 2486, 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, 865, 866, - 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, - 0, 0, 0, 0, 1363, 0, 1772, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2535, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1128, 1128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1821, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1361, 0, 0, 0, - 0, 648, 0, 648, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2584, 2585, 2586, - 2587, 2588, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1875, 0, 0, 0, 0, 0, - 0, 1833, 2598, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1891, 0, 0, 0, 0, - 0, 0, 0, 648, 2606, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 596, 0, 0, 0, 648, - 0, 0, 0, 1720, 0, 0, 1924, 1925, 0, 0, + 0, 0, 0, 0, 0, 1880, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1364, 0, 0, 0, 1896, 0, 0, 0, + 0, 0, 0, 0, 0, 596, 596, 596, 596, 596, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1929, 1930, 596, + 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, - 0, 0, 0, 0, 596, 0, 1128, 0, 0, 0, - 0, 0, 648, 0, 0, 0, 648, 648, 0, 0, + 0, 0, 0, 0, 0, 0, 920, 1129, 1362, 0, + 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, - 0, 0, 0, 0, 2049, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, - 0, 2061, 0, 0, 0, 2541, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1541, 0, 0, 1128, 0, + 0, 0, 0, 0, 0, 2054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 942, 0, - 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, - 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 596, 596, 596, 596, 596, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 596, 596, - 0, 0, 0, 0, 0, 949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2815, 596, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 942, 0, 0, 0, 0, 0, 949, 648, - 0, 0, 0, 0, 0, 919, 2853, 0, 0, 1361, - 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, - 2865, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 648, 648, 0, 0, 2882, - 0, 0, 2885, 0, 0, 942, 0, 0, 0, 0, - 1875, 0, 0, 0, 1875, 1875, 0, 648, 0, 0, + 0, 0, 2066, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 920, 0, 0, 0, 0, + 1546, 0, 0, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 919, 0, 0, 0, 0, 0, + 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, + 0, 0, 0, 1364, 0, 0, 0, 0, 1364, 596, + 596, 596, 596, 596, 0, 0, 0, 0, 648, 0, + 950, 2767, 0, 0, 0, 0, 0, 1725, 0, 596, + 0, 648, 596, 2775, 1777, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 943, 0, 0, + 0, 0, 0, 950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2506, 0, 596, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1364, 0, 0, 0, 0, 0, + 943, 0, 0, 0, 596, 1880, 0, 0, 0, 1880, + 1880, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, - 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2981, 0, 0, 0, 0, 648, 0, 648, 0, - 0, 0, 1363, 2273, 0, 0, 0, 1363, 596, 596, - 596, 596, 596, 0, 0, 0, 0, 0, 0, 0, - 2760, 0, 0, 0, 0, 0, 1720, 0, 596, 0, - 0, 596, 2768, 1772, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, - 0, 0, 828, 0, 0, 0, 816, 829, 830, 831, - 832, 817, 0, 0, 818, 819, 0, 820, 0, 0, - 0, 1128, 0, 0, 0, 0, 3042, 596, 0, 0, - 0, 825, 833, 834, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1363, 0, 0, 3057, 0, 0, 3058, - 3059, 3060, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2859, 2860, - 0, 0, 0, 0, 0, 0, 596, 0, 0, 596, - 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, - 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, - 875, 876, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, + 0, 0, 648, 0, 0, 0, 1666, 1666, 0, 0, + 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1362, 2579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2861, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2434, - 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, - 2449, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2862, 2863, 0, 0, 596, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2531, 0, 0, - 0, 0, 0, 596, 0, 0, 596, 596, 596, 0, + 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2061, 0, 0, 0, 0, 0, - 0, 2556, 0, 0, 0, 0, 0, 0, 0, 0, - 2561, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 648, 596, 0, 0, 596, 596, 596, + 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 648, 0, 0, 0, 1362, 0, + 0, 648, 648, 1362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2441, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 648, 0, 0, 1362, + 1725, 0, 0, 0, 648, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2538, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2896, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1720, + 0, 2066, 0, 0, 0, 0, 0, 0, 2563, 0, + 0, 0, 0, 0, 0, 0, 0, 2568, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1875, 0, 0, 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2680, 0, 3380, 0, 0, 0, 0, 0, - 1128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1669, 0, 0, 0, 0, 0, 0, 1720, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1128, 0, 0, 0, 0, 0, 0, - 2744, 1669, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3039, 0, + 0, 1880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2687, + 0, 0, 648, 648, 0, 0, 0, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1725, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1674, 0, + 0, 0, 596, 0, 0, 0, 0, 0, 0, 648, + 648, 648, 648, 0, 0, 0, 2724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 942, 0, 0, 0, 0, - 0, 0, 0, 2061, 0, 0, 0, 0, 0, 0, + 1129, 0, 0, 0, 0, 0, 0, 2751, 1674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1720, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 943, 0, 1725, 0, 0, 0, 0, 0, + 2066, 0, 0, 0, 1362, 0, 0, 0, 0, 648, + 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1777, 0, 0, 0, + 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1363, 0, 0, 0, 0, 0, 0, 0, 0, + 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3433, 0, + 0, 2959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 648, 0, 0, 0, 648, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2061, 2061, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3096, 3097, - 3098, 3099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 648, 0, 0, 0, 0, 0, 2066, 2066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3103, 3104, 3105, 3106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1362, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 648, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3172, 0, - 3174, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3179, 0, 3181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 648, 0, 648, 2066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3287, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3280, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3337, 0, 0, 0, + 3337, 3337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3330, - 0, 0, 0, 3330, 3330, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3414, 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, - 0, 0, 0, 0, 0, 0, 3407, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3411, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1129, + 1129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3462, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1128, 1128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3455, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2066, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, + 2959, 0, 3470, 1263, 1248, 502, 0, 1191, 1266, 1160, + 1179, 1276, 1182, 1185, 1227, 1139, 1205, 402, 1176, 1132, + 1164, 1134, 1171, 1135, 1162, 1193, 260, 1159, 1250, 1209, + 1265, 353, 257, 1141, 1165, 416, 1181, 198, 1229, 471, + 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, + 414, 492, 408, 1272, 357, 1215, 0, 481, 387, 0, + 0, 0, 1195, 1254, 1203, 1241, 1190, 1228, 1149, 1214, + 1267, 1177, 1224, 1268, 312, 240, 314, 197, 399, 482, + 276, 0, 0, 0, 0, 3442, 812, 0, 0, 0, + 0, 3443, 0, 0, 0, 0, 230, 0, 0, 237, + 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, + 337, 344, 350, 1173, 1221, 1262, 1174, 1223, 255, 310, + 262, 254, 507, 1273, 1253, 1138, 1202, 1261, 0, 0, + 221, 1264, 1197, 0, 1226, 0, 1279, 1133, 1217, 0, + 1136, 1140, 1275, 1257, 1168, 265, 0, 0, 0, 0, + 0, 0, 0, 1194, 1204, 1238, 1242, 1188, 0, 0, + 0, 0, 0, 0, 0, 1166, 0, 1213, 0, 0, + 0, 1145, 1137, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1192, 0, 0, 0, 0, + 1148, 0, 1167, 1239, 0, 1131, 287, 1142, 388, 247, + 0, 438, 1246, 1256, 1189, 549, 1260, 1187, 1186, 1233, + 1146, 1252, 1180, 352, 1144, 319, 193, 217, 0, 1178, + 398, 446, 458, 1251, 1163, 1172, 245, 1170, 456, 412, + 527, 225, 274, 443, 418, 454, 426, 277, 1212, 1231, + 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, + 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, + 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, + 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, + 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, + 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, + 0, 248, 401, 516, 517, 246, 571, 220, 543, 212, + 1143, 542, 394, 511, 520, 381, 370, 211, 518, 379, + 369, 323, 342, 343, 270, 296, 433, 362, 434, 295, + 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, + 532, 572, 226, 227, 229, 1158, 269, 273, 281, 284, + 292, 293, 302, 354, 405, 432, 428, 437, 1247, 506, + 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, + 564, 562, 393, 300, 479, 322, 360, 1236, 1278, 411, + 457, 232, 529, 480, 1153, 1157, 1151, 1218, 1152, 1207, + 1208, 1154, 1269, 1270, 1271, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 0, 1240, 1147, 0, 1155, 1156, 1249, + 1258, 1259, 591, 371, 470, 526, 324, 336, 339, 329, + 348, 0, 349, 325, 326, 331, 333, 334, 335, 340, + 341, 345, 351, 241, 203, 377, 385, 505, 301, 208, + 209, 210, 498, 499, 500, 501, 540, 541, 545, 447, + 448, 449, 450, 282, 535, 298, 453, 452, 320, 321, + 366, 435, 1211, 192, 213, 355, 1274, 439, 278, 569, + 539, 534, 199, 215, 1150, 252, 1161, 1169, 0, 1175, + 1183, 1184, 1196, 1198, 1199, 1200, 1201, 1219, 1220, 1222, + 1230, 1232, 1235, 1237, 1244, 1255, 1277, 194, 195, 202, + 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, + 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, + 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, + 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, + 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, + 484, 485, 490, 513, 515, 528, 546, 552, 465, 290, + 291, 430, 431, 303, 304, 566, 567, 289, 523, 553, + 521, 565, 547, 424, 365, 1210, 1216, 368, 271, 294, + 309, 1225, 538, 486, 219, 451, 280, 243, 1243, 1245, + 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, + 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, + 497, 382, 256, 419, 1206, 1234, 363, 503, 504, 305, + 383, 0, 0, 0, 1263, 1248, 502, 0, 1191, 1266, + 1160, 1179, 1276, 1182, 1185, 1227, 1139, 1205, 402, 1176, + 1132, 1164, 1134, 1171, 1135, 1162, 1193, 260, 1159, 1250, + 1209, 1265, 353, 257, 1141, 1165, 416, 1181, 198, 1229, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 1272, 357, 1215, 0, 481, 387, + 0, 0, 0, 1195, 1254, 1203, 1241, 1190, 1228, 1149, + 1214, 1267, 1177, 1224, 1268, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 190, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 1173, 1221, 1262, 1174, 1223, 255, + 310, 262, 254, 507, 1273, 1253, 1138, 1202, 1261, 0, + 0, 221, 1264, 1197, 0, 1226, 0, 1279, 1133, 1217, + 0, 1136, 1140, 1275, 1257, 1168, 265, 0, 0, 0, + 0, 0, 0, 0, 1194, 1204, 1238, 1242, 1188, 0, + 0, 0, 0, 0, 2776, 0, 1166, 0, 1213, 0, + 0, 0, 1145, 1137, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1192, 0, 0, 0, + 0, 1148, 0, 1167, 1239, 0, 1131, 287, 1142, 388, + 247, 0, 438, 1246, 1256, 1189, 549, 1260, 1187, 1186, + 1233, 1146, 1252, 1180, 352, 1144, 319, 193, 217, 0, + 1178, 398, 446, 458, 1251, 1163, 1172, 245, 1170, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 1212, + 1231, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 1143, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 1158, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 1247, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 1236, 1278, + 411, 457, 232, 529, 480, 1153, 1157, 1151, 1218, 1152, + 1207, 1208, 1154, 1269, 1270, 1271, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 1240, 1147, 0, 1155, 1156, + 1249, 1258, 1259, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 1211, 192, 213, 355, 1274, 439, 278, + 569, 539, 534, 199, 215, 1150, 252, 1161, 1169, 0, + 1175, 1183, 1184, 1196, 1198, 1199, 1200, 1201, 1219, 1220, + 1222, 1230, 1232, 1235, 1237, 1244, 1255, 1277, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 1210, 1216, 368, 271, + 294, 309, 1225, 538, 486, 219, 451, 280, 243, 1243, + 1245, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 1206, 1234, 363, 503, 504, + 305, 383, 0, 0, 0, 1263, 1248, 502, 0, 1191, + 1266, 1160, 1179, 1276, 1182, 1185, 1227, 1139, 1205, 402, + 1176, 1132, 1164, 1134, 1171, 1135, 1162, 1193, 260, 1159, + 1250, 1209, 1265, 353, 257, 1141, 1165, 416, 1181, 198, + 1229, 471, 244, 364, 361, 510, 272, 263, 259, 242, + 306, 372, 414, 492, 408, 1272, 357, 1215, 0, 481, + 387, 0, 0, 0, 1195, 1254, 1203, 1241, 1190, 1228, + 1149, 1214, 1267, 1177, 1224, 1268, 312, 240, 314, 197, + 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, + 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, + 330, 332, 337, 344, 350, 1173, 1221, 1262, 1174, 1223, + 255, 310, 262, 254, 507, 1273, 1253, 1138, 1202, 1261, + 0, 0, 221, 1264, 1197, 0, 1226, 0, 1279, 1133, + 1217, 0, 1136, 1140, 1275, 1257, 1168, 265, 0, 0, + 0, 0, 0, 0, 0, 1194, 1204, 1238, 1242, 1188, + 0, 0, 0, 0, 0, 2737, 0, 1166, 0, 1213, + 0, 0, 0, 1145, 1137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 383, 2952, 0, 3463, 1262, 1247, 502, 0, - 1190, 1265, 1159, 1178, 1275, 1181, 1184, 1226, 1138, 1204, - 402, 1175, 1131, 1163, 1133, 1170, 1134, 1161, 1192, 260, - 1158, 1249, 1208, 1264, 353, 257, 1140, 1164, 416, 1180, - 198, 1228, 471, 244, 364, 361, 510, 272, 263, 259, - 242, 306, 372, 414, 492, 408, 1271, 357, 1214, 0, - 481, 387, 0, 0, 0, 1194, 1253, 1202, 1240, 1189, - 1227, 1148, 1213, 1266, 1176, 1223, 1267, 312, 240, 314, - 197, 399, 482, 276, 0, 0, 0, 0, 3435, 812, - 0, 0, 0, 0, 3436, 0, 0, 0, 0, 230, + 0, 0, 0, 0, 0, 0, 0, 1192, 0, 0, + 0, 0, 1148, 0, 1167, 1239, 0, 1131, 287, 1142, + 388, 247, 0, 438, 1246, 1256, 1189, 549, 1260, 1187, + 1186, 1233, 1146, 1252, 1180, 352, 1144, 319, 193, 217, + 0, 1178, 398, 446, 458, 1251, 1163, 1172, 245, 1170, + 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, + 1212, 1231, 455, 359, 512, 436, 524, 550, 551, 253, + 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, + 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, + 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, + 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, + 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, + 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, + 543, 212, 1143, 542, 394, 511, 520, 381, 370, 211, + 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, + 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, + 0, 483, 532, 572, 226, 227, 229, 1158, 269, 273, + 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, + 1247, 506, 525, 537, 548, 554, 555, 557, 558, 559, + 560, 561, 564, 562, 393, 300, 479, 322, 360, 1236, + 1278, 411, 457, 232, 529, 480, 1153, 1157, 1151, 1218, + 1152, 1207, 1208, 1154, 1269, 1270, 1271, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 0, 1240, 1147, 0, 1155, + 1156, 1249, 1258, 1259, 591, 371, 470, 526, 324, 336, + 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, + 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, + 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, + 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, + 320, 321, 366, 435, 1211, 192, 213, 355, 1274, 439, + 278, 569, 539, 534, 199, 215, 1150, 252, 1161, 1169, + 0, 1175, 1183, 1184, 1196, 1198, 1199, 1200, 1201, 1219, + 1220, 1222, 1230, 1232, 1235, 1237, 1244, 1255, 1277, 194, + 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, + 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, + 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, + 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, + 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, + 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, + 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, + 523, 553, 521, 565, 547, 424, 365, 1210, 1216, 368, + 271, 294, 309, 1225, 538, 486, 219, 451, 280, 243, + 1243, 1245, 204, 238, 222, 249, 264, 267, 313, 378, + 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, + 494, 495, 497, 382, 256, 419, 1206, 1234, 363, 503, + 504, 305, 383, 0, 0, 0, 1263, 1248, 502, 0, + 1191, 1266, 1160, 1179, 1276, 1182, 1185, 1227, 1139, 1205, + 402, 1176, 1132, 1164, 1134, 1171, 1135, 1162, 1193, 260, + 1159, 1250, 1209, 1265, 353, 257, 1141, 1165, 416, 1181, + 198, 1229, 471, 244, 364, 361, 510, 272, 263, 259, + 242, 306, 372, 414, 492, 408, 1272, 357, 1215, 0, + 481, 387, 0, 0, 0, 1195, 1254, 1203, 1241, 1190, + 1228, 1149, 1214, 1267, 1177, 1224, 1268, 312, 240, 314, + 197, 399, 482, 276, 0, 0, 0, 0, 0, 812, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, - 328, 330, 332, 337, 344, 350, 1172, 1220, 1261, 1173, - 1222, 255, 310, 262, 254, 507, 1272, 1252, 1137, 1201, - 1260, 0, 0, 221, 1263, 1196, 0, 1225, 0, 1278, - 1132, 1216, 0, 1135, 1139, 1274, 1256, 1167, 265, 0, - 0, 0, 0, 0, 0, 0, 1193, 1203, 1237, 1241, - 1187, 0, 0, 0, 0, 0, 0, 0, 1165, 0, - 1212, 0, 0, 0, 1144, 1136, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1191, 0, - 0, 0, 0, 1147, 0, 1166, 1238, 0, 1130, 287, - 1141, 388, 247, 0, 438, 1245, 1255, 1188, 549, 1259, - 1186, 1185, 1232, 1145, 1251, 1179, 352, 1143, 319, 193, - 217, 0, 1177, 398, 446, 458, 1250, 1162, 1171, 245, - 1169, 456, 412, 527, 225, 274, 443, 418, 454, 426, - 277, 1211, 1230, 455, 359, 512, 436, 524, 550, 551, + 328, 330, 332, 337, 344, 350, 1173, 1221, 1262, 1174, + 1223, 255, 310, 262, 254, 507, 1273, 1253, 1138, 1202, + 1261, 0, 0, 221, 1264, 1197, 0, 1226, 0, 1279, + 1133, 1217, 0, 1136, 1140, 1275, 1257, 1168, 265, 0, + 0, 0, 0, 0, 0, 0, 1194, 1204, 1238, 1242, + 1188, 0, 0, 0, 0, 0, 2084, 0, 1166, 0, + 1213, 0, 0, 0, 1145, 1137, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1192, 0, + 0, 0, 0, 1148, 0, 1167, 1239, 0, 1131, 287, + 1142, 388, 247, 0, 438, 1246, 1256, 1189, 549, 1260, + 1187, 1186, 1233, 1146, 1252, 1180, 352, 1144, 319, 193, + 217, 0, 1178, 398, 446, 458, 1251, 1163, 1172, 245, + 1170, 456, 412, 527, 225, 274, 443, 418, 454, 426, + 277, 1212, 1231, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, 571, - 220, 543, 212, 1142, 542, 394, 511, 520, 381, 370, + 220, 543, 212, 1143, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, - 201, 0, 483, 532, 572, 226, 227, 229, 1157, 269, + 201, 0, 483, 532, 572, 226, 227, 229, 1158, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, - 437, 1246, 506, 525, 537, 548, 554, 555, 557, 558, + 437, 1247, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, - 1235, 1277, 411, 457, 232, 529, 480, 1152, 1156, 1150, - 1217, 1151, 1206, 1207, 1153, 1268, 1269, 1270, 573, 574, + 1236, 1278, 411, 457, 232, 529, 480, 1153, 1157, 1151, + 1218, 1152, 1207, 1208, 1154, 1269, 1270, 1271, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 0, 1239, 1146, 0, - 1154, 1155, 1248, 1257, 1258, 591, 371, 470, 526, 324, + 585, 586, 587, 588, 589, 590, 0, 1240, 1147, 0, + 1155, 1156, 1249, 1258, 1259, 591, 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, 453, - 452, 320, 321, 366, 435, 1210, 192, 213, 355, 1273, - 439, 278, 569, 539, 534, 199, 215, 1149, 252, 1160, - 1168, 0, 1174, 1182, 1183, 1195, 1197, 1198, 1199, 1200, - 1218, 1219, 1221, 1229, 1231, 1234, 1236, 1243, 1254, 1276, + 452, 320, 321, 366, 435, 1211, 192, 213, 355, 1274, + 439, 278, 569, 539, 534, 199, 215, 1150, 252, 1161, + 1169, 0, 1175, 1183, 1184, 1196, 1198, 1199, 1200, 1201, + 1219, 1220, 1222, 1230, 1232, 1235, 1237, 1244, 1255, 1277, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, @@ -2542,132 +2780,132 @@ var yyAct = [...]int{ 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, 567, - 289, 523, 553, 521, 565, 547, 424, 365, 1209, 1215, - 368, 271, 294, 309, 1224, 538, 486, 219, 451, 280, - 243, 1242, 1244, 204, 238, 222, 249, 264, 267, 313, + 289, 523, 553, 521, 565, 547, 424, 365, 1210, 1216, + 368, 271, 294, 309, 1225, 538, 486, 219, 451, 280, + 243, 1243, 1245, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, - 493, 494, 495, 497, 382, 256, 419, 1205, 1233, 363, - 503, 504, 305, 383, 0, 0, 0, 1262, 1247, 502, - 0, 1190, 1265, 1159, 1178, 1275, 1181, 1184, 1226, 1138, - 1204, 402, 1175, 1131, 1163, 1133, 1170, 1134, 1161, 1192, - 260, 1158, 1249, 1208, 1264, 353, 257, 1140, 1164, 416, - 1180, 198, 1228, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 1271, 357, 1214, - 0, 481, 387, 0, 0, 0, 1194, 1253, 1202, 1240, - 1189, 1227, 1148, 1213, 1266, 1176, 1223, 1267, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 493, 494, 495, 497, 382, 256, 419, 1206, 1234, 363, + 503, 504, 305, 383, 0, 0, 0, 1263, 1248, 502, + 0, 1191, 1266, 1160, 1179, 1276, 1182, 1185, 1227, 1139, + 1205, 402, 1176, 1132, 1164, 1134, 1171, 1135, 1162, 1193, + 260, 1159, 1250, 1209, 1265, 353, 257, 1141, 1165, 416, + 1181, 198, 1229, 471, 244, 364, 361, 510, 272, 263, + 259, 242, 306, 372, 414, 492, 408, 1272, 357, 1215, + 0, 481, 387, 0, 0, 0, 1195, 1254, 1203, 1241, + 1190, 1228, 1149, 1214, 1267, 1177, 1224, 1268, 312, 240, + 314, 197, 399, 482, 276, 0, 91, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 1172, 1220, 1261, - 1173, 1222, 255, 310, 262, 254, 507, 1272, 1252, 1137, - 1201, 1260, 0, 0, 221, 1263, 1196, 0, 1225, 0, - 1278, 1132, 1216, 0, 1135, 1139, 1274, 1256, 1167, 265, - 0, 0, 0, 0, 0, 0, 0, 1193, 1203, 1237, - 1241, 1187, 0, 0, 0, 0, 0, 2769, 0, 1165, - 0, 1212, 0, 0, 0, 1144, 1136, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1191, - 0, 0, 0, 0, 1147, 0, 1166, 1238, 0, 1130, - 287, 1141, 388, 247, 0, 438, 1245, 1255, 1188, 549, - 1259, 1186, 1185, 1232, 1145, 1251, 1179, 352, 1143, 319, - 193, 217, 0, 1177, 398, 446, 458, 1250, 1162, 1171, - 245, 1169, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 1211, 1230, 455, 359, 512, 436, 524, 550, + 327, 328, 330, 332, 337, 344, 350, 1173, 1221, 1262, + 1174, 1223, 255, 310, 262, 254, 507, 1273, 1253, 1138, + 1202, 1261, 0, 0, 221, 1264, 1197, 0, 1226, 0, + 1279, 1133, 1217, 0, 1136, 1140, 1275, 1257, 1168, 265, + 0, 0, 0, 0, 0, 0, 0, 1194, 1204, 1238, + 1242, 1188, 0, 0, 0, 0, 0, 0, 0, 1166, + 0, 1213, 0, 0, 0, 1145, 1137, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1192, + 0, 0, 0, 0, 1148, 0, 1167, 1239, 0, 1131, + 287, 1142, 388, 247, 0, 438, 1246, 1256, 1189, 549, + 1260, 1187, 1186, 1233, 1146, 1252, 1180, 352, 1144, 319, + 193, 217, 0, 1178, 398, 446, 458, 1251, 1163, 1172, + 245, 1170, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 1212, 1231, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 1142, 542, 394, 511, 520, 381, + 571, 220, 543, 212, 1143, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 1157, + 0, 201, 0, 483, 532, 572, 226, 227, 229, 1158, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 1246, 506, 525, 537, 548, 554, 555, 557, + 428, 437, 1247, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 1235, 1277, 411, 457, 232, 529, 480, 1152, 1156, - 1150, 1217, 1151, 1206, 1207, 1153, 1268, 1269, 1270, 573, + 360, 1236, 1278, 411, 457, 232, 529, 480, 1153, 1157, + 1151, 1218, 1152, 1207, 1208, 1154, 1269, 1270, 1271, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 1239, 1146, - 0, 1154, 1155, 1248, 1257, 1258, 591, 371, 470, 526, + 584, 585, 586, 587, 588, 589, 590, 0, 1240, 1147, + 0, 1155, 1156, 1249, 1258, 1259, 591, 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 1210, 192, 213, 355, - 1273, 439, 278, 569, 539, 534, 199, 215, 1149, 252, - 1160, 1168, 0, 1174, 1182, 1183, 1195, 1197, 1198, 1199, - 1200, 1218, 1219, 1221, 1229, 1231, 1234, 1236, 1243, 1254, - 1276, 194, 195, 202, 214, 224, 228, 235, 251, 266, + 453, 452, 320, 321, 366, 435, 1211, 192, 213, 355, + 1274, 439, 278, 569, 539, 534, 199, 215, 1150, 252, + 1161, 1169, 0, 1175, 1183, 1184, 1196, 1198, 1199, 1200, + 1201, 1219, 1220, 1222, 1230, 1232, 1235, 1237, 1244, 1255, + 1277, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 1209, - 1215, 368, 271, 294, 309, 1224, 538, 486, 219, 451, - 280, 243, 1242, 1244, 204, 238, 222, 249, 264, 267, + 567, 289, 523, 553, 521, 565, 547, 424, 365, 1210, + 1216, 368, 271, 294, 309, 1225, 538, 486, 219, 451, + 280, 243, 1243, 1245, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 1205, 1233, - 363, 503, 504, 305, 383, 0, 0, 0, 1262, 1247, - 502, 0, 1190, 1265, 1159, 1178, 1275, 1181, 1184, 1226, - 1138, 1204, 402, 1175, 1131, 1163, 1133, 1170, 1134, 1161, - 1192, 260, 1158, 1249, 1208, 1264, 353, 257, 1140, 1164, - 416, 1180, 198, 1228, 471, 244, 364, 361, 510, 272, - 263, 259, 242, 306, 372, 414, 492, 408, 1271, 357, - 1214, 0, 481, 387, 0, 0, 0, 1194, 1253, 1202, - 1240, 1189, 1227, 1148, 1213, 1266, 1176, 1223, 1267, 312, + 469, 493, 494, 495, 497, 382, 256, 419, 1206, 1234, + 363, 503, 504, 305, 383, 0, 0, 0, 1263, 1248, + 502, 0, 1191, 1266, 1160, 1179, 1276, 1182, 1185, 1227, + 1139, 1205, 402, 1176, 1132, 1164, 1134, 1171, 1135, 1162, + 1193, 260, 1159, 1250, 1209, 1265, 353, 257, 1141, 1165, + 416, 1181, 198, 1229, 471, 244, 364, 361, 510, 272, + 263, 259, 242, 306, 372, 414, 492, 408, 1272, 357, + 1215, 0, 481, 387, 0, 0, 0, 1195, 1254, 1203, + 1241, 1190, 1228, 1149, 1214, 1267, 1177, 1224, 1268, 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, 0, - 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, - 346, 327, 328, 330, 332, 337, 344, 350, 1172, 1220, - 1261, 1173, 1222, 255, 310, 262, 254, 507, 1272, 1252, - 1137, 1201, 1260, 0, 0, 221, 1263, 1196, 0, 1225, - 0, 1278, 1132, 1216, 0, 1135, 1139, 1274, 1256, 1167, - 265, 0, 0, 0, 0, 0, 0, 0, 1193, 1203, - 1237, 1241, 1187, 0, 0, 0, 0, 0, 2730, 0, - 1165, 0, 1212, 0, 0, 0, 1144, 1136, 0, 0, + 346, 327, 328, 330, 332, 337, 344, 350, 1173, 1221, + 1262, 1174, 1223, 255, 310, 262, 254, 507, 1273, 1253, + 1138, 1202, 1261, 0, 0, 221, 1264, 1197, 0, 1226, + 0, 1279, 1133, 1217, 0, 1136, 1140, 1275, 1257, 1168, + 265, 0, 0, 0, 0, 0, 0, 0, 1194, 1204, + 1238, 1242, 1188, 0, 0, 0, 0, 0, 0, 0, + 1166, 0, 1213, 0, 0, 0, 1145, 1137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1191, 0, 0, 0, 0, 1147, 0, 1166, 1238, 0, - 1130, 287, 1141, 388, 247, 0, 438, 1245, 1255, 1188, - 549, 1259, 1186, 1185, 1232, 1145, 1251, 1179, 352, 1143, - 319, 193, 217, 0, 1177, 398, 446, 458, 1250, 1162, - 1171, 245, 1169, 456, 412, 527, 225, 274, 443, 418, - 454, 426, 277, 1211, 1230, 455, 359, 512, 436, 524, + 1192, 0, 0, 0, 0, 1148, 0, 1167, 1239, 0, + 1131, 287, 1142, 388, 247, 0, 438, 1246, 1256, 1189, + 549, 1260, 1187, 1186, 1233, 1146, 1252, 1180, 352, 1144, + 319, 193, 217, 0, 1178, 398, 446, 458, 1251, 1163, + 1172, 245, 1170, 456, 412, 527, 225, 274, 443, 418, + 454, 426, 277, 1212, 1231, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, 517, - 246, 571, 220, 543, 212, 1142, 542, 394, 511, 520, + 246, 571, 220, 543, 212, 1143, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, - 1157, 269, 273, 281, 284, 292, 293, 302, 354, 405, - 432, 428, 437, 1246, 506, 525, 537, 548, 554, 555, + 1158, 269, 273, 281, 284, 292, 293, 302, 354, 405, + 432, 428, 437, 1247, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, - 322, 360, 1235, 1277, 411, 457, 232, 529, 480, 1152, - 1156, 1150, 1217, 1151, 1206, 1207, 1153, 1268, 1269, 1270, + 322, 360, 1236, 1278, 411, 457, 232, 529, 480, 1153, + 1157, 1151, 1218, 1152, 1207, 1208, 1154, 1269, 1270, 1271, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 0, 1239, - 1146, 0, 1154, 1155, 1248, 1257, 1258, 591, 371, 470, + 583, 584, 585, 586, 587, 588, 589, 590, 0, 1240, + 1147, 0, 1155, 1156, 1249, 1258, 1259, 591, 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, 535, - 298, 453, 452, 320, 321, 366, 435, 1210, 192, 213, - 355, 1273, 439, 278, 569, 539, 534, 199, 215, 1149, - 252, 1160, 1168, 0, 1174, 1182, 1183, 1195, 1197, 1198, - 1199, 1200, 1218, 1219, 1221, 1229, 1231, 1234, 1236, 1243, - 1254, 1276, 194, 195, 202, 214, 224, 228, 235, 251, + 298, 453, 452, 320, 321, 366, 435, 1211, 192, 213, + 355, 1274, 439, 278, 569, 539, 534, 199, 215, 1150, + 252, 1161, 1169, 0, 1175, 1183, 1184, 1196, 1198, 1199, + 1200, 1201, 1219, 1220, 1222, 1230, 1232, 1235, 1237, 1244, + 1255, 1277, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, @@ -2675,65 +2913,65 @@ var yyAct = [...]int{ 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, 365, - 1209, 1215, 368, 271, 294, 309, 1224, 538, 486, 219, - 451, 280, 243, 1242, 1244, 204, 238, 222, 249, 264, + 1210, 1216, 368, 271, 294, 309, 1225, 538, 486, 219, + 451, 280, 243, 1243, 1245, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, - 233, 469, 493, 494, 495, 497, 382, 256, 419, 1205, - 1233, 363, 503, 504, 305, 383, 0, 0, 0, 1262, - 1247, 502, 0, 1190, 1265, 1159, 1178, 1275, 1181, 1184, - 1226, 1138, 1204, 402, 1175, 1131, 1163, 1133, 1170, 1134, - 1161, 1192, 260, 1158, 1249, 1208, 1264, 353, 257, 1140, - 1164, 416, 1180, 198, 1228, 471, 244, 364, 361, 510, - 272, 263, 259, 242, 306, 372, 414, 492, 408, 1271, - 357, 1214, 0, 481, 387, 0, 0, 0, 1194, 1253, - 1202, 1240, 1189, 1227, 1148, 1213, 1266, 1176, 1223, 1267, + 233, 469, 493, 494, 495, 497, 382, 256, 419, 1206, + 1234, 363, 503, 504, 305, 383, 0, 0, 0, 1263, + 1248, 502, 0, 1191, 1266, 1160, 1179, 1276, 1182, 1185, + 1227, 1139, 1205, 402, 1176, 1132, 1164, 1134, 1171, 1135, + 1162, 1193, 260, 1159, 1250, 1209, 1265, 353, 257, 1141, + 1165, 416, 1181, 198, 1229, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 1272, + 357, 1215, 0, 481, 387, 0, 0, 0, 1195, 1254, + 1203, 1241, 1190, 1228, 1149, 1214, 1267, 1177, 1224, 1268, 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, - 0, 0, 812, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, - 347, 346, 327, 328, 330, 332, 337, 344, 350, 1172, - 1220, 1261, 1173, 1222, 255, 310, 262, 254, 507, 1272, - 1252, 1137, 1201, 1260, 0, 0, 221, 1263, 1196, 0, - 1225, 0, 1278, 1132, 1216, 0, 1135, 1139, 1274, 1256, - 1167, 265, 0, 0, 0, 0, 0, 0, 0, 1193, - 1203, 1237, 1241, 1187, 0, 0, 0, 0, 0, 2077, - 0, 1165, 0, 1212, 0, 0, 0, 1144, 1136, 0, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 1173, + 1221, 1262, 1174, 1223, 255, 310, 262, 254, 507, 1273, + 1253, 1138, 1202, 1261, 0, 0, 221, 1264, 1197, 0, + 1226, 0, 1279, 1133, 1217, 0, 1136, 1140, 1275, 1257, + 1168, 265, 0, 0, 0, 0, 0, 0, 0, 1194, + 1204, 1238, 1242, 1188, 0, 0, 0, 0, 0, 0, + 0, 1166, 0, 1213, 0, 0, 0, 1145, 1137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1191, 0, 0, 0, 0, 1147, 0, 1166, 1238, - 0, 1130, 287, 1141, 388, 247, 0, 438, 1245, 1255, - 1188, 549, 1259, 1186, 1185, 1232, 1145, 1251, 1179, 352, - 1143, 319, 193, 217, 0, 1177, 398, 446, 458, 1250, - 1162, 1171, 245, 1169, 456, 412, 527, 225, 274, 443, - 418, 454, 426, 277, 1211, 1230, 455, 359, 512, 436, + 0, 1192, 0, 0, 0, 0, 1148, 0, 1167, 1239, + 0, 1131, 287, 1142, 388, 247, 0, 438, 1246, 1256, + 1189, 549, 1260, 1187, 1186, 1233, 1146, 1252, 1180, 352, + 1144, 319, 193, 217, 0, 1178, 398, 446, 458, 1251, + 1163, 1172, 245, 1170, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 1212, 1231, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, - 517, 246, 571, 220, 543, 212, 1142, 542, 394, 511, + 517, 246, 571, 220, 543, 212, 1143, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, - 229, 1157, 269, 273, 281, 284, 292, 293, 302, 354, - 405, 432, 428, 437, 1246, 506, 525, 537, 548, 554, + 229, 1158, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 1247, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, - 479, 322, 360, 1235, 1277, 411, 457, 232, 529, 480, - 1152, 1156, 1150, 1217, 1151, 1206, 1207, 1153, 1268, 1269, - 1270, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 479, 322, 360, 1236, 1278, 411, 457, 232, 529, 480, + 1153, 1157, 1151, 1218, 1152, 1207, 1208, 1154, 1269, 1270, + 1271, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, - 1239, 1146, 0, 1154, 1155, 1248, 1257, 1258, 591, 371, + 1240, 1147, 0, 1155, 1156, 1249, 1258, 1259, 591, 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, - 535, 298, 453, 452, 320, 321, 366, 435, 1210, 192, - 213, 355, 1273, 439, 278, 569, 539, 534, 199, 215, - 1149, 252, 1160, 1168, 0, 1174, 1182, 1183, 1195, 1197, - 1198, 1199, 1200, 1218, 1219, 1221, 1229, 1231, 1234, 1236, - 1243, 1254, 1276, 194, 195, 202, 214, 224, 228, 235, + 535, 298, 453, 452, 320, 321, 366, 435, 1211, 192, + 213, 355, 1274, 439, 278, 569, 539, 534, 199, 215, + 1150, 252, 1161, 1169, 0, 1175, 1183, 1184, 1196, 1198, + 1199, 1200, 1201, 1219, 1220, 1222, 1230, 1232, 1235, 1237, + 1244, 1255, 1277, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, @@ -2741,65 +2979,65 @@ var yyAct = [...]int{ 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, - 365, 1209, 1215, 368, 271, 294, 309, 1224, 538, 486, - 219, 451, 280, 243, 1242, 1244, 204, 238, 222, 249, + 365, 1210, 1216, 368, 271, 294, 309, 1225, 538, 486, + 219, 451, 280, 243, 1243, 1245, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, - 1205, 1233, 363, 503, 504, 305, 383, 0, 0, 0, - 1262, 1247, 502, 0, 1190, 1265, 1159, 1178, 1275, 1181, - 1184, 1226, 1138, 1204, 402, 1175, 1131, 1163, 1133, 1170, - 1134, 1161, 1192, 260, 1158, 1249, 1208, 1264, 353, 257, - 1140, 1164, 416, 1180, 198, 1228, 471, 244, 364, 361, + 1206, 1234, 363, 503, 504, 305, 383, 0, 0, 0, + 1263, 1248, 502, 0, 1191, 1266, 1160, 1179, 1276, 1182, + 1185, 1227, 1139, 1205, 402, 1176, 1132, 1164, 1134, 1171, + 1135, 1162, 1193, 260, 1159, 1250, 1209, 1265, 353, 257, + 1141, 1165, 416, 1181, 198, 1229, 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 1271, 357, 1214, 0, 481, 387, 0, 0, 0, 1194, - 1253, 1202, 1240, 1189, 1227, 1148, 1213, 1266, 1176, 1223, - 1267, 312, 240, 314, 197, 399, 482, 276, 0, 91, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, + 1272, 357, 1215, 0, 481, 387, 0, 0, 0, 1195, + 1254, 1203, 1241, 1190, 1228, 1149, 1214, 1267, 1177, 1224, + 1268, 312, 240, 314, 197, 399, 482, 276, 0, 0, + 0, 0, 0, 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 1172, 1220, 1261, 1173, 1222, 255, 310, 262, 254, 507, - 1272, 1252, 1137, 1201, 1260, 0, 0, 221, 1263, 1196, - 0, 1225, 0, 1278, 1132, 1216, 0, 1135, 1139, 1274, - 1256, 1167, 265, 0, 0, 0, 0, 0, 0, 0, - 1193, 1203, 1237, 1241, 1187, 0, 0, 0, 0, 0, - 0, 0, 1165, 0, 1212, 0, 0, 0, 1144, 1136, + 1173, 1221, 1262, 1174, 1223, 255, 310, 262, 254, 507, + 1273, 1253, 1138, 1202, 1261, 0, 0, 221, 1264, 1197, + 0, 1226, 0, 1279, 1133, 1217, 0, 1136, 1140, 1275, + 1257, 1168, 265, 0, 0, 0, 0, 0, 0, 0, + 1194, 1204, 1238, 1242, 1188, 0, 0, 0, 0, 0, + 0, 0, 1166, 0, 1213, 0, 0, 0, 1145, 1137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1191, 0, 0, 0, 0, 1147, 0, 1166, - 1238, 0, 1130, 287, 1141, 388, 247, 0, 438, 1245, - 1255, 1188, 549, 1259, 1186, 1185, 1232, 1145, 1251, 1179, - 352, 1143, 319, 193, 217, 0, 1177, 398, 446, 458, - 1250, 1162, 1171, 245, 1169, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 1211, 1230, 455, 359, 512, + 0, 0, 1192, 0, 0, 0, 0, 1148, 0, 1167, + 1239, 0, 1131, 287, 1142, 388, 247, 0, 438, 1246, + 1256, 1189, 549, 1260, 1187, 1186, 1233, 1146, 1252, 1180, + 352, 1144, 319, 193, 217, 0, 1178, 398, 446, 458, + 1251, 1163, 1172, 245, 1170, 456, 412, 527, 225, 274, + 443, 418, 454, 426, 277, 1212, 1231, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 1142, 542, 394, + 516, 517, 246, 571, 220, 543, 212, 1143, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 1157, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 1246, 506, 525, 537, 548, + 227, 229, 1158, 269, 273, 281, 284, 292, 293, 302, + 354, 405, 432, 428, 437, 1247, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 1235, 1277, 411, 457, 232, 529, - 480, 1152, 1156, 1150, 1217, 1151, 1206, 1207, 1153, 1268, - 1269, 1270, 573, 574, 575, 576, 577, 578, 579, 580, + 300, 479, 322, 360, 1236, 1278, 411, 457, 232, 529, + 480, 1153, 1157, 1151, 1218, 1152, 1207, 1208, 1154, 1269, + 1270, 1271, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 1239, 1146, 0, 1154, 1155, 1248, 1257, 1258, 591, + 0, 1240, 1147, 0, 1155, 1156, 1249, 1258, 1259, 591, 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 1210, - 192, 213, 355, 1273, 439, 278, 569, 539, 534, 199, - 215, 1149, 252, 1160, 1168, 0, 1174, 1182, 1183, 1195, - 1197, 1198, 1199, 1200, 1218, 1219, 1221, 1229, 1231, 1234, - 1236, 1243, 1254, 1276, 194, 195, 202, 214, 224, 228, + 282, 535, 298, 453, 452, 320, 321, 366, 435, 1211, + 192, 213, 355, 1274, 439, 278, 569, 539, 534, 199, + 215, 1150, 252, 1161, 1169, 0, 1175, 1183, 1184, 1196, + 1198, 1199, 1200, 1201, 1219, 1220, 1222, 1230, 1232, 1235, + 1237, 1244, 1255, 1277, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, @@ -2807,1087 +3045,168 @@ var yyAct = [...]int{ 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 1209, 1215, 368, 271, 294, 309, 1224, 538, - 486, 219, 451, 280, 243, 1242, 1244, 204, 238, 222, + 424, 365, 1210, 1216, 368, 271, 294, 309, 1225, 538, + 486, 219, 451, 280, 243, 1243, 1245, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 1205, 1233, 363, 503, 504, 305, 383, 0, 0, - 0, 1262, 1247, 502, 0, 1190, 1265, 1159, 1178, 1275, - 1181, 1184, 1226, 1138, 1204, 402, 1175, 1131, 1163, 1133, - 1170, 1134, 1161, 1192, 260, 1158, 1249, 1208, 1264, 353, - 257, 1140, 1164, 416, 1180, 198, 1228, 471, 244, 364, + 419, 1206, 1234, 363, 503, 504, 305, 383, 0, 0, + 0, 0, 0, 502, 0, 691, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, + 678, 0, 0, 0, 260, 683, 0, 0, 0, 353, + 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, 492, - 408, 1271, 357, 1214, 0, 481, 387, 0, 0, 0, - 1194, 1253, 1202, 1240, 1189, 1227, 1148, 1213, 1266, 1176, - 1223, 1267, 312, 240, 314, 197, 399, 482, 276, 0, - 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, - 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, - 350, 1172, 1220, 1261, 1173, 1222, 255, 310, 262, 254, - 507, 1272, 1252, 1137, 1201, 1260, 0, 0, 221, 1263, - 1196, 0, 1225, 0, 1278, 1132, 1216, 0, 1135, 1139, - 1274, 1256, 1167, 265, 0, 0, 0, 0, 0, 0, - 0, 1193, 1203, 1237, 1241, 1187, 0, 0, 0, 0, - 0, 0, 0, 1165, 0, 1212, 0, 0, 0, 1144, - 1136, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1191, 0, 0, 0, 0, 1147, 0, - 1166, 1238, 0, 1130, 287, 1141, 388, 247, 0, 438, - 1245, 1255, 1188, 549, 1259, 1186, 1185, 1232, 1145, 1251, - 1179, 352, 1143, 319, 193, 217, 0, 1177, 398, 446, - 458, 1250, 1162, 1171, 245, 1169, 456, 412, 527, 225, - 274, 443, 418, 454, 426, 277, 1211, 1230, 455, 359, + 408, 690, 357, 0, 0, 481, 387, 0, 0, 0, + 0, 0, 686, 687, 0, 0, 0, 0, 0, 0, + 0, 0, 312, 240, 314, 197, 399, 482, 276, 0, + 91, 0, 0, 828, 812, 778, 779, 816, 829, 830, + 831, 832, 817, 0, 230, 818, 819, 237, 820, 0, + 777, 718, 720, 719, 737, 738, 739, 740, 741, 742, + 743, 716, 825, 833, 834, 0, 255, 310, 262, 254, + 507, 0, 0, 1961, 1962, 1963, 0, 0, 221, 0, + 0, 0, 0, 0, 0, 0, 660, 675, 0, 689, + 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 672, + 673, 0, 0, 0, 0, 772, 0, 674, 0, 0, + 682, 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, 865, 866, 867, 868, 869, 870, 871, 872, 873, + 874, 875, 876, 685, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 287, 0, 388, 247, 0, 438, + 771, 0, 0, 549, 0, 0, 769, 0, 0, 0, + 0, 352, 0, 319, 193, 217, 0, 0, 398, 446, + 458, 0, 0, 0, 822, 0, 456, 412, 527, 225, + 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, - 401, 516, 517, 246, 571, 220, 543, 212, 1142, 542, + 401, 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, 323, - 342, 343, 270, 296, 433, 362, 434, 295, 297, 390, + 732, 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, - 226, 227, 229, 1157, 269, 273, 281, 284, 292, 293, - 302, 354, 405, 432, 428, 437, 1246, 506, 525, 537, + 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, + 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, - 393, 300, 479, 322, 360, 1235, 1277, 411, 457, 232, - 529, 480, 1152, 1156, 1150, 1217, 1151, 1206, 1207, 1153, - 1268, 1269, 1270, 573, 574, 575, 576, 577, 578, 579, + 393, 300, 479, 322, 360, 0, 0, 411, 457, 232, + 529, 480, 782, 770, 695, 786, 697, 783, 784, 692, + 693, 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 0, 1239, 1146, 0, 1154, 1155, 1248, 1257, 1258, - 591, 371, 470, 526, 324, 336, 339, 329, 348, 0, - 349, 325, 326, 331, 333, 334, 335, 340, 341, 345, - 351, 241, 203, 377, 385, 505, 301, 208, 209, 210, - 498, 499, 500, 501, 540, 541, 545, 447, 448, 449, - 450, 282, 535, 298, 453, 452, 320, 321, 366, 435, - 1210, 192, 213, 355, 1273, 439, 278, 569, 539, 534, - 199, 215, 1149, 252, 1160, 1168, 0, 1174, 1182, 1183, - 1195, 1197, 1198, 1199, 1200, 1218, 1219, 1221, 1229, 1231, - 1234, 1236, 1243, 1254, 1276, 194, 195, 202, 214, 224, + 590, 0, 773, 681, 680, 0, 688, 0, 714, 715, + 717, 721, 722, 723, 734, 735, 736, 744, 746, 747, + 745, 748, 749, 750, 753, 754, 755, 756, 751, 752, + 757, 698, 702, 699, 700, 701, 713, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 796, 797, 798, + 799, 800, 801, 727, 731, 730, 728, 729, 725, 726, + 679, 192, 213, 355, 0, 439, 278, 569, 539, 534, + 199, 215, 787, 252, 788, 0, 0, 792, 0, 0, + 0, 794, 793, 0, 795, 761, 760, 0, 0, 789, + 790, 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, - 490, 513, 515, 528, 546, 552, 465, 290, 291, 430, - 431, 303, 304, 566, 567, 289, 523, 553, 521, 565, - 547, 424, 365, 1209, 1215, 368, 271, 294, 309, 1224, - 538, 486, 219, 451, 280, 243, 1242, 1244, 204, 238, + 490, 513, 515, 528, 546, 552, 465, 802, 803, 804, + 805, 806, 807, 808, 809, 289, 523, 553, 521, 565, + 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, + 538, 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, - 256, 419, 1205, 1233, 363, 503, 504, 305, 383, 0, - 0, 0, 1262, 1247, 502, 0, 1190, 1265, 1159, 1178, - 1275, 1181, 1184, 1226, 1138, 1204, 402, 1175, 1131, 1163, - 1133, 1170, 1134, 1161, 1192, 260, 1158, 1249, 1208, 1264, - 353, 257, 1140, 1164, 416, 1180, 198, 1228, 471, 244, + 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, + 691, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 402, 0, 0, 0, 0, 678, 0, 0, 0, 260, + 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, + 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, + 242, 306, 372, 414, 492, 408, 690, 357, 0, 0, + 481, 387, 0, 0, 0, 0, 0, 686, 687, 0, + 0, 0, 0, 0, 0, 2113, 0, 312, 240, 314, + 197, 399, 482, 276, 0, 91, 0, 0, 828, 812, + 778, 779, 816, 829, 830, 831, 832, 817, 0, 230, + 818, 819, 237, 820, 0, 777, 718, 720, 719, 737, + 738, 739, 740, 741, 742, 743, 716, 825, 833, 834, + 2114, 255, 310, 262, 254, 507, 0, 0, 0, 0, + 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, + 0, 660, 675, 0, 689, 0, 0, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 672, 673, 0, 0, 0, 0, + 772, 0, 674, 0, 0, 682, 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, 865, 866, 867, 868, + 869, 870, 871, 872, 873, 874, 875, 876, 685, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, + 0, 388, 247, 0, 438, 771, 0, 0, 549, 0, + 0, 769, 0, 0, 0, 0, 352, 0, 319, 193, + 217, 0, 0, 398, 446, 458, 0, 0, 0, 822, + 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, + 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, + 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, + 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, + 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, + 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, + 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, + 258, 283, 0, 0, 248, 401, 823, 824, 246, 571, + 724, 543, 212, 0, 542, 394, 511, 520, 381, 370, + 211, 518, 379, 369, 323, 732, 733, 270, 296, 433, + 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, + 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, + 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, + 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, + 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, + 0, 0, 411, 457, 232, 529, 480, 782, 770, 695, + 786, 697, 783, 784, 692, 693, 696, 785, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 0, 773, 681, 680, + 0, 688, 0, 714, 715, 717, 721, 722, 723, 734, + 735, 736, 744, 746, 747, 745, 748, 749, 750, 753, + 754, 755, 756, 751, 752, 757, 698, 702, 699, 700, + 701, 713, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 796, 797, 798, 799, 800, 801, 727, 731, + 730, 728, 729, 725, 726, 679, 192, 213, 355, 0, + 439, 278, 569, 539, 534, 199, 215, 787, 252, 788, + 0, 0, 792, 0, 0, 0, 794, 793, 0, 795, + 761, 760, 0, 0, 789, 790, 0, 791, 0, 0, + 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, + 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, + 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, + 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, + 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, + 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, + 552, 465, 802, 803, 804, 805, 806, 807, 808, 809, + 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, + 368, 271, 294, 309, 0, 538, 486, 219, 451, 280, + 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, + 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, + 493, 494, 495, 497, 382, 256, 419, 0, 383, 363, + 503, 504, 305, 82, 502, 0, 691, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, + 0, 678, 0, 0, 0, 260, 683, 0, 0, 0, + 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 1271, 357, 1214, 0, 481, 387, 0, 0, - 0, 1194, 1253, 1202, 1240, 1189, 1227, 1148, 1213, 1266, - 1176, 1223, 1267, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 1172, 1220, 1261, 1173, 1222, 255, 310, 262, - 254, 507, 1272, 1252, 1137, 1201, 1260, 0, 0, 221, - 1263, 1196, 0, 1225, 0, 1278, 1132, 1216, 0, 1135, - 1139, 1274, 1256, 1167, 265, 0, 0, 0, 0, 0, - 0, 0, 1193, 1203, 1237, 1241, 1187, 0, 0, 0, - 0, 0, 0, 0, 1165, 0, 1212, 0, 0, 0, - 1144, 1136, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1191, 0, 0, 0, 0, 1147, - 0, 1166, 1238, 0, 1130, 287, 1141, 388, 247, 0, - 438, 1245, 1255, 1188, 549, 1259, 1186, 1185, 1232, 1145, - 1251, 1179, 352, 1143, 319, 193, 217, 0, 1177, 398, - 446, 458, 1250, 1162, 1171, 245, 1169, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 1211, 1230, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 1142, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 1157, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 1246, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 1235, 1277, 411, 457, - 232, 529, 480, 1152, 1156, 1150, 1217, 1151, 1206, 1207, - 1153, 1268, 1269, 1270, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 1239, 1146, 0, 1154, 1155, 1248, 1257, - 1258, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 1210, 192, 213, 355, 1273, 439, 278, 569, 539, - 534, 199, 215, 1149, 252, 1160, 1168, 0, 1174, 1182, - 1183, 1195, 1197, 1198, 1199, 1200, 1218, 1219, 1221, 1229, - 1231, 1234, 1236, 1243, 1254, 1276, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 1209, 1215, 368, 271, 294, 309, - 1224, 538, 486, 219, 451, 280, 243, 1242, 1244, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 1205, 1233, 363, 503, 504, 305, 383, - 0, 0, 0, 1262, 1247, 502, 0, 1190, 1265, 1159, - 1178, 1275, 1181, 1184, 1226, 1138, 1204, 402, 1175, 1131, - 1163, 1133, 1170, 1134, 1161, 1192, 260, 1158, 1249, 1208, - 1264, 353, 257, 1140, 1164, 416, 1180, 198, 1228, 471, - 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, - 414, 492, 408, 1271, 357, 1214, 0, 481, 387, 0, - 0, 0, 1194, 1253, 1202, 1240, 1189, 1227, 1148, 1213, - 1266, 1176, 1223, 1267, 312, 240, 314, 197, 399, 482, - 276, 0, 0, 0, 0, 0, 812, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, - 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, - 337, 344, 350, 1172, 1220, 1261, 1173, 1222, 255, 310, - 262, 254, 507, 1272, 1252, 1137, 1201, 1260, 0, 0, - 221, 1263, 1196, 0, 1225, 0, 1278, 1132, 1216, 0, - 1135, 1139, 1274, 1256, 1167, 265, 0, 0, 0, 0, - 0, 0, 0, 1193, 1203, 1237, 1241, 1187, 0, 0, - 0, 0, 0, 0, 0, 1165, 0, 1212, 0, 0, - 0, 1144, 1136, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1191, 0, 0, 0, 0, - 1147, 0, 1166, 1238, 0, 1130, 287, 1141, 388, 247, - 0, 438, 1245, 1255, 1188, 549, 1259, 1186, 1185, 1232, - 1145, 1251, 1179, 352, 1143, 319, 193, 217, 0, 1177, - 398, 446, 458, 1250, 1162, 1171, 245, 1169, 456, 412, - 527, 225, 274, 443, 418, 454, 426, 277, 1211, 1230, - 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, - 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, - 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, - 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, - 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, - 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, - 0, 248, 401, 516, 517, 246, 571, 220, 543, 212, - 1142, 542, 394, 511, 520, 381, 370, 211, 518, 379, - 369, 323, 342, 343, 270, 296, 433, 362, 434, 295, - 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, - 532, 572, 226, 227, 229, 1157, 269, 273, 281, 284, - 292, 293, 302, 354, 405, 432, 428, 437, 1246, 506, - 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, - 564, 562, 393, 300, 479, 322, 360, 1235, 1277, 411, - 457, 232, 529, 480, 1152, 1156, 1150, 1217, 1151, 1206, - 1207, 1153, 1268, 1269, 1270, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 0, 1239, 1146, 0, 1154, 1155, 1248, - 1257, 1258, 591, 371, 470, 526, 324, 336, 339, 329, - 348, 0, 349, 325, 326, 331, 333, 334, 335, 340, - 341, 345, 351, 241, 203, 377, 385, 505, 301, 208, - 209, 210, 498, 499, 500, 501, 540, 541, 545, 447, - 448, 449, 450, 282, 535, 298, 453, 452, 320, 321, - 366, 435, 1210, 192, 213, 355, 1273, 439, 278, 569, - 539, 534, 199, 215, 1149, 252, 1160, 1168, 0, 1174, - 1182, 1183, 1195, 1197, 1198, 1199, 1200, 1218, 1219, 1221, - 1229, 1231, 1234, 1236, 1243, 1254, 1276, 194, 195, 202, - 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, - 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, - 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, - 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, - 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, - 484, 485, 490, 513, 515, 528, 546, 552, 465, 290, - 291, 430, 431, 303, 304, 566, 567, 289, 523, 553, - 521, 565, 547, 424, 365, 1209, 1215, 368, 271, 294, - 309, 1224, 538, 486, 219, 451, 280, 243, 1242, 1244, - 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, - 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, - 497, 382, 256, 419, 1205, 1233, 363, 503, 504, 305, - 383, 0, 0, 0, 0, 0, 502, 0, 691, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, - 0, 0, 0, 678, 0, 0, 0, 260, 683, 0, - 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, - 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, - 372, 414, 492, 408, 690, 357, 0, 0, 481, 387, - 0, 0, 0, 0, 0, 686, 687, 0, 0, 0, - 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, - 482, 276, 0, 91, 0, 0, 828, 812, 778, 779, - 816, 829, 830, 831, 832, 817, 0, 230, 818, 819, - 237, 820, 0, 777, 718, 720, 719, 737, 738, 739, - 740, 741, 742, 743, 716, 825, 833, 834, 0, 255, - 310, 262, 254, 507, 0, 0, 1956, 1957, 1958, 0, - 0, 221, 0, 0, 0, 0, 0, 0, 0, 660, - 675, 0, 689, 0, 0, 0, 265, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 672, 673, 0, 0, 0, 0, 772, 0, - 674, 0, 0, 682, 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, 865, 866, 867, 868, 869, 870, - 871, 872, 873, 874, 875, 876, 685, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, - 247, 0, 438, 771, 0, 0, 549, 0, 0, 769, - 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, - 0, 398, 446, 458, 0, 0, 0, 822, 0, 456, - 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, - 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, - 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, - 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, - 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, - 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, - 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, - 0, 0, 248, 401, 823, 824, 246, 571, 724, 543, - 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, - 379, 369, 323, 732, 733, 270, 296, 433, 362, 434, - 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, - 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, - 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, - 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, - 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, - 411, 457, 232, 529, 480, 782, 770, 695, 786, 697, - 783, 784, 692, 693, 696, 785, 573, 574, 575, 576, - 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, - 587, 588, 589, 590, 0, 773, 681, 680, 0, 688, - 0, 714, 715, 717, 721, 722, 723, 734, 735, 736, - 744, 746, 747, 745, 748, 749, 750, 753, 754, 755, - 756, 751, 752, 757, 698, 702, 699, 700, 701, 713, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, - 796, 797, 798, 799, 800, 801, 727, 731, 730, 728, - 729, 725, 726, 679, 192, 213, 355, 0, 439, 278, - 569, 539, 534, 199, 215, 787, 252, 788, 0, 0, - 792, 0, 0, 0, 794, 793, 0, 795, 761, 760, - 0, 0, 789, 790, 0, 791, 0, 0, 194, 195, - 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, - 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, - 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, - 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, - 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, - 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, - 802, 803, 804, 805, 806, 807, 808, 809, 289, 523, - 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, - 294, 309, 0, 538, 486, 219, 451, 280, 243, 827, - 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, - 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, - 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, - 305, 502, 0, 691, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 402, 0, 0, 0, 0, 678, 0, - 0, 0, 260, 683, 0, 0, 0, 353, 257, 0, - 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, - 272, 263, 259, 242, 306, 372, 414, 492, 408, 690, - 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, - 686, 687, 0, 0, 0, 0, 0, 0, 2106, 0, - 312, 240, 314, 197, 399, 482, 276, 0, 91, 0, - 0, 828, 812, 778, 779, 816, 829, 830, 831, 832, - 817, 0, 230, 818, 819, 237, 820, 0, 777, 718, - 720, 719, 737, 738, 739, 740, 741, 742, 743, 716, - 825, 833, 834, 2107, 255, 310, 262, 254, 507, 0, - 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, - 0, 0, 0, 0, 660, 675, 0, 689, 0, 0, - 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 672, 673, 0, - 0, 0, 0, 772, 0, 674, 0, 0, 682, 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, 865, - 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, - 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 287, 0, 388, 247, 0, 438, 771, 0, - 0, 549, 0, 0, 769, 0, 0, 0, 0, 352, - 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, - 0, 0, 822, 0, 456, 412, 527, 225, 274, 443, - 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, - 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, - 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, - 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, - 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, - 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, - 206, 0, 442, 258, 283, 0, 0, 248, 401, 823, - 824, 246, 571, 724, 543, 212, 0, 542, 394, 511, - 520, 381, 370, 211, 518, 379, 369, 323, 732, 733, - 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, - 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, - 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, - 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, - 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, - 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, - 782, 770, 695, 786, 697, 783, 784, 692, 693, 696, - 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, - 773, 681, 680, 0, 688, 0, 714, 715, 717, 721, - 722, 723, 734, 735, 736, 744, 746, 747, 745, 748, - 749, 750, 753, 754, 755, 756, 751, 752, 757, 698, - 702, 699, 700, 701, 713, 703, 704, 705, 706, 707, - 708, 709, 710, 711, 712, 796, 797, 798, 799, 800, - 801, 727, 731, 730, 728, 729, 725, 726, 679, 192, - 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, - 787, 252, 788, 0, 0, 792, 0, 0, 0, 794, - 793, 0, 795, 761, 760, 0, 0, 789, 790, 0, - 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, - 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, - 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, - 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, - 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, - 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, - 515, 528, 546, 552, 465, 802, 803, 804, 805, 806, - 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, - 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, - 219, 451, 280, 243, 827, 0, 204, 238, 222, 249, - 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, - 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, - 0, 383, 363, 503, 504, 305, 82, 502, 0, 691, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 678, 0, 0, 0, 260, 683, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 690, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 686, 687, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 91, 0, 0, 828, 812, 778, - 779, 816, 829, 830, 831, 832, 817, 0, 230, 818, - 819, 237, 820, 0, 777, 718, 720, 719, 737, 738, - 739, 740, 741, 742, 743, 716, 825, 833, 834, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 660, 675, 0, 689, 0, 0, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 672, 673, 0, 0, 0, 0, 772, - 0, 674, 0, 0, 682, 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, 865, 866, 867, 868, 869, - 870, 871, 872, 873, 874, 875, 876, 685, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 771, 0, 0, 549, 0, 0, - 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 822, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 823, 824, 246, 571, 724, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 732, 733, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 782, 770, 695, 786, - 697, 783, 784, 692, 693, 696, 785, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 773, 681, 680, 0, - 688, 0, 714, 715, 717, 721, 722, 723, 734, 735, - 736, 744, 746, 747, 745, 748, 749, 750, 753, 754, - 755, 756, 751, 752, 757, 698, 702, 699, 700, 701, - 713, 703, 704, 705, 706, 707, 708, 709, 710, 711, - 712, 796, 797, 798, 799, 800, 801, 727, 731, 730, - 728, 729, 725, 726, 679, 192, 213, 355, 90, 439, - 278, 569, 539, 534, 199, 215, 787, 252, 788, 0, - 0, 792, 0, 0, 0, 794, 793, 0, 795, 761, - 760, 0, 0, 789, 790, 0, 791, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 802, 803, 804, 805, 806, 807, 808, 809, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 691, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 678, - 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 690, 357, 0, 0, 481, 387, 0, 0, 0, 0, - 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 91, - 0, 0, 828, 812, 778, 779, 816, 829, 830, 831, - 832, 817, 0, 230, 818, 819, 237, 820, 0, 777, - 718, 720, 719, 737, 738, 739, 740, 741, 742, 743, - 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, - 0, 0, 0, 0, 0, 660, 675, 0, 689, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 672, 673, - 0, 0, 0, 0, 772, 0, 674, 0, 0, 682, - 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, - 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, - 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 771, - 0, 0, 549, 0, 0, 769, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 3421, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 732, - 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 782, 770, 695, 786, 697, 783, 784, 692, 693, - 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 773, 681, 680, 0, 688, 0, 714, 715, 717, - 721, 722, 723, 734, 735, 736, 744, 746, 747, 745, - 748, 749, 750, 753, 754, 755, 756, 751, 752, 757, - 698, 702, 699, 700, 701, 713, 703, 704, 705, 706, - 707, 708, 709, 710, 711, 712, 796, 797, 798, 799, - 800, 801, 727, 731, 730, 728, 729, 725, 726, 679, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 787, 252, 788, 0, 0, 792, 0, 0, 0, - 794, 793, 0, 795, 761, 760, 0, 0, 789, 790, - 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 802, 803, 804, 805, - 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 691, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 678, 0, 0, 0, 260, 683, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 690, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 686, 687, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 91, 0, 1519, 828, 812, 778, - 779, 816, 829, 830, 831, 832, 817, 0, 230, 818, - 819, 237, 820, 0, 777, 718, 720, 719, 737, 738, - 739, 740, 741, 742, 743, 716, 825, 833, 834, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 660, 675, 0, 689, 0, 0, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 672, 673, 0, 0, 0, 0, 772, - 0, 674, 0, 0, 682, 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, 865, 866, 867, 868, 869, - 870, 871, 872, 873, 874, 875, 876, 685, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 771, 0, 0, 549, 0, 0, - 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 822, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 823, 824, 246, 571, 724, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 732, 733, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 782, 770, 695, 786, - 697, 783, 784, 692, 693, 696, 785, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 773, 681, 680, 0, - 688, 0, 714, 715, 717, 721, 722, 723, 734, 735, - 736, 744, 746, 747, 745, 748, 749, 750, 753, 754, - 755, 756, 751, 752, 757, 698, 702, 699, 700, 701, - 713, 703, 704, 705, 706, 707, 708, 709, 710, 711, - 712, 796, 797, 798, 799, 800, 801, 727, 731, 730, - 728, 729, 725, 726, 679, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 787, 252, 788, 0, - 0, 792, 0, 0, 0, 794, 793, 0, 795, 761, - 760, 0, 0, 789, 790, 0, 791, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 802, 803, 804, 805, 806, 807, 808, 809, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 691, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 678, - 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 690, 357, 0, 0, 481, 387, 0, 0, 0, 0, - 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 91, - 0, 0, 828, 812, 778, 779, 816, 829, 830, 831, - 832, 817, 0, 230, 818, 819, 237, 820, 0, 777, - 718, 720, 719, 737, 738, 739, 740, 741, 742, 743, - 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, - 0, 0, 0, 0, 0, 660, 675, 0, 689, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 672, 673, - 917, 0, 0, 0, 772, 0, 674, 0, 0, 682, - 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, - 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, - 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 771, - 0, 0, 549, 0, 0, 769, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 732, - 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 782, 770, 695, 786, 697, 783, 784, 692, 693, - 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 773, 681, 680, 0, 688, 0, 714, 715, 717, - 721, 722, 723, 734, 735, 736, 744, 746, 747, 745, - 748, 749, 750, 753, 754, 755, 756, 751, 752, 757, - 698, 702, 699, 700, 701, 713, 703, 704, 705, 706, - 707, 708, 709, 710, 711, 712, 796, 797, 798, 799, - 800, 801, 727, 731, 730, 728, 729, 725, 726, 679, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 787, 252, 788, 0, 0, 792, 0, 0, 0, - 794, 793, 0, 795, 761, 760, 0, 0, 789, 790, - 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 802, 803, 804, 805, - 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 691, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 678, 0, 0, 0, 260, 683, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 690, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 686, 687, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 91, 0, 0, 828, 812, 778, - 779, 816, 829, 830, 831, 832, 817, 0, 230, 818, - 819, 237, 820, 0, 777, 718, 720, 719, 737, 738, - 739, 740, 741, 742, 743, 716, 825, 833, 834, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 660, 675, 0, 689, 0, 0, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 672, 673, 0, 0, 0, 0, 772, - 0, 674, 0, 0, 682, 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, 865, 866, 867, 868, 869, - 870, 871, 872, 873, 874, 875, 876, 685, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 771, 0, 0, 549, 0, 0, - 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 822, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 823, 824, 246, 571, 724, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 732, 733, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 782, 770, 695, 786, - 697, 783, 784, 692, 693, 696, 785, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 773, 681, 680, 0, - 688, 0, 714, 715, 717, 721, 722, 723, 734, 735, - 736, 744, 746, 747, 745, 748, 749, 750, 753, 754, - 755, 756, 751, 752, 757, 698, 702, 699, 700, 701, - 713, 703, 704, 705, 706, 707, 708, 709, 710, 711, - 712, 796, 797, 798, 799, 800, 801, 727, 731, 730, - 728, 729, 725, 726, 679, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 787, 252, 788, 0, - 0, 792, 0, 0, 0, 794, 793, 0, 795, 761, - 760, 0, 0, 789, 790, 0, 791, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 802, 803, 804, 805, 806, 807, 808, 809, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 691, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 678, - 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 690, 357, 0, 0, 481, 387, 0, 0, 0, 0, - 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 91, - 0, 0, 828, 812, 778, 779, 816, 829, 830, 831, - 832, 817, 0, 230, 818, 819, 237, 820, 0, 777, - 718, 720, 719, 737, 738, 739, 740, 741, 742, 743, - 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, - 0, 0, 0, 0, 0, 0, 675, 0, 689, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 672, 673, - 0, 0, 0, 0, 772, 0, 674, 0, 0, 682, - 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, - 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, - 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 771, - 0, 0, 549, 0, 0, 769, 0, 0, 0, 0, - 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, - 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 732, - 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 782, 770, 695, 786, 697, 783, 784, 692, 693, - 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 773, 681, 680, 0, 688, 0, 714, 715, 717, - 721, 722, 723, 734, 735, 736, 744, 746, 747, 745, - 748, 749, 750, 753, 754, 755, 756, 751, 752, 757, - 698, 702, 699, 700, 701, 713, 703, 704, 705, 706, - 707, 708, 709, 710, 711, 712, 796, 797, 798, 799, - 800, 801, 727, 731, 730, 728, 729, 725, 726, 679, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 787, 252, 788, 0, 0, 792, 0, 0, 0, - 794, 793, 0, 795, 761, 760, 0, 0, 789, 790, - 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 802, 803, 804, 805, - 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 1335, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1344, 1343, 1345, - 1346, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, - 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 260, 0, 0, 0, 0, 353, 257, - 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, - 510, 272, 263, 259, 242, 306, 372, 414, 492, 408, - 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 312, 240, 314, 197, 399, 482, 276, 0, 0, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, - 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, - 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, - 0, 0, 0, 0, 0, 0, 0, 221, 0, 988, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 388, 247, 0, 438, 0, - 0, 987, 549, 0, 0, 0, 0, 0, 984, 985, - 352, 945, 319, 193, 217, 978, 982, 398, 446, 458, - 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, - 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, - 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, - 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, - 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, - 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, - 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, - 316, 206, 0, 442, 258, 283, 0, 0, 248, 401, - 516, 517, 246, 571, 220, 543, 212, 0, 542, 394, - 511, 520, 381, 370, 211, 518, 379, 369, 323, 342, - 343, 270, 296, 433, 362, 434, 295, 297, 390, 389, - 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, - 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, - 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, - 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, - 300, 479, 322, 360, 0, 0, 411, 457, 232, 529, - 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, - 371, 470, 526, 324, 336, 339, 329, 348, 0, 349, - 325, 326, 331, 333, 334, 335, 340, 341, 345, 351, - 241, 203, 377, 385, 505, 301, 208, 209, 210, 498, - 499, 500, 501, 540, 541, 545, 447, 448, 449, 450, - 282, 535, 298, 453, 452, 320, 321, 366, 435, 0, - 192, 213, 355, 0, 439, 278, 569, 539, 534, 199, - 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 195, 202, 214, 224, 228, - 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, - 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, - 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, - 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, - 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, - 513, 515, 528, 546, 552, 465, 290, 291, 430, 431, - 303, 304, 566, 567, 289, 523, 553, 521, 565, 547, - 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, - 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, - 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, - 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, - 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, - 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, - 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, - 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, - 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, - 399, 482, 276, 0, 0, 0, 0, 1482, 812, 0, - 0, 1479, 0, 0, 0, 0, 1477, 0, 230, 1478, - 1476, 237, 1481, 0, 777, 338, 347, 346, 327, 328, - 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, - 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, - 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 388, 247, 0, 438, 0, 0, 0, 549, 0, 0, - 0, 0, 0, 0, 0, 352, 0, 319, 193, 217, - 0, 0, 398, 446, 458, 0, 0, 0, 245, 0, - 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, - 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, - 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, - 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, - 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, - 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, - 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, - 283, 0, 0, 248, 401, 516, 517, 246, 571, 220, - 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, - 518, 379, 369, 323, 342, 343, 270, 296, 433, 362, - 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, - 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, - 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, - 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, - 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, - 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, - 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 591, 371, 470, 526, 324, 336, - 339, 329, 348, 0, 349, 325, 326, 331, 333, 334, - 335, 340, 341, 345, 351, 241, 203, 377, 385, 505, - 301, 208, 209, 210, 498, 499, 500, 501, 540, 541, - 545, 447, 448, 449, 450, 282, 535, 298, 453, 452, - 320, 321, 366, 435, 0, 192, 213, 355, 0, 439, - 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, - 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, - 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, - 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, - 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, - 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, - 475, 476, 484, 485, 490, 513, 515, 528, 546, 552, - 465, 290, 291, 430, 431, 303, 304, 566, 567, 289, - 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, - 271, 294, 309, 0, 538, 486, 219, 451, 280, 243, - 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, - 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, - 494, 495, 497, 382, 256, 419, 0, 383, 363, 503, - 504, 305, 82, 502, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, - 0, 0, 0, 0, 260, 0, 0, 0, 0, 353, - 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, - 361, 510, 272, 263, 259, 242, 306, 372, 414, 492, - 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 312, 240, 314, 197, 399, 482, 276, 0, - 91, 0, 0, 0, 190, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, - 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, - 350, 0, 0, 0, 0, 0, 255, 310, 262, 254, - 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 287, 0, 388, 247, 0, 438, - 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, - 0, 352, 0, 319, 193, 217, 0, 0, 398, 446, - 458, 0, 0, 0, 245, 0, 456, 412, 527, 225, - 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, - 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, - 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, - 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, - 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, - 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, - 315, 316, 206, 0, 442, 258, 283, 0, 0, 248, - 401, 516, 517, 246, 571, 220, 543, 212, 0, 542, - 394, 511, 520, 381, 370, 211, 518, 379, 369, 323, - 342, 343, 270, 296, 433, 362, 434, 295, 297, 390, - 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, - 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, - 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, - 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, - 393, 300, 479, 322, 360, 0, 0, 411, 457, 232, - 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 573, 574, 575, 576, 577, 578, 579, - 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 591, 371, 470, 526, 324, 336, 339, 329, 348, 0, - 349, 325, 326, 331, 333, 334, 335, 340, 341, 345, - 351, 241, 203, 377, 385, 505, 301, 208, 209, 210, - 498, 499, 500, 501, 540, 541, 545, 447, 448, 449, - 450, 282, 535, 298, 453, 452, 320, 321, 366, 435, - 0, 192, 213, 355, 90, 439, 278, 569, 539, 534, - 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, - 2093, 0, 0, 2092, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 194, 195, 202, 214, 224, - 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, - 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, - 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, - 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, - 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, - 490, 513, 515, 528, 546, 552, 465, 290, 291, 430, - 431, 303, 304, 566, 567, 289, 523, 553, 521, 565, - 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, - 538, 486, 219, 451, 280, 243, 0, 0, 204, 238, - 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, - 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, - 256, 419, 1538, 0, 363, 503, 504, 305, 502, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 402, 0, 0, 0, 1540, 0, 0, 0, 0, 260, - 0, 0, 0, 0, 353, 257, 0, 0, 416, 0, - 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, - 242, 306, 372, 414, 492, 408, 0, 357, 0, 0, - 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, - 197, 399, 482, 276, 0, 0, 0, 0, 1542, 638, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, - 328, 330, 332, 337, 344, 350, 0, 0, 0, 0, - 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, - 0, 0, 0, 221, 0, 0, 0, 1316, 0, 1317, - 1318, 0, 0, 0, 0, 0, 0, 0, 265, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, - 0, 388, 247, 0, 438, 0, 0, 0, 549, 0, - 0, 0, 0, 0, 0, 0, 352, 0, 319, 193, - 217, 0, 0, 398, 446, 458, 0, 0, 0, 245, - 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, - 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, - 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, - 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, - 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, - 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, - 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, - 258, 283, 0, 0, 248, 401, 516, 517, 246, 571, - 220, 543, 212, 0, 542, 394, 511, 520, 381, 370, - 211, 518, 379, 369, 323, 342, 343, 270, 296, 433, - 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, - 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, - 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, - 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, - 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, - 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 591, 371, 470, 526, 324, - 336, 339, 329, 348, 0, 349, 325, 326, 331, 333, - 334, 335, 340, 341, 345, 351, 241, 203, 377, 385, - 505, 301, 208, 209, 210, 498, 499, 500, 501, 540, - 541, 545, 447, 448, 449, 450, 282, 535, 298, 453, - 452, 320, 321, 366, 435, 0, 192, 213, 355, 0, - 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, - 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, - 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, - 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, - 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, - 474, 475, 476, 484, 485, 490, 513, 515, 528, 546, - 552, 465, 290, 291, 430, 431, 303, 304, 566, 567, - 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, - 368, 271, 294, 309, 0, 538, 486, 219, 451, 280, - 243, 0, 0, 204, 238, 222, 249, 264, 267, 313, - 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, - 493, 494, 495, 497, 382, 256, 419, 0, 383, 363, - 503, 504, 305, 82, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 492, 408, 690, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 91, 0, 1519, 0, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 0, 91, 0, 0, 828, 812, 778, 779, 816, 829, + 830, 831, 832, 817, 0, 230, 818, 819, 237, 820, + 0, 777, 718, 720, 719, 737, 738, 739, 740, 741, + 742, 743, 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 660, 675, 0, + 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 672, 673, 0, 0, 0, 0, 772, 0, 674, 0, + 0, 682, 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, 865, 866, 867, 868, 869, 870, 871, 872, + 873, 874, 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 438, 771, 0, 0, 549, 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 446, 458, 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, @@ -3895,261 +3214,261 @@ var yyAct = [...]int{ 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 248, 401, 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 323, 732, 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 232, 529, 480, 782, 770, 695, 786, 697, 783, 784, + 692, 693, 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 90, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 589, 590, 0, 773, 681, 680, 0, 688, 0, 714, + 715, 717, 721, 722, 723, 734, 735, 736, 744, 746, + 747, 745, 748, 749, 750, 753, 754, 755, 756, 751, + 752, 757, 698, 702, 699, 700, 701, 713, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 796, 797, + 798, 799, 800, 801, 727, 731, 730, 728, 729, 725, + 726, 679, 192, 213, 355, 90, 439, 278, 569, 539, + 534, 199, 215, 787, 252, 788, 0, 0, 792, 0, + 0, 0, 794, 793, 0, 795, 761, 760, 0, 0, + 789, 790, 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 485, 490, 513, 515, 528, 546, 552, 465, 802, 803, + 804, 805, 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 0, 538, 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 691, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 678, 0, 0, 0, + 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 259, 242, 306, 372, 414, 492, 408, 690, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 91, 0, 0, 0, - 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 314, 197, 399, 482, 276, 0, 91, 0, 0, 828, + 812, 778, 779, 816, 829, 830, 831, 832, 817, 0, + 230, 818, 819, 237, 820, 0, 777, 718, 720, 719, + 737, 738, 739, 740, 741, 742, 743, 716, 825, 833, + 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 675, 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 672, 673, 0, 0, 0, + 0, 772, 0, 674, 0, 0, 682, 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, 865, 866, 867, + 868, 869, 870, 871, 872, 873, 874, 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, + 287, 0, 388, 247, 0, 438, 771, 0, 0, 549, + 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, + 822, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 426, 277, 3428, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 442, 258, 283, 0, 0, 248, 401, 823, 824, 246, + 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 732, 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 360, 0, 0, 411, 457, 232, 529, 480, 782, 770, + 695, 786, 697, 783, 784, 692, 693, 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, - 0, 0, 0, 0, 0, 0, 2093, 0, 0, 2092, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 584, 585, 586, 587, 588, 589, 590, 0, 773, 681, + 680, 0, 688, 0, 714, 715, 717, 721, 722, 723, + 734, 735, 736, 744, 746, 747, 745, 748, 749, 750, + 753, 754, 755, 756, 751, 752, 757, 698, 702, 699, + 700, 701, 713, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 796, 797, 798, 799, 800, 801, 727, + 731, 730, 728, 729, 725, 726, 679, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 787, 252, + 788, 0, 0, 792, 0, 0, 0, 794, 793, 0, + 795, 761, 760, 0, 0, 789, 790, 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 546, 552, 465, 802, 803, 804, 805, 806, 807, 808, + 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 363, 503, 504, 305, 502, 0, 691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 2043, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 0, 678, 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 492, 408, 690, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 1721, 190, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 0, 91, 0, 1520, 828, 812, 778, 779, 816, 829, + 830, 831, 832, 817, 0, 230, 818, 819, 237, 820, + 0, 777, 718, 720, 719, 737, 738, 739, 740, 741, + 742, 743, 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 660, 675, 0, + 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 672, 673, 0, 0, 0, 0, 772, 0, 674, 0, + 0, 682, 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, 865, 866, 867, 868, 869, 870, 871, 872, + 873, 874, 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 438, 771, 0, 0, 549, 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 2041, 455, + 446, 458, 0, 0, 0, 822, 0, 456, 412, 527, + 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 248, 401, 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 323, 732, 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 232, 529, 480, 782, 770, 695, 786, 697, 783, 784, + 692, 693, 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 589, 590, 0, 773, 681, 680, 0, 688, 0, 714, + 715, 717, 721, 722, 723, 734, 735, 736, 744, 746, + 747, 745, 748, 749, 750, 753, 754, 755, 756, 751, + 752, 757, 698, 702, 699, 700, 701, 713, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 796, 797, + 798, 799, 800, 801, 727, 731, 730, 728, 729, 725, + 726, 679, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 787, 252, 788, 0, 0, 792, 0, + 0, 0, 794, 793, 0, 795, 761, 760, 0, 0, + 789, 790, 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 485, 490, 513, 515, 528, 546, 552, 465, 802, 803, + 804, 805, 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 0, 538, 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 691, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 678, 0, 0, 0, + 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 259, 242, 306, 372, 414, 492, 408, 690, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 314, 197, 399, 482, 276, 0, 91, 0, 0, 828, + 812, 778, 779, 816, 829, 830, 831, 832, 817, 0, + 230, 818, 819, 237, 820, 0, 777, 718, 720, 719, + 737, 738, 739, 740, 741, 742, 743, 716, 825, 833, + 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 939, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 675, 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 672, 673, 918, 0, 0, + 0, 772, 0, 674, 0, 0, 682, 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, 865, 866, 867, + 868, 869, 870, 871, 872, 873, 874, 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 945, 319, - 193, 217, 943, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 287, 0, 388, 247, 0, 438, 771, 0, 0, 549, + 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, + 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 822, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 442, 258, 283, 0, 0, 248, 401, 823, 824, 246, + 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 732, 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 360, 0, 0, 411, 457, 232, 529, 480, 782, 770, + 695, 786, 697, 783, 784, 692, 693, 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 584, 585, 586, 587, 588, 589, 590, 0, 773, 681, + 680, 0, 688, 0, 714, 715, 717, 721, 722, 723, + 734, 735, 736, 744, 746, 747, 745, 748, 749, 750, + 753, 754, 755, 756, 751, 752, 757, 698, 702, 699, + 700, 701, 713, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 796, 797, 798, 799, 800, 801, 727, + 731, 730, 728, 729, 725, 726, 679, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 787, 252, + 788, 0, 0, 792, 0, 0, 0, 794, 793, 0, + 795, 761, 760, 0, 0, 789, 790, 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 546, 552, 465, 802, 803, 804, 805, 806, 807, 808, + 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, + 363, 503, 504, 305, 502, 0, 691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 2043, 0, 0, 0, 0, 260, 0, 0, 0, 0, + 0, 678, 0, 0, 0, 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 492, 408, 690, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 1721, 190, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, + 0, 91, 0, 0, 828, 812, 778, 779, 816, 829, + 830, 831, 832, 817, 0, 230, 818, 819, 237, 820, + 0, 777, 718, 720, 719, 737, 738, 739, 740, 741, + 742, 743, 716, 825, 833, 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 0, 0, 0, 0, 660, 675, 0, + 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 672, 673, 0, 0, 0, 0, 772, 0, 674, 0, + 0, 682, 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, 865, 866, 867, 868, 869, 870, 871, 872, + 873, 874, 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, + 438, 771, 0, 0, 549, 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, + 446, 458, 0, 0, 0, 822, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, @@ -4157,102 +3476,102 @@ var yyAct = [...]int{ 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, + 248, 401, 823, 824, 246, 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, + 323, 732, 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, + 232, 529, 480, 782, 770, 695, 786, 697, 783, 784, + 692, 693, 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, + 589, 590, 0, 773, 681, 680, 0, 688, 0, 714, + 715, 717, 721, 722, 723, 734, 735, 736, 744, 746, + 747, 745, 748, 749, 750, 753, 754, 755, 756, 751, + 752, 757, 698, 702, 699, 700, 701, 713, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 796, 797, + 798, 799, 800, 801, 727, 731, 730, 728, 729, 725, + 726, 679, 192, 213, 355, 0, 439, 278, 569, 539, + 534, 199, 215, 787, 252, 788, 0, 0, 792, 0, + 0, 0, 794, 793, 0, 795, 761, 760, 0, 0, + 789, 790, 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, + 485, 490, 513, 515, 528, 546, 552, 465, 802, 803, + 804, 805, 806, 807, 808, 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, + 0, 538, 486, 219, 451, 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, + 0, 691, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 678, 0, 0, 0, + 260, 683, 0, 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, + 259, 242, 306, 372, 414, 492, 408, 690, 357, 0, + 0, 481, 387, 0, 0, 0, 0, 0, 686, 687, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 1519, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, + 314, 197, 399, 482, 276, 0, 91, 0, 0, 828, + 812, 778, 779, 816, 829, 830, 831, 832, 817, 0, + 230, 818, 819, 237, 820, 0, 777, 718, 720, 719, + 737, 738, 739, 740, 741, 742, 743, 716, 825, 833, + 834, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 675, 0, 689, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 672, 673, 0, 0, 0, + 0, 772, 0, 674, 0, 0, 682, 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, 865, 866, 867, + 868, 869, 870, 871, 872, 873, 874, 875, 876, 685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 3331, 0, 0, 0, 352, 0, 319, + 287, 0, 388, 247, 0, 438, 771, 0, 0, 549, + 0, 0, 769, 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, + 822, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, + 442, 258, 283, 0, 0, 248, 401, 823, 824, 246, + 571, 724, 543, 212, 0, 542, 394, 511, 520, 381, + 370, 211, 518, 379, 369, 323, 732, 733, 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, + 360, 0, 0, 411, 457, 232, 529, 480, 782, 770, + 695, 786, 697, 783, 784, 692, 693, 696, 785, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 584, 585, 586, 587, 588, 589, 590, 0, 773, 681, + 680, 0, 688, 0, 714, 715, 717, 721, 722, 723, + 734, 735, 736, 744, 746, 747, 745, 748, 749, 750, + 753, 754, 755, 756, 751, 752, 757, 698, 702, 699, + 700, 701, 713, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 796, 797, 798, 799, 800, 801, 727, + 731, 730, 728, 729, 725, 726, 679, 192, 213, 355, + 0, 439, 278, 569, 539, 534, 199, 215, 787, 252, + 788, 0, 0, 792, 0, 0, 0, 794, 793, 0, + 795, 761, 760, 0, 0, 789, 790, 0, 791, 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, + 546, 552, 465, 802, 803, 804, 805, 806, 807, 808, + 809, 289, 523, 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, + 280, 243, 827, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, @@ -4263,17 +3582,17 @@ var yyAct = [...]int{ 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 1876, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1337, 1338, 1339, + 1340, 1341, 1342, 1343, 1345, 1344, 1346, 1347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1877, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4328,24 +3647,24 @@ var yyAct = [...]int{ 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 2450, + 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 388, 247, 0, 438, 0, 0, 988, 549, + 0, 0, 0, 0, 0, 985, 986, 352, 946, 319, + 193, 217, 979, 983, 398, 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, @@ -4394,9 +3713,9 @@ var yyAct = [...]int{ 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, - 2435, 0, 0, 0, 0, 230, 0, 0, 237, 2436, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, + 0, 0, 0, 0, 1483, 812, 0, 0, 1480, 0, + 0, 0, 0, 1478, 0, 230, 1479, 1477, 237, 1482, + 0, 777, 338, 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4451,611 +3770,1135 @@ var yyAct = [...]int{ 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 382, 256, 419, 0, 383, 363, 503, 504, 305, 82, + 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 402, 0, 0, 0, 0, 0, 0, 0, + 0, 260, 0, 0, 0, 0, 353, 257, 0, 0, + 416, 0, 198, 0, 471, 244, 364, 361, 510, 272, + 263, 259, 242, 306, 372, 414, 492, 408, 0, 357, + 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, + 240, 314, 197, 399, 482, 276, 0, 91, 0, 0, + 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 230, 0, 0, 237, 0, 0, 0, 338, 347, + 346, 327, 328, 330, 332, 337, 344, 350, 0, 0, + 0, 0, 0, 255, 310, 262, 254, 507, 0, 0, + 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 287, 0, 388, 247, 0, 438, 0, 0, 0, + 549, 0, 0, 0, 0, 0, 0, 0, 352, 0, + 319, 193, 217, 0, 0, 398, 446, 458, 0, 0, + 0, 245, 0, 456, 412, 527, 225, 274, 443, 418, + 454, 426, 277, 0, 0, 455, 359, 512, 436, 524, + 550, 551, 253, 392, 536, 496, 544, 568, 218, 250, + 406, 489, 530, 478, 384, 508, 509, 318, 477, 285, + 196, 356, 556, 216, 464, 358, 234, 223, 514, 533, + 279, 441, 563, 205, 491, 522, 231, 468, 0, 0, + 570, 239, 488, 207, 519, 487, 380, 315, 316, 206, + 0, 442, 258, 283, 0, 0, 248, 401, 516, 517, + 246, 571, 220, 543, 212, 0, 542, 394, 511, 520, + 381, 370, 211, 518, 379, 369, 323, 342, 343, 270, + 296, 433, 362, 434, 295, 297, 390, 389, 391, 200, + 531, 0, 201, 0, 483, 532, 572, 226, 227, 229, + 0, 269, 273, 281, 284, 292, 293, 302, 354, 405, + 432, 428, 437, 0, 506, 525, 537, 548, 554, 555, + 557, 558, 559, 560, 561, 564, 562, 393, 300, 479, + 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 591, 371, 470, + 526, 324, 336, 339, 329, 348, 0, 349, 325, 326, + 331, 333, 334, 335, 340, 341, 345, 351, 241, 203, + 377, 385, 505, 301, 208, 209, 210, 498, 499, 500, + 501, 540, 541, 545, 447, 448, 449, 450, 282, 535, + 298, 453, 452, 320, 321, 366, 435, 0, 192, 213, + 355, 90, 439, 278, 569, 539, 534, 199, 215, 0, + 252, 0, 0, 0, 0, 0, 0, 2100, 0, 0, + 2099, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 194, 195, 202, 214, 224, 228, 235, 251, + 266, 268, 275, 288, 299, 307, 308, 311, 317, 367, + 373, 374, 375, 376, 395, 396, 397, 400, 403, 404, + 407, 409, 410, 413, 417, 421, 422, 423, 425, 427, + 429, 440, 445, 459, 460, 461, 462, 463, 466, 467, + 472, 473, 474, 475, 476, 484, 485, 490, 513, 515, + 528, 546, 552, 465, 290, 291, 430, 431, 303, 304, + 566, 567, 289, 523, 553, 521, 565, 547, 424, 365, + 0, 0, 368, 271, 294, 309, 0, 538, 486, 219, + 451, 280, 243, 0, 0, 204, 238, 222, 249, 264, + 267, 313, 378, 386, 415, 420, 286, 261, 236, 444, + 233, 469, 493, 494, 495, 497, 382, 256, 419, 1543, + 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, + 0, 1545, 0, 0, 0, 0, 260, 0, 0, 0, + 0, 353, 257, 0, 0, 416, 0, 198, 0, 471, + 244, 364, 361, 510, 272, 263, 259, 242, 306, 372, + 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 312, 240, 314, 197, 399, 482, + 276, 0, 0, 0, 0, 1547, 638, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 230, 0, 0, 237, + 0, 0, 0, 338, 347, 346, 327, 328, 330, 332, + 337, 344, 350, 0, 0, 0, 0, 0, 255, 310, + 262, 254, 507, 0, 0, 0, 0, 0, 0, 0, + 221, 0, 0, 0, 1317, 0, 1318, 1319, 0, 0, + 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 287, 0, 388, 247, + 0, 438, 0, 0, 0, 549, 0, 0, 0, 0, + 0, 0, 0, 352, 0, 319, 193, 217, 0, 0, + 398, 446, 458, 0, 0, 0, 245, 0, 456, 412, + 527, 225, 274, 443, 418, 454, 426, 277, 0, 0, + 455, 359, 512, 436, 524, 550, 551, 253, 392, 536, + 496, 544, 568, 218, 250, 406, 489, 530, 478, 384, + 508, 509, 318, 477, 285, 196, 356, 556, 216, 464, + 358, 234, 223, 514, 533, 279, 441, 563, 205, 491, + 522, 231, 468, 0, 0, 570, 239, 488, 207, 519, + 487, 380, 315, 316, 206, 0, 442, 258, 283, 0, + 0, 248, 401, 516, 517, 246, 571, 220, 543, 212, + 0, 542, 394, 511, 520, 381, 370, 211, 518, 379, + 369, 323, 342, 343, 270, 296, 433, 362, 434, 295, + 297, 390, 389, 391, 200, 531, 0, 201, 0, 483, + 532, 572, 226, 227, 229, 0, 269, 273, 281, 284, + 292, 293, 302, 354, 405, 432, 428, 437, 0, 506, + 525, 537, 548, 554, 555, 557, 558, 559, 560, 561, + 564, 562, 393, 300, 479, 322, 360, 0, 0, 411, + 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 591, 371, 470, 526, 324, 336, 339, 329, + 348, 0, 349, 325, 326, 331, 333, 334, 335, 340, + 341, 345, 351, 241, 203, 377, 385, 505, 301, 208, + 209, 210, 498, 499, 500, 501, 540, 541, 545, 447, + 448, 449, 450, 282, 535, 298, 453, 452, 320, 321, + 366, 435, 0, 192, 213, 355, 0, 439, 278, 569, + 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 194, 195, 202, + 214, 224, 228, 235, 251, 266, 268, 275, 288, 299, + 307, 308, 311, 317, 367, 373, 374, 375, 376, 395, + 396, 397, 400, 403, 404, 407, 409, 410, 413, 417, + 421, 422, 423, 425, 427, 429, 440, 445, 459, 460, + 461, 462, 463, 466, 467, 472, 473, 474, 475, 476, + 484, 485, 490, 513, 515, 528, 546, 552, 465, 290, + 291, 430, 431, 303, 304, 566, 567, 289, 523, 553, + 521, 565, 547, 424, 365, 0, 0, 368, 271, 294, + 309, 0, 538, 486, 219, 451, 280, 243, 0, 0, + 204, 238, 222, 249, 264, 267, 313, 378, 386, 415, + 420, 286, 261, 236, 444, 233, 469, 493, 494, 495, + 497, 382, 256, 419, 0, 383, 363, 503, 504, 305, + 82, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 91, 0, + 1520, 0, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 90, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 91, 0, 0, 0, 190, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 2100, 0, 0, 2099, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 2048, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 1726, 190, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 2046, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 940, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 946, 319, 193, 217, 944, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 2048, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 1726, 190, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 1561, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 1560, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 1520, 0, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 640, 641, 642, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 3338, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 1881, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 2457, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 3456, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 638, 0, 0, 0, 0, 2442, 0, 0, + 0, 0, 230, 0, 0, 237, 2443, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 1721, 190, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 1566, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 1565, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 640, 641, 642, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 3331, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 91, 0, 0, 0, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, - 0, 0, 0, 0, 2094, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 3463, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 1726, 190, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 1542, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 3338, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 91, 0, + 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 1831, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 1822, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 2101, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 190, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5063,64 +4906,65 @@ 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, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 1547, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 1688, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5128,327 +4972,392 @@ 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, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 190, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 1686, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 1836, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 1827, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 1684, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 1693, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 1682, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 1691, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 1680, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 1689, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 1676, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 1687, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5456,65 +5365,64 @@ 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, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 1674, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 1685, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5522,392 +5430,458 @@ 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, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 1681, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 1672, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 1679, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 1647, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 1677, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 1546, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 1652, 0, 0, 0, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 91, 0, 0, 0, - 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 1551, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 91, 0, 0, 0, 812, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1295, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 1294, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5915,64 +5889,64 @@ 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, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 1296, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 898, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 1295, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 190, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5980,64 +5954,65 @@ 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, 287, 0, 388, 247, 0, - 438, 0, 594, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 898, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6045,196 +6020,261 @@ 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, 287, 0, 388, 247, 0, 438, 0, 594, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 3464, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 3471, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 0, 0, 0, - 260, 0, 0, 0, 0, 353, 257, 0, 0, 416, - 0, 198, 0, 471, 244, 364, 361, 510, 272, 263, - 259, 242, 306, 372, 414, 492, 408, 0, 357, 0, - 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 312, 240, - 314, 197, 399, 482, 276, 0, 0, 0, 0, 0, - 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 0, 0, 237, 0, 0, 0, 338, 347, 346, - 327, 328, 330, 332, 337, 344, 350, 0, 0, 0, - 0, 0, 255, 310, 262, 254, 507, 0, 0, 0, - 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 383, 0, 363, 503, 504, 305, 502, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, + 0, 0, 353, 257, 0, 0, 416, 0, 198, 0, + 471, 244, 364, 361, 510, 272, 263, 259, 242, 306, + 372, 414, 492, 408, 0, 357, 0, 0, 481, 387, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 240, 314, 197, 399, + 482, 276, 0, 0, 0, 0, 0, 812, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 237, 0, 0, 0, 338, 347, 346, 327, 328, 330, + 332, 337, 344, 350, 0, 0, 0, 0, 0, 255, + 310, 262, 254, 507, 0, 0, 0, 0, 0, 0, + 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 388, 247, 0, 438, 0, 0, 0, 549, - 0, 0, 0, 0, 0, 0, 0, 352, 0, 319, - 193, 217, 0, 0, 398, 446, 458, 0, 0, 0, - 245, 0, 456, 412, 527, 225, 274, 443, 418, 454, - 426, 277, 0, 0, 455, 359, 512, 436, 524, 550, - 551, 253, 392, 536, 496, 544, 568, 218, 250, 406, - 489, 530, 478, 384, 508, 509, 318, 477, 285, 196, - 356, 556, 216, 464, 358, 234, 223, 514, 533, 279, - 441, 563, 205, 491, 522, 231, 468, 0, 0, 570, - 239, 488, 207, 519, 487, 380, 315, 316, 206, 0, - 442, 258, 283, 0, 0, 248, 401, 516, 517, 246, - 571, 220, 543, 212, 0, 542, 394, 511, 520, 381, - 370, 211, 518, 379, 369, 323, 342, 343, 270, 296, - 433, 362, 434, 295, 297, 390, 389, 391, 200, 531, - 0, 201, 0, 483, 532, 572, 226, 227, 229, 0, - 269, 273, 281, 284, 292, 293, 302, 354, 405, 432, - 428, 437, 0, 506, 525, 537, 548, 554, 555, 557, - 558, 559, 560, 561, 564, 562, 393, 300, 479, 322, - 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 591, 371, 470, 526, - 324, 336, 339, 329, 348, 0, 349, 325, 326, 331, - 333, 334, 335, 340, 341, 345, 351, 241, 203, 377, - 385, 505, 301, 208, 209, 210, 498, 499, 500, 501, - 540, 541, 545, 447, 448, 449, 450, 282, 535, 298, - 453, 452, 320, 321, 366, 435, 0, 192, 213, 355, - 0, 439, 278, 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 202, 214, 224, 228, 235, 251, 266, - 268, 275, 288, 299, 307, 308, 311, 317, 367, 373, - 374, 375, 376, 395, 396, 397, 400, 403, 404, 407, - 409, 410, 413, 417, 421, 422, 423, 425, 427, 429, - 440, 445, 459, 460, 461, 462, 463, 466, 467, 472, - 473, 474, 475, 476, 484, 485, 490, 513, 515, 528, - 546, 552, 465, 290, 291, 430, 431, 303, 304, 566, - 567, 289, 523, 553, 521, 565, 547, 424, 365, 0, - 0, 368, 271, 294, 309, 0, 538, 486, 219, 451, - 280, 243, 0, 0, 204, 238, 222, 249, 264, 267, - 313, 378, 386, 415, 420, 286, 261, 236, 444, 233, - 469, 493, 494, 495, 497, 382, 256, 419, 383, 0, - 363, 503, 504, 305, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, - 353, 257, 0, 0, 416, 0, 198, 0, 471, 244, - 364, 361, 510, 272, 263, 259, 242, 306, 372, 414, - 492, 408, 0, 357, 0, 0, 481, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 388, + 247, 0, 438, 0, 0, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 352, 0, 319, 193, 217, 0, + 0, 398, 446, 458, 0, 0, 0, 245, 0, 456, + 412, 527, 225, 274, 443, 418, 454, 426, 277, 0, + 0, 455, 359, 512, 436, 524, 550, 551, 253, 392, + 536, 496, 544, 568, 218, 250, 406, 489, 530, 478, + 384, 508, 509, 318, 477, 285, 196, 356, 556, 216, + 464, 358, 234, 223, 514, 533, 279, 441, 563, 205, + 491, 522, 231, 468, 0, 0, 570, 239, 488, 207, + 519, 487, 380, 315, 316, 206, 0, 442, 258, 283, + 0, 0, 248, 401, 516, 517, 246, 571, 220, 543, + 212, 0, 542, 394, 511, 520, 381, 370, 211, 518, + 379, 369, 323, 342, 343, 270, 296, 433, 362, 434, + 295, 297, 390, 389, 391, 200, 531, 0, 201, 0, + 483, 532, 572, 226, 227, 229, 0, 269, 273, 281, + 284, 292, 293, 302, 354, 405, 432, 428, 437, 0, + 506, 525, 537, 548, 554, 555, 557, 558, 559, 560, + 561, 564, 562, 393, 300, 479, 322, 360, 0, 0, + 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 591, 371, 470, 526, 324, 336, 339, + 329, 348, 0, 349, 325, 326, 331, 333, 334, 335, + 340, 341, 345, 351, 241, 203, 377, 385, 505, 301, + 208, 209, 210, 498, 499, 500, 501, 540, 541, 545, + 447, 448, 449, 450, 282, 535, 298, 453, 452, 320, + 321, 366, 435, 0, 192, 213, 355, 0, 439, 278, + 569, 539, 534, 199, 215, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, + 202, 214, 224, 228, 235, 251, 266, 268, 275, 288, + 299, 307, 308, 311, 317, 367, 373, 374, 375, 376, + 395, 396, 397, 400, 403, 404, 407, 409, 410, 413, + 417, 421, 422, 423, 425, 427, 429, 440, 445, 459, + 460, 461, 462, 463, 466, 467, 472, 473, 474, 475, + 476, 484, 485, 490, 513, 515, 528, 546, 552, 465, + 290, 291, 430, 431, 303, 304, 566, 567, 289, 523, + 553, 521, 565, 547, 424, 365, 0, 0, 368, 271, + 294, 309, 0, 538, 486, 219, 451, 280, 243, 0, + 0, 204, 238, 222, 249, 264, 267, 313, 378, 386, + 415, 420, 286, 261, 236, 444, 233, 469, 493, 494, + 495, 497, 382, 256, 419, 383, 0, 363, 503, 504, + 305, 502, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 260, 0, 0, 0, 0, 353, 257, 0, + 0, 416, 0, 198, 0, 471, 244, 364, 361, 510, + 272, 263, 259, 242, 306, 372, 414, 492, 408, 0, + 357, 0, 0, 481, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 312, 240, 314, 197, 399, 482, 276, - 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 237, 0, - 0, 0, 338, 347, 346, 327, 328, 330, 332, 337, - 344, 350, 0, 0, 0, 0, 0, 255, 310, 262, - 254, 507, 0, 0, 0, 0, 0, 0, 0, 221, + 312, 240, 314, 197, 399, 482, 276, 0, 0, 0, + 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 0, 0, 237, 0, 0, 0, 338, + 347, 346, 327, 328, 330, 332, 337, 344, 350, 0, + 0, 0, 0, 0, 255, 310, 262, 254, 507, 0, + 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6242,72 +6282,72 @@ 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, 287, 0, 388, 247, 0, - 438, 0, 0, 0, 549, 0, 0, 0, 0, 0, - 0, 0, 352, 0, 319, 193, 217, 0, 0, 398, - 446, 458, 0, 0, 0, 245, 0, 456, 412, 527, - 225, 274, 443, 418, 454, 426, 277, 0, 0, 455, - 359, 512, 436, 524, 550, 551, 253, 392, 536, 496, - 544, 568, 218, 250, 406, 489, 530, 478, 384, 508, - 509, 318, 477, 285, 196, 356, 556, 216, 464, 358, - 234, 223, 514, 533, 279, 441, 563, 205, 491, 522, - 231, 468, 0, 0, 570, 239, 488, 207, 519, 487, - 380, 315, 316, 206, 0, 442, 258, 283, 0, 0, - 248, 401, 516, 517, 246, 571, 220, 543, 212, 0, - 542, 394, 511, 520, 381, 370, 211, 518, 379, 369, - 323, 342, 343, 270, 296, 433, 362, 434, 295, 297, - 390, 389, 391, 200, 531, 0, 201, 0, 483, 532, - 572, 226, 227, 229, 0, 269, 273, 281, 284, 292, - 293, 302, 354, 405, 432, 428, 437, 0, 506, 525, - 537, 548, 554, 555, 557, 558, 559, 560, 561, 564, - 562, 393, 300, 479, 322, 360, 0, 0, 411, 457, - 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 591, 371, 470, 526, 324, 336, 339, 329, 348, - 0, 349, 325, 326, 331, 333, 334, 335, 340, 341, - 345, 351, 241, 203, 377, 385, 505, 301, 208, 209, - 210, 498, 499, 500, 501, 540, 541, 545, 447, 448, - 449, 450, 282, 535, 298, 453, 452, 320, 321, 366, - 435, 0, 192, 213, 355, 0, 439, 278, 569, 539, - 534, 199, 215, 0, 252, 0, 0, 0, 0, 0, + 0, 0, 287, 0, 388, 247, 0, 438, 0, 0, + 0, 549, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 319, 193, 217, 0, 0, 398, 446, 458, 0, + 0, 0, 245, 0, 456, 412, 527, 225, 274, 443, + 418, 454, 426, 277, 0, 0, 455, 359, 512, 436, + 524, 550, 551, 253, 392, 536, 496, 544, 568, 218, + 250, 406, 489, 530, 478, 384, 508, 509, 318, 477, + 285, 196, 356, 556, 216, 464, 358, 234, 223, 514, + 533, 279, 441, 563, 205, 491, 522, 231, 468, 0, + 0, 570, 239, 488, 207, 519, 487, 380, 315, 316, + 206, 0, 442, 258, 283, 0, 0, 248, 401, 516, + 517, 246, 571, 220, 543, 212, 0, 542, 394, 511, + 520, 381, 370, 211, 518, 379, 369, 323, 342, 343, + 270, 296, 433, 362, 434, 295, 297, 390, 389, 391, + 200, 531, 0, 201, 0, 483, 532, 572, 226, 227, + 229, 0, 269, 273, 281, 284, 292, 293, 302, 354, + 405, 432, 428, 437, 0, 506, 525, 537, 548, 554, + 555, 557, 558, 559, 560, 561, 564, 562, 393, 300, + 479, 322, 360, 0, 0, 411, 457, 232, 529, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 194, 195, 202, 214, - 224, 228, 235, 251, 266, 268, 275, 288, 299, 307, - 308, 311, 317, 367, 373, 374, 375, 376, 395, 396, - 397, 400, 403, 404, 407, 409, 410, 413, 417, 421, - 422, 423, 425, 427, 429, 440, 445, 459, 460, 461, - 462, 463, 466, 467, 472, 473, 474, 475, 476, 484, - 485, 490, 513, 515, 528, 546, 552, 465, 290, 291, - 430, 431, 303, 304, 566, 567, 289, 523, 553, 521, - 565, 547, 424, 365, 0, 0, 368, 271, 294, 309, - 0, 538, 486, 219, 451, 280, 243, 0, 0, 204, - 238, 222, 249, 264, 267, 313, 378, 386, 415, 420, - 286, 261, 236, 444, 233, 469, 493, 494, 495, 497, - 382, 256, 419, 0, 0, 363, 503, 504, 305, + 0, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 591, 371, + 470, 526, 324, 336, 339, 329, 348, 0, 349, 325, + 326, 331, 333, 334, 335, 340, 341, 345, 351, 241, + 203, 377, 385, 505, 301, 208, 209, 210, 498, 499, + 500, 501, 540, 541, 545, 447, 448, 449, 450, 282, + 535, 298, 453, 452, 320, 321, 366, 435, 0, 192, + 213, 355, 0, 439, 278, 569, 539, 534, 199, 215, + 0, 252, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 194, 195, 202, 214, 224, 228, 235, + 251, 266, 268, 275, 288, 299, 307, 308, 311, 317, + 367, 373, 374, 375, 376, 395, 396, 397, 400, 403, + 404, 407, 409, 410, 413, 417, 421, 422, 423, 425, + 427, 429, 440, 445, 459, 460, 461, 462, 463, 466, + 467, 472, 473, 474, 475, 476, 484, 485, 490, 513, + 515, 528, 546, 552, 465, 290, 291, 430, 431, 303, + 304, 566, 567, 289, 523, 553, 521, 565, 547, 424, + 365, 0, 0, 368, 271, 294, 309, 0, 538, 486, + 219, 451, 280, 243, 0, 0, 204, 238, 222, 249, + 264, 267, 313, 378, 386, 415, 420, 286, 261, 236, + 444, 233, 469, 493, 494, 495, 497, 382, 256, 419, + 0, 0, 363, 503, 504, 305, } var yyPact = [...]int{ - -1000, -1000, 4962, -1000, -463, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 4946, -1000, -459, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2212, - 2367, -1000, -1000, -1000, -1000, 2434, -1000, 829, 1919, -1000, - 2253, 319, -1000, 46994, 584, -1000, 44374, 583, 3459, 29964, - -1000, 238, -1000, 220, 45684, 226, -1000, -1000, -1000, -1000, - -357, 18827, 2164, 99, 96, 46994, -1000, -1000, -1000, -1000, - 2420, 1917, -1000, 399, -1000, -1000, -1000, -1000, -1000, -1000, - 43719, -1000, 921, -1000, -1000, 2245, 2264, 2446, 721, 2208, - -1000, 2338, 1917, -1000, 18827, 2409, 2316, 18172, 18172, 503, - -1000, -1000, 256, -1000, -1000, 25379, 46994, 32584, 361, -1000, - 2253, -1000, -1000, -1000, 87, -1000, 370, 1836, -1000, 1825, - -1000, 691, 502, 431, 514, 510, 429, 421, 420, 418, - 414, 413, 406, 405, 442, -1000, 742, 742, -123, -130, - 685, 519, 487, 487, 735, 558, 2197, 2193, -1000, -1000, - 742, 742, 742, 398, 742, 742, 742, 742, 331, 330, - 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, - 742, 742, 742, 742, 742, 742, 742, 380, 2253, 309, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2226, + 2430, -1000, -1000, -1000, -1000, 2454, -1000, 859, 1921, -1000, + 2229, 312, -1000, 47391, 593, -1000, 44771, 592, 247, 30361, + -1000, 232, -1000, 217, 46081, 228, -1000, -1000, -1000, -1000, + -304, 19224, 2160, 96, 92, 47391, -1000, -1000, -1000, -1000, + 2368, 1892, -1000, 414, -1000, -1000, -1000, -1000, -1000, -1000, + 44116, -1000, 992, -1000, -1000, 2245, 2210, 2111, 753, 2186, + -1000, 2337, 1892, -1000, 19224, 2395, 2291, 18569, 18569, 549, + -1000, -1000, 208, -1000, -1000, 25776, 47391, 32981, 364, -1000, + 2229, -1000, -1000, -1000, 128, -1000, 415, 1815, -1000, 1814, + -1000, 745, 895, 447, 543, 533, 446, 445, 444, 443, + 442, 441, 427, 426, 461, -1000, 778, 778, -109, -115, + 3441, 541, 538, 538, 858, 564, 2192, 2181, -1000, -1000, + 778, 778, 778, 387, 778, 778, 778, 778, 357, 340, + 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, + 778, 778, 778, 778, 778, 778, 778, 517, 2229, 324, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -6348,60 +6388,60 @@ 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, 46994, 218, 46994, -1000, 644, 46994, 885, 885, - 132, 885, 885, 885, 885, 232, 755, 93, -1000, 227, - 290, 223, 295, 898, 195, -1000, -1000, 287, 898, 1558, - -1000, 727, 294, 211, -1000, 885, 885, -1000, 12252, 141, - 12252, 12252, -1000, 2230, -1000, -1000, -1000, -1000, -1000, 1149, - -1000, -1000, -1000, -1000, -10, 552, -1000, -1000, -1000, -1000, - 45684, 43064, 255, -1000, -1000, 74, -1000, -1000, 1598, 1174, - 18827, 1602, -1000, 1226, 702, -1000, -1000, -1000, -1000, -1000, - 618, -1000, 19482, 19482, 19482, 19482, -1000, -1000, 1842, 42409, - 1842, 1842, 19482, 1842, -1000, 19482, 1842, 1842, 1842, 18827, - 1842, 1842, 1842, 1842, -1000, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, -1000, -1000, -1000, -1000, 1842, 640, 1842, - 1842, 1842, 1842, 1842, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1842, 1842, 1842, 1842, 1842, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + -1000, -1000, 47391, 331, 47391, -1000, 660, 47391, 916, 916, + 123, 916, 916, 916, 916, 221, 743, 89, -1000, 220, + 321, 196, 315, 891, 276, -1000, -1000, 308, 891, 1611, + -1000, 757, 310, 210, -1000, 916, 916, -1000, 12649, 189, + 12649, 12649, -1000, 2215, -1000, -1000, -1000, -1000, -1000, 1196, + -1000, -1000, -1000, -1000, 10, 561, -1000, -1000, -1000, -1000, + 46081, 43461, 292, -1000, -1000, 51, -1000, -1000, 1575, 1098, + 19224, 1116, -1000, 1142, 721, -1000, -1000, -1000, -1000, -1000, + 613, -1000, 19879, 19879, 19879, 19879, -1000, -1000, 1627, 42806, + 1627, 1627, 19879, 1627, -1000, 19879, 1627, 1627, 1627, 19224, + 1627, 1627, 1627, 1627, -1000, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, -1000, -1000, -1000, -1000, 1627, 659, 1627, + 1627, 1627, 1627, 1627, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1627, 1627, 1627, 1627, 1627, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 21447, 1349, 1347, 1346, -1000, 16207, 1842, -1000, -1000, + -1000, 21844, 1377, 1376, 1375, -1000, 16604, 1627, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 46994, -1000, - 1842, 257, 45684, 45684, 391, 2338, 1917, -1000, 2420, 2386, - 399, -1000, 3040, 2041, 1398, 1203, 1917, 1809, 46994, -1000, - 1853, -1000, -1000, -1000, -1000, 2109, 1241, 1524, -1000, -1000, - -1000, -1000, 2250, 18827, -1000, -1000, 2430, -1000, 22758, 634, - 2429, 41754, -1000, 503, 503, 1823, 459, 27, -1000, -1000, - -1000, -1000, 778, 29309, -1000, -1000, -1000, -1000, 1706, 46994, - -1000, -1000, 5563, 1142, -1000, 1916, -1000, 1700, -1000, 1879, - 18827, 1931, 582, 1142, 575, 569, 566, -1000, -21, -1000, - -1000, -1000, -1000, -1000, -1000, 742, 742, 742, -1000, 441, - 2402, 319, 3863, -1000, -1000, -1000, 41099, 1914, 1142, -1000, - 1909, -1000, 854, 587, 676, 676, 1142, -1000, -1000, 46339, - 1142, 852, 844, 1142, 1142, 45684, 45684, -1000, 40444, -1000, - 39789, 39134, 1136, 45684, 38479, 37824, 37169, 36514, 35859, -1000, - 2019, -1000, 1936, -1000, -1000, -1000, 46339, 1142, 1142, 46339, - 45684, 46339, 46994, 1142, -1000, -1000, 404, -1000, -1000, 1135, - 1127, 1114, 742, 742, 1110, 1518, 1494, 1490, 742, 742, - 1099, 1486, 31274, 1484, 334, 1093, 1088, 1087, 1141, 1475, - 188, 1473, 1019, 992, 1079, 45684, 1908, 46994, -1000, 280, - 770, 571, 777, 2253, 2163, 1822, 549, 581, 1142, 501, - 501, 45684, -1000, 12913, -1000, -1000, 1451, 18827, -1000, 899, - 898, 898, -1000, -1000, -1000, -1000, -1000, -1000, 885, 46994, - 899, -1000, -1000, -1000, 898, 885, 46994, 885, 885, 885, - 885, 898, 898, 898, 885, 46994, 46994, 46994, 46994, 46994, - 46994, 46994, 46994, 46994, 12252, 727, 885, -369, -1000, 1447, - -1000, -1000, 2048, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 47391, -1000, + 1627, 255, 46081, 46081, 411, 2337, 1892, -1000, 2368, 2356, + 414, -1000, 2585, 1420, 1626, 1230, 1892, 1793, 47391, -1000, + 1831, -1000, -1000, -1000, -212, -213, 2048, 1287, 1610, -1000, + -1000, -1000, -1000, 1496, 19224, -1000, -1000, 2441, -1000, 23155, + 658, 2439, 42151, -1000, 549, 549, 1808, 459, 38, -1000, + -1000, -1000, -1000, 807, 29706, -1000, -1000, -1000, -1000, 1608, + 47391, -1000, -1000, 3954, 1051, -1000, 1920, -1000, 1599, -1000, + 1875, 19224, 1927, 590, 1051, 581, 579, 571, -1000, -6, + -1000, -1000, -1000, -1000, -1000, -1000, 778, 778, 778, -1000, + 453, 2392, 312, 3893, -1000, -1000, -1000, 41496, 1914, 1051, + -1000, 1913, -1000, 908, 642, 684, 684, 1051, -1000, -1000, + 46736, 1051, 906, 905, 1051, 1051, 46081, 46081, -1000, 40841, + -1000, 40186, 39531, 1180, 46081, 38876, 38221, 37566, 36911, 36256, + -1000, 1996, -1000, 1867, -1000, -1000, -1000, 46736, 1051, 1051, + 46736, 46081, 46736, 47391, 1051, -1000, -1000, 394, -1000, -1000, + 1169, 1168, 1166, 778, 778, 1165, 1596, 1595, 1589, 778, + 778, 1164, 1579, 31671, 1577, 330, 1163, 1158, 1140, 1193, + 1576, 193, 1564, 1183, 1145, 1138, 46081, 1912, 47391, -1000, + 302, 832, 544, 792, 2229, 2148, 1805, 558, 587, 1051, + 542, 542, 46081, -1000, 13310, -1000, -1000, 1554, 19224, -1000, + 903, 891, 891, -1000, -1000, -1000, -1000, -1000, -1000, 916, + 47391, 903, -1000, -1000, -1000, 891, 916, 47391, 916, 916, + 916, 916, 891, 891, 891, 916, 47391, 47391, 47391, 47391, + 47391, 47391, 47391, 47391, 47391, 12649, 757, 916, -317, -1000, + 1550, -1000, -1000, 2040, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -6416,284 +6456,285 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 12252, - 12252, -1000, -1000, -1000, -1000, -1000, 1820, -1000, 221, 56, - 225, -1000, 35204, 407, 776, -1000, 407, -1000, -1000, -1000, - 1814, 34549, -1000, -375, -376, -380, -385, -1000, -1000, -1000, - -387, -389, -1000, -1000, -1000, 18827, 18827, 18827, 18827, -157, - -1000, 922, 19482, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 154, 853, 19482, 19482, 19482, 19482, 19482, 19482, 19482, 19482, - 19482, 19482, 19482, 19482, 19482, 19482, 19482, -1000, -1000, 27344, - 7130, 7130, 702, 702, 702, 702, -1000, -87, 1811, 46339, - -1000, -1000, -1000, 633, 18827, 18827, 702, -1000, 1142, 16207, - 20137, 18172, 18172, 18827, 784, 1174, 46339, 18827, -1000, 1203, - -1000, -1000, -1000, 1071, -1000, 860, 2239, 2239, 2239, 2239, - 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, - 2239, 45684, 45684, 864, 18827, 18827, 18827, 18827, 18827, 18827, - 14896, 18827, 18827, 19482, 18827, 18827, 18827, 1203, 18827, 18827, - 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, - 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, - 18827, 18827, 18827, 18827, 18827, 1203, 18827, 1259, 18827, 18827, - 18172, 14235, 18172, 18172, 18172, 18172, 18172, -1000, -1000, -1000, - -1000, -1000, 18827, 18827, 18827, 18827, 18827, 18827, 18827, 18827, - 1203, 18827, 18827, 18827, 18827, 18827, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1449, 1244, 1246, 18827, - -1000, 1810, -1000, -168, 24724, 18827, 1443, 2428, 1964, 45684, - -1000, -1000, -1000, 2338, -1000, 2338, 1449, 2133, 2087, 18172, - -1000, -1000, 2133, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1611, -1000, 46994, 1809, 2311, 45684, 2101, 1435, 437, - -1000, 18827, 18827, 1808, -1000, 1220, 46994, -1000, -157, -1000, - 33894, -1000, -1000, 11591, 46994, 385, 46994, -1000, 24069, 33239, - 388, -1000, 27, 1783, -1000, 65, 53, 15551, 692, -1000, - -1000, -1000, 685, 20792, 1582, 692, 153, -1000, -1000, -1000, - 1879, -1000, 1879, 1879, 1879, 1879, 437, 437, 437, 437, - -1000, -1000, -1000, -1000, -1000, 1906, 1903, -1000, 1879, 1879, - 1879, 1879, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1902, - 1902, 1902, 1901, 1901, 1882, 1882, 475, -1000, 18827, 306, - 32584, 2279, 1078, 1103, 280, 522, 1959, 1142, 1142, 1142, - 522, -1000, 1193, 1190, 1163, -1000, -452, 1803, -1000, -1000, - 2401, -1000, -1000, 981, 877, 875, 855, 45684, 262, 368, - -1000, 464, -1000, 32584, 1142, 838, 676, 1142, -1000, 1142, - -1000, -1000, -1000, -1000, -1000, 1142, -1000, -1000, 1799, -1000, - 1719, 929, 874, 918, 863, 1799, -1000, -1000, -98, 1799, - -1000, 1799, -1000, 1799, -1000, 1799, -1000, 1799, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 793, 228, -198, - 45684, 262, 542, -1000, 521, 27344, -1000, -1000, -1000, 27344, - 27344, -1000, -1000, -1000, -1000, 1433, 1420, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 12649, 12649, -1000, -1000, -1000, -1000, -1000, 1799, -1000, 214, + 52, 225, -1000, 35601, 409, 790, -1000, 409, -1000, -1000, + -1000, 1798, 34946, -1000, -319, -327, -328, -331, -1000, -1000, + -1000, -332, -341, -1000, -1000, -1000, 19224, 19224, 19224, 19224, + -141, -1000, 860, 19879, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 182, 1067, 19879, 19879, 19879, 19879, 19879, 19879, 19879, + 19879, 19879, 19879, 19879, 19879, 19879, 19879, 19879, -1000, -1000, + 27741, 6717, 6717, 721, 721, 721, 721, -1000, -76, 1797, + 46736, -1000, -1000, -1000, 657, 19224, 19224, 721, -1000, 1051, + 16604, 20534, 18569, 18569, 19224, 826, 1098, 46736, 19224, -1000, + 1230, -1000, -1000, -1000, 1127, -1000, 869, 2207, 2207, 2207, + 2207, 19224, 19224, 19224, 19224, 19224, 19224, 19224, 19224, 19224, + 19224, 2207, 46081, 46081, 1115, 19224, 19224, 19224, 19224, 19224, + 19224, 15293, 19224, 19224, 19879, 19224, 19224, 19224, 1230, 19224, + 19224, 19224, 19224, 19224, 19224, 19224, 19224, 19224, 19224, 19224, + 19224, 19224, 19224, 19224, 19224, 19224, 19224, 19224, 19224, 19224, + 19224, 19224, 19224, 19224, 19224, 19224, 1230, 19224, 1012, 19224, + 19224, 18569, 14632, 18569, 18569, 18569, 18569, 18569, -1000, -1000, + -1000, -1000, -1000, 19224, 19224, 19224, 19224, 19224, 19224, 19224, + 19224, 1230, 19224, 19224, 19224, 19224, 19224, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1403, 1329, 1294, + 19224, -1000, 1795, -1000, -127, 25121, 19224, 1544, 2437, 1969, + 46081, -1000, -1000, -1000, 2337, -1000, 2337, 1403, 2360, 2075, + 18569, -1000, -1000, 2360, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1643, -1000, 47391, 1793, 2288, 46081, -1000, -182, + -1000, -185, 2044, 1541, 395, -1000, 19224, 19224, 1787, -1000, + 1139, 47391, -1000, -141, -1000, 34291, -1000, -1000, 11988, 47391, + 423, 47391, -1000, 24466, 33636, 279, -1000, 38, 1684, -1000, + 68, 50, 15948, 713, -1000, -1000, -1000, 3441, 21189, 1494, + 713, 145, -1000, -1000, -1000, 1875, -1000, 1875, 1875, 1875, + 1875, 395, 395, 395, 395, -1000, -1000, -1000, -1000, -1000, + 1910, 1909, -1000, 1875, 1875, 1875, 1875, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -440, 46994, -1000, 269, - 772, 346, 378, 364, 46994, 343, 2328, 2325, 2324, 2323, - 2318, 296, 329, 46994, 46994, 501, 2061, 46994, 2284, 46994, - -1000, -1000, -1000, -1000, -1000, 1174, 46994, -1000, -1000, 885, - 885, -1000, -1000, 46994, 885, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 885, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 46994, - -1000, -1000, -1000, -1000, -10, 219, -1000, -1000, 45684, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -79, -1000, - 112, 60, 394, -1000, -1000, -1000, -1000, -1000, 2333, -1000, - 1174, 836, 808, -1000, 1842, -1000, -1000, 1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 154, 19482, 19482, 19482, 1924, - 536, 1941, 1335, 1348, 1557, 1557, 1031, 1031, 708, 708, - 708, 708, 708, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1402, -1000, 1842, 46339, 1682, 14235, 1740, 1998, 1203, - 3079, -1000, 1654, -1000, 1654, 1070, 800, -1000, 18827, 1203, - 3015, -1000, -1000, 1203, 1203, 1203, 18827, -1000, -1000, 18827, - 18827, 18827, 18827, 1103, 1103, 1103, 1103, 1103, 1103, 1103, - 1103, 1103, 1103, 18827, 1795, 1792, 2426, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1907, 1907, 1907, 1896, 1896, 1876, + 1876, 521, -1000, 19224, 246, 32981, 2241, 1137, 1622, 302, + 546, 1948, 1051, 1051, 1051, 546, -1000, 1238, 1236, 1234, + -1000, -448, 1777, -1000, -1000, 2387, -1000, -1000, 722, 933, + 928, 616, 46081, 275, 397, -1000, 527, -1000, 32981, 1051, + 901, 684, 1051, -1000, 1051, -1000, -1000, -1000, -1000, -1000, + 1051, -1000, -1000, 1776, -1000, 1678, 978, 923, 973, 919, + 1776, -1000, -1000, -82, 1776, -1000, 1776, -1000, 1776, -1000, + 1776, -1000, 1776, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 802, 238, -236, 46081, 275, 557, -1000, 555, + 27741, -1000, -1000, -1000, 27741, 27741, -1000, -1000, -1000, -1000, + 1535, 1497, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1046, 1103, - 1103, 1103, 1103, 1103, 18827, 1888, -1000, -1000, -1000, 1294, - 2952, 982, 2919, 1103, 1103, -1000, 1103, 2889, 2882, 1203, - 1598, 1203, 1788, -1000, 2873, 1103, 2852, 2840, 2832, 2243, - 2827, 2821, 2808, 1103, 1103, 1103, 2237, 2792, 2788, 2766, - 2750, 2746, 2732, 2726, 2721, 2716, 1103, -159, 1103, 1203, - -1000, -1000, -1000, -1000, -1000, 2691, 2161, 1203, 1785, 1842, - 630, -1000, -1000, 1654, 1203, 1203, 1654, 1654, 2685, 2664, - 2647, 2635, 2630, 2419, 1103, 1103, -1000, 1103, 2405, 2347, - 2155, 2142, 1203, -1000, 1246, 46994, -1000, -333, -1000, 28, - 684, 1842, -1000, 31274, 1203, -1000, 1641, -1000, 985, -1000, - -1000, -1000, -1000, -1000, 28654, 1720, 2133, -1000, -1000, 1842, - 1651, -1000, -1000, 437, 126, 27999, 690, 690, 160, 1174, - 1174, 18827, -1000, -1000, -1000, -1000, -1000, -1000, 629, 2414, - 401, 1842, -1000, 1777, 2843, -1000, -1000, -1000, 2308, 22103, - -1000, -1000, 1842, 1842, 46994, 1723, 1690, -1000, 628, -1000, - 1164, 1783, 27, 35, -1000, -1000, -1000, -1000, 1174, -1000, - 1161, 386, 621, -1000, 466, -1000, -1000, -1000, -1000, 2177, - 138, -1000, -1000, -1000, 261, 437, -1000, -1000, -1000, -1000, - -1000, -1000, 1400, 1400, -1000, -1000, -1000, -1000, -1000, 1068, - -1000, -1000, -1000, -1000, 1065, -1000, -1000, 1036, -1000, -1000, - 2221, 1957, 306, -1000, -1000, 742, 1383, -1000, -1000, 2183, - 742, 742, 45684, -1000, -1000, 1577, 2279, 269, 46994, 791, - 2057, -1000, 1959, 1959, 1959, 46994, -1000, -1000, -1000, -1000, - -1000, -1000, -442, 64, 415, -1000, -1000, -1000, 395, 45684, - 1627, -1000, 265, -1000, 1570, -1000, 45684, -1000, 1620, 1892, - 1142, 1142, -1000, -1000, -1000, 45684, 1842, -1000, -1000, -1000, - -1000, 572, 2241, 260, -1000, -1000, -177, -1000, -1000, 262, - 265, 46339, 1142, 692, -1000, -1000, -1000, -1000, -1000, -443, - 1615, 564, 259, 340, 46994, 46994, 46994, 46994, 46994, 597, - -1000, -1000, 73, -1000, -1000, 246, -1000, -1000, -1000, -1000, - 246, -1000, -1000, -1000, -1000, 312, 516, -1000, 46994, 46994, - 665, -1000, -1000, -1000, 898, -1000, -1000, 898, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 2226, 46994, 48, -407, -1000, -403, 18827, -1000, -1000, -1000, - -1000, 1177, 530, 1941, 19482, 19482, 19482, -1000, -1000, -1000, - 1102, 1102, 27344, -1000, 18827, 18172, -1000, -1000, 18827, 18827, - 771, -1000, 18827, 939, -1000, 18827, -1000, -1000, -1000, 1246, - 1103, 1103, 1103, 1103, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1726, 18827, 18827, 18827, 1203, 348, - -1000, -1000, -1000, -1000, -1000, 2425, -1000, 18827, -1000, 27344, - 18827, 18827, 18827, -1000, -1000, -1000, 18827, 18827, -1000, -1000, - 18827, 18827, -1000, 18827, 18827, 18827, -1000, 18827, 18827, 18827, - 18827, -1000, -1000, -1000, -1000, 18827, 18827, 18827, 18827, 18827, - 18827, 18827, 18827, 18827, 18827, -1000, -1000, 32584, 69, -159, - 1259, 69, 1259, -1000, 18172, 13574, -1000, -1000, -1000, -1000, - -1000, 18827, 18827, 18827, 18827, 18827, 18827, -1000, -1000, -1000, - 18827, 18827, -1000, 18827, -1000, 18827, -1000, -1000, -1000, -1000, - -1000, 684, -1000, 676, 676, 676, 45684, -1000, -1000, -1000, - -1000, 1782, -1000, 2331, -1000, 2121, 2119, 2423, 2414, -1000, - 24069, 2133, -1000, -1000, 45684, -325, -1000, 2156, 2287, 690, - 690, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 10930, 2338, - 18827, 2052, 46339, 144, -1000, 23414, 45684, 46339, 24069, 24069, - 24069, 24069, 24069, -1000, 2085, 2084, -1000, 2083, 2077, 2188, - 46994, -1000, 1449, 1608, -1000, 18827, 26034, 1689, 24069, -1000, - -1000, 24069, 46994, 10269, -1000, -1000, 44, 32, -1000, -1000, - -1000, -1000, 685, -1000, -1000, 1904, 2304, 2171, -1000, -1000, - -1000, -1000, -1000, 1604, -1000, 1594, 1776, 1592, 1585, 228, - -1000, 1893, 2214, 742, 742, -1000, 1033, -1000, 1142, 1375, - 1372, -1000, -1000, -1000, 561, -1000, 2268, 46994, 2038, 2024, - 2002, -1000, -451, 1018, 1891, 1790, 18827, 1887, 2398, 1715, - 45684, -1000, -1000, 46339, -1000, 324, -1000, 306, 45684, -1000, - -1000, -1000, 368, 46994, -1000, 7892, -1000, -1000, -1000, 265, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 46994, 281, -1000, - 1886, 1133, -1000, -1000, 1944, -1000, -1000, -1000, -1000, 252, - 339, 1364, 244, 1360, 244, -1000, 46994, 632, 1957, 46994, - -1000, -1000, -1000, 885, 885, -1000, -1000, 2211, -1000, 1142, - 1103, 19482, 19482, -1000, 702, 505, -139, 1879, 1879, -1000, - 1879, 1882, -1000, 1879, 210, 1879, 203, 1879, -1000, -1000, - 1203, 1203, 1246, -1000, 2138, 1352, -1000, 1174, 18827, 2295, - -1000, -1000, -1000, -1000, -1000, -28, 2285, 2278, 1103, -1000, - 1876, 1875, 18827, 1103, 1203, 2128, 1103, 1103, 1103, 1103, - -1000, 1174, 1246, 2262, 1246, 1103, 1103, 2257, 322, 1103, - 1581, 1581, 1581, 1581, 1581, 1246, 1246, 1246, 1246, 45684, - -1000, -159, -1000, -1000, -201, -204, -1000, 1203, -159, 1724, - 1203, -1000, 2098, 2080, 2216, 2073, 1103, 2039, 1103, 1103, - 1103, 2065, -1000, 2330, 2330, 2330, 1460, 985, 46994, -1000, - -1000, -1000, -1000, 2414, 2389, 1718, -1000, -1000, 126, 463, - -1000, 2134, 2287, -1000, 2396, 2152, 2394, -1000, -1000, -1000, - -1000, -1000, 1174, -1000, 2240, 1703, -1000, 769, 1631, -1000, - -1000, 17517, 1462, 2116, 625, 1460, 1697, 2843, 1977, 2001, - 2689, -1000, -1000, -1000, -1000, 2049, -1000, 1989, -1000, -1000, - 1853, -1000, 1314, 385, 24069, 1659, 1659, -1000, 623, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 900, 6004, 2445, -1000, - 1355, -1000, 1148, 193, 1002, -1000, -1000, 742, 742, -1000, - 832, 815, -1000, 46994, 1874, -1000, 437, 1353, 437, 996, - -1000, -1000, 994, -1000, -1000, -1000, -1000, 1784, 1978, -1000, - -1000, -1000, -1000, 46994, -1000, -1000, 46994, 46994, 46994, 1862, - 2393, -1000, 18827, 1861, 768, 1805, 45684, 45684, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 474, - 742, -421, 315, 314, 742, 742, 742, -458, -1000, -1000, - 1457, 1455, -1000, -125, -1000, 18827, -1000, -1000, -1000, 1044, - 1044, 1349, 1347, 1346, -1000, 1853, -1000, -1000, -1000, 1567, - -1000, -1000, -105, 45684, 45684, 45684, 45684, -1000, -1000, 972, + -1000, -436, 47391, -1000, 297, 788, 343, 457, 348, 47391, + 360, 2319, 2315, 2312, 2309, 2298, 398, 339, 47391, 47391, + 542, 2012, 47391, 2261, 47391, -1000, -1000, -1000, -1000, -1000, + 1098, 47391, -1000, -1000, 916, 916, -1000, -1000, 47391, 916, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 916, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 702, 1203, 350, -112, 1203, -1000, -1000, 437, + -1000, -1000, -1000, -1000, 47391, -1000, -1000, -1000, -1000, 10, + 202, -1000, -1000, 46081, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -49, -1000, 101, 66, 396, -1000, -1000, + -1000, -1000, -1000, 2331, -1000, 1098, 893, 883, -1000, 1627, + -1000, -1000, 948, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 182, 19879, 19879, 19879, 1361, 567, 1436, 1229, 986, 1025, + 1025, 1002, 1002, 719, 719, 719, 719, 719, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1478, -1000, 1627, 46736, + 1573, 14632, 1296, 2020, 1230, 2844, -1000, 1569, -1000, 1569, + 1900, 823, -1000, 19224, 1230, 2829, -1000, -1000, 1230, 1230, + 1230, 19224, -1000, -1000, 19224, 19224, 19224, 19224, 1622, 1622, + 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 19224, 1775, + 1768, 2435, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 18827, -1000, 18827, -1000, 1174, 18827, 2338, 1332, 18827, 18827, - -1000, 987, 983, 1103, -1000, -1000, -1000, 18827, -1000, -1000, - -1000, -1000, -1000, 18827, -1000, -1000, -1000, 18827, 202, 1102, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1203, 381, -1000, -1000, -1000, -1000, 2410, -1000, 1203, 18827, - -1000, -1000, 18827, -1000, 18827, 18827, -1000, 18827, -1000, 18827, - -1000, -1000, -1000, -1000, 18827, 1842, 2124, 1842, 1842, 26034, - -1000, -1000, 2389, 2369, 2392, 2129, 2136, 2136, 2134, -1000, - 2391, 2388, -1000, 1326, 2382, 1310, 805, -1000, 46339, 18827, - 144, -1000, 396, 45684, 144, 45684, -1000, 2348, -1000, -1000, - 18827, 1858, -1000, 18827, -1000, -1000, -1000, -1000, 7130, 2414, - 1659, -1000, -1000, 714, -1000, 18827, -1000, -1000, -1000, 4415, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1291, 1289, - -1000, -1000, 1856, 18827, -1000, -1000, -1000, 1463, 1450, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1853, -1000, -1000, - -1000, -1000, 368, -449, 1645, 45684, 979, -1000, 1441, 1715, - 355, 144, 1287, 742, 742, 742, 975, 966, 31274, 1407, - -1000, 45684, 433, -1000, 368, -1000, -132, -134, 1103, -1000, - -1000, 2303, -1000, -1000, 13574, -1000, -1000, 1847, 1946, -1000, - -1000, -1000, -1000, 2100, -92, -115, -1000, -1000, 1103, 1103, - 1080, 1203, -1000, 1103, 1103, 1442, 1336, -1000, 1103, 1246, - 2034, -1000, 202, 1203, 1993, -1000, -1000, 7130, -1000, -1000, - 2348, 2380, 69, -1000, -1000, 263, 69, 1174, 1994, 1103, - 1979, 1870, 1103, 1103, 26689, -1000, 2370, 2344, 31929, 31929, - 684, 2369, -167, 18827, 18827, 2130, 945, -1000, -1000, -1000, - -1000, 1275, 1270, -1000, 1264, -1000, 2440, -1000, 1174, -1000, - 144, -1000, 622, 1631, -1000, 2338, 1174, 45684, 1174, 125, - 2348, -1000, 1103, -1000, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, -1000, -1000, 45684, 1278, -1000, -1000, - 2301, 1397, 63, -1000, 1279, 1715, -1000, -1000, 142, -1000, - 18827, -1000, 31274, 1242, 1224, -1000, -1000, -1000, -1000, -458, - -1000, -1000, -1000, -1000, -1000, -1000, 399, 1714, -1000, 740, - 45684, 46994, -1000, 2093, -1000, -1000, -1000, 18827, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 18827, -1000, 1203, 1975, - -1000, -265, -1000, -422, 18827, -159, -1000, -1000, -159, -1000, - 18827, -1000, -1000, 18827, -1000, 18827, -1000, -1000, 1395, -1000, - -1000, -1000, -1000, -1000, 1395, 1395, -1000, -167, -1000, 1694, - -1000, 45684, 1174, 1598, -1000, 932, -1000, -1000, -1000, -1000, - -1000, 46339, 1631, 45684, -1000, 1371, 1203, 1842, 2338, -1000, - 1359, -1000, 399, -1000, 1846, 1790, -1000, -1000, -1000, 16862, - -1000, -1000, -1000, -1000, -1000, 245, -102, 13574, 9608, 1341, - -1000, -99, 1103, 1246, -1000, -396, -1000, -1000, -1000, -1000, - 216, -1000, -1000, 1598, -1000, -1000, 1800, 1796, 1789, 30619, - -1000, -1000, -1000, -1000, -167, -1000, -1000, 2288, -1000, -1000, - 1596, -1000, -1000, 26034, 45029, -1000, -85, 251, -102, 18827, - 1845, 1203, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -20, -1000, -1000, 611, -1000, -1000, -1000, 1944, -113, -1000, - -1000, -1000, 258, -410, -188, -203, -1000, -1000, 19482, -1000, - 18827, -1000, 18827, -1000, 18827, -1000, -1000, -1000, 45684, 1842, - -1000, 1202, -1000, 4812, -218, 1973, -1000, -89, -1000, -1000, - -1000, 892, 1186, -1000, -1000, -1000, -1000, -1000, -1000, 1129, - 45684, -1000, 472, -1000, -1000, 12913, -105, -120, 799, -1000, - -1000, -1000, -1000, -1000, 1285, 964, 1103, -1000, 45684, -1000, - 45029, -209, 692, 7130, -1000, 1969, 1967, 2418, -1000, -1000, - -1000, -1000, -1000, -1000, -460, 1199, 276, -1000, -1000, -1000, - 258, -1000, 18827, -1000, 18827, -1000, 1203, -1000, -1000, 2263, - 125, -1000, 2439, -1000, 2436, 696, 696, -1000, 962, -460, - -1000, -1000, 1103, 1103, -1000, -260, -1000, -1000, -1000, -1000, - -1000, 465, 976, -1000, -1000, -1000, -1000, -1000, 7130, -1000, - -1000, -1000, 248, 248, -1000, -1000, + -1000, -1000, -1000, 1111, 1622, 1622, 1622, 1622, 1622, 19224, + 1606, -1000, -1000, -1000, 1300, 2803, 1176, 2799, 1622, 1622, + -1000, 1622, 2788, 2773, 1230, 1575, 1230, 1717, -1000, 2756, + 1622, 2751, 2747, 2549, 2007, 2466, 2405, 2398, 1622, 1622, + 1622, 2002, 2390, 2367, 2353, 2333, 2320, 2290, 2281, 2277, + 2272, 1622, -143, 1622, 1230, -1000, -1000, -1000, -1000, -1000, + 2264, 1991, 1230, 1687, 1627, 656, -1000, -1000, 1569, 1230, + 1230, 1569, 1569, 2259, 2220, 2214, 2209, 2203, 2199, 1622, + 1622, -1000, 1622, 2171, 2159, 1974, 1970, 1230, -1000, 1294, + 47391, -1000, -300, -1000, 62, 718, 1627, -1000, 31671, 1230, + -1000, 6587, -1000, 1146, -1000, -1000, -1000, -1000, -1000, 29051, + 1650, 2360, -1000, -1000, 1627, 1559, -1000, -1000, -1000, -1000, + 395, 120, 28396, 708, 708, 157, 1098, 1098, 19224, -1000, + -1000, -1000, -1000, -1000, -1000, 655, 2401, 401, 1627, -1000, + 1683, 2366, -1000, -1000, -1000, 2285, 22500, -1000, -1000, 1627, + 1627, 47391, 1653, 1621, -1000, 654, -1000, 1205, 1684, 38, + 37, -1000, -1000, -1000, -1000, 1098, -1000, 1203, 424, 370, + -1000, 503, -1000, -1000, -1000, -1000, 2174, 133, -1000, -1000, + -1000, 274, 395, -1000, -1000, -1000, -1000, -1000, -1000, 1445, + 1445, -1000, -1000, -1000, -1000, -1000, 1135, -1000, -1000, -1000, + -1000, 1118, -1000, -1000, 1093, -1000, -1000, 2138, 1984, 246, + -1000, -1000, 778, 1422, -1000, -1000, 2172, 778, 778, 46081, + -1000, -1000, 1428, 2241, 297, 47391, 831, 2010, -1000, 1948, + 1948, 1948, 47391, -1000, -1000, -1000, -1000, -1000, -1000, -434, + 71, 408, -1000, -1000, -1000, 3593, 46081, 1531, -1000, 273, + -1000, 1421, -1000, 46081, -1000, 1528, 1889, 1051, 1051, -1000, + -1000, -1000, 46081, 1627, -1000, -1000, -1000, -1000, 584, 2222, + 309, -1000, -1000, -163, -1000, -1000, 275, 273, 46736, 1051, + 713, -1000, -1000, -1000, -1000, -1000, -439, 1523, 568, 286, + 356, 47391, 47391, 47391, 47391, 47391, 624, -1000, -1000, 78, + -1000, -1000, 252, -1000, -1000, -1000, -1000, 252, -1000, -1000, + -1000, -1000, 329, 554, -1000, 47391, 47391, 726, -1000, -1000, + -1000, 891, -1000, -1000, 891, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2219, 47391, 65, + -367, -1000, -359, 19224, -1000, -1000, -1000, -1000, 1038, 562, + 1436, 19879, 19879, 19879, -1000, -1000, -1000, 716, 716, 27741, + -1000, 19224, 18569, -1000, -1000, 19224, 19224, 809, -1000, 19224, + 941, -1000, 19224, -1000, -1000, -1000, 1294, 1622, 1622, 1622, + 1622, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1685, 19224, 19224, 19224, 1230, 341, -1000, -1000, -1000, + -1000, -1000, 2433, -1000, 19224, -1000, 27741, 19224, 19224, 19224, + -1000, -1000, -1000, 19224, 19224, -1000, -1000, 19224, 19224, -1000, + 19224, 19224, 19224, -1000, 19224, 19224, 19224, 19224, -1000, -1000, + -1000, -1000, 19224, 19224, 19224, 19224, 19224, 19224, 19224, 19224, + 19224, 19224, -1000, -1000, 32981, 114, -143, 1012, 114, 1012, + -1000, 18569, 13971, -1000, -1000, -1000, -1000, -1000, 19224, 19224, + 19224, 19224, 19224, 19224, -1000, -1000, -1000, 19224, 19224, -1000, + 19224, -1000, 19224, -1000, -1000, -1000, -1000, -1000, 718, -1000, + 684, 684, 684, 46081, -1000, -1000, -1000, -1000, 1679, -1000, + 2302, -1000, 2098, 2096, 2431, 2401, -1000, 24466, 2360, -1000, + -1000, 46081, -291, -1000, 2127, 2121, 708, 708, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 11327, 2337, 19224, 2009, 46736, + 140, -1000, 23811, 46081, 46736, 24466, 24466, 24466, 24466, 24466, + -1000, 2036, 2030, -1000, 2093, 2051, 2059, 47391, -1000, 1403, + 1508, -1000, 19224, 26431, 1680, 24466, -1000, -1000, 24466, 47391, + 10666, -1000, -1000, 64, 40, -1000, -1000, -1000, -1000, 3441, + -1000, -1000, 1147, 2283, 2141, -1000, -1000, -1000, -1000, -1000, + 1493, -1000, 1453, 1677, 1451, 1433, 238, -1000, 1898, 2216, + 778, 778, -1000, 1092, -1000, 1051, 1412, 1401, -1000, -1000, + -1000, 563, -1000, 2256, 47391, 2008, 2006, 2005, -1000, -446, + 1089, 1884, 1872, 19224, 1881, 2384, 1655, 46081, -1000, -1000, + 46736, -1000, 248, -1000, 246, 46081, -1000, -1000, -1000, 397, + 47391, -1000, 5694, -1000, -1000, -1000, 273, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 47391, 293, -1000, 1877, 1194, -1000, + -1000, 1871, -1000, -1000, -1000, -1000, 233, 333, 1398, 237, + 1393, 237, -1000, 47391, 678, 1984, 47391, -1000, -1000, -1000, + 916, 916, -1000, -1000, 2205, -1000, 1051, 1622, 19879, 19879, + -1000, 721, 540, -120, 1875, 1875, -1000, 1875, 1876, -1000, + 1875, 205, 1875, 204, 1875, -1000, -1000, 1230, 1230, 1294, + -1000, 1963, 1893, -1000, 1098, 19224, 2154, -1000, -1000, -1000, + -1000, -1000, -13, 2132, 2123, 1622, -1000, 1873, 1866, 19224, + 1622, 1230, 1928, 1622, 1622, 1622, 1622, -1000, 1098, 1294, + 2116, 1294, 1622, 1622, 2084, 328, 1622, 1427, 1427, 1427, + 1427, 1427, 1294, 1294, 1294, 1294, 46081, -1000, -143, -1000, + -1000, -191, -194, -1000, 1230, -143, 1662, 1230, -1000, 1618, + 1614, 2080, 1594, 1622, 2067, 1622, 1622, 1622, 1504, -1000, + 2326, 2326, 2326, 1397, 1146, 47391, -1000, -1000, -1000, -1000, + 2401, 2393, 1658, -1000, -1000, 120, 458, -1000, 2133, 2121, + -1000, 2377, 2142, 2376, -1000, -1000, -1000, -1000, -1000, 1098, + -1000, 2236, 1674, -1000, 785, 1641, -1000, -1000, 17914, 1417, + 2089, 653, 1397, 1778, 2366, 1971, 2004, 2117, -1000, -1000, + -1000, -1000, 2027, -1000, 2026, -1000, -1000, 1831, -1000, 2057, + 423, 24466, 1718, 1718, -1000, 651, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 965, 5282, 2467, -1000, 1386, -1000, 1201, + 198, 1088, -1000, -1000, 778, 778, -1000, 899, 890, -1000, + 47391, 1855, -1000, 395, 1378, 395, 1086, -1000, -1000, 1085, + -1000, -1000, -1000, -1000, 1862, 1993, -1000, -1000, -1000, -1000, + 47391, -1000, -1000, 47391, 47391, 47391, 1852, 2370, -1000, 19224, + 1850, 782, 2025, 46081, 46081, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 499, 778, -414, 338, + 332, 778, 778, 778, -447, -1000, -1000, 1391, 1382, -1000, + -110, -1000, 19224, -1000, -1000, -1000, 1121, 1121, 1377, 1376, + 1375, -1000, 1831, -1000, -1000, -1000, 1418, -1000, -1000, -86, + 46081, 46081, 46081, 46081, -1000, -1000, 1040, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 721, + 1230, 359, -100, 1230, -1000, -1000, 395, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 19224, -1000, 19224, + -1000, 1098, 19224, 2337, 1374, 19224, 19224, -1000, 1050, 1049, + 1622, -1000, -1000, -1000, 19224, -1000, -1000, -1000, -1000, -1000, + 19224, -1000, -1000, -1000, 19224, 250, 716, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1230, 419, -1000, + -1000, -1000, -1000, 2415, -1000, 1230, 19224, -1000, -1000, 19224, + -1000, 19224, 19224, -1000, 19224, -1000, 19224, -1000, -1000, -1000, + -1000, 19224, 1627, 2217, 1627, 1627, 26431, -1000, -1000, 2393, + 2355, 2363, 2097, 2124, 2124, 2133, -1000, 2362, 2354, -1000, + 1354, 2352, 1352, 865, -1000, 46736, 19224, 140, -1000, 402, + 46081, 140, 46081, -1000, 2361, -1000, -1000, 19224, 1849, -1000, + 19224, -1000, -1000, -1000, -1000, 6717, 2401, 1718, -1000, -1000, + 737, -1000, 19224, -1000, -1000, -1000, 5903, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1350, 1346, -1000, -1000, 1847, + 19224, -1000, -1000, -1000, 1404, 1392, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1831, -1000, -1000, -1000, -1000, 397, + -445, 2011, 46081, 1039, -1000, 1371, 1655, 380, 140, 1344, + 778, 778, 778, 1026, 1023, 31671, 1365, -1000, 46081, 488, + -1000, 397, -1000, -116, -117, 1622, -1000, -1000, 2266, -1000, + -1000, 13971, -1000, -1000, 1830, 1936, -1000, -1000, -1000, -1000, + 2043, -79, -106, -1000, -1000, 1622, 1622, 1980, 1230, -1000, + 1622, 1622, 1372, 1338, -1000, 1622, 1294, 1500, -1000, 250, + 1230, 2001, -1000, -1000, 6717, -1000, -1000, 2361, 2348, 114, + -1000, -1000, 257, 114, 1098, 1491, 1622, 1425, 1357, 1622, + 1622, 27086, -1000, 2347, 2346, 32326, 32326, 718, 2355, -150, + 19224, 19224, 2102, 1011, -1000, -1000, -1000, -1000, 1333, 1331, + -1000, 1240, -1000, 2464, -1000, 1098, -1000, 140, -1000, 650, + 1641, -1000, 2337, 1098, 46081, 1098, 119, 2361, -1000, 1622, + -1000, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, -1000, -1000, 46081, 1904, -1000, -1000, 2263, 1363, 70, + -1000, 1301, 1655, -1000, -1000, 144, -1000, 19224, -1000, 31671, + 1231, 1227, -1000, -1000, -1000, -1000, -447, -1000, -1000, -1000, + -1000, -1000, -1000, 414, 1654, -1000, 768, 46081, 47391, -1000, + 2029, -1000, -1000, -1000, 19224, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 19224, -1000, 1230, 1988, -1000, -243, -1000, + -392, 19224, -143, -1000, -1000, -143, -1000, 19224, -1000, -1000, + 19224, -1000, 19224, -1000, -1000, 1360, -1000, -1000, -1000, -1000, + -1000, 1360, 1360, -1000, -150, -1000, 1649, -1000, 46081, 1098, + 1575, -1000, 1010, -1000, -1000, -1000, -1000, -1000, 46736, 1641, + 46081, -1000, 1337, 1230, 1627, 2337, -1000, 1328, -1000, 414, + -1000, 1820, 1872, -1000, -1000, -1000, 17259, -1000, -1000, -1000, + -1000, -1000, 191, -84, 13971, 10005, 1318, -1000, -83, 1622, + 1294, -1000, -349, -1000, -1000, -1000, -1000, 200, -1000, -1000, + 1575, -1000, -1000, 1316, 1291, 1271, 31016, -1000, -1000, -1000, + -1000, -150, -1000, -1000, 2260, -1000, -1000, 1525, -1000, -1000, + 26431, 45426, -1000, -67, 325, -84, 19224, 1819, 1230, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 35, -1000, -1000, + 636, -1000, -1000, -1000, 1871, -104, -1000, -1000, -1000, 169, + -404, -188, -193, -1000, -1000, 19879, -1000, 19224, -1000, 19224, + -1000, 19224, -1000, -1000, -1000, 46081, 1627, -1000, 1262, -1000, + 2936, -216, 1987, -1000, -43, -1000, -1000, -1000, 954, 1208, + -1000, -1000, -1000, -1000, -1000, -1000, 1651, 46081, -1000, 514, + -1000, -1000, 13310, -86, -108, 874, -1000, -1000, -1000, -1000, + -1000, 1245, 1022, 1622, -1000, 46081, -1000, 45426, -203, 713, + 6717, -1000, 1983, 1977, 2429, -1000, -1000, -1000, -1000, -1000, + -1000, -454, 1248, 299, -1000, -1000, -1000, 169, -1000, 19224, + -1000, 19224, -1000, 1230, -1000, -1000, 2251, 119, -1000, 2463, + -1000, 2444, 776, 776, -1000, 1013, -454, -1000, -1000, 1622, + 1622, -1000, -245, -1000, -1000, -1000, -1000, -1000, 495, 1046, + -1000, -1000, -1000, -1000, -1000, 6717, -1000, -1000, -1000, 239, + 239, -1000, -1000, } var yyPgo = [...]int{ - 0, 3086, 3084, 39, 2, 37, 36, 3077, 172, 105, - 194, 38, 206, 104, 3076, 166, 3070, 3069, 3068, 3067, - 3066, 3063, 2467, 2461, 2460, 3062, 3059, 3055, 3053, 3051, - 3045, 3044, 3043, 3042, 3039, 167, 161, 187, 3038, 3036, - 3035, 116, 184, 91, 93, 190, 3033, 3032, 84, 3029, - 3027, 3026, 186, 183, 182, 866, 3022, 179, 113, 49, - 3017, 3016, 3013, 3011, 3009, 3008, 3006, 3001, 3000, 2999, - 2997, 2996, 2995, 2992, 2990, 2989, 2988, 205, 2987, 2986, - 24, 2984, 86, 2983, 2980, 2978, 2976, 2975, 8, 2972, - 2965, 15, 52, 2964, 2958, 54, 2957, 2955, 2954, 2953, - 2952, 19, 2948, 28, 2944, 31, 2943, 2942, 124, 2941, - 2938, 2936, 42, 2935, 2925, 2922, 2921, 2919, 2918, 2906, - 140, 2902, 2901, 2900, 301, 193, 2899, 2898, 295, 197, - 109, 2895, 2890, 137, 191, 2882, 120, 2879, 2878, 2875, - 150, 2872, 162, 2861, 2853, 73, 63, 2846, 68, 2840, - 2839, 13, 97, 64, 9, 6, 18, 2837, 2829, 65, - 100, 2828, 101, 2822, 2819, 99, 94, 2816, 103, 111, - 2813, 2811, 12, 7, 2808, 3, 5, 10, 72, 2807, - 2802, 115, 2800, 2797, 2795, 83, 2793, 2791, 5212, 2790, - 96, 131, 106, 78, 2787, 50, 51, 2782, 2781, 2780, - 2778, 2775, 55, 2768, 2764, 2761, 138, 221, 168, 2755, - 43, 45, 56, 136, 2753, 149, 80, 196, 164, 2751, - 2749, 139, 130, 2748, 2747, 69, 48, 46, 2745, 135, - 128, 119, 117, 133, 132, 2744, 2740, 61, 75, 2739, - 2738, 2737, 2733, 165, 2732, 2731, 76, 2729, 58, 2728, - 169, 2727, 21, 60, 2726, 47, 156, 2724, 77, 2722, - 2721, 71, 129, 74, 40, 2719, 153, 163, 125, 181, - 2717, 2716, 57, 2714, 2698, 2692, 192, 302, 2690, 2687, - 81, 177, 146, 148, 90, 2669, 308, 2662, 2653, 22, - 2252, 6114, 2652, 95, 160, 2647, 2628, 5469, 20, 59, - 25, 2627, 112, 2626, 2625, 2624, 2622, 195, 171, 107, - 159, 70, 2621, 2620, 2619, 17, 2609, 2608, 2607, 2602, - 2601, 2600, 87, 35, 34, 33, 199, 67, 44, 98, - 152, 151, 82, 2599, 2598, 2597, 122, 89, 2594, 158, - 154, 123, 126, 2593, 178, 141, 114, 2591, 157, 32, - 2590, 2588, 2562, 2559, 92, 2555, 2553, 2545, 2536, 155, - 143, 121, 79, 2534, 88, 118, 147, 144, 53, 2529, - 62, 2525, 2522, 30, 185, 29, 2521, 16, 108, 102, - 2518, 4427, 180, 2517, 23, 310, 145, 2511, 2505, 4, - 11, 14, 2504, 2503, 2502, 2497, 134, 2495, 2487, 2485, - 2477, 27, 66, 26, 1, 110, 85, 2476, 2474, 142, - 2473, 2465, 3469, 0, 127, 2433, 198, + 0, 2991, 2990, 38, 7, 45, 42, 2989, 37, 113, + 201, 43, 199, 104, 2988, 179, 2987, 2984, 2982, 2981, + 2980, 2979, 2542, 2535, 2487, 2978, 2977, 2976, 2974, 2973, + 2972, 2967, 2965, 2961, 2960, 180, 164, 195, 2956, 2954, + 2953, 127, 210, 95, 97, 189, 2952, 2951, 87, 2950, + 2949, 2948, 193, 192, 191, 888, 2947, 190, 143, 63, + 2943, 2939, 2936, 2935, 2934, 2928, 2923, 2921, 2919, 2918, + 2916, 2913, 2910, 2909, 2908, 2907, 2905, 284, 2902, 2899, + 24, 2894, 94, 2885, 2884, 2883, 2882, 2881, 12, 2880, + 2879, 16, 56, 2875, 2873, 58, 2870, 2869, 2866, 2865, + 2864, 22, 2862, 30, 2857, 47, 2855, 2847, 132, 2845, + 2843, 2842, 48, 2841, 2840, 2837, 2836, 2834, 2832, 2831, + 151, 2829, 2827, 2823, 184, 196, 2820, 2819, 170, 122, + 114, 2811, 2808, 109, 194, 2806, 128, 2804, 2802, 2800, + 150, 2799, 403, 2798, 2794, 78, 71, 2793, 28, 2785, + 2784, 11, 85, 73, 10, 4, 5, 2783, 2782, 75, + 91, 2776, 120, 2774, 2773, 111, 79, 2770, 108, 103, + 2769, 2766, 17, 9, 2765, 2, 6, 3, 80, 2764, + 2759, 129, 2754, 2744, 2743, 102, 2742, 2741, 4048, 2740, + 99, 138, 112, 83, 2739, 57, 76, 2738, 2737, 2736, + 2735, 2734, 61, 2733, 2732, 2730, 149, 74, 174, 2728, + 50, 77, 62, 137, 2725, 53, 98, 198, 176, 2717, + 2715, 142, 139, 2713, 2712, 67, 51, 49, 2711, 107, + 135, 125, 31, 106, 136, 2702, 2696, 66, 84, 2694, + 2689, 2687, 2676, 178, 2671, 2669, 88, 2668, 64, 2660, + 175, 2655, 19, 60, 2654, 55, 163, 2652, 86, 2648, + 2647, 81, 118, 82, 44, 2645, 167, 172, 133, 162, + 2641, 2636, 65, 2635, 2634, 2630, 204, 325, 2629, 2628, + 145, 182, 158, 152, 100, 2623, 350, 2622, 2621, 20, + 2846, 6504, 2619, 41, 166, 2617, 2616, 5643, 21, 52, + 32, 2615, 117, 2613, 2612, 2611, 2606, 203, 181, 173, + 171, 70, 2602, 2601, 2600, 18, 2598, 2595, 2594, 2593, + 2591, 2590, 96, 39, 36, 35, 202, 68, 14, 105, + 168, 160, 89, 2588, 2582, 2579, 131, 101, 2576, 161, + 157, 144, 200, 2574, 185, 154, 126, 2573, 72, 34, + 2572, 2571, 2570, 2569, 110, 2568, 2567, 2566, 2565, 155, + 159, 130, 92, 2564, 93, 124, 169, 165, 59, 2561, + 69, 2560, 2559, 33, 187, 29, 2557, 23, 116, 115, + 2555, 6068, 186, 2551, 25, 348, 156, 2550, 2549, 8, + 13, 15, 2543, 2534, 2525, 2512, 141, 2511, 2505, 2504, + 2497, 27, 54, 26, 1, 123, 90, 2496, 2489, 153, + 2488, 2481, 4072, 0, 134, 2479, 205, } -//line sql.y:7969 +//line sql.y:7989 type yySymType struct { union any empty struct{} @@ -7512,16 +7553,16 @@ var yyR1 = [...]int{ 48, 48, 48, 48, 48, 43, 43, 43, 43, 44, 44, 44, 44, 134, 134, 134, 134, 136, 136, 135, 135, 80, 80, 81, 81, 81, 140, 140, 141, 141, - 141, 138, 138, 139, 139, 250, 250, 234, 234, 234, - 241, 241, 241, 237, 237, 239, 239, 239, 240, 240, - 240, 238, 247, 247, 249, 249, 248, 248, 244, 244, - 245, 245, 246, 246, 246, 242, 242, 199, 199, 199, - 199, 199, 251, 251, 251, 251, 263, 263, 210, 210, - 212, 212, 211, 211, 161, 264, 264, 272, 269, 269, - 270, 270, 296, 296, 296, 273, 273, 286, 286, 282, - 282, 283, 283, 276, 276, 288, 288, 288, 75, 208, - 208, 365, 365, 362, 291, 291, 293, 293, 297, 297, - 301, 301, 298, 298, 289, 289, 289, 289, 289, 289, + 141, 138, 138, 139, 139, 250, 250, 250, 250, 250, + 250, 250, 234, 234, 234, 241, 241, 241, 237, 237, + 239, 239, 239, 240, 240, 240, 238, 247, 247, 249, + 249, 248, 248, 244, 244, 245, 245, 246, 246, 246, + 242, 242, 199, 199, 199, 199, 199, 251, 251, 251, + 251, 263, 263, 210, 210, 212, 212, 211, 211, 161, + 264, 264, 272, 269, 269, 270, 270, 296, 296, 296, + 273, 273, 286, 286, 282, 282, 283, 283, 276, 276, + 288, 288, 288, 75, 208, 208, 365, 365, 362, 291, + 291, 293, 293, 297, 297, 301, 301, 298, 298, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, @@ -7536,7 +7577,7 @@ var yyR1 = [...]int{ 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 290, 290, 290, 290, 290, 290, 290, + 289, 289, 289, 289, 289, 289, 289, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, @@ -7576,7 +7617,8 @@ var yyR1 = [...]int{ 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 412, 413, 307, 308, 308, 308, + 290, 290, 290, 290, 290, 290, 290, 290, 412, 413, + 307, 308, 308, 308, } var yyR2 = [...]int{ @@ -7719,16 +7761,16 @@ var yyR2 = [...]int{ 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, 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, + 2, 1, 1, 0, 1, 2, 3, 4, 2, 3, + 4, 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, 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, @@ -7783,7 +7825,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, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, } var yyChk = [...]int{ @@ -7877,273 +7920,274 @@ var yyChk = [...]int{ 213, 214, 215, 216, 217, 218, 219, 45, 394, 394, -188, -77, -77, -77, -77, -227, -125, -229, -10, -8, -412, 9, -77, -8, -9, -13, -35, -37, 538, -36, - -297, 100, -234, -250, 13, 162, 43, 51, -232, -233, - -12, -8, -142, 20, 24, 25, -130, 168, -142, -297, - -130, -276, 242, -77, -77, -265, -310, 315, -267, 409, - 619, 408, -257, -270, 91, -256, -269, 407, -351, 159, - -337, -341, -291, 253, -367, 249, -188, -360, -359, -291, - -412, -126, -286, 239, 247, 246, 136, -385, 139, 295, - 420, 237, -52, -53, -54, -269, 176, 639, -108, 270, - 274, 88, 88, -341, -340, -339, -386, 274, 253, -366, - -358, 245, 254, -347, 246, 247, -342, 239, 137, -386, - -342, 244, 254, 249, 253, 274, 274, 127, 274, 127, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 269, - -348, 151, -348, 515, 515, -354, -386, 249, 239, -386, - -386, 245, -288, -342, 241, 26, 241, 36, 36, -348, - -348, -348, -269, 176, -348, -348, -348, -348, 282, 282, - -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, - -348, -348, -348, -348, -348, -348, -348, 238, -385, -134, - 405, 302, 82, -55, 284, -38, -188, -286, 239, 240, - -385, 271, -188, 221, -188, -280, 159, 16, -280, -277, - 394, 392, 379, 384, -280, -280, -280, -280, 285, 377, - -343, 239, 36, 250, 394, 285, 377, 285, 286, 285, - 286, 387, 397, 285, -302, 15, 162, 420, 382, 386, - 278, 238, 279, 240, 396, 286, -302, 90, -281, 159, - 285, 394, 281, -280, -280, -308, -412, -293, -291, -289, - 230, 24, 142, 26, 28, 145, 177, 130, 20, 146, - 38, 232, 345, 249, 176, 245, 450, 225, 73, 519, - 421, 423, 419, 426, 452, 453, 420, 380, 32, 14, - 521, 29, 259, 25, 39, 170, 227, 149, 522, 262, - 27, 260, 118, 121, 524, 23, 76, 254, 15, 247, - 41, 17, 525, 526, 18, 243, 242, 162, 239, 71, - 12, 220, 30, 158, 67, 527, 137, 528, 529, 530, - 531, 131, 69, 159, 21, 659, 424, 425, 34, 620, - 507, 273, 172, 74, 60, 621, 143, 422, 532, 533, - 119, 534, 122, 77, 626, 139, 19, 72, 43, 535, - 274, 536, 244, 660, 537, 412, 538, 160, 228, 449, - 70, 161, 633, 539, 634, 237, 393, 9, 454, 33, - 258, 246, 129, 68, 540, 238, 148, 455, 456, 241, - 132, 120, 8, 136, 35, 13, 75, 78, 427, 428, - 429, 58, 128, 511, 147, 16, 541, 413, 141, -381, - 622, -308, -308, 33, 92, -407, -408, -409, 511, 412, - 241, -291, -188, -83, 612, 229, -84, 618, 24, 236, - -132, 394, -120, 177, 640, 623, 624, 625, 622, 391, - 630, 628, 626, 285, 627, 88, 139, 141, 142, 4, - -142, 158, -198, 151, 152, 153, 154, 155, 156, 157, - 162, 143, 145, 159, -243, 140, 163, 164, 165, 166, - 167, 168, 169, 171, 170, 172, 173, 160, 161, 176, - 223, 224, -152, -152, -152, -152, -213, -219, -218, -412, - -215, -381, -290, -297, -412, -412, -152, -275, -412, -412, - -148, -412, -412, -412, -222, -142, -412, -412, -416, -412, - -416, -416, -326, -412, -326, -412, -412, -412, -412, -412, + -297, 100, -234, -250, 13, 62, 162, 43, 51, -232, + -233, -12, -8, -142, 20, 24, 25, -130, 168, -142, + -297, -130, -276, 242, -77, -77, -265, -310, 315, -267, + 409, 619, 408, -257, -270, 91, -256, -269, 407, -351, + 159, -337, -341, -291, 253, -367, 249, -188, -360, -359, + -291, -412, -126, -286, 239, 247, 246, 136, -385, 139, + 295, 420, 237, -52, -53, -54, -269, 176, 639, -108, + 270, 274, 88, 88, -341, -340, -339, -386, 274, 253, + -366, -358, 245, 254, -347, 246, 247, -342, 239, 137, + -386, -342, 244, 254, 249, 253, 274, 274, 127, 274, + 127, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 269, -348, 151, -348, 515, 515, -354, -386, 249, 239, + -386, -386, 245, -288, -342, 241, 26, 241, 36, 36, + -348, -348, -348, -269, 176, -348, -348, -348, -348, 282, + 282, -348, -348, -348, -348, -348, -348, -348, -348, -348, + -348, -348, -348, -348, -348, -348, -348, -348, 238, -385, + -134, 405, 302, 82, -55, 284, -38, -188, -286, 239, + 240, -385, 271, -188, 221, -188, -280, 159, 16, -280, + -277, 394, 392, 379, 384, -280, -280, -280, -280, 285, + 377, -343, 239, 36, 250, 394, 285, 377, 285, 286, + 285, 286, 387, 397, 285, -302, 15, 162, 420, 382, + 386, 278, 238, 279, 240, 396, 286, -302, 90, -281, + 159, 285, 394, 281, -280, -280, -308, -412, -293, -291, + -289, 230, 24, 142, 26, 28, 145, 177, 130, 20, + 146, 38, 232, 345, 249, 176, 245, 450, 225, 73, + 519, 421, 423, 419, 426, 452, 453, 420, 380, 32, + 14, 521, 29, 259, 25, 39, 170, 227, 149, 522, + 262, 27, 260, 118, 121, 524, 23, 76, 254, 15, + 247, 41, 17, 525, 526, 18, 243, 242, 162, 239, + 71, 12, 220, 30, 158, 67, 527, 137, 528, 529, + 530, 531, 131, 69, 159, 21, 659, 424, 425, 34, + 620, 507, 273, 172, 74, 60, 621, 143, 422, 532, + 533, 119, 534, 122, 77, 626, 139, 19, 72, 43, + 535, 274, 536, 244, 660, 537, 412, 538, 160, 228, + 449, 70, 161, 633, 539, 634, 237, 393, 9, 454, + 33, 258, 246, 129, 68, 540, 238, 148, 455, 456, + 241, 132, 120, 8, 136, 35, 13, 75, 78, 427, + 428, 429, 58, 128, 511, 147, 16, 541, 413, 141, + -381, 622, -308, -308, 33, 92, -407, -408, -409, 511, + 412, 241, -291, -188, -83, 612, 229, -84, 618, 24, + 236, -132, 394, -120, 177, 640, 623, 624, 625, 622, + 391, 630, 628, 626, 285, 627, 88, 139, 141, 142, + 4, -142, 158, -198, 151, 152, 153, 154, 155, 156, + 157, 162, 143, 145, 159, -243, 140, 163, 164, 165, + 166, 167, 168, 169, 171, 170, 172, 173, 160, 161, + 176, 223, 224, -152, -152, -152, -152, -213, -219, -218, + -412, -215, -381, -290, -297, -412, -412, -152, -275, -412, + -412, -148, -412, -412, -412, -222, -142, -412, -412, -416, + -412, -416, -416, -326, -412, -326, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, - -412, 221, -412, -412, -412, -412, -412, -326, -326, -326, - -326, -326, -412, -412, -412, -412, -412, -412, -412, -412, - -412, -412, -412, -412, -412, -412, 103, 99, 102, 94, - -217, 105, 90, 90, 90, 90, -8, -9, -207, -412, - -307, -395, -396, -191, -188, -412, 302, -291, -291, 271, - -232, -12, -8, -227, -233, -229, -8, -77, -118, -131, - 64, 65, -133, 25, 39, 68, 66, 24, -413, 89, - -413, -250, -413, 88, -37, -253, 87, 62, 44, 90, - 90, 88, 22, -228, -230, -142, 15, -295, 4, -294, - 26, -291, 90, 221, 15, -189, 30, -188, -276, -276, - 88, 91, 315, -266, -268, 410, 412, 151, -296, -291, - 90, 32, 89, 88, -188, -315, -318, -320, -319, -321, - -316, -317, 342, 343, 177, 346, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 359, 33, 261, 338, 339, - 340, 341, 360, 361, 362, 363, 365, 366, 367, 368, - 323, 344, 509, 324, 325, 326, 327, 328, 329, 331, - 332, 335, 333, 334, 336, 337, -382, -381, 87, 89, - 88, -322, 87, -142, -134, 238, -381, 239, 239, 239, - -77, 449, -348, -348, -348, 269, 20, -45, -42, -374, - 19, -41, -42, 230, 123, 124, 227, 87, -337, 87, - -346, -382, -381, 87, 137, 244, 136, -345, -342, -345, - -346, -381, -215, -381, 137, 137, -381, -381, -262, -291, - -262, -262, 24, -262, 24, -262, 24, 96, -291, -262, - 24, -262, 24, -262, 24, -262, 24, -262, 24, 32, - 79, 80, 81, 32, 83, 84, 85, -215, -381, -381, - -215, -337, -215, -188, -381, -269, 96, 96, 96, -348, - -348, 96, 90, 90, 90, -348, -348, 96, 90, -299, - -297, 90, 90, -387, 255, 299, 301, 96, 96, 96, - 96, 32, 90, -388, 32, 647, 646, 648, 649, 650, - 90, 96, 32, 96, 32, 96, -291, 87, -188, -140, - 289, 225, 227, 230, 77, 90, 305, 306, 303, 308, - 309, 151, 45, 88, 241, 238, -381, -282, 243, -282, - -291, -298, -297, -289, 90, -142, -344, 15, 162, -302, - -302, -280, -188, -344, -302, -280, -188, -280, -280, -280, - -280, -302, -302, -302, -280, -297, -297, -188, -188, -188, - -188, -188, -188, -188, -308, -281, -280, 622, 90, -274, - 15, 77, -308, -308, 88, 321, 413, 414, -306, 318, - -79, -291, 90, -15, -11, -23, -22, -24, 151, -15, - 88, 511, -181, -188, 622, 622, 622, 622, 622, 622, - -142, -142, -142, -142, 534, -205, 119, 143, 120, 121, - -160, -206, -211, -213, 106, 162, 145, 159, -243, -148, - -152, -148, -148, -148, -148, -148, -148, -148, -148, -148, - -148, -148, -148, -148, -309, -291, 90, 177, -156, -155, - 105, -404, -156, 508, 88, -218, 221, -142, -142, -381, - -142, -291, -128, -130, -128, -142, -220, -221, 147, -215, - -142, -413, -413, 96, 105, 168, -124, 25, 39, -124, - -124, -124, -124, -142, -142, -142, -142, -142, -142, -142, - -142, -142, -142, -124, -291, -291, -117, -116, 431, 432, - 433, 434, 436, 437, 438, 441, 442, 446, 447, 430, - 448, 435, 440, 443, 444, 445, 439, 341, -142, -142, - -142, -142, -142, -142, -85, -142, 130, 131, 132, -207, - -142, -148, -142, -142, -142, -413, -142, -142, -142, -208, - -207, -380, -379, -378, -142, -142, -142, -142, -142, -142, + -412, -412, 221, -412, -412, -412, -412, -412, -326, -326, + -326, -326, -326, -412, -412, -412, -412, -412, -412, -412, + -412, -412, -412, -412, -412, -412, -412, 103, 99, 102, + 94, -217, 105, 90, 90, 90, 90, -8, -9, -207, + -412, -307, -395, -396, -191, -188, -412, 302, -291, -291, + 271, -232, -12, -8, -227, -233, -229, -8, -77, -118, + -131, 64, 65, -133, 25, 39, 68, 66, 24, -413, + 89, -413, -250, -413, 88, -37, -253, 87, 566, 596, + 566, 596, 62, 44, 90, 90, 88, 22, -228, -230, + -142, 15, -295, 4, -294, 26, -291, 90, 221, 15, + -189, 30, -188, -276, -276, 88, 91, 315, -266, -268, + 410, 412, 151, -296, -291, 90, 32, 89, 88, -188, + -315, -318, -320, -319, -321, -316, -317, 342, 343, 177, + 346, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 359, 33, 261, 338, 339, 340, 341, 360, 361, 362, + 363, 365, 366, 367, 368, 323, 344, 509, 324, 325, + 326, 327, 328, 329, 331, 332, 335, 333, 334, 336, + 337, -382, -381, 87, 89, 88, -322, 87, -142, -134, + 238, -381, 239, 239, 239, -77, 449, -348, -348, -348, + 269, 20, -45, -42, -374, 19, -41, -42, 230, 123, + 124, 227, 87, -337, 87, -346, -382, -381, 87, 137, + 244, 136, -345, -342, -345, -346, -381, -215, -381, 137, + 137, -381, -381, -262, -291, -262, -262, 24, -262, 24, + -262, 24, 96, -291, -262, 24, -262, 24, -262, 24, + -262, 24, -262, 24, 32, 79, 80, 81, 32, 83, + 84, 85, -215, -381, -381, -215, -337, -215, -188, -381, + -269, 96, 96, 96, -348, -348, 96, 90, 90, 90, + -348, -348, 96, 90, -299, -297, 90, 90, -387, 255, + 299, 301, 96, 96, 96, 96, 32, 90, -388, 32, + 647, 646, 648, 649, 650, 90, 96, 32, 96, 32, + 96, -291, 87, -188, -140, 289, 225, 227, 230, 77, + 90, 305, 306, 303, 308, 309, 151, 45, 88, 241, + 238, -381, -282, 243, -282, -291, -298, -297, -289, 90, + -142, -344, 15, 162, -302, -302, -280, -188, -344, -302, + -280, -188, -280, -280, -280, -280, -302, -302, -302, -280, + -297, -297, -188, -188, -188, -188, -188, -188, -188, -308, + -281, -280, 622, 90, -274, 15, 77, -308, -308, 88, + 321, 413, 414, -306, 318, -79, -291, 90, -15, -11, + -23, -22, -24, 151, -15, 88, 511, -181, -188, 622, + 622, 622, 622, 622, 622, -142, -142, -142, -142, 534, + -205, 119, 143, 120, 121, -160, -206, -211, -213, 106, + 162, 145, 159, -243, -148, -152, -148, -148, -148, -148, + -148, -148, -148, -148, -148, -148, -148, -148, -148, -309, + -291, 90, 177, -156, -155, 105, -404, -156, 508, 88, + -218, 221, -142, -142, -381, -142, -291, -128, -130, -128, + -142, -220, -221, 147, -215, -142, -413, -413, 96, 105, + 168, -124, 25, 39, -124, -124, -124, -124, -142, -142, + -142, -142, -142, -142, -142, -142, -142, -142, -124, -291, + -291, -117, -116, 431, 432, 433, 434, 436, 437, 438, + 441, 442, 446, 447, 430, 448, 435, 440, 443, 444, + 445, 439, 341, -142, -142, -142, -142, -142, -142, -85, + -142, 130, 131, 132, -207, -142, -148, -142, -142, -142, + -413, -142, -142, -142, -208, -207, -380, -379, -378, -142, + -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, -142, - -142, -142, -142, -142, -142, -142, -142, -413, -142, -162, - -146, 96, -258, 105, 92, -142, -142, -129, -128, -293, - -298, -289, -290, -128, -129, -129, -128, -128, -142, -142, - -142, -142, -142, -142, -142, -142, -413, -142, -142, -142, - -142, -142, -250, -413, -207, 88, -397, 412, 413, 620, - -300, 274, -299, 26, -208, 90, 15, -260, 78, -291, - -232, -232, 64, 65, 60, -128, -133, -413, -36, 26, - -252, -291, 63, 90, -327, -269, 369, 370, 177, -142, - -142, 88, -231, 28, 29, -188, -294, 168, -298, -188, - -261, 274, -188, -166, -168, -169, -170, -191, -214, -412, - -171, -8, 530, 527, 15, -181, -182, -190, -297, -267, - -310, -266, 88, 411, 413, 414, 77, 122, -142, -328, - 176, -356, -355, -354, -337, -339, -340, -341, 89, -328, - -333, 375, 374, -322, -322, -322, -322, -322, -327, -327, - -327, -327, 87, 87, -322, -322, -322, -322, -330, 87, - -330, -330, -331, -330, 87, -331, -332, 87, -332, -367, - -142, -364, -363, -361, -362, 248, 101, 602, 558, 511, - 551, 592, 78, -359, -231, 96, -413, -140, -283, 243, - -365, -362, -381, -381, -381, -283, 91, 90, 91, 90, - 91, 90, -109, -59, -1, 659, 660, 661, 88, 20, - -338, -337, -58, 299, -370, -371, 274, -366, -360, -346, - 137, -345, -346, -346, -381, 88, 30, 127, 127, 127, - 127, 511, 227, 33, -284, 550, 143, 602, 558, -337, - -58, 241, 241, -309, -309, -309, 90, 90, -279, 655, - -181, -136, 291, 151, 280, 280, 238, 238, 293, -188, - 304, 307, 305, 306, 303, 308, 309, 24, 24, 24, - 24, 24, 292, 294, 296, 282, -188, -188, -282, 77, - -183, -188, 27, -297, -188, -280, -280, -188, -280, -280, - -188, -409, 322, -291, 356, 613, 614, 616, 615, -120, - 412, 88, 511, 23, -121, 23, -412, 119, 120, 121, - -206, -148, -152, -148, 142, 262, -412, -215, -413, -293, - 26, 88, 78, -413, 88, 88, -413, -413, 88, 15, - -223, -221, 149, -142, -413, 88, -413, -413, -413, -207, - -142, -142, -142, -142, -413, -413, -413, -413, -413, -413, - -413, -413, -413, -413, -207, 88, 88, 15, -313, 26, - -413, -413, -413, -413, -413, -222, -413, 15, -413, 78, - 88, 162, 88, -413, -413, -413, 88, 88, -413, -413, - 88, 88, -413, 88, 88, 88, -413, 88, 88, 88, - 88, -413, -413, -413, -413, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, -413, -92, 535, -413, -413, - 88, -413, 88, -413, -412, 221, -413, -413, -413, -413, - -413, 88, 88, 88, 88, 88, 88, -413, -413, -413, - 88, 88, -413, 88, -413, 88, -413, -396, 619, 413, - -195, -194, -192, 75, 242, 76, -412, -299, -413, -156, - -258, -259, -258, -200, -291, 96, 105, -234, -165, -167, - 15, -133, -213, 89, 88, -327, -238, -244, -277, -291, - 90, 177, -329, 177, -329, 369, 370, -230, 221, -196, - 16, -199, 33, 58, -11, -412, -412, 33, 88, -184, - -186, -185, -187, 67, 71, 73, 68, 69, 70, 74, - -304, 26, -8, -166, -8, -412, -188, -181, -414, 15, - 78, -414, 88, 221, -268, -271, 415, 412, 418, -381, - 90, -108, 88, -354, -341, -235, -137, 41, -334, 376, - -327, 518, -327, -336, 90, -336, 96, 96, 96, 89, - -48, -43, -44, 34, 82, -361, -348, 90, 40, -348, - -348, -291, 89, -231, -136, -188, 143, 77, -365, -365, - -365, -297, -2, 658, 664, 137, 87, 379, 19, -252, - 88, 89, -216, 300, 89, -110, -291, 89, 87, -346, - -346, -291, -412, 238, 32, 32, 602, 558, 550, -58, - -216, -215, -381, -328, 657, 656, 89, 240, 298, -141, - 426, -138, 90, 91, -188, -188, -188, -188, -188, 230, - 227, 402, -405, 310, -405, 283, 241, -181, -188, 88, - -82, 257, 252, -302, -302, 34, -188, 412, 631, 629, - -142, 142, 262, -160, -152, -148, -311, 177, 342, 261, - 340, 336, 356, 347, 374, 338, 375, 333, 332, 331, - -311, -309, -207, -130, -142, -142, 150, -142, 148, -142, - -413, -413, -413, -413, -413, -227, -142, -142, -142, -413, - 177, 342, 15, -142, -309, -142, -142, -142, -142, -142, - -378, -142, -207, -142, -207, -142, -142, -142, -142, -142, - -379, -379, -379, -379, -379, -207, -207, -207, -207, -412, - -291, -95, -94, -93, 585, 242, -92, -162, -95, -162, - -129, -293, -142, -142, -142, -142, -142, -142, -142, -142, - -142, -142, -192, -342, -342, -342, -262, 88, -273, 23, - 15, 58, 58, -165, -196, -166, -133, -291, -241, 612, - -247, 47, -245, -246, 48, -242, 49, 57, -329, -329, - 168, -232, -142, -263, 77, -264, -272, -215, -210, -212, - -211, -412, -251, -413, -291, -262, -264, -168, -169, -169, - -168, -169, 67, 67, 67, 72, 67, 72, 67, -185, - -297, -413, -142, -300, 78, -166, -166, -190, -297, 168, - 412, 416, 417, -354, -403, 119, 143, 32, 77, 372, - 101, -401, 176, 547, 597, 602, 558, 551, 592, -402, - 244, 136, 137, 256, 26, 42, 89, 88, 89, 88, - 89, 89, 88, -285, -284, -44, -43, -348, -348, 96, - -381, 90, 90, 240, 27, -188, 77, 77, 77, -111, - 662, 96, 87, -3, 82, -142, 87, 20, -337, -215, - -372, -323, -373, -324, -325, -5, -6, -349, -114, 58, - 101, -62, 45, 239, 642, 643, 127, -412, 655, -364, - -252, -368, -370, -188, -145, -412, -144, -146, -153, 166, - 167, 261, 338, 339, -216, -188, -135, 289, 297, 87, - -139, 92, -384, 78, 280, 372, 280, 90, -406, 311, - 90, -406, -188, -82, -48, -188, -280, -280, 34, -381, - -413, -160, -152, -123, 162, 511, -314, 517, -322, -322, - -322, -332, -322, 328, -322, 328, -322, -413, -413, -413, - 88, -413, 23, -413, -142, 88, -119, 454, 88, 88, - -413, 87, 87, -142, -413, -413, -413, 88, -413, -413, - -413, -413, -413, 88, -413, -413, -413, 88, -312, 603, - -413, -413, -413, -413, -413, -413, -413, -413, -413, -413, - -91, -292, -291, -92, 567, 567, -413, -92, -224, 88, - -413, -413, 88, -413, 88, 88, -413, 88, -413, 88, - -413, -413, -413, -413, 88, -193, 23, -193, -193, -413, - -258, -188, -196, -225, 17, -238, 52, 348, -249, -248, - 56, 48, -246, 20, 50, 20, 31, -263, 88, 151, - 88, -413, -413, 88, 58, 221, -413, -196, -179, -178, - 77, 78, -180, 77, -178, 67, 67, -253, 88, -261, - -166, -196, -196, 221, 119, -412, -147, -159, -145, 13, - 90, 90, -381, -400, 646, 647, 32, 96, -348, -348, - 137, 137, -188, 87, -327, 90, -327, 96, 96, 32, - 83, 84, 85, 32, 79, 80, 81, -188, -188, -188, - -188, -369, 87, 20, -142, 87, 151, 89, -252, -252, - 276, 162, -348, 640, 282, 282, -348, -348, -348, -113, - -112, 662, 89, -413, 88, -335, 511, 514, -142, -154, - -154, -253, 89, -377, 511, -383, -291, -291, -291, -291, - 96, 98, -413, 509, 74, 512, -413, -327, -142, -142, - -142, -232, 90, -142, -142, 96, 96, -413, -142, -207, - -142, -413, -176, -175, -177, 623, 119, 32, -311, -413, - -209, 274, -98, -97, -96, 15, -413, -142, -142, -142, - -142, -142, -142, -142, -412, 67, 19, 17, -412, -412, - -300, -225, -226, 18, 20, -239, 54, -237, 53, -237, - -248, 20, 20, 90, 20, 90, 137, -272, -142, -212, - 58, -11, -291, -210, -291, -227, -142, 87, -142, -156, - -196, -196, -142, -202, 478, 480, 481, 482, 479, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 483, - 457, 108, 110, 109, 458, 459, 460, 342, 505, 506, - 500, 503, 504, 502, 501, 357, 358, 461, 462, 463, - 111, 112, 113, 114, 115, 116, 117, 464, 467, 465, - 468, 469, 470, 475, 476, 471, 472, 473, 474, 477, - 494, 495, 496, 497, 498, 499, 604, 605, 606, 607, - 608, 609, 610, 611, 90, 90, 87, -142, 89, 89, - -253, -368, -59, 89, -254, -252, 96, 89, 277, -211, - -412, 90, -348, -348, -348, 96, 96, -299, -413, 88, - -291, -402, -370, 515, 515, -413, 26, -376, -375, -293, - 87, 78, 63, 510, 513, -413, -413, 88, -413, -413, - -413, 89, 89, -413, -413, -413, 88, -413, -175, -177, - -413, 77, -156, -227, 20, -95, 299, 301, -95, -413, - 88, -413, -413, 88, -413, 88, -413, -413, -255, -413, - -291, 244, 20, 20, -255, -255, -195, -226, -105, -104, - -103, 541, -142, -207, -240, 55, 77, 122, 90, 90, - 90, 13, -210, 221, -232, -252, -173, 379, -227, -413, - -252, 89, 26, 89, 664, 137, 89, -211, -122, -412, - 273, -299, 90, 90, -112, -115, -11, 88, 151, -252, - -188, 63, -142, -207, -413, 77, 522, 623, -90, -89, - -86, 634, 660, -207, -92, -92, -142, -142, -142, 88, - -413, -413, -413, -105, 88, -102, -101, -291, 77, 122, - -264, -291, 89, -413, -412, -232, 89, -236, -11, 87, - -3, 273, -323, -373, -324, -325, -5, -6, -349, -80, - 511, -375, -353, -297, -293, 90, 96, 89, 511, -413, - -413, -88, 145, 632, 600, -143, -154, -151, 220, -413, - 88, -413, 88, -413, 88, -291, 244, -103, 88, 26, - -300, -174, -172, -291, 564, -393, -392, 507, -403, -399, - 119, 143, 101, -401, 602, 558, 128, 129, -80, -142, - 87, -413, -81, 288, 619, 221, -384, 512, -88, 633, - 578, 553, 578, 553, -142, -142, -142, -101, -412, -413, - 88, 23, -315, -61, 575, -390, -391, 77, -394, 385, - 574, 595, 119, 90, 89, -252, 249, -298, -377, 513, - 142, -413, 88, -413, 88, -413, -91, -172, 571, -328, - -156, -391, 77, -390, 77, 14, 13, -4, 663, 89, - 290, -88, -142, -142, -413, -60, 27, -173, -389, 257, - 252, 255, 33, -389, 96, -4, -413, -413, 575, 251, - 32, 119, -156, -176, -175, -175, + -142, -142, -413, -142, -162, -146, 96, -258, 105, 92, + -142, -142, -129, -128, -293, -298, -289, -290, -128, -129, + -129, -128, -128, -142, -142, -142, -142, -142, -142, -142, + -142, -413, -142, -142, -142, -142, -142, -250, -413, -207, + 88, -397, 412, 413, 620, -300, 274, -299, 26, -208, + 90, 15, -260, 78, -291, -232, -232, 64, 65, 60, + -128, -133, -413, -36, 26, -252, -291, 559, 559, 63, + 90, -327, -269, 369, 370, 177, -142, -142, 88, -231, + 28, 29, -188, -294, 168, -298, -188, -261, 274, -188, + -166, -168, -169, -170, -191, -214, -412, -171, -8, 530, + 527, 15, -181, -182, -190, -297, -267, -310, -266, 88, + 411, 413, 414, 77, 122, -142, -328, 176, -356, -355, + -354, -337, -339, -340, -341, 89, -328, -333, 375, 374, + -322, -322, -322, -322, -322, -327, -327, -327, -327, 87, + 87, -322, -322, -322, -322, -330, 87, -330, -330, -331, + -330, 87, -331, -332, 87, -332, -367, -142, -364, -363, + -361, -362, 248, 101, 602, 558, 511, 551, 592, 78, + -359, -231, 96, -413, -140, -283, 243, -365, -362, -381, + -381, -381, -283, 91, 90, 91, 90, 91, 90, -109, + -59, -1, 659, 660, 661, 88, 20, -338, -337, -58, + 299, -370, -371, 274, -366, -360, -346, 137, -345, -346, + -346, -381, 88, 30, 127, 127, 127, 127, 511, 227, + 33, -284, 550, 143, 602, 558, -337, -58, 241, 241, + -309, -309, -309, 90, 90, -279, 655, -181, -136, 291, + 151, 280, 280, 238, 238, 293, -188, 304, 307, 305, + 306, 303, 308, 309, 24, 24, 24, 24, 24, 292, + 294, 296, 282, -188, -188, -282, 77, -183, -188, 27, + -297, -188, -280, -280, -188, -280, -280, -188, -409, 322, + -291, 356, 613, 614, 616, 615, -120, 412, 88, 511, + 23, -121, 23, -412, 119, 120, 121, -206, -148, -152, + -148, 142, 262, -412, -215, -413, -293, 26, 88, 78, + -413, 88, 88, -413, -413, 88, 15, -223, -221, 149, + -142, -413, 88, -413, -413, -413, -207, -142, -142, -142, + -142, -413, -413, -413, -413, -413, -413, -413, -413, -413, + -413, -207, 88, 88, 15, -313, 26, -413, -413, -413, + -413, -413, -222, -413, 15, -413, 78, 88, 162, 88, + -413, -413, -413, 88, 88, -413, -413, 88, 88, -413, + 88, 88, 88, -413, 88, 88, 88, 88, -413, -413, + -413, -413, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, -413, -92, 535, -413, -413, 88, -413, 88, + -413, -412, 221, -413, -413, -413, -413, -413, 88, 88, + 88, 88, 88, 88, -413, -413, -413, 88, 88, -413, + 88, -413, 88, -413, -396, 619, 413, -195, -194, -192, + 75, 242, 76, -412, -299, -413, -156, -258, -259, -258, + -200, -291, 96, 105, -234, -165, -167, 15, -133, -213, + 89, 88, -327, -238, -244, -277, -291, 90, 177, -329, + 177, -329, 369, 370, -230, 221, -196, 16, -199, 33, + 58, -11, -412, -412, 33, 88, -184, -186, -185, -187, + 67, 71, 73, 68, 69, 70, 74, -304, 26, -8, + -166, -8, -412, -188, -181, -414, 15, 78, -414, 88, + 221, -268, -271, 415, 412, 418, -381, 90, -108, 88, + -354, -341, -235, -137, 41, -334, 376, -327, 518, -327, + -336, 90, -336, 96, 96, 96, 89, -48, -43, -44, + 34, 82, -361, -348, 90, 40, -348, -348, -291, 89, + -231, -136, -188, 143, 77, -365, -365, -365, -297, -2, + 658, 664, 137, 87, 379, 19, -252, 88, 89, -216, + 300, 89, -110, -291, 89, 87, -346, -346, -291, -412, + 238, 32, 32, 602, 558, 550, -58, -216, -215, -381, + -328, 657, 656, 89, 240, 298, -141, 426, -138, 90, + 91, -188, -188, -188, -188, -188, 230, 227, 402, -405, + 310, -405, 283, 241, -181, -188, 88, -82, 257, 252, + -302, -302, 34, -188, 412, 631, 629, -142, 142, 262, + -160, -152, -148, -311, 177, 342, 261, 340, 336, 356, + 347, 374, 338, 375, 333, 332, 331, -311, -309, -207, + -130, -142, -142, 150, -142, 148, -142, -413, -413, -413, + -413, -413, -227, -142, -142, -142, -413, 177, 342, 15, + -142, -309, -142, -142, -142, -142, -142, -378, -142, -207, + -142, -207, -142, -142, -142, -142, -142, -379, -379, -379, + -379, -379, -207, -207, -207, -207, -412, -291, -95, -94, + -93, 585, 242, -92, -162, -95, -162, -129, -293, -142, + -142, -142, -142, -142, -142, -142, -142, -142, -142, -192, + -342, -342, -342, -262, 88, -273, 23, 15, 58, 58, + -165, -196, -166, -133, -291, -241, 612, -247, 47, -245, + -246, 48, -242, 49, 57, -329, -329, 168, -232, -142, + -263, 77, -264, -272, -215, -210, -212, -211, -412, -251, + -413, -291, -262, -264, -168, -169, -169, -168, -169, 67, + 67, 67, 72, 67, 72, 67, -185, -297, -413, -142, + -300, 78, -166, -166, -190, -297, 168, 412, 416, 417, + -354, -403, 119, 143, 32, 77, 372, 101, -401, 176, + 547, 597, 602, 558, 551, 592, -402, 244, 136, 137, + 256, 26, 42, 89, 88, 89, 88, 89, 89, 88, + -285, -284, -44, -43, -348, -348, 96, -381, 90, 90, + 240, 27, -188, 77, 77, 77, -111, 662, 96, 87, + -3, 82, -142, 87, 20, -337, -215, -372, -323, -373, + -324, -325, -5, -6, -349, -114, 58, 101, -62, 45, + 239, 642, 643, 127, -412, 655, -364, -252, -368, -370, + -188, -145, -412, -144, -146, -153, 166, 167, 261, 338, + 339, -216, -188, -135, 289, 297, 87, -139, 92, -384, + 78, 280, 372, 280, 90, -406, 311, 90, -406, -188, + -82, -48, -188, -280, -280, 34, -381, -413, -160, -152, + -123, 162, 511, -314, 517, -322, -322, -322, -332, -322, + 328, -322, 328, -322, -413, -413, -413, 88, -413, 23, + -413, -142, 88, -119, 454, 88, 88, -413, 87, 87, + -142, -413, -413, -413, 88, -413, -413, -413, -413, -413, + 88, -413, -413, -413, 88, -312, 603, -413, -413, -413, + -413, -413, -413, -413, -413, -413, -413, -91, -292, -291, + -92, 567, 567, -413, -92, -224, 88, -413, -413, 88, + -413, 88, 88, -413, 88, -413, 88, -413, -413, -413, + -413, 88, -193, 23, -193, -193, -413, -258, -188, -196, + -225, 17, -238, 52, 348, -249, -248, 56, 48, -246, + 20, 50, 20, 31, -263, 88, 151, 88, -413, -413, + 88, 58, 221, -413, -196, -179, -178, 77, 78, -180, + 77, -178, 67, 67, -253, 88, -261, -166, -196, -196, + 221, 119, -412, -147, -159, -145, 13, 90, 90, -381, + -400, 646, 647, 32, 96, -348, -348, 137, 137, -188, + 87, -327, 90, -327, 96, 96, 32, 83, 84, 85, + 32, 79, 80, 81, -188, -188, -188, -188, -369, 87, + 20, -142, 87, 151, 89, -252, -252, 276, 162, -348, + 640, 282, 282, -348, -348, -348, -113, -112, 662, 89, + -413, 88, -335, 511, 514, -142, -154, -154, -253, 89, + -377, 511, -383, -291, -291, -291, -291, 96, 98, -413, + 509, 74, 512, -413, -327, -142, -142, -142, -232, 90, + -142, -142, 96, 96, -413, -142, -207, -142, -413, -176, + -175, -177, 623, 119, 32, -311, -413, -209, 274, -98, + -97, -96, 15, -413, -142, -142, -142, -142, -142, -142, + -142, -412, 67, 19, 17, -412, -412, -300, -225, -226, + 18, 20, -239, 54, -237, 53, -237, -248, 20, 20, + 90, 20, 90, 137, -272, -142, -212, 58, -11, -291, + -210, -291, -227, -142, 87, -142, -156, -196, -196, -142, + -202, 478, 480, 481, 482, 479, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 483, 457, 108, 110, + 109, 458, 459, 460, 342, 505, 506, 500, 503, 504, + 502, 501, 357, 358, 461, 462, 463, 111, 112, 113, + 114, 115, 116, 117, 464, 467, 465, 468, 469, 470, + 475, 476, 471, 472, 473, 474, 477, 494, 495, 496, + 497, 498, 499, 604, 605, 606, 607, 608, 609, 610, + 611, 90, 90, 87, -142, 89, 89, -253, -368, -59, + 89, -254, -252, 96, 89, 277, -211, -412, 90, -348, + -348, -348, 96, 96, -299, -413, 88, -291, -402, -370, + 515, 515, -413, 26, -376, -375, -293, 87, 78, 63, + 510, 513, -413, -413, 88, -413, -413, -413, 89, 89, + -413, -413, -413, 88, -413, -175, -177, -413, 77, -156, + -227, 20, -95, 299, 301, -95, -413, 88, -413, -413, + 88, -413, 88, -413, -413, -255, -413, -291, 244, 20, + 20, -255, -255, -195, -226, -105, -104, -103, 541, -142, + -207, -240, 55, 77, 122, 90, 90, 90, 13, -210, + 221, -232, -252, -173, 379, -227, -413, -252, 89, 26, + 89, 664, 137, 89, -211, -122, -412, 273, -299, 90, + 90, -112, -115, -11, 88, 151, -252, -188, 63, -142, + -207, -413, 77, 522, 623, -90, -89, -86, 634, 660, + -207, -92, -92, -142, -142, -142, 88, -413, -413, -413, + -105, 88, -102, -101, -291, 77, 122, -264, -291, 89, + -413, -412, -232, 89, -236, -11, 87, -3, 273, -323, + -373, -324, -325, -5, -6, -349, -80, 511, -375, -353, + -297, -293, 90, 96, 89, 511, -413, -413, -88, 145, + 632, 600, -143, -154, -151, 220, -413, 88, -413, 88, + -413, 88, -291, 244, -103, 88, 26, -300, -174, -172, + -291, 564, -393, -392, 507, -403, -399, 119, 143, 101, + -401, 602, 558, 128, 129, -80, -142, 87, -413, -81, + 288, 619, 221, -384, 512, -88, 633, 578, 553, 578, + 553, -142, -142, -142, -101, -412, -413, 88, 23, -315, + -61, 575, -390, -391, 77, -394, 385, 574, 595, 119, + 90, 89, -252, 249, -298, -377, 513, 142, -413, 88, + -413, 88, -413, -91, -172, 571, -328, -156, -391, 77, + -390, 77, 14, 13, -4, 663, 89, 290, -88, -142, + -142, -413, -60, 27, -173, -389, 257, 252, 255, 33, + -389, 96, -4, -413, -413, 575, 251, 32, 119, -156, + -176, -175, -175, } var yyDef = [...]int{ @@ -8152,358 +8196,359 @@ var yyDef = [...]int{ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 70, 72, 73, 872, 872, 872, 0, 872, 0, 0, 872, - -2, -2, 872, 1480, 0, 872, 0, 0, -2, 787, - 793, 0, 802, -2, 0, 0, 872, 872, 2035, 2035, + -2, -2, 872, 1485, 0, 872, 0, 0, -2, 787, + 793, 0, 802, -2, 0, 0, 872, 872, 2040, 2040, 867, 0, 0, 0, 0, 0, 872, 872, 872, 872, 1346, 50, 872, 0, 85, 86, 822, 823, 824, 65, - 0, 2033, 873, 1, 3, 71, 75, 0, 0, 0, - 58, 1355, 0, 78, 0, 0, 876, 0, 0, 1463, + 0, 2038, 873, 1, 3, 71, 75, 0, 0, 0, + 58, 1355, 0, 78, 0, 0, 876, 0, 0, 1468, 872, 872, 0, 126, 127, 0, 0, 0, -2, 130, -2, 159, 160, 161, 0, 166, 600, 523, 575, 521, 560, -2, 509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 398, 398, 0, 0, - -2, 509, 509, 509, 1465, 0, 0, 0, 557, 460, + -2, 509, 509, 509, 1470, 0, 0, 0, 557, 460, 398, 398, 398, 0, 398, 398, 398, 398, 0, 0, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, - 398, 398, 398, 398, 398, 398, 398, 1373, 165, 1481, - 1478, 1479, 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, 2007, 2008, 2009, 2010, - 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, - 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, - 2031, 2032, 0, 1457, 0, 713, 975, 0, 776, 776, + 398, 398, 398, 398, 398, 398, 398, 1373, 165, 1486, + 1483, 1484, 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, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, + 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, + 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, + 2036, 2037, 0, 1462, 0, 713, 975, 0, 776, 776, 0, 776, 776, 776, 776, 0, 0, 0, 725, 0, 0, 0, 0, 773, 0, 741, 742, 0, 773, 0, - 748, 779, 0, 0, 754, 776, 776, 757, 2036, 0, - 2036, 2036, 1448, 0, 770, 768, 782, 783, 40, 786, - 789, 790, 791, 792, 795, 0, 806, 809, 1474, 1475, + 748, 779, 0, 0, 754, 776, 776, 757, 2041, 0, + 2041, 2041, 1453, 0, 770, 768, 782, 783, 40, 786, + 789, 790, 791, 792, 795, 0, 806, 809, 1479, 1480, 0, 811, 818, 835, 836, 0, 868, 869, 45, 1123, 0, 997, 1002, 1013, 1028, 1029, 1030, 1031, 1032, 1034, 1035, 1036, 0, 0, 0, 0, 1041, 1042, 0, 0, 0, 0, 0, 1104, 1050, 0, 0, 0, 0, 1319, - 0, 0, 1280, 1280, 1138, 1280, 1282, 1282, 1682, 1818, - 1826, 1946, 1644, 1649, 1650, 1651, 1939, 1940, 1941, 1942, - 1981, 1982, 1986, 1742, 0, 0, 0, 2032, 1779, 1787, - 1788, 1812, 1911, 1967, 1661, 1807, 1876, 1739, 1761, 1762, - 1893, 1894, 1783, 1784, 1765, 1777, 1780, 1768, 1769, 1771, - 1773, 1778, 1785, 1791, 1770, 1790, 1789, 0, 1766, 1767, - 1772, 1782, 1786, 1774, 1775, 1776, 1781, 1792, 0, 0, + 0, 0, 1280, 1280, 1138, 1280, 1282, 1282, 1687, 1823, + 1831, 1951, 1649, 1654, 1655, 1656, 1944, 1945, 1946, 1947, + 1986, 1987, 1991, 1747, 0, 0, 0, 2037, 1784, 1792, + 1793, 1817, 1916, 1972, 1666, 1812, 1881, 1744, 1766, 1767, + 1898, 1899, 1788, 1789, 1770, 1782, 1785, 1773, 1774, 1776, + 1778, 1783, 1790, 1796, 1775, 1795, 1794, 0, 1771, 1772, + 1777, 1787, 1791, 1779, 1780, 1781, 1786, 1797, 0, 0, 0, 0, 0, 1219, 1220, 1221, 1222, 0, 0, 0, 0, 0, 0, 0, 290, 291, 1332, 1333, 43, 44, - 1122, 1444, 1282, 1282, 1282, 1282, 1282, 1064, 1065, 1066, - 1067, 1068, 1092, 1093, 1099, 1100, 1888, 1889, 1890, 1891, - 1723, 1976, 1731, 1732, 1871, 1872, 1744, 1745, 2007, 2008, + 1122, 1449, 1282, 1282, 1282, 1282, 1282, 1064, 1065, 1066, + 1067, 1068, 1092, 1093, 1099, 1100, 1893, 1894, 1895, 1896, + 1728, 1981, 1736, 1737, 1876, 1877, 1749, 1750, 2012, 2013, -2, -2, -2, 231, 232, 233, 234, 235, 236, 237, - 238, 0, 1686, 1957, 1958, 227, 0, 0, 295, 296, + 238, 0, 1691, 1962, 1963, 227, 0, 0, 295, 296, 292, 293, 294, 1106, 1107, 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, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 2035, 0, 845, + 283, 284, 285, 286, 287, 288, 289, 2040, 0, 845, 0, 0, 0, 0, 0, 1355, 0, 1347, 1346, 63, 0, 872, -2, 0, 0, 0, 0, 47, 0, 52, - 932, 875, 77, 76, 1395, 0, 0, 0, 59, 1356, - 67, 69, 1357, 0, 877, 878, 0, 908, 912, 0, - 0, 0, 1464, 1463, 1463, 102, 0, 0, 103, 123, - 124, 125, 0, 0, 109, 110, 1450, 1451, 0, 0, - 177, 178, 0, 41, 425, 0, 173, 0, 418, 357, - 0, 1373, 0, 0, 0, 0, 0, 872, 0, 1458, - 154, 155, 162, 163, 164, 398, 398, 398, 572, 0, - 0, 165, 165, 530, 531, 532, 0, 0, -2, 423, - 0, 510, 0, 0, 412, 412, 416, 414, 415, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 0, 550, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, - 0, 399, 0, 570, 571, 461, 0, 0, 0, 0, - 0, 0, 0, 0, 1466, 1467, 0, 547, 548, 0, - 0, 0, 398, 398, 0, 0, 0, 0, 398, 398, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 153, 1386, - 0, 0, 0, -2, 0, 705, 0, 0, 0, 1459, - 1459, 0, 712, 0, 714, 715, 0, 0, 716, 0, - 773, 773, 771, 772, 718, 719, 720, 721, 776, 0, - 0, 407, 408, 409, 773, 776, 0, 776, 776, 776, - 776, 773, 773, 773, 776, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2036, 779, 776, 0, 749, 0, - 750, 751, 752, 755, 756, 758, 2037, 2038, 1476, 1477, - 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, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, - 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 2036, - 2036, 762, 766, 1449, 788, 794, 796, 797, 0, 0, - 807, 810, 829, 49, 1730, 817, 49, 819, 820, 821, - 847, 848, 853, 0, 0, 0, 0, 859, 860, 861, - 0, 0, 864, 865, 866, 0, 0, 0, 0, 0, - 995, 0, 0, 1112, 1113, 1114, 1115, 1116, 1117, 1118, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1014, 1015, 0, - 0, 0, 1037, 1038, 1039, 1040, 1043, 0, 1055, 0, - 1057, 1328, -2, 0, 0, 0, 1048, 1049, 0, 0, - 0, 0, 0, 0, 0, 1320, 0, 0, 1136, 0, - 1137, 1139, 1140, 0, 1141, 882, 882, 882, 882, 882, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 932, 875, 77, 76, 1395, 1398, 0, 0, 0, 59, + 1356, 67, 69, 1357, 0, 877, 878, 0, 908, 912, + 0, 0, 0, 1469, 1468, 1468, 102, 0, 0, 103, + 123, 124, 125, 0, 0, 109, 110, 1455, 1456, 0, + 0, 177, 178, 0, 41, 425, 0, 173, 0, 418, + 357, 0, 1373, 0, 0, 0, 0, 0, 872, 0, + 1463, 154, 155, 162, 163, 164, 398, 398, 398, 572, + 0, 0, 165, 165, 530, 531, 532, 0, 0, -2, + 423, 0, 510, 0, 0, 412, 412, 416, 414, 415, + 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, + 550, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 0, 399, 0, 570, 571, 461, 0, 0, 0, + 0, 0, 0, 0, 0, 1471, 1472, 0, 547, 548, + 0, 0, 0, 398, 398, 0, 0, 0, 0, 398, + 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, + 1386, 0, 0, 0, -2, 0, 705, 0, 0, 0, + 1464, 1464, 0, 712, 0, 714, 715, 0, 0, 716, + 0, 773, 773, 771, 772, 718, 719, 720, 721, 776, + 0, 0, 407, 408, 409, 773, 776, 0, 776, 776, + 776, 776, 773, 773, 773, 776, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2041, 779, 776, 0, 749, + 0, 750, 751, 752, 755, 756, 758, 2042, 2043, 1481, + 1482, 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, 1615, 1616, 1617, + 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, + 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, + 2041, 2041, 762, 766, 1454, 788, 794, 796, 797, 0, + 0, 807, 810, 829, 49, 1735, 817, 49, 819, 820, + 821, 847, 848, 853, 0, 0, 0, 0, 859, 860, + 861, 0, 0, 864, 865, 866, 0, 0, 0, 0, + 0, 995, 0, 0, 1112, 1113, 1114, 1115, 1116, 1117, + 1118, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1014, 1015, + 0, 0, 0, 1037, 1038, 1039, 1040, 1043, 0, 1055, + 0, 1057, 1328, -2, 0, 0, 0, 1048, 1049, 0, + 0, 0, 0, 0, 0, 0, 1320, 0, 0, 1136, + 0, 1137, 1139, 1140, 0, 1141, 882, 882, 882, 882, 882, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1469, 141, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 892, 0, 0, 892, 892, 0, 0, 220, 221, 222, - 223, 224, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 239, 240, 241, 242, - 243, 244, 297, 245, 246, 247, 1122, 0, 0, 0, - 46, 837, 838, 0, 958, 1469, 0, 0, 888, 0, - 57, 66, 68, 1355, 61, 1355, 0, 894, 0, 0, - -2, -2, 895, 901, 902, 903, 904, 905, 54, 2034, - 55, 0, 74, 0, 48, 0, 0, 0, 0, 371, - 1398, 0, 0, 1348, 1349, 1352, 0, 909, 1824, 913, - 0, 915, 916, 0, 0, 100, 0, 974, 0, 0, - 0, 111, 0, 113, 114, 0, 0, 0, 382, 1452, - 1453, 1454, -2, 405, 0, 382, 366, 305, 306, 307, - 357, 309, 357, 357, 357, 357, 371, 371, 371, 371, - 340, 341, 342, 343, 344, 0, 0, 326, 357, 357, - 357, 357, 347, 348, 349, 350, 351, 352, 353, 354, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 359, - 359, 359, 359, 359, 363, 363, 0, 42, 0, 386, - 0, 1352, 0, 0, 1386, 1461, 1471, 0, 0, 0, - 1461, 132, 0, 0, 0, 573, 611, 524, 561, 574, - 0, 527, 528, -2, 0, 0, 509, 0, 511, 0, - 406, 0, -2, 0, 416, 0, 412, 416, 413, 416, - 404, 417, 551, 552, 553, 0, 555, 556, 641, 944, - 0, 0, 0, 0, 0, 647, 648, 649, 0, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 562, - 563, 564, 565, 566, 567, 568, 569, 0, 0, 0, - 0, 511, 0, 558, 0, 0, 462, 463, 464, 0, - 0, 467, 468, 469, 470, 0, 0, 473, 474, 475, - 961, 962, 476, 477, 502, 503, 504, 478, 479, 480, - 481, 482, 483, 484, 496, 497, 498, 499, 500, 501, - 485, 486, 487, 488, 489, 490, 493, 0, 147, 1377, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1459, 0, 0, 0, 0, - 891, 976, 1482, 1483, 777, 778, 0, 410, 411, 776, - 776, 722, 763, 0, 776, 726, 764, 727, 729, 728, - 730, 743, 744, 776, 733, 774, 775, 734, 735, 736, - 737, 738, 739, 740, 759, 745, 746, 747, 780, 0, - 784, 785, 760, 761, 0, 0, 800, 801, 0, 808, - 832, 830, 831, 833, 825, 826, 827, 828, 0, 834, - 0, 0, 850, 96, 855, 856, 857, 858, 870, 863, - 1124, 992, 993, 994, 0, 996, 999, 0, 1108, 1110, - 1001, 1003, 1119, 1120, 1121, 0, 0, 0, 0, 0, - 1007, 1011, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, - 1024, 1025, 1026, 1027, 1033, 1296, 1297, 1298, 1052, 298, - 299, 0, 1053, 0, 0, 0, 0, 0, 0, 0, - 1123, 1054, 0, 906, 0, 0, 1326, 1323, 0, 0, - 0, 1281, 1283, 0, 0, 0, 0, 883, 884, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1259, 1260, 1261, - 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, - 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1299, 0, - 0, 0, 0, 0, 1319, 0, 1059, 1060, 1061, 0, - 0, 0, 0, 0, 0, 1179, 0, 0, 0, 0, - 1470, 0, 142, 143, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1223, 1224, 1225, 1226, 39, 0, 0, 0, 893, 1330, - 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1248, 0, 0, 0, - 0, 0, 0, 1442, 0, 0, 840, 841, 843, 0, - 978, 0, 959, 0, 0, 846, 0, 887, 0, 890, - 60, 62, 899, 900, 0, 917, 896, 56, 51, 0, - 0, 936, 1396, 371, 1418, 0, 380, 380, 377, 1358, - 1359, 0, 1351, 1353, 1354, 79, 914, 910, 0, 990, - 0, 0, 973, 0, 920, 922, 923, 924, 956, 0, - 927, 928, 0, 0, 0, 0, 0, 98, 975, 104, - 0, 112, 0, 0, 117, 118, 105, 106, 107, 108, - 0, 600, -2, 457, 179, 181, 182, 183, 174, -2, - 369, 367, 368, 308, 371, 371, 334, 335, 336, 337, - 338, 339, 0, 0, 327, 328, 329, 330, 319, 0, - 320, 321, 322, 361, 0, 323, 324, 0, 325, 424, - 0, 1360, 387, 388, 390, 398, 0, 393, 394, 0, - 398, 398, 0, 419, 420, 0, 1352, 1377, 0, 0, - 0, 1472, 1471, 1471, 1471, 0, 167, 168, 169, 170, - 171, 172, 636, 0, 0, 612, 634, 635, 165, 0, - 0, 175, 513, 512, 0, 668, 0, 422, 0, 0, - 416, 416, 401, 402, 554, 0, 0, 643, 644, 645, - 646, 0, 0, 0, 540, 451, 0, 541, 542, 511, - 513, 0, 0, 382, 465, 466, 471, 472, 491, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 587, 588, 589, 592, 594, 515, 598, 591, 593, 595, - 515, 599, 1374, 1375, 1376, 0, 0, 706, 0, 0, - 448, 94, 1460, 711, 773, 732, 765, 773, 724, 731, - 753, 798, 799, 804, 812, 813, 814, 815, 816, 854, - 0, 0, 0, 0, 862, 0, 0, 1000, 1109, 1111, - 1004, 0, 1008, 1012, 0, 0, 0, 1058, 1056, 1330, - 0, 0, 0, 1105, 0, 0, 1127, 1128, 0, 0, - 0, 1324, 0, 0, 1134, 0, 1284, 1285, 1142, 0, - 0, 0, 0, 0, 1148, 1149, 1150, 1151, 1152, 1153, - 1154, 1155, 1156, 1157, 1346, 0, 0, 0, 0, 0, - 1163, 1164, 1165, 1166, 1167, 0, 1169, 0, 1170, 0, - 0, 0, 0, 1177, 1178, 1180, 0, 0, 1183, 1184, - 0, 0, 1185, 0, 0, 0, 1189, 0, 0, 0, - 0, 1198, 1199, 1200, 1201, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1212, 1213, 0, 1087, 0, - 0, 1087, 0, 1125, 892, 0, 1286, 1287, 1288, 1289, - 1290, 0, 0, 0, 0, 0, 0, 1246, 1247, 1249, - 0, 0, 1252, 0, 1254, 0, 1443, 839, 842, 844, - 930, 979, 980, 0, 0, 0, 0, 960, 1468, 885, - 886, 889, 938, 0, 1334, 0, 0, 917, 990, 918, - 0, 897, 53, 933, 0, 1400, 1399, 1412, 1425, 380, - 380, 374, 375, 381, 376, 378, 379, 1350, 0, 1355, - 0, 1436, 0, 0, 1428, 0, 0, 0, 0, 0, - 0, 0, 0, 963, 0, 0, 966, 0, 0, 0, - 0, 957, 928, 0, 929, 0, -2, 0, 0, 92, - 93, 0, 0, 0, 115, 116, 0, 0, 122, 383, - 384, 156, 165, 459, 180, 432, 0, 0, 304, 370, - 331, 332, 333, 0, 355, 0, 0, 0, 0, 453, - 128, 1364, 1363, 398, 398, 389, 0, 392, 0, 0, - 0, 1473, 358, 421, 0, 146, 0, 0, 0, 0, - 0, 152, 606, 0, 0, 613, 0, 0, 0, 522, - 0, 533, 534, 0, 640, -2, 702, 386, 0, 400, - 403, 945, 0, 0, 535, 0, 538, 539, 452, 513, - 544, 545, 559, 546, 494, 495, 492, 0, 0, 1387, - 1388, 1393, 1391, 1392, 133, 580, 582, 581, 585, 0, - 0, 0, 517, 0, 517, 578, 0, 448, 1360, 0, - 710, 449, 450, 776, 776, 849, 97, 0, 852, 0, - 0, 0, 0, 1005, 1009, 1291, 1317, 357, 357, 1304, - 357, 363, 1307, 357, 1309, 357, 1312, 357, 1315, 1316, - 0, 0, 0, 907, 0, 0, 1133, 1327, 0, 0, - 1143, 1144, 1145, 1146, 1147, 1321, 0, 0, 0, 1162, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 144, 145, 0, 0, 0, 0, 0, 0, 1257, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1082, - 1086, 0, 1088, 1089, 0, 0, 1215, 0, 0, 1227, - 0, 1331, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 981, 986, 986, 986, 0, 0, 0, 1455, - 1456, 1335, 1336, 990, 1337, 919, 898, 937, 1418, 0, - 1411, 0, -2, 1420, 0, 0, 0, 1426, 372, 373, - 911, 80, 991, 83, 0, 1436, 1445, 0, 1427, 1438, - 1440, 0, 0, 0, 1432, 0, 990, 921, 952, 954, - 0, 949, 964, 965, 967, 0, 969, 0, 971, 972, - 932, 926, 0, 100, 0, 990, 990, 99, 0, 977, - 119, 120, 121, 458, 184, 189, 0, 0, 0, 194, - 0, 196, 0, 0, 0, 201, 202, 398, 398, 433, - 0, 301, 303, 0, 0, 187, 371, 0, 371, 0, - 362, 364, 0, 434, 454, 1361, 1362, 0, 0, 391, - 395, 396, 397, 0, 1462, 148, 0, 0, 0, 609, - 0, 637, 0, 0, 0, 0, 0, 0, 176, 514, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 0, - 398, 0, 0, 0, 398, 398, 398, 0, 694, 385, - 0, 0, 665, 662, 536, 0, 225, 226, 228, 0, - 0, 0, 0, 0, 543, 932, 1378, 1379, 1380, 0, - 1390, 1394, 136, 0, 0, 0, 0, 590, 596, 0, - 516, 597, 707, 708, 709, 95, 717, 723, 851, 871, - 998, 1006, 1010, 0, 0, 0, 0, 1318, 1302, 371, - 1305, 1306, 1308, 1310, 1311, 1313, 1314, 1046, 1047, 1051, - 0, 1130, 0, 1132, 1325, 0, 1355, 0, 0, 0, - 1161, 0, 0, 0, 1172, 1171, 1173, 0, 1175, 1176, - 1181, 1182, 1186, 0, 1188, 1190, 1191, 0, 0, 0, - 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, - 0, 1080, 1083, 1214, 1090, 1091, 1096, 1217, 0, 0, - 1126, 1229, 0, 1234, 0, 0, 1240, 0, 1244, 0, - 1250, 1251, 1253, 1255, 0, 0, 0, 0, 0, 958, - 939, 64, 1337, 1339, 0, 1405, 1403, 1403, 1413, 1414, - 0, 0, 1421, 0, 0, 0, 0, 84, 0, 0, - 0, 1441, 0, 0, 0, 0, 101, 1346, 946, 953, - 0, 0, 947, 0, 948, 968, 970, 925, 0, 990, - 990, 90, 91, 0, 190, 0, 192, 218, 219, 0, - 195, 197, 198, 199, 205, 206, 207, 200, 0, 0, - 300, 302, 0, 0, 345, 356, 346, 0, 0, 1365, - 1366, 1367, 1368, 1369, 1370, 1371, 1372, 932, 149, 150, - 151, 601, 0, 611, 0, 934, 0, 604, 0, 525, - 0, 0, 0, 398, 398, 398, 0, 0, 0, 0, - 679, 0, 0, 642, 0, 650, 0, 0, 0, 229, - 230, 0, 1389, 579, 0, 134, 135, 0, 0, 584, - 518, 519, 1044, 0, 0, 0, 1045, 1303, 0, 0, - 0, 0, 1322, 0, 0, 0, 0, 1168, 0, 0, - 0, 1194, 0, 0, 0, 631, 632, 0, 1258, 1085, - 1346, 0, 1087, 1097, 1098, 0, 1087, 1228, 0, 0, - 0, 0, 0, 0, 0, 987, 0, 0, 0, 0, - 978, 1339, 1344, 0, 0, 1408, 0, 1401, 1404, 1402, - 1415, 0, 0, 1422, 0, 1424, 0, 1446, 1447, 1439, - 0, 1431, 1434, 1430, 1433, 1355, 950, 0, 955, 0, - 1346, 89, 0, 193, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 203, 204, 0, 0, 360, 365, - 0, 0, 0, 602, 0, 935, 614, 605, 0, 692, - 0, 696, 0, 0, 0, 699, 700, 701, 678, 0, - 682, 426, 666, 663, 664, 537, 0, 137, 138, 0, - 0, 0, 1292, 0, 1295, 1129, 1131, 0, 1158, 1159, - 1160, 1300, 1301, 1174, 1187, 1192, 0, 1195, 0, 0, - 1196, 0, 633, 1076, 0, 0, 1094, 1095, 0, 1230, - 0, 1235, 1236, 0, 1241, 0, 1245, 1256, 0, 983, - 940, 941, 988, 989, 0, 0, 931, 1344, 82, 1345, - 1342, 0, 1340, 1338, 1397, 0, 1406, 1407, 1416, 1417, - 1423, 0, 1429, 0, 87, 0, 0, 0, 1355, 191, - 0, 210, 0, 610, 0, 613, 603, 690, 691, 0, - 703, 695, 697, 698, 680, -2, 1381, 0, 0, 0, - 586, 1293, 0, 0, 1197, 0, 629, 630, 1084, 1077, - 0, 1062, 1063, 1081, 1216, 1218, 0, 0, 0, 0, - 982, 984, 985, 81, 0, 1341, 1102, 0, 1409, 1410, - 1437, 1435, 951, 958, 0, 88, 439, 432, 1381, 0, - 0, 0, 683, 684, 685, 686, 687, 688, 689, 576, - 1383, 139, 140, 0, 506, 507, 508, 133, 0, 1135, - 1193, 1078, 0, 0, 0, 0, 1074, 1075, 0, 1231, - 0, 1237, 0, 1242, 0, 942, 943, 1343, 0, 0, - 615, 0, 617, 0, -2, 427, 440, 0, 185, 211, - 212, 0, 0, 215, 216, 217, 208, 209, 129, 0, - 0, 704, 0, 1384, 1385, 0, 136, 0, 0, 1069, - 1070, 1071, 1072, 1073, 0, 0, 0, 1103, 1082, 616, - 0, 0, 382, 0, 626, 428, 429, 0, 435, 436, - 437, 438, 213, 214, 638, 0, 0, 505, 583, 1294, - 0, 1232, 0, 1238, 0, 1243, 0, 618, 619, 627, - 0, 430, 0, 431, 0, 0, 0, 607, 0, 638, - 1382, 1079, 0, 0, 1101, 0, 628, 624, 441, 443, - 444, 0, 0, 442, 639, 608, 1233, 1239, 0, 445, - 446, 447, 620, 621, 622, 623, + 0, 882, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1474, 141, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 892, 0, 0, 892, 892, 0, 0, 220, 221, + 222, 223, 224, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, + 242, 243, 244, 297, 245, 246, 247, 1122, 0, 0, + 0, 46, 837, 838, 0, 958, 1474, 0, 0, 888, + 0, 57, 66, 68, 1355, 61, 1355, 0, 894, 0, + 0, -2, -2, 895, 901, 902, 903, 904, 905, 54, + 2039, 55, 0, 74, 0, 48, 0, 0, 1396, 0, + 1399, 0, 0, 0, 371, 1403, 0, 0, 1348, 1349, + 1352, 0, 909, 1829, 913, 0, 915, 916, 0, 0, + 100, 0, 974, 0, 0, 0, 111, 0, 113, 114, + 0, 0, 0, 382, 1457, 1458, 1459, -2, 405, 0, + 382, 366, 305, 306, 307, 357, 309, 357, 357, 357, + 357, 371, 371, 371, 371, 340, 341, 342, 343, 344, + 0, 0, 326, 357, 357, 357, 357, 347, 348, 349, + 350, 351, 352, 353, 354, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 359, 359, 359, 359, 359, 363, + 363, 0, 42, 0, 386, 0, 1352, 0, 0, 1386, + 1466, 1476, 0, 0, 0, 1466, 132, 0, 0, 0, + 573, 611, 524, 561, 574, 0, 527, 528, -2, 0, + 0, 509, 0, 511, 0, 406, 0, -2, 0, 416, + 0, 412, 416, 413, 416, 404, 417, 551, 552, 553, + 0, 555, 556, 641, 944, 0, 0, 0, 0, 0, + 647, 648, 649, 0, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 562, 563, 564, 565, 566, 567, + 568, 569, 0, 0, 0, 0, 511, 0, 558, 0, + 0, 462, 463, 464, 0, 0, 467, 468, 469, 470, + 0, 0, 473, 474, 475, 961, 962, 476, 477, 502, + 503, 504, 478, 479, 480, 481, 482, 483, 484, 496, + 497, 498, 499, 500, 501, 485, 486, 487, 488, 489, + 490, 493, 0, 147, 1377, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1464, 0, 0, 0, 0, 891, 976, 1487, 1488, 777, + 778, 0, 410, 411, 776, 776, 722, 763, 0, 776, + 726, 764, 727, 729, 728, 730, 743, 744, 776, 733, + 774, 775, 734, 735, 736, 737, 738, 739, 740, 759, + 745, 746, 747, 780, 0, 784, 785, 760, 761, 0, + 0, 800, 801, 0, 808, 832, 830, 831, 833, 825, + 826, 827, 828, 0, 834, 0, 0, 850, 96, 855, + 856, 857, 858, 870, 863, 1124, 992, 993, 994, 0, + 996, 999, 0, 1108, 1110, 1001, 1003, 1119, 1120, 1121, + 0, 0, 0, 0, 0, 1007, 1011, 1016, 1017, 1018, + 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1033, + 1296, 1297, 1298, 1052, 298, 299, 0, 1053, 0, 0, + 0, 0, 0, 0, 0, 1123, 1054, 0, 906, 0, + 0, 1326, 1323, 0, 0, 0, 1281, 1283, 0, 0, + 0, 0, 883, 884, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, + 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, + 1277, 1278, 1279, 1299, 0, 0, 0, 0, 0, 1319, + 0, 1059, 1060, 1061, 0, 0, 0, 0, 0, 0, + 1179, 0, 0, 0, 0, 1475, 0, 142, 143, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1223, 1224, 1225, 1226, 39, + 0, 0, 0, 893, 1330, 0, -2, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1248, 0, 0, 0, 0, 0, 0, 1447, 0, + 0, 840, 841, 843, 0, 978, 0, 959, 0, 0, + 846, 0, 887, 0, 890, 60, 62, 899, 900, 0, + 917, 896, 56, 51, 0, 0, 936, 1397, 1400, 1401, + 371, 1423, 0, 380, 380, 377, 1358, 1359, 0, 1351, + 1353, 1354, 79, 914, 910, 0, 990, 0, 0, 973, + 0, 920, 922, 923, 924, 956, 0, 927, 928, 0, + 0, 0, 0, 0, 98, 975, 104, 0, 112, 0, + 0, 117, 118, 105, 106, 107, 108, 0, 600, -2, + 457, 179, 181, 182, 183, 174, -2, 369, 367, 368, + 308, 371, 371, 334, 335, 336, 337, 338, 339, 0, + 0, 327, 328, 329, 330, 319, 0, 320, 321, 322, + 361, 0, 323, 324, 0, 325, 424, 0, 1360, 387, + 388, 390, 398, 0, 393, 394, 0, 398, 398, 0, + 419, 420, 0, 1352, 1377, 0, 0, 0, 1477, 1476, + 1476, 1476, 0, 167, 168, 169, 170, 171, 172, 636, + 0, 0, 612, 634, 635, 165, 0, 0, 175, 513, + 512, 0, 668, 0, 422, 0, 0, 416, 416, 401, + 402, 554, 0, 0, 643, 644, 645, 646, 0, 0, + 0, 540, 451, 0, 541, 542, 511, 513, 0, 0, + 382, 465, 466, 471, 472, 491, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 587, 588, 589, + 592, 594, 515, 598, 591, 593, 595, 515, 599, 1374, + 1375, 1376, 0, 0, 706, 0, 0, 448, 94, 1465, + 711, 773, 732, 765, 773, 724, 731, 753, 798, 799, + 804, 812, 813, 814, 815, 816, 854, 0, 0, 0, + 0, 862, 0, 0, 1000, 1109, 1111, 1004, 0, 1008, + 1012, 0, 0, 0, 1058, 1056, 1330, 0, 0, 0, + 1105, 0, 0, 1127, 1128, 0, 0, 0, 1324, 0, + 0, 1134, 0, 1284, 1285, 1142, 0, 0, 0, 0, + 0, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, + 1157, 1346, 0, 0, 0, 0, 0, 1163, 1164, 1165, + 1166, 1167, 0, 1169, 0, 1170, 0, 0, 0, 0, + 1177, 1178, 1180, 0, 0, 1183, 1184, 0, 0, 1185, + 0, 0, 0, 1189, 0, 0, 0, 0, 1198, 1199, + 1200, 1201, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1212, 1213, 0, 1087, 0, 0, 1087, 0, + 1125, 892, 0, 1286, 1287, 1288, 1289, 1290, 0, 0, + 0, 0, 0, 0, 1246, 1247, 1249, 0, 0, 1252, + 0, 1254, 0, 1448, 839, 842, 844, 930, 979, 980, + 0, 0, 0, 0, 960, 1473, 885, 886, 889, 938, + 0, 1334, 0, 0, 917, 990, 918, 0, 897, 53, + 933, 0, 1405, 1404, 1417, 1430, 380, 380, 374, 375, + 381, 376, 378, 379, 1350, 0, 1355, 0, 1441, 0, + 0, 1433, 0, 0, 0, 0, 0, 0, 0, 0, + 963, 0, 0, 966, 0, 0, 0, 0, 957, 928, + 0, 929, 0, -2, 0, 0, 92, 93, 0, 0, + 0, 115, 116, 0, 0, 122, 383, 384, 156, 165, + 459, 180, 432, 0, 0, 304, 370, 331, 332, 333, + 0, 355, 0, 0, 0, 0, 453, 128, 1364, 1363, + 398, 398, 389, 0, 392, 0, 0, 0, 1478, 358, + 421, 0, 146, 0, 0, 0, 0, 0, 152, 606, + 0, 0, 613, 0, 0, 0, 522, 0, 533, 534, + 0, 640, -2, 702, 386, 0, 400, 403, 945, 0, + 0, 535, 0, 538, 539, 452, 513, 544, 545, 559, + 546, 494, 495, 492, 0, 0, 1387, 1388, 1393, 1391, + 1392, 133, 580, 582, 581, 585, 0, 0, 0, 517, + 0, 517, 578, 0, 448, 1360, 0, 710, 449, 450, + 776, 776, 849, 97, 0, 852, 0, 0, 0, 0, + 1005, 1009, 1291, 1317, 357, 357, 1304, 357, 363, 1307, + 357, 1309, 357, 1312, 357, 1315, 1316, 0, 0, 0, + 907, 0, 0, 1133, 1327, 0, 0, 1143, 1144, 1145, + 1146, 1147, 1321, 0, 0, 0, 1162, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 144, 145, 0, + 0, 0, 0, 0, 0, 1257, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1082, 1086, 0, 1088, + 1089, 0, 0, 1215, 0, 0, 1227, 0, 1331, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 981, + 986, 986, 986, 0, 0, 0, 1460, 1461, 1335, 1336, + 990, 1337, 919, 898, 937, 1423, 0, 1416, 0, -2, + 1425, 0, 0, 0, 1431, 372, 373, 911, 80, 991, + 83, 0, 1441, 1450, 0, 1432, 1443, 1445, 0, 0, + 0, 1437, 0, 990, 921, 952, 954, 0, 949, 964, + 965, 967, 0, 969, 0, 971, 972, 932, 926, 0, + 100, 0, 990, 990, 99, 0, 977, 119, 120, 121, + 458, 184, 189, 0, 0, 0, 194, 0, 196, 0, + 0, 0, 201, 202, 398, 398, 433, 0, 301, 303, + 0, 0, 187, 371, 0, 371, 0, 362, 364, 0, + 434, 454, 1361, 1362, 0, 0, 391, 395, 396, 397, + 0, 1467, 148, 0, 0, 0, 609, 0, 637, 0, + 0, 0, 0, 0, 0, 176, 514, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 0, 398, 0, 0, + 0, 398, 398, 398, 0, 694, 385, 0, 0, 665, + 662, 536, 0, 225, 226, 228, 0, 0, 0, 0, + 0, 543, 932, 1378, 1379, 1380, 0, 1390, 1394, 136, + 0, 0, 0, 0, 590, 596, 0, 516, 597, 707, + 708, 709, 95, 717, 723, 851, 871, 998, 1006, 1010, + 0, 0, 0, 0, 1318, 1302, 371, 1305, 1306, 1308, + 1310, 1311, 1313, 1314, 1046, 1047, 1051, 0, 1130, 0, + 1132, 1325, 0, 1355, 0, 0, 0, 1161, 0, 0, + 0, 1172, 1171, 1173, 0, 1175, 1176, 1181, 1182, 1186, + 0, 1188, 1190, 1191, 0, 0, 0, 1202, 1203, 1204, + 1205, 1206, 1207, 1208, 1209, 1210, 1211, 0, 1080, 1083, + 1214, 1090, 1091, 1096, 1217, 0, 0, 1126, 1229, 0, + 1234, 0, 0, 1240, 0, 1244, 0, 1250, 1251, 1253, + 1255, 0, 0, 0, 0, 0, 958, 939, 64, 1337, + 1339, 0, 1410, 1408, 1408, 1418, 1419, 0, 0, 1426, + 0, 0, 0, 0, 84, 0, 0, 0, 1446, 0, + 0, 0, 0, 101, 1346, 946, 953, 0, 0, 947, + 0, 948, 968, 970, 925, 0, 990, 990, 90, 91, + 0, 190, 0, 192, 218, 219, 0, 195, 197, 198, + 199, 205, 206, 207, 200, 0, 0, 300, 302, 0, + 0, 345, 356, 346, 0, 0, 1365, 1366, 1367, 1368, + 1369, 1370, 1371, 1372, 932, 149, 150, 151, 601, 0, + 611, 0, 934, 0, 604, 0, 525, 0, 0, 0, + 398, 398, 398, 0, 0, 0, 0, 679, 0, 0, + 642, 0, 650, 0, 0, 0, 229, 230, 0, 1389, + 579, 0, 134, 135, 0, 0, 584, 518, 519, 1044, + 0, 0, 0, 1045, 1303, 0, 0, 0, 0, 1322, + 0, 0, 0, 0, 1168, 0, 0, 0, 1194, 0, + 0, 0, 631, 632, 0, 1258, 1085, 1346, 0, 1087, + 1097, 1098, 0, 1087, 1228, 0, 0, 0, 0, 0, + 0, 0, 987, 0, 0, 0, 0, 978, 1339, 1344, + 0, 0, 1413, 0, 1406, 1409, 1407, 1420, 0, 0, + 1427, 0, 1429, 0, 1451, 1452, 1444, 0, 1436, 1439, + 1435, 1438, 1355, 950, 0, 955, 0, 1346, 89, 0, + 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 203, 204, 0, 0, 360, 365, 0, 0, 0, + 602, 0, 935, 614, 605, 0, 692, 0, 696, 0, + 0, 0, 699, 700, 701, 678, 0, 682, 426, 666, + 663, 664, 537, 0, 137, 138, 0, 0, 0, 1292, + 0, 1295, 1129, 1131, 0, 1158, 1159, 1160, 1300, 1301, + 1174, 1187, 1192, 0, 1195, 0, 0, 1196, 0, 633, + 1076, 0, 0, 1094, 1095, 0, 1230, 0, 1235, 1236, + 0, 1241, 0, 1245, 1256, 0, 983, 940, 941, 988, + 989, 0, 0, 931, 1344, 82, 1345, 1342, 0, 1340, + 1338, 1402, 0, 1411, 1412, 1421, 1422, 1428, 0, 1434, + 0, 87, 0, 0, 0, 1355, 191, 0, 210, 0, + 610, 0, 613, 603, 690, 691, 0, 703, 695, 697, + 698, 680, -2, 1381, 0, 0, 0, 586, 1293, 0, + 0, 1197, 0, 629, 630, 1084, 1077, 0, 1062, 1063, + 1081, 1216, 1218, 0, 0, 0, 0, 982, 984, 985, + 81, 0, 1341, 1102, 0, 1414, 1415, 1442, 1440, 951, + 958, 0, 88, 439, 432, 1381, 0, 0, 0, 683, + 684, 685, 686, 687, 688, 689, 576, 1383, 139, 140, + 0, 506, 507, 508, 133, 0, 1135, 1193, 1078, 0, + 0, 0, 0, 1074, 1075, 0, 1231, 0, 1237, 0, + 1242, 0, 942, 943, 1343, 0, 0, 615, 0, 617, + 0, -2, 427, 440, 0, 185, 211, 212, 0, 0, + 215, 216, 217, 208, 209, 129, 0, 0, 704, 0, + 1384, 1385, 0, 136, 0, 0, 1069, 1070, 1071, 1072, + 1073, 0, 0, 0, 1103, 1082, 616, 0, 0, 382, + 0, 626, 428, 429, 0, 435, 436, 437, 438, 213, + 214, 638, 0, 0, 505, 583, 1294, 0, 1232, 0, + 1238, 0, 1243, 0, 618, 619, 627, 0, 430, 0, + 431, 0, 0, 0, 607, 0, 638, 1382, 1079, 0, + 0, 1101, 0, 628, 624, 441, 443, 444, 0, 0, + 442, 639, 608, 1233, 1239, 0, 445, 446, 447, 620, + 621, 622, 623, } var yyTok1 = [...]int{ @@ -19330,336 +19375,376 @@ yydefault: } yyVAL.union = yyLOCAL case 1396: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Lock //line sql.y:6992 { - yyLOCAL = ShareModeLock + yyLOCAL = ForUpdateLockNoWait } yyVAL.union = yyLOCAL case 1397: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL Lock +//line sql.y:6996 + { + yyLOCAL = ForUpdateLockSkipLocked + } + yyVAL.union = yyLOCAL + case 1398: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL Lock +//line sql.y:7000 + { + yyLOCAL = ForShareLock + } + yyVAL.union = yyLOCAL + case 1399: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL Lock +//line sql.y:7004 + { + yyLOCAL = ForShareLockNoWait + } + yyVAL.union = yyLOCAL + case 1400: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL Lock +//line sql.y:7008 + { + yyLOCAL = ForShareLockSkipLocked + } + yyVAL.union = yyLOCAL + case 1401: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL Lock +//line sql.y:7012 + { + yyLOCAL = ShareModeLock + } + yyVAL.union = yyLOCAL + case 1402: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:6998 +//line sql.y:7018 { 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 1398: + case 1403: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7002 +//line sql.y:7022 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1399: + case 1404: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7006 +//line sql.y:7026 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1400: + case 1405: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7011 +//line sql.y:7031 { yyVAL.str = "" } - case 1401: + case 1406: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7015 +//line sql.y:7035 { yyVAL.str = " format csv" + yyDollar[3].str } - case 1402: + case 1407: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7019 +//line sql.y:7039 { yyVAL.str = " format text" + yyDollar[3].str } - case 1403: + case 1408: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7024 +//line sql.y:7044 { yyVAL.str = "" } - case 1404: + case 1409: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7028 +//line sql.y:7048 { yyVAL.str = " header" } - case 1405: + case 1410: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7033 +//line sql.y:7053 { yyVAL.str = "" } - case 1406: + case 1411: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7037 +//line sql.y:7057 { yyVAL.str = " manifest on" } - case 1407: + case 1412: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7041 +//line sql.y:7061 { yyVAL.str = " manifest off" } - case 1408: + case 1413: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7046 +//line sql.y:7066 { yyVAL.str = "" } - case 1409: + case 1414: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7050 +//line sql.y:7070 { yyVAL.str = " overwrite on" } - case 1410: + case 1415: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7054 +//line sql.y:7074 { yyVAL.str = " overwrite off" } - case 1411: + case 1416: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7060 +//line sql.y:7080 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1412: + case 1417: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7065 +//line sql.y:7085 { yyVAL.str = "" } - case 1413: + case 1418: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7069 +//line sql.y:7089 { yyVAL.str = " lines" + yyDollar[2].str } - case 1414: + case 1419: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7075 +//line sql.y:7095 { yyVAL.str = yyDollar[1].str } - case 1415: + case 1420: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7079 +//line sql.y:7099 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1416: + case 1421: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7085 +//line sql.y:7105 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } - case 1417: + case 1422: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7089 +//line sql.y:7109 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1418: + case 1423: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7094 +//line sql.y:7114 { yyVAL.str = "" } - case 1419: + case 1424: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7098 +//line sql.y:7118 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } - case 1420: + case 1425: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7104 +//line sql.y:7124 { yyVAL.str = yyDollar[1].str } - case 1421: + case 1426: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7108 +//line sql.y:7128 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1422: + case 1427: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7114 +//line sql.y:7134 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1423: + case 1428: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7118 +//line sql.y:7138 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } - case 1424: + case 1429: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7122 +//line sql.y:7142 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } - case 1425: + case 1430: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7127 +//line sql.y:7147 { yyVAL.str = "" } - case 1426: + case 1431: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7131 +//line sql.y:7151 { yyVAL.str = " optionally" } - case 1427: + case 1432: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Insert -//line sql.y:7144 +//line sql.y:7164 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion()} } yyVAL.union = yyLOCAL - case 1428: + case 1433: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7148 +//line sql.y:7168 { yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1429: + case 1434: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7152 +//line sql.y:7172 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion()} } yyVAL.union = yyLOCAL - case 1430: + case 1435: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7156 +//line sql.y:7176 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion()} } yyVAL.union = yyLOCAL - case 1431: + case 1436: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7160 +//line sql.y:7180 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1432: + case 1437: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7166 +//line sql.y:7186 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1433: + case 1438: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7170 +//line sql.y:7190 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1434: + case 1439: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7174 +//line sql.y:7194 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 1435: + case 1440: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7178 +//line sql.y:7198 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) } - case 1436: + case 1441: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7183 +//line sql.y:7203 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1437: + case 1442: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7187 +//line sql.y:7207 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 1438: + case 1443: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7193 +//line sql.y:7213 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL - case 1439: + case 1444: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7197 +//line sql.y:7217 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) } - case 1440: + case 1445: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7203 +//line sql.y:7223 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1441: + case 1446: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7207 +//line sql.y:7227 { yyLOCAL = ValTuple{} } yyVAL.union = yyLOCAL - case 1442: + case 1447: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7213 +//line sql.y:7233 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1443: + case 1448: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7217 +//line sql.y:7237 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1444: + case 1449: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7222 +//line sql.y:7242 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -19668,268 +19753,268 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1445: + case 1450: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7232 +//line sql.y:7252 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 1446: + case 1451: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7236 +//line sql.y:7256 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) } - case 1447: + case 1452: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7242 +//line sql.y:7262 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1449: + case 1454: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7249 +//line sql.y:7269 { yyVAL.str = "charset" } - case 1452: + case 1457: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7259 +//line sql.y:7279 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } yyVAL.union = yyLOCAL - case 1453: + case 1458: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7263 +//line sql.y:7283 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1454: + case 1459: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7267 +//line sql.y:7287 { yyLOCAL = &Default{} } yyVAL.union = yyLOCAL - case 1457: + case 1462: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7276 +//line sql.y:7296 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1458: + case 1463: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7278 +//line sql.y:7298 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1459: + case 1464: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7281 +//line sql.y:7301 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1460: + case 1465: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7283 +//line sql.y:7303 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1461: + case 1466: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7286 +//line sql.y:7306 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1462: + case 1467: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:7288 +//line sql.y:7308 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1463: + case 1468: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:7291 +//line sql.y:7311 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1464: + case 1469: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:7293 +//line sql.y:7313 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1465: + case 1470: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7296 +//line sql.y:7316 { yyVAL.empty = struct{}{} } - case 1466: + case 1471: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7298 +//line sql.y:7318 { yyVAL.empty = struct{}{} } - case 1467: + case 1472: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7300 +//line sql.y:7320 { yyVAL.empty = struct{}{} } - case 1468: + case 1473: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:7304 +//line sql.y:7324 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL - case 1469: + case 1474: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:7309 +//line sql.y:7329 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1470: + case 1475: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:7313 +//line sql.y:7333 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1471: + case 1476: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7318 +//line sql.y:7338 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1472: + case 1477: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7320 +//line sql.y:7340 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 1473: + case 1478: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:7324 +//line sql.y:7344 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL - case 1474: + case 1479: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7330 +//line sql.y:7350 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1475: + case 1480: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7334 +//line sql.y:7354 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 1477: + case 1482: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7341 +//line sql.y:7361 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 1478: + case 1483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7347 +//line sql.y:7367 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1479: + case 1484: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7351 +//line sql.y:7371 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1480: + case 1485: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7357 +//line sql.y:7377 { yyVAL.identifierCS = NewIdentifierCS("") } - case 1481: + case 1486: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7361 +//line sql.y:7381 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 1483: + case 1488: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7368 +//line sql.y:7388 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 2033: + case 2038: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7944 +//line sql.y:7964 { } - case 2034: + case 2039: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7949 +//line sql.y:7969 { } - case 2035: + case 2040: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7953 +//line sql.y:7973 { skipToEnd(yylex) } - case 2036: + case 2041: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7958 +//line sql.y:7978 { skipToEnd(yylex) } - case 2037: + case 2042: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7962 +//line sql.y:7982 { skipToEnd(yylex) } - case 2038: + case 2043: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7966 +//line sql.y:7986 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index f77a92a4443..6d8f84c6c59 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -6988,6 +6988,26 @@ FOR UPDATE { $$ = ForUpdateLock } +| FOR UPDATE NOWAIT + { + $$ = ForUpdateLockNoWait + } +| FOR UPDATE SKIP LOCKED + { + $$ = ForUpdateLockSkipLocked + } +| FOR SHARE + { + $$ = ForShareLock + } +| FOR SHARE NOWAIT + { + $$ = ForShareLockNoWait + } +| FOR SHARE SKIP LOCKED + { + $$ = ForShareLockSkipLocked + } | LOCK IN SHARE MODE { $$ = ShareModeLock diff --git a/go/vt/sqlparser/testdata/union_cases.txt b/go/vt/sqlparser/testdata/union_cases.txt index 0f74e8a3cda..d9e6c0e2241 100644 --- a/go/vt/sqlparser/testdata/union_cases.txt +++ b/go/vt/sqlparser/testdata/union_cases.txt @@ -1004,7 +1004,7 @@ INPUT SELECT 1 FOR SHARE UNION SELECT 2; END ERROR -syntax error at position 19 near 'SHARE' +syntax error at position 25 near 'UNION' END INPUT SELECT ST_AsText(ST_Union(shore, boundary)) FROM lakes, named_places WHERE lakes.name = 'Blue Lake' AND named_places.name = 'Goose Island'; From 95c3a5d3bc111a51b27fc15de754f8a548c8ec68 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 07:50:08 +0200 Subject: [PATCH 202/233] [release-16.0] Rewrite `USING` to `ON` condition for joins (#13931) (#13940) Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Co-authored-by: Andres Taylor Co-authored-by: Florent Poinsard --- go/test/endtoend/cluster/cluster_process.go | 16 +- go/test/endtoend/cluster/vttablet_process.go | 15 +- .../tabletmanager/custom_rule_topo_test.go | 2 +- .../tabletmanager/primary/tablet_test.go | 2 +- .../tabletmanager/tablet_health_test.go | 6 +- .../tablet_security_policy_test.go | 6 +- go/test/endtoend/tabletmanager/tablet_test.go | 4 +- .../endtoend/vtgate/queries/misc/misc_test.go | 8 + go/vt/vterrors/code.go | 2 + go/vt/vterrors/errors_test.go | 2 +- .../planbuilder/testdata/from_cases.json | 22 ++ .../testdata/unsupported_cases.json | 4 +- go/vt/vtgate/semantics/analyzer.go | 5 + go/vt/vtgate/semantics/binder.go | 7 - go/vt/vtgate/semantics/early_rewriter.go | 208 +++++++++++++----- go/vt/vtgate/semantics/early_rewriter_test.go | 23 +- 16 files changed, 247 insertions(+), 85 deletions(-) diff --git a/go/test/endtoend/cluster/cluster_process.go b/go/test/endtoend/cluster/cluster_process.go index b0401f56324..21a21202811 100644 --- a/go/test/endtoend/cluster/cluster_process.go +++ b/go/test/endtoend/cluster/cluster_process.go @@ -327,13 +327,12 @@ func (cluster *LocalProcessCluster) startKeyspace(keyspace Keyspace, shardNames if !cluster.ReusingVTDATAROOT { _ = cluster.VtctlProcess.CreateKeyspace(keyspace.Name) } - var mysqlctlProcessList []*exec.Cmd for _, shardName := range shardNames { shard := &Shard{ Name: shardName, } log.Infof("Starting shard: %v", shardName) - mysqlctlProcessList = []*exec.Cmd{} + var mysqlctlProcessList []*exec.Cmd for i := 0; i < totalTabletsRequired; i++ { // instantiate vttablet object with reserved ports tabletUID := cluster.GetAndReserveTabletUID() @@ -1191,8 +1190,16 @@ func (cluster *LocalProcessCluster) VtprocessInstanceFromVttablet(tablet *Vttabl } // StartVttablet starts a new tablet -func (cluster *LocalProcessCluster) StartVttablet(tablet *Vttablet, servingStatus string, - supportBackup bool, cell string, keyspaceName string, hostname string, shardName string) error { +func (cluster *LocalProcessCluster) StartVttablet( + tablet *Vttablet, + explicitServingStatus bool, + servingStatus string, + supportBackup bool, + cell string, + keyspaceName string, + hostname string, + shardName string, +) error { tablet.VttabletProcess = VttabletProcessInstance( tablet.HTTPPort, tablet.GrpcPort, @@ -1210,6 +1217,7 @@ func (cluster *LocalProcessCluster) StartVttablet(tablet *Vttablet, servingStatu tablet.VttabletProcess.SupportsBackup = supportBackup tablet.VttabletProcess.ServingStatus = servingStatus + tablet.VttabletProcess.ExplicitServingStatus = explicitServingStatus return tablet.VttabletProcess.Setup() } diff --git a/go/test/endtoend/cluster/vttablet_process.go b/go/test/endtoend/cluster/vttablet_process.go index 68dfddb831e..747bdc8fb39 100644 --- a/go/test/endtoend/cluster/vttablet_process.go +++ b/go/test/endtoend/cluster/vttablet_process.go @@ -40,6 +40,8 @@ import ( "vitess.io/vitess/go/vt/log" ) +const vttabletStateTimeout = 30 * time.Second + // VttabletProcess is a generic handle for a running vttablet . // It can be spawned manually type VttabletProcess struct { @@ -67,6 +69,7 @@ type VttabletProcess struct { QueryzURL string StatusDetailsURL string SupportsBackup bool + ExplicitServingStatus bool ServingStatus string DbPassword string DbPort int @@ -75,7 +78,7 @@ type VttabletProcess struct { Charset string ConsolidationsURL string - //Extra Args to be set before starting the vttablet process + // Extra Args to be set before starting the vttablet process ExtraArgs []string proc *exec.Cmd @@ -146,7 +149,15 @@ func (vttablet *VttabletProcess) Setup() (err error) { }() if vttablet.ServingStatus != "" { - if err = vttablet.WaitForTabletStatus(vttablet.ServingStatus); err != nil { + // If the tablet has an explicit serving status we use the serving status + // otherwise we wait for any serving status to show up in the healthcheck. + var servingStatus []string + if vttablet.ExplicitServingStatus { + servingStatus = append(servingStatus, vttablet.ServingStatus) + } else { + servingStatus = append(servingStatus, "SERVING", "NOT_SERVING") + } + if err = vttablet.WaitForTabletStatuses(servingStatus); err != nil { errFileContent, _ := os.ReadFile(fname) if errFileContent != nil { log.Infof("vttablet error:\n%s\n", string(errFileContent)) diff --git a/go/test/endtoend/tabletmanager/custom_rule_topo_test.go b/go/test/endtoend/tabletmanager/custom_rule_topo_test.go index 0d68c7a2521..537633e175a 100644 --- a/go/test/endtoend/tabletmanager/custom_rule_topo_test.go +++ b/go/test/endtoend/tabletmanager/custom_rule_topo_test.go @@ -71,7 +71,7 @@ func TestTopoCustomRule(t *testing.T) { require.Nil(t, err, "error should be Nil") // Start Vttablet - err = clusterInstance.StartVttablet(rTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) + err = clusterInstance.StartVttablet(rTablet, false, "SERVING", false, cell, keyspaceName, hostname, shardName) require.Nil(t, err, "error should be Nil") err = clusterInstance.VtctlclientProcess.ExecuteCommand("Validate") diff --git a/go/test/endtoend/tabletmanager/primary/tablet_test.go b/go/test/endtoend/tabletmanager/primary/tablet_test.go index 3db692694b5..28b238883ab 100644 --- a/go/test/endtoend/tabletmanager/primary/tablet_test.go +++ b/go/test/endtoend/tabletmanager/primary/tablet_test.go @@ -189,7 +189,7 @@ func TestPrimaryRestartSetsTERTimestamp(t *testing.T) { require.NoError(t, err) // Start Vttablet - err = clusterInstance.StartVttablet(&replicaTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) + err = clusterInstance.StartVttablet(&replicaTablet, false, "SERVING", false, cell, keyspaceName, hostname, shardName) require.NoError(t, err) // Make sure that the TER did not change diff --git a/go/test/endtoend/tabletmanager/tablet_health_test.go b/go/test/endtoend/tabletmanager/tablet_health_test.go index 19359406607..5e5eaebca84 100644 --- a/go/test/endtoend/tabletmanager/tablet_health_test.go +++ b/go/test/endtoend/tabletmanager/tablet_health_test.go @@ -73,7 +73,7 @@ func TestTabletReshuffle(t *testing.T) { // SupportsBackup=False prevents vttablet from trying to restore // Start vttablet process - err = clusterInstance.StartVttablet(rTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) + err = clusterInstance.StartVttablet(rTablet, false, "SERVING", false, cell, keyspaceName, hostname, shardName) require.NoError(t, err) sql := "select value from t1" @@ -107,7 +107,7 @@ func TestHealthCheck(t *testing.T) { utils.Exec(t, replicaConn, fmt.Sprintf("create database vt_%s", keyspaceName)) // start vttablet process, should be in SERVING state as we already have a primary - err = clusterInstance.StartVttablet(rTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) + err = clusterInstance.StartVttablet(rTablet, true, "SERVING", false, cell, keyspaceName, hostname, shardName) require.NoError(t, err) conn, err := mysql.Connect(ctx, &primaryTabletParams) @@ -248,7 +248,7 @@ func TestHealthCheckDrainedStateDoesNotShutdownQueryService(t *testing.T) { // - the second tablet will be set to 'drained' and we expect that // - the query service won't be shutdown - //Wait if tablet is not in service state + // Wait if tablet is not in service state defer cluster.PanicHandler(t) err := rdonlyTablet.VttabletProcess.WaitForTabletStatus("SERVING") require.NoError(t, err) diff --git a/go/test/endtoend/tabletmanager/tablet_security_policy_test.go b/go/test/endtoend/tabletmanager/tablet_security_policy_test.go index a2e1e8bd987..e7aae5ef08c 100644 --- a/go/test/endtoend/tabletmanager/tablet_security_policy_test.go +++ b/go/test/endtoend/tabletmanager/tablet_security_policy_test.go @@ -39,7 +39,7 @@ func TestFallbackSecurityPolicy(t *testing.T) { // Requesting an unregistered security_policy should fallback to deny-all. clusterInstance.VtTabletExtraArgs = []string{"--security_policy", "bogus"} - err = clusterInstance.StartVttablet(mTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) + err = clusterInstance.StartVttablet(mTablet, false, "SERVING", false, cell, keyspaceName, hostname, shardName) require.NoError(t, err) // It should deny ADMIN role. @@ -94,7 +94,7 @@ func TestDenyAllSecurityPolicy(t *testing.T) { // Requesting a deny-all security_policy. clusterInstance.VtTabletExtraArgs = []string{"--security_policy", "deny-all"} - err = clusterInstance.StartVttablet(mTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) + err = clusterInstance.StartVttablet(mTablet, false, "SERVING", false, cell, keyspaceName, hostname, shardName) require.NoError(t, err) // It should deny ADMIN role. @@ -126,7 +126,7 @@ func TestReadOnlySecurityPolicy(t *testing.T) { // Requesting a read-only security_policy. clusterInstance.VtTabletExtraArgs = []string{"--security_policy", "read-only"} - err = clusterInstance.StartVttablet(mTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) + err = clusterInstance.StartVttablet(mTablet, false, "SERVING", false, cell, keyspaceName, hostname, shardName) require.NoError(t, err) // It should deny ADMIN role. diff --git a/go/test/endtoend/tabletmanager/tablet_test.go b/go/test/endtoend/tabletmanager/tablet_test.go index 3c597e97981..750379c5468 100644 --- a/go/test/endtoend/tabletmanager/tablet_test.go +++ b/go/test/endtoend/tabletmanager/tablet_test.go @@ -40,7 +40,7 @@ func TestEnsureDB(t *testing.T) { log.Info(fmt.Sprintf("Started vttablet %v", tablet)) // Start vttablet process as replica. It won't be able to serve because there's no db. - err = clusterInstance.StartVttablet(tablet, "NOT_SERVING", false, cell, "dbtest", hostname, "0") + err = clusterInstance.StartVttablet(tablet, false, "NOT_SERVING", false, cell, "dbtest", hostname, "0") require.NoError(t, err) // Make it the primary. @@ -73,7 +73,7 @@ func TestResetReplicationParameters(t *testing.T) { log.Info(fmt.Sprintf("Started vttablet %v", tablet)) // Start vttablet process as replica. It won't be able to serve because there's no db. - err = clusterInstance.StartVttablet(tablet, "NOT_SERVING", false, cell, "dbtest", hostname, "0") + err = clusterInstance.StartVttablet(tablet, false, "NOT_SERVING", false, cell, "dbtest", hostname, "0") require.NoError(t, err) // Set a replication source on the tablet and start replication diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index 094ccc040bf..cdd9f97d671 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -185,3 +185,11 @@ func TestBuggyOuterJoin(t *testing.T) { mcmp.Exec("insert into t1(id1, id2) values (1,2), (42,5), (5, 42)") mcmp.Exec("select t1.id1, t2.id1 from t1 left join t1 as t2 on t2.id1 = t2.id2") } + +func TestLeftJoinUsingUnsharded(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + utils.Exec(t, mcmp.VtConn, "insert /*vt+ QUERY_TIMEOUT_MS=1000 */ into uks.unsharded(id1) values (1),(2),(3),(4),(5)") + utils.Exec(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from uks.unsharded as A left join uks.unsharded as B using(id1)") +} diff --git a/go/vt/vterrors/code.go b/go/vt/vterrors/code.go index 50238c38eee..831c45d1f95 100644 --- a/go/vt/vterrors/code.go +++ b/go/vt/vterrors/code.go @@ -68,6 +68,7 @@ var ( VT09009 = errorWithoutState("VT09009", vtrpcpb.Code_FAILED_PRECONDITION, "stream is supported only for primary tablet type, current type: %v", "Stream is only supported for primary tablets, please use a stream on those tablets.") VT09010 = errorWithoutState("VT09010", vtrpcpb.Code_FAILED_PRECONDITION, "SHOW VITESS_THROTTLER STATUS works only on primary tablet", "SHOW VITESS_THROTTLER STATUS works only on primary tablet.") VT09013 = errorWithoutState("VT09013", vtrpcpb.Code_FAILED_PRECONDITION, "semi-sync plugins are not loaded", "Durability policy wants Vitess to use semi-sync, but the MySQL instances don't have the semi-sync plugin loaded.") + VT09015 = errorWithoutState("VT09015", vtrpcpb.Code_FAILED_PRECONDITION, "schema tracking required", "This query cannot be planned without more information on the SQL schema. Please turn on schema tracking or add authoritative columns information to your VSchema.") VT10001 = errorWithoutState("VT10001", vtrpcpb.Code_ABORTED, "foreign key constraints are not allowed", "Foreign key constraints are not allowed, see https://vitess.io/blog/2021-06-15-online-ddl-why-no-fk/.") @@ -125,6 +126,7 @@ var ( VT09009, VT09010, VT09013, + VT09015, VT10001, VT12001, VT13001, diff --git a/go/vt/vterrors/errors_test.go b/go/vt/vterrors/errors_test.go index c115fb41686..5ecd97fbd00 100644 --- a/go/vt/vterrors/errors_test.go +++ b/go/vt/vterrors/errors_test.go @@ -269,7 +269,7 @@ func TestStackFormat(t *testing.T) { // but the change in errors#27 made them incomparable. Assert that // various kinds of errors have a functional equality operator, even // if the result of that equality is always false. -func TestErrorEquality(t *testing.T) { +func TestErrorEquality(_ *testing.T) { vals := []error{ nil, io.EOF, diff --git a/go/vt/vtgate/planbuilder/testdata/from_cases.json b/go/vt/vtgate/planbuilder/testdata/from_cases.json index cfc673ad3af..14b435a1a46 100644 --- a/go/vt/vtgate/planbuilder/testdata/from_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/from_cases.json @@ -6500,6 +6500,28 @@ ] } }, + { + "comment": "left join with using has to be transformed into inner join with on condition", + "query": "SELECT * FROM unsharded_authoritative as A LEFT JOIN unsharded_authoritative as B USING(col1)", + "plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM unsharded_authoritative as A LEFT JOIN unsharded_authoritative as B USING(col1)", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select A.col1 as col1, A.col2 as col2, B.col2 as col2 from unsharded_authoritative as A left join unsharded_authoritative as B on A.col1 = B.col1 where 1 != 1", + "Query": "select A.col1 as col1, A.col2 as col2, B.col2 as col2 from unsharded_authoritative as A left join unsharded_authoritative as B on A.col1 = B.col1", + "Table": "unsharded_authoritative" + }, + "TablesUsed": [ + "main.unsharded_authoritative" + ] + } + }, { "comment": "join query using table with muticolumn vindex", "query": "select 1 from multicol_tbl m1 join multicol_tbl m2 on m1.cola = m2.cola", diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json index 5a2c92451d4..d2ff7278e71 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json @@ -45,13 +45,13 @@ "comment": "join with USING construct", "query": "select * from user join user_extra using(id)", "v3-plan": "VT12001: unsupported: JOIN with USING(column_list) clause for complex queries", - "gen4-plan": "can't handle JOIN USING without authoritative tables" + "gen4-plan": "VT09015: schema tracking required" }, { "comment": "join with USING construct with 3 tables", "query": "select user.id from user join user_extra using(id) join music using(id2)", "v3-plan": "VT12001: unsupported: JOIN with USING(column_list) clause for complex queries", - "gen4-plan": "can't handle JOIN USING without authoritative tables" + "gen4-plan": "VT09015: schema tracking required" }, { "comment": "natural left join", diff --git a/go/vt/vtgate/semantics/analyzer.go b/go/vt/vtgate/semantics/analyzer.go index 33edf05b68f..8d80e2a6ed2 100644 --- a/go/vt/vtgate/semantics/analyzer.go +++ b/go/vt/vtgate/semantics/analyzer.go @@ -172,6 +172,11 @@ func (a *analyzer) analyzeUp(cursor *sqlparser.Cursor) bool { return false } + if err := a.rewriter.up(cursor); err != nil { + a.setError(err) + return true + } + a.leaveProjection(cursor) return a.shouldContinue() } diff --git a/go/vt/vtgate/semantics/binder.go b/go/vt/vtgate/semantics/binder.go index 2a1b8c2c0ac..e60a4aab11a 100644 --- a/go/vt/vtgate/semantics/binder.go +++ b/go/vt/vtgate/semantics/binder.go @@ -81,13 +81,6 @@ func (b *binder) up(cursor *sqlparser.Cursor) error { } currScope.joinUsing[ident.Lowered()] = deps.direct } - if len(node.Using) > 0 { - err := rewriteJoinUsing(currScope, node.Using, b.org) - if err != nil { - return err - } - node.Using = nil - } case *sqlparser.ColName: currentScope := b.scoper.currentScope() deps, err := b.resolveColumn(node, currentScope, false) diff --git a/go/vt/vtgate/semantics/early_rewriter.go b/go/vt/vtgate/semantics/early_rewriter.go index 4071cfe3837..0a524807ff0 100644 --- a/go/vt/vtgate/semantics/early_rewriter.go +++ b/go/vt/vtgate/semantics/early_rewriter.go @@ -17,8 +17,8 @@ limitations under the License. package semantics import ( + "fmt" "strconv" - "strings" "vitess.io/vitess/go/vt/vtgate/evalengine" @@ -108,6 +108,33 @@ func (r *earlyRewriter) down(cursor *sqlparser.Cursor) error { return nil } +func (r *earlyRewriter) up(cursor *sqlparser.Cursor) error { + // this rewriting is done in the `up` phase, because we need the scope to have been + // filled in with the available tables + node, ok := cursor.Node().(*sqlparser.JoinTableExpr) + if !ok || len(node.Condition.Using) == 0 { + return nil + } + + err := rewriteJoinUsing(r.binder, node) + if err != nil { + return err + } + + // since the binder has already been over the join, we need to invoke it again so it + // can bind columns to the right tables + sqlparser.Rewrite(node.Condition.On, nil, func(cursor *sqlparser.Cursor) bool { + innerErr := r.binder.up(cursor) + if innerErr == nil { + return true + } + + err = innerErr + return false + }) + return err +} + func (r *earlyRewriter) expandStar(cursor *sqlparser.Cursor, node sqlparser.SelectExprs) error { currentScope := r.scoper.currentScope() var selExprs sqlparser.SelectExprs @@ -279,67 +306,144 @@ func rewriteOrFalse(orExpr sqlparser.OrExpr) sqlparser.Expr { return nil } -func rewriteJoinUsing( - current *scope, - using sqlparser.Columns, - org originable, -) error { - joinUsing := current.prepareUsingMap() - predicates := make([]sqlparser.Expr, 0, len(using)) - for _, column := range using { - var foundTables []sqlparser.TableName - for _, tbl := range current.tables { - if !tbl.authoritative() { - return vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "can't handle JOIN USING without authoritative tables") - } +// rewriteJoinUsing rewrites SQL JOINs that use the USING clause to their equivalent +// JOINs with the ON condition. This function finds all the tables that have the +// specified columns in the USING clause, constructs an equality predicate for +// each pair of tables, and adds the resulting predicates to the WHERE clause +// of the outermost SELECT statement. +// +// For example, given the query: +// +// SELECT * FROM t1 JOIN t2 USING (col1, col2) +// +// The rewriteJoinUsing function will rewrite the query to: +// +// SELECT * FROM t1 JOIN t2 ON (t1.col1 = t2.col1 AND t1.col2 = t2.col2) +// +// This function returns an error if it encounters a non-authoritative table or +// if it cannot find a SELECT statement to add the WHERE predicate to. +func rewriteJoinUsing(b *binder, join *sqlparser.JoinTableExpr) error { + predicates, err := buildJoinPredicates(b, join) + if err != nil { + return err + } + if len(predicates) > 0 { + join.Condition.On = sqlparser.AndExpressions(predicates...) + join.Condition.Using = nil + } + return nil +} - currTable := tbl.getTableSet(org) - usingCols := joinUsing[currTable] - if usingCols == nil { - usingCols = map[string]TableSet{} - } - for _, col := range tbl.getColumns() { - _, found := usingCols[strings.ToLower(col.Name)] - if found { - tblName, err := tbl.Name() - if err != nil { - return err - } +// buildJoinPredicates constructs the join predicates for a given set of USING columns. +// It returns a slice of sqlparser.Expr, each representing a join predicate for the given columns. +func buildJoinPredicates(b *binder, join *sqlparser.JoinTableExpr) ([]sqlparser.Expr, error) { + var predicates []sqlparser.Expr - foundTables = append(foundTables, tblName) - break // no need to look at other columns in this table - } + for _, column := range join.Condition.Using { + foundTables, err := findTablesWithColumn(b, join, column) + if err != nil { + return nil, err + } + + predicates = append(predicates, createComparisonPredicates(column, foundTables)...) + } + + return predicates, nil +} + +func findOnlyOneTableInfoThatHasColumn(b *binder, tbl sqlparser.TableExpr, column sqlparser.IdentifierCI) ([]TableInfo, error) { + switch tbl := tbl.(type) { + case *sqlparser.AliasedTableExpr: + ts := b.tc.tableSetFor(tbl) + tblInfo := b.tc.Tables[ts.TableOffset()] + for _, info := range tblInfo.getColumns() { + if column.EqualString(info.Name) { + return []TableInfo{tblInfo}, nil } } - for i, lft := range foundTables { - for j := i + 1; j < len(foundTables); j++ { - rgt := foundTables[j] - predicates = append(predicates, &sqlparser.ComparisonExpr{ - Operator: sqlparser.EqualOp, - Left: sqlparser.NewColNameWithQualifier(column.String(), lft), - Right: sqlparser.NewColNameWithQualifier(column.String(), rgt), - }) + return nil, nil + case *sqlparser.JoinTableExpr: + tblInfoR, err := findOnlyOneTableInfoThatHasColumn(b, tbl.RightExpr, column) + if err != nil { + return nil, err + } + tblInfoL, err := findOnlyOneTableInfoThatHasColumn(b, tbl.LeftExpr, column) + if err != nil { + return nil, err + } + + return append(tblInfoL, tblInfoR...), nil + case *sqlparser.ParenTableExpr: + var tblInfo []TableInfo + for _, parenTable := range tbl.Exprs { + newTblInfo, err := findOnlyOneTableInfoThatHasColumn(b, parenTable, column) + if err != nil { + return nil, err + } + if tblInfo != nil && newTblInfo != nil { + return nil, vterrors.VT03021(column.String()) + } + if newTblInfo != nil { + tblInfo = newTblInfo } } + return tblInfo, nil + default: + panic(fmt.Sprintf("unsupported TableExpr type in JOIN: %T", tbl)) } +} - // now, we go up the scope until we find a SELECT with a where clause we can add this predicate to - for current != nil { - sel, found := current.stmt.(*sqlparser.Select) - if found { - if sel.Where == nil { - sel.Where = &sqlparser.Where{ - Type: sqlparser.WhereClause, - Expr: sqlparser.AndExpressions(predicates...), - } - } else { - sel.Where.Expr = sqlparser.AndExpressions(append(predicates, sel.Where.Expr)...) - } - return nil +// findTablesWithColumn finds the tables with the specified column in the current scope. +func findTablesWithColumn(b *binder, join *sqlparser.JoinTableExpr, column sqlparser.IdentifierCI) ([]sqlparser.TableName, error) { + leftTableInfo, err := findOnlyOneTableInfoThatHasColumn(b, join.LeftExpr, column) + if err != nil { + return nil, err + } + + rightTableInfo, err := findOnlyOneTableInfoThatHasColumn(b, join.RightExpr, column) + if err != nil { + return nil, err + } + + if leftTableInfo == nil || rightTableInfo == nil { + return nil, ShardedError{Inner: vterrors.VT09015()} + } + var tableNames []sqlparser.TableName + for _, info := range leftTableInfo { + nm, err := info.Name() + if err != nil { + return nil, err + } + tableNames = append(tableNames, nm) + } + for _, info := range rightTableInfo { + nm, err := info.Name() + if err != nil { + return nil, err + } + tableNames = append(tableNames, nm) + } + return tableNames, nil +} + +// createComparisonPredicates creates a list of comparison predicates between the given column and foundTables. +func createComparisonPredicates(column sqlparser.IdentifierCI, foundTables []sqlparser.TableName) []sqlparser.Expr { + var predicates []sqlparser.Expr + for i, lft := range foundTables { + for j := i + 1; j < len(foundTables); j++ { + rgt := foundTables[j] + predicates = append(predicates, createComparisonBetween(column, lft, rgt)) } - current = current.parent } - return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "did not find WHERE clause") + return predicates +} + +func createComparisonBetween(column sqlparser.IdentifierCI, lft, rgt sqlparser.TableName) *sqlparser.ComparisonExpr { + return &sqlparser.ComparisonExpr{ + Operator: sqlparser.EqualOp, + Left: sqlparser.NewColNameWithQualifier(column.String(), lft), + Right: sqlparser.NewColNameWithQualifier(column.String(), rgt), + } } func (r *earlyRewriter) expandTableColumns( diff --git a/go/vt/vtgate/semantics/early_rewriter_test.go b/go/vt/vtgate/semantics/early_rewriter_test.go index 324172ab72e..3819d766100 100644 --- a/go/vt/vtgate/semantics/early_rewriter_test.go +++ b/go/vt/vtgate/semantics/early_rewriter_test.go @@ -143,24 +143,30 @@ func TestExpandStar(t *testing.T) { }, { sql: "select * from t1 join t2 on t1.a = t2.c1", expSQL: "select t1.a as a, t1.b as b, t1.c as c, t2.c1 as c1, t2.c2 as c2 from t1 join t2 on t1.a = t2.c1", + }, { + sql: "select * from t1 left join t2 on t1.a = t2.c1", + expSQL: "select t1.a as a, t1.b as b, t1.c as c, t2.c1 as c1, t2.c2 as c2 from t1 left join t2 on t1.a = t2.c1", + }, { + sql: "select * from t1 right join t2 on t1.a = t2.c1", + expSQL: "select t1.a as a, t1.b as b, t1.c as c, t2.c1 as c1, t2.c2 as c2 from t1 right join t2 on t1.a = t2.c1", }, { sql: "select * from t2 join t4 using (c1)", - expSQL: "select t2.c1 as c1, t2.c2 as c2, t4.c4 as c4 from t2 join t4 where t2.c1 = t4.c1", + expSQL: "select t2.c1 as c1, t2.c2 as c2, t4.c4 as c4 from t2 join t4 on t2.c1 = t4.c1", }, { sql: "select * from t2 join t4 using (c1) join t2 as X using (c1)", - expSQL: "select t2.c1 as c1, t2.c2 as c2, t4.c4 as c4, X.c2 as c2 from t2 join t4 join t2 as X where t2.c1 = t4.c1 and t2.c1 = X.c1 and t4.c1 = X.c1", + expSQL: "select t2.c1 as c1, t2.c2 as c2, t4.c4 as c4, X.c2 as c2 from t2 join t4 on t2.c1 = t4.c1 join t2 as X on t2.c1 = t4.c1 and t2.c1 = X.c1 and t4.c1 = X.c1", }, { sql: "select * from t2 join t4 using (c1), t2 as t2b join t4 as t4b using (c1)", - expSQL: "select t2.c1 as c1, t2.c2 as c2, t4.c4 as c4, t2b.c1 as c1, t2b.c2 as c2, t4b.c4 as c4 from t2 join t4, t2 as t2b join t4 as t4b where t2b.c1 = t4b.c1 and t2.c1 = t4.c1", + expSQL: "select t2.c1 as c1, t2.c2 as c2, t4.c4 as c4, t2b.c1 as c1, t2b.c2 as c2, t4b.c4 as c4 from t2 join t4 on t2.c1 = t4.c1, t2 as t2b join t4 as t4b on t2b.c1 = t4b.c1", }, { sql: "select * from t1 join t5 using (b)", - expSQL: "select t1.b as b, t1.a as a, t1.c as c, t5.a as a from t1 join t5 where t1.b = t5.b", + expSQL: "select t1.b as b, t1.a as a, t1.c as c, t5.a as a from t1 join t5 on t1.b = t5.b", }, { sql: "select * from t1 join t5 using (b) having b = 12", - expSQL: "select t1.b as b, t1.a as a, t1.c as c, t5.a as a from t1 join t5 where t1.b = t5.b having b = 12", + expSQL: "select t1.b as b, t1.a as a, t1.c as c, t5.a as a from t1 join t5 on t1.b = t5.b having b = 12", }, { sql: "select 1 from t1 join t5 using (b) having b = 12", - expSQL: "select 1 from t1 join t5 where t1.b = t5.b having t1.b = 12", + expSQL: "select 1 from t1 join t5 on t1.b = t5.b having t1.b = 12", }, { sql: "select * from (select 12) as t", expSQL: "select t.`12` from (select 12 from dual) as t", @@ -269,13 +275,16 @@ func TestRewriteJoinUsingColumns(t *testing.T) { expErr string }{{ sql: "select 1 from t1 join t2 using (a) where a = 42", - expSQL: "select 1 from t1 join t2 where t1.a = t2.a and t1.a = 42", + expSQL: "select 1 from t1 join t2 on t1.a = t2.a where t1.a = 42", }, { sql: "select 1 from t1 join t2 using (a), t3 where a = 42", expErr: "Column 'a' in field list is ambiguous", }, { sql: "select 1 from t1 join t2 using (a), t1 as b join t3 on (a) where a = 42", expErr: "Column 'a' in field list is ambiguous", + }, { + sql: "select 1 from t1 left join t2 using (a) where a = 42", + expSQL: "select 1 from t1 left join t2 on t1.a = t2.a where t1.a = 42", }} for _, tcase := range tcases { t.Run(tcase.sql, func(t *testing.T) { From 745ed3f46f3cc9a52b6d99e0a76682c92c004fa7 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Wed, 11 Oct 2023 11:57:49 +0300 Subject: [PATCH 203/233] [Release 16.0]: Online DDL: timeouts for all gRPC calls (#14182) (#14191) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/vttablet/onlineddl/executor.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index 071deb99aa9..1a36e71f5d2 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -147,6 +147,7 @@ const ( readyToCompleteHint = "ready_to_complete" databasePoolSize = 3 vreplicationCutOverThreshold = 5 * time.Second + grpcTimeout = 30 * time.Second vreplicationTestSuiteWaitSeconds = 5 ) @@ -721,9 +722,6 @@ func (e *Executor) primaryPosition(ctx context.Context) (pos mysql.Position, err // terminateVReplMigration stops vreplication, then removes the _vt.vreplication entry for the given migration func (e *Executor) terminateVReplMigration(ctx context.Context, uuid string) error { - tmClient := e.tabletManagerClient() - defer tmClient.Close() - tablet, err := e.ts.GetTablet(ctx, e.tabletAlias) if err != nil { return err @@ -870,11 +868,13 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream) er log.Infof("toggling buffering: %t in migration %v", bufferQueries, onlineDDL.UUID) e.toggleBufferTableFunc(bufferingCtx, onlineDDL.Table, bufferQueries) if !bufferQueries { + grpcCtx, cancel := context.WithTimeout(ctx, grpcTimeout) + defer cancel() // called after new table is in place. // unbuffer existing queries: bufferingContextCancel() // force re-read of tables - if err := tmClient.RefreshState(ctx, tablet.Tablet); err != nil { + if err := tmClient.RefreshState(grpcCtx, tablet.Tablet); err != nil { return err } } @@ -3799,7 +3799,10 @@ func (e *Executor) vreplicationExec(ctx context.Context, tablet *topodatapb.Tabl tmClient := e.tabletManagerClient() defer tmClient.Close() - return tmClient.VReplicationExec(ctx, tablet, query) + grpcCtx, cancel := context.WithTimeout(ctx, grpcTimeout) + defer cancel() + + return tmClient.VReplicationExec(grpcCtx, tablet, query) } // reloadSchema issues a ReloadSchema on this tablet @@ -3811,7 +3814,11 @@ func (e *Executor) reloadSchema(ctx context.Context) error { if err != nil { return err } - return tmClient.ReloadSchema(ctx, tablet.Tablet, "") + + grpcCtx, cancel := context.WithTimeout(ctx, grpcTimeout) + defer cancel() + + return tmClient.ReloadSchema(grpcCtx, tablet.Tablet, "") } // deleteVReplicationEntry cleans up a _vt.vreplication entry; this function is called as part of From 774f5ffba084b61923e80c81852a77d41fe169ec Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 10:38:55 -0500 Subject: [PATCH 204/233] [release-16.0] Fix anonymous paths in cobra code-gen (#14185) (#14236) Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- go/cmd/internal/docgen/docgen.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/cmd/internal/docgen/docgen.go b/go/cmd/internal/docgen/docgen.go index 16b237ea15f..eda94cfefb4 100644 --- a/go/cmd/internal/docgen/docgen.go +++ b/go/cmd/internal/docgen/docgen.go @@ -193,8 +193,8 @@ func anonymizeHomedir(file string) (err error) { // We're replacing the stuff inside the square brackets in the example sed // below: - // 's:Paths to search for config files in. (default \[.*\])$:Paths to search for config files in. (default \[$WORKDIR\]):' - sed := exec.Command("sed", "-i", "", "-e", fmt.Sprintf("s:%s:$WORKDIR:i", wd), file) + // 's:Paths to search for config files in. (default \[.*\])$:Paths to search for config files in. (default \[\]):' + sed := exec.Command("sed", "-i", "", "-e", fmt.Sprintf("s:%s::i", wd), file) if out, err := sed.CombinedOutput(); err != nil { return fmt.Errorf("%w: %s", err, out) } From 266b2d8e4bca147cbbe74a3c39f436f4436a8d2c Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Wed, 11 Oct 2023 20:41:38 +0300 Subject: [PATCH 205/233] [release-16.0] Tablet throttler: fix race condition by removing goroutine call (#14179) (#14200) --- go/vt/vttablet/tabletserver/throttle/throttler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/vt/vttablet/tabletserver/throttle/throttler.go b/go/vt/vttablet/tabletserver/throttle/throttler.go index 9b04dd4bb21..55a86a5e683 100644 --- a/go/vt/vttablet/tabletserver/throttle/throttler.go +++ b/go/vt/vttablet/tabletserver/throttle/throttler.go @@ -630,7 +630,7 @@ func (throttler *Throttler) Operate(ctx context.Context) { { // sparse if atomic.LoadInt64(&throttler.isOpen) > 0 { - go throttler.refreshMySQLInventory(ctx) + throttler.refreshMySQLInventory(ctx) } } case probes := <-throttler.mysqlClusterProbesChan: From 239b7b420708159332feda6c8179066d4767f307 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 12:42:14 -0500 Subject: [PATCH 206/233] [release-16.0] Upgrade the Golang version to `go1.20.10` (#14228) Co-authored-by: frouioui Co-authored-by: Florent Poinsard --- .github/workflows/assign_milestone.yml | 2 +- .github/workflows/check_make_vtadmin_authz_testgen.yml | 2 +- .github/workflows/check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr_mysql57.yml | 2 +- .../cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .github/workflows/cluster_endtoend_mysql_server_vault.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_scheduler.yml | 2 +- .../cluster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- ...luster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl.yml | 2 +- .../workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_consul.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_tablegc.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_throttler.yml | 2 +- ...uster_endtoend_tabletmanager_throttler_custom_config.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .../workflows/cluster_endtoend_topo_connection_cache.yml | 2 +- .../cluster_endtoend_vreplication_across_db_versions.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_basic.yml | 2 +- .../workflows/cluster_endtoend_vreplication_cellalias.yml | 2 +- ...ster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .../workflows/cluster_endtoend_vreplication_multicell.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_v2.yml | 2 +- .github/workflows/cluster_endtoend_vstream_failover.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_false.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_true.yml | 2 +- .../cluster_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- ...uster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_general_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_godriver.yml | 2 +- .../workflows/cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .../workflows/cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_reservedconn.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .../workflows/cluster_endtoend_vtgate_schema_tracker.yml | 2 +- .../cluster_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_consul.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_transaction.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_unsharded.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .github/workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 2 +- .github/workflows/docker_test_cluster_10.yml | 2 +- .github/workflows/docker_test_cluster_25.yml | 2 +- .github/workflows/e2e_race.yml | 2 +- .github/workflows/endtoend.yml | 2 +- .github/workflows/local_example.yml | 2 +- .github/workflows/region_example.yml | 2 +- .github/workflows/sonar_analysis.yml | 2 +- .github/workflows/static_checks_etc.yml | 2 +- .github/workflows/unit_race.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- .github/workflows/update_golang_version.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 2 +- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 2 +- .../upgrade_downgrade_test_backups_manual_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries.yml | 2 +- ...de_downgrade_test_query_serving_queries_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_schema.yml | 2 +- ...ade_downgrade_test_query_serving_schema_next_release.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 2 +- docker/lite/Dockerfile.ubi7.mysql80 | 2 +- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 2 +- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 2 +- docker/lite/Dockerfile.ubi8.mysql80 | 2 +- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- test.go | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_docker.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/dockerfile.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 128 files changed, 132 insertions(+), 128 deletions(-) diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index cc81c3fa519..e0db014af02 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index 0e7b5b1e9f3..e1be68021ba 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -48,7 +48,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index e69a5d96d22..d4127e0ae85 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -50,7 +50,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 543fa0b5afc..a3728489b2e 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 b738d5d7005..e42b132ff87 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 08057c45c74..672421c71e6 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 a1e19ee0eef..87782ace706 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 d6ad7779bc1..4236a5b5602 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 8ca63c0c564..8b7e034dab5 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index 9de116120f1..d70a60e248d 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index 3e9bfcb6afe..42c1fdea759 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 180371926e0..e53b2b434bb 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 309a357c444..f2816ad19cb 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 7f2cd0aff37..be9f918d19f 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 0b685ec1e41..93619a8fe33 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 8f5711d3337..75e7dffd7dc 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 9a8d376555a..c7f931c08d6 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 97624be4006..a8c4a8caadf 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 00f92ebded4..9861da48efe 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 c7a1a1be9c9..6fb96d567ff 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 058cf793338..0598a3ac862 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 5dff49290cf..426ab0bb1f8 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 6f4baf5ef14..f509ee0560c 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 b5bdc90f092..20664d82ed4 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 be1ebda7509..c2872e08c89 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 bb7bfd815b1..542879d2f5a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 86f1f383ef9..b446e263911 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 e5399496b42..a2cb365156f 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 bd8bb05b660..db0ea91ca9e 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 b41c6831895..0c298fe398f 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 58bd8ecf50d..f035ac9862e 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 b73c8f62cb9..ee5a056008b 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 29dcdaf2599..50aef792242 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 46c618b1114..21e9a388b10 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 1a78b6cdf3c..f75275d9524 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 563643224cf..20c0b64c666 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 3e6bcfebcbc..a3ca80219a5 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 26ccab72210..09e88978a8d 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 f46ce4f2c89..55f52b3eb01 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 a9efd5ba0ce..dde2333c390 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 661d63d6e3a..ac932e2869b 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 24f42d11ddd..a8bd76ed6df 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 9d7184fa458..871b80c1f03 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 1d8701019c0..7230e4dfe2a 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 6702663bc6c..3e00be60bf3 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 aa1eebd1f24..beff08fdad1 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 ab53f0afd17..6b45de10d12 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index 52b4d7ea35f..eb8e85cfea3 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 7bed6e46422..a1c2790b916 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 e9b715ab3f1..10feebb7f51 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 3c6346c6d70..6aafd74c069 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 7ee89ec48bb..7539cf0d4bf 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 4e44823567f..d307a9d8ea9 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 b6c93eb12b7..e5147006695 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 a2515d2a02a..3141cf310bb 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 31f2ee5b616..e1deb75e8e3 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 6d123980f44..2c50f274650 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 b45b5f2fa40..e2a3ed42933 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 6cd02b5332d..cedf53b5bbd 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 3d2b2488159..9bdb4b32d4f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 c9c20f284a2..79daf1ea32c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 9745a5510d7..62189eee8c7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 cf34a6bfc32..8bc3b88a11e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 d2e13b4c2ad..662d1df2c1d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 c982eb6b67a..22b5457e78f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 1f6187e0ac1..c131de6f865 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 06aaee5f8a2..30610aa7c69 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 69d689e256a..7389342e421 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 ccc2f6f8d01..9756e653373 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 7147a6c4a86..9b7b13d4074 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 620d8681626..c8890e6b556 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 f4a0175e435..1ee164a215b 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 1ad3c2d3fec..25399090b6a 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 60dd330232a..f2b35b78460 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 19465632595..1b918624156 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -42,7 +42,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Get base dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 043a830881c..0dd36c64d1f 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index c0364142e6e..ffc60c2bd93 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index 3005812c04c..04eabd0ea87 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 735beb123d6..5efaef57079 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index 8482707ded6..23abd685ad9 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index 7787bf5a07a..d47928e558d 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index 3a43f6a81cd..07b23598327 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index 5ef89372b34..acf47e28bbc 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS run: | diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index fda49b622ac..ff0de2605f6 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -100,7 +100,7 @@ jobs: 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@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 46f787c4960..81b68a7cd75 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -55,7 +55,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 9916fa788a5..3e77fbbe808 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index 577e7c6d412..3bf67da49b2 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index 7d760163c2c..d63c6a14af8 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index d4f91ed011b..8c95505eeb8 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -83,7 +83,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index fa41629cefe..59ed0188f24 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -86,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index c9f6b0f5b60..c828c005617 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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 49b35fb122f..8311cca0276 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index c5452f1dc29..eee8534d91f 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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 a47f352bab2..d953ac4e462 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index ec4717d3423..4de83a46b01 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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 3ee8a7da6ba..5778f8844a3 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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 66ebda21dec..249da4df32d 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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 14fe6f27a8a..bf1486de868 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 4a0a2d160f8..98c80f81e10 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 7778aae043b..719133f4c88 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/Makefile b/Makefile index 94ba17aed6c..17a4d46e78f 100644 --- a/Makefile +++ b/Makefile @@ -275,7 +275,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=14.8 +BOOTSTRAP_VERSION=14.9 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index d45f920eb46..512dc0c8eae 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.20.9 || echo "Go version reported: `go version`. Version 1.20.9+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.20.10 || echo "Go version reported: `go version`. Version 1.20.10+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index f85e6cf33f6..30840ae46f2 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index 906249ed173..cc1b8390940 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index 06a8318d302..b143eb85ac8 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index 18346f89fcf..ffccae2a40a 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index 7bc0d3d22e8..9ff72f85ba9 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -84,4 +84,8 @@ List of changes between bootstrap image versions. ## [14.8] - 2023-10-05 ### Changes -- Update build to golang 1.20.9 \ No newline at end of file +- Update build to golang 1.20.9 + +## [14.9] - 2023-10-10 +### Changes +- Update build to golang 1.20.10 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 54fa2fd07ed..20eb47ebefb 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.20.9-bullseye +FROM --platform=linux/amd64 golang:1.20.10-bullseye # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index d584b293481..d3d016cbe3c 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index 2ed22dc6e96..95cccb61c2b 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index 55b8b547059..ee80f5f94a2 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index c8306361c4c..70512675ed9 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index 3ff700e5149..33f407a19f1 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index 70e41f5d04f..b35e9237cda 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index 9cf5b6ac627..21615bde859 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index 3e004926ba7..a009f5a324c 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index 1c0a4f5880a..59c662b6343 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index aabb4526225..375bb146767 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index 06afe9af9f0..d99815d4db8 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index 06781a39f3f..f75256511e8 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index f8de5bf9504..eb5a39b0b98 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index fa42de8135e..53bec7153d6 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/test.go b/test.go index 9334a718107..85d44932cef 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "14.8", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "14.9", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index ae75b8c44e6..8249ab24172 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python 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 8f7e5b61ebf..32df8d6ae4e 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - 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_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index 264508e60d8..b8c4d797bbe 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -68,7 +68,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index 71626f393b6..f2e614c099c 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.8 +ARG bootstrap_version=14.9 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index b735176aea8..a0a17180189 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -59,7 +59,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.9 + go-version: 1.20.10 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' From e5e690083840080b8f037039f63b0070cb5a6263 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 15:07:51 -0400 Subject: [PATCH 207/233] [release-16.0] Bump postcss from 8.4.21 to 8.4.31 in /web/vtadmin (#14173) (#14256) Signed-off-by: Florent Poinsard Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- web/vtadmin/package-lock.json | 36 ++++++++++++++++++++--------------- web/vtadmin/package.json | 2 +- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/web/vtadmin/package-lock.json b/web/vtadmin/package-lock.json index a754abbceb8..fcc6198f5ab 100644 --- a/web/vtadmin/package-lock.json +++ b/web/vtadmin/package-lock.json @@ -45,7 +45,7 @@ "@types/lodash-es": "^4.17.4", "autoprefixer": "^10.4.2", "msw": "^0.36.8", - "postcss": "^8.4.6", + "postcss": "^8.4.31", "prettier": "^2.2.1", "protobufjs": "^6.11.3", "react-scripts": "5.0.1", @@ -17416,9 +17416,15 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -18166,11 +18172,11 @@ } }, "node_modules/postcss": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", - "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dependencies": { - "nanoid": "^3.2.0", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -37432,9 +37438,9 @@ "dev": true }, "nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" }, "natural-compare": { "version": "1.4.0", @@ -37996,11 +38002,11 @@ } }, "postcss": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", - "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "requires": { - "nanoid": "^3.2.0", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, diff --git a/web/vtadmin/package.json b/web/vtadmin/package.json index f5a078cfce5..825312a48fe 100644 --- a/web/vtadmin/package.json +++ b/web/vtadmin/package.json @@ -82,7 +82,7 @@ "@types/lodash-es": "^4.17.4", "autoprefixer": "^10.4.2", "msw": "^0.36.8", - "postcss": "^8.4.6", + "postcss": "^8.4.31", "prettier": "^2.2.1", "protobufjs": "^6.11.3", "react-scripts": "5.0.1", From 7dc154b6d56a789a956ac2f726a26a50ec19cb47 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:11:52 -0500 Subject: [PATCH 208/233] [release-16.0] Bump github.com/cyphar/filepath-securejoin from 0.2.3 to 0.2.4 (#14239) (#14251) Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 265d6d0b72a..3608a09c8d0 100644 --- a/go.mod +++ b/go.mod @@ -134,7 +134,7 @@ require ( github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/cyphar/filepath-securejoin v0.2.3 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect diff --git a/go.sum b/go.sum index 46ae97a30fb..3523e97bdd8 100644 --- a/go.sum +++ b/go.sum @@ -182,8 +182,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHH github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/dave/jennifer v1.6.0 h1:MQ/6emI2xM7wt0tJzJzyUik2Q3Tcn2eE0vtYgh4GPVI= github.com/dave/jennifer v1.6.0/go.mod h1:AxTG893FiZKqxy3FP1kL80VMshSMuz2G+EgvszgGRnk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 7f899c6be2ac5de68192fe0d3165f26a5e84a290 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 23:58:12 -0500 Subject: [PATCH 209/233] [release-16.0] Bump golang.org/x/net from 0.14.0 to 0.17.0 (#14260) (#14262) Co-authored-by: Florent Poinsard --- go.mod | 15 ++++++++------- go.sum | 29 ++++++++++++++++------------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 3608a09c8d0..64c34db08bb 100644 --- a/go.mod +++ b/go.mod @@ -76,16 +76,16 @@ require ( go.etcd.io/etcd/api/v3 v3.5.7 go.etcd.io/etcd/client/pkg/v3 v3.5.7 go.etcd.io/etcd/client/v3 v3.5.7 - golang.org/x/crypto v0.5.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 - golang.org/x/mod v0.7.0 // indirect - golang.org/x/net v0.7.0 + golang.org/x/mod v0.8.0 // indirect + golang.org/x/net v0.17.0 golang.org/x/oauth2 v0.4.0 - 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/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 + golang.org/x/text v0.13.0 golang.org/x/time v0.3.0 - golang.org/x/tools v0.5.0 + golang.org/x/tools v0.6.0 google.golang.org/api v0.109.0 google.golang.org/genproto v0.0.0-20230131230820-1c016267d619 // indirect google.golang.org/grpc v1.52.3 @@ -114,6 +114,7 @@ require ( github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249 github.com/spyzhov/ajson v0.8.0 golang.org/x/exp v0.0.0-20230131160201-f062dba9d201 + golang.org/x/tools/cmd/cover v0.1.0-deprecated modernc.org/sqlite v1.20.3 ) diff --git a/go.sum b/go.sum index 3523e97bdd8..7477905c562 100644 --- a/go.sum +++ b/go.sum @@ -849,8 +849,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -892,8 +892,9 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -955,8 +956,8 @@ golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -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/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 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= @@ -1062,14 +1063,14 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/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/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.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/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -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/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= 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= @@ -1082,8 +1083,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -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/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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= @@ -1150,8 +1151,10 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.5.0 h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= +golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 4a0e0386df2de64a696b11b495934f606c765bde Mon Sep 17 00:00:00 2001 From: David Piegza <697113+davidpiegza@users.noreply.github.com> Date: Mon, 25 Sep 2023 10:53:31 +0000 Subject: [PATCH 210/233] Add shutdown state in MySQL server plugin --- go/mysql/conn.go | 29 +++++++++++++++++++++++++++++ go/mysql/server.go | 3 ++- go/vt/vtgate/plugin_mysql_server.go | 11 ++++++++--- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/go/mysql/conn.go b/go/mysql/conn.go index f13c3b2242f..17dc9ccca89 100644 --- a/go/mysql/conn.go +++ b/go/mysql/conn.go @@ -199,6 +199,12 @@ type Conn struct { // enableQueryInfo controls whether we parse the INFO field in QUERY_OK packets // See: ConnParams.EnableQueryInfo enableQueryInfo bool + + // mu protects the fields below + mu sync.Mutex + // this is used to mark the connection to be closed so that the command phase for the connection can be stopped and + // the connection gets closed. + closing bool } // splitStatementFunciton is the function that is used to split the statement in case of a multi-statement query. @@ -899,6 +905,11 @@ func (c *Conn) handleNextCommand(handler Handler) bool { return false } + // before continue to process the packet, check if the connection should be closed or not. + if c.IsMarkedForClose() { + return false + } + switch data[0] { case ComQuit: c.recycleReadPacket() @@ -1634,3 +1645,21 @@ func (c *Conn) IsUnixSocket() bool { func (c *Conn) GetRawConn() net.Conn { return c.conn } + +// MarkForClose marks the connection for close. +func (c *Conn) MarkForClose() { + c.mu.Lock() + defer c.mu.Unlock() + c.closing = true +} + +// IsMarkedForClose return true if the connection should be closed. +func (c *Conn) IsMarkedForClose() bool { + c.mu.Lock() + defer c.mu.Unlock() + return c.closing +} + +func (c *Conn) IsShuttingDown() bool { + return c.listener.isShutdown() +} diff --git a/go/mysql/server.go b/go/mysql/server.go index 4d65ce93a81..0e782847adb 100644 --- a/go/mysql/server.go +++ b/go/mysql/server.go @@ -526,7 +526,8 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32, acceptTime time.Ti for { kontinue := c.handleNextCommand(l.handler) - if !kontinue { + // before going for next command check if the connection should be closed or not. + if !kontinue || c.IsMarkedForClose() { return } } diff --git a/go/vt/vtgate/plugin_mysql_server.go b/go/vt/vtgate/plugin_mysql_server.go index 4a6f45ce629..d42128c74fc 100644 --- a/go/vt/vtgate/plugin_mysql_server.go +++ b/go/vt/vtgate/plugin_mysql_server.go @@ -199,6 +199,12 @@ func startSpan(ctx context.Context, query, label string) (trace.Span, context.Co } func (vh *vtgateHandler) ComQuery(c *mysql.Conn, query string, callback func(*sqltypes.Result) error) error { + session := vh.session(c) + if c.IsShuttingDown() && !session.InTransaction { + c.MarkForClose() + return mysql.NewSQLError(mysql.ERServerShutdown, mysql.SSNetError, "Server shutdown in progress") + } + ctx := context.Background() var cancel context.CancelFunc if mysqlQueryTimeout != 0 { @@ -226,7 +232,6 @@ func (vh *vtgateHandler) ComQuery(c *mysql.Conn, query string, callback func(*sq "VTGate MySQL Connector" /* subcomponent: part of the client */) ctx = callerid.NewContext(ctx, ef, im) - session := vh.session(c) if !session.InTransaction { atomic.AddInt32(&busyConnections, 1) } @@ -561,11 +566,11 @@ func newMysqlUnixSocket(address string, authServer mysql.AuthServer, handler mys func shutdownMysqlProtocolAndDrain() { if mysqlListener != nil { - mysqlListener.Close() + mysqlListener.Shutdown() mysqlListener = nil } if mysqlUnixListener != nil { - mysqlUnixListener.Close() + mysqlUnixListener.Shutdown() mysqlUnixListener = nil } if sigChan != nil { From faf29772b18bcb4174d9ed1b48916acd3cbaedc8 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 12:51:13 -0500 Subject: [PATCH 211/233] [release-16.0] Bump @babel/traverse from 7.21.4 to 7.23.2 in /web/vtadmin (#14304) (#14306) Co-authored-by: Florent Poinsard --- web/vtadmin/package-lock.json | 338 ++++++++++++++++------------------ web/vtadmin/package.json | 1 + 2 files changed, 158 insertions(+), 181 deletions(-) diff --git a/web/vtadmin/package-lock.json b/web/vtadmin/package-lock.json index fcc6198f5ab..31661313a6a 100644 --- a/web/vtadmin/package-lock.json +++ b/web/vtadmin/package-lock.json @@ -8,6 +8,7 @@ "name": "vtadmin", "version": "0.1.0", "dependencies": { + "@babel/traverse": "^7.23.2", "@bugsnag/js": "^7.20.0", "@headlessui/react": "^1.7.8", "@types/jest": "^29.4.0", @@ -61,11 +62,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" @@ -178,14 +180,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz", - "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dependencies": { - "@babel/types": "^7.16.7", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" @@ -309,13 +311,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } @@ -333,25 +331,23 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -476,21 +472,28 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } @@ -534,12 +537,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -547,10 +550,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz", - "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1952,33 +1954,31 @@ } }, "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz", - "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1987,12 +1987,12 @@ } }, "node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3781,7 +3781,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3795,7 +3794,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -3804,7 +3802,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -3822,17 +3819,15 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { @@ -9345,7 +9340,6 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -11871,7 +11865,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } @@ -16372,7 +16365,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -17233,8 +17225,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/msw": { "version": "0.36.8", @@ -22891,7 +22882,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, "engines": { "node": ">=4" } @@ -24541,11 +24531,12 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" } }, "@babel/compat-data": { @@ -24627,14 +24618,14 @@ } }, "@babel/generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz", - "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "requires": { - "@babel/types": "^7.16.7", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" } }, "@babel/helper-annotate-as-pure": { @@ -24726,13 +24717,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" }, "@babel/helper-explode-assignable-expression": { "version": "7.16.7", @@ -24744,22 +24731,20 @@ } }, "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { @@ -24854,18 +24839,22 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" + }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/helper-validator-option": { "version": "7.16.7", @@ -24897,20 +24886,19 @@ } }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz", - "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==", - "dev": true + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -25848,41 +25836,39 @@ } }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz", - "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -27132,7 +27118,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -27142,14 +27127,12 @@ "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/source-map": { "version": "0.3.2", @@ -27164,17 +27147,15 @@ "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@leichtgewicht/ip-codec": { @@ -31338,7 +31319,6 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -33248,8 +33228,7 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { "version": "11.1.0", @@ -36631,8 +36610,7 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "json-parse-better-errors": { "version": "1.0.2", @@ -37300,8 +37278,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "msw": { "version": "0.36.8", @@ -41240,8 +41217,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-regex-range": { "version": "5.0.1", diff --git a/web/vtadmin/package.json b/web/vtadmin/package.json index 825312a48fe..afc52c99539 100644 --- a/web/vtadmin/package.json +++ b/web/vtadmin/package.json @@ -7,6 +7,7 @@ "npm": ">=8.1.0" }, "dependencies": { + "@babel/traverse": "^7.23.2", "@bugsnag/js": "^7.20.0", "@headlessui/react": "^1.7.8", "@types/jest": "^29.4.0", From cb4ab530467cd07d544806a9335e5435797397aa Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 16:10:22 +0300 Subject: [PATCH 212/233] [release-16.0] OnlineDDL: reduce vrepl_stress workload in forks (#14302) (#14347) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- .../onlineddl_vrepl_mini_stress_test.go | 85 ++++++++++++------- go/test/endtoend/onlineddl/vtgate_util.go | 15 +++- 2 files changed, 66 insertions(+), 34 deletions(-) diff --git a/go/test/endtoend/onlineddl/vrepl_stress/onlineddl_vrepl_mini_stress_test.go b/go/test/endtoend/onlineddl/vrepl_stress/onlineddl_vrepl_mini_stress_test.go index 7201fa70652..9af1a2ba5ab 100644 --- a/go/test/endtoend/onlineddl/vrepl_stress/onlineddl_vrepl_mini_stress_test.go +++ b/go/test/endtoend/onlineddl/vrepl_stress/onlineddl_vrepl_mini_stress_test.go @@ -23,9 +23,9 @@ import ( "math/rand" "os" "path" + "runtime" "strings" "sync" - "sync/atomic" "testing" "time" @@ -135,12 +135,14 @@ var ( writeMetrics WriteMetrics ) +var ( + countIterations = 5 +) + const ( - maxTableRows = 4096 - maxConcurrency = 20 - singleConnectionSleepInterval = 2 * time.Millisecond - countIterations = 5 - migrationWaitTimeout = 60 * time.Second + maxTableRows = 4096 + workloadDuration = 5 * time.Second + migrationWaitTimeout = 60 * time.Second ) func resetOpOrder() { @@ -173,7 +175,7 @@ func TestMain(m *testing.M) { clusterInstance.VtctldExtraArgs = []string{ "--schema_change_dir", schemaChangeDirectory, "--schema_change_controller", "local", - "--schema_change_check_interval", "1", + "--schema_change_check_interval", "1s", } clusterInstance.VtTabletExtraArgs = []string{ @@ -220,15 +222,15 @@ func TestMain(m *testing.M) { if err != nil { fmt.Printf("%v\n", err) os.Exit(1) - } else { - os.Exit(exitcode) } - + os.Exit(exitcode) } func TestSchemaChange(t *testing.T) { defer cluster.PanicHandler(t) + ctx := context.Background() + shards = clusterInstance.Keyspaces[0].Shards require.Equal(t, 1, len(shards)) @@ -251,16 +253,17 @@ func TestSchemaChange(t *testing.T) { // that our testing/metrics logic is sound in the first place. testName := fmt.Sprintf("workload without ALTER TABLE %d/%d", (i + 1), countIterations) t.Run(testName, func(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) initTable(t) + + ctx, cancel := context.WithTimeout(ctx, workloadDuration) + defer cancel() + var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() runMultipleConnections(ctx, t) }() - time.Sleep(5 * time.Second) - cancel() // will cause runMultipleConnections() to terminate wg.Wait() testSelectTableMetrics(t) }) @@ -285,7 +288,7 @@ func TestSchemaChange(t *testing.T) { // the vreplication/ALTER TABLE did not corrupt our data and we are happy. testName := fmt.Sprintf("ALTER TABLE with workload %d/%d", (i + 1), countIterations) t.Run(testName, func(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) + ctx := context.Background() t.Run("create schema", func(t *testing.T) { testWithInitialSchema(t) }) @@ -293,6 +296,9 @@ func TestSchemaChange(t *testing.T) { initTable(t) }) t.Run("migrate", func(t *testing.T) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + var wg sync.WaitGroup wg.Add(1) go func() { @@ -302,7 +308,7 @@ func TestSchemaChange(t *testing.T) { hint := fmt.Sprintf("hint-alter-with-workload-%d", i) uuid := testOnlineDDLStatement(t, fmt.Sprintf(alterHintStatement, hint), onlineDDLStrategy, "vtgate", hint) onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusComplete) - cancel() // will cause runMultipleConnections() to terminate + cancel() // Now that the migration is complete, we can stop the workload. wg.Wait() }) t.Run("validate metrics", func(t *testing.T) { @@ -371,7 +377,11 @@ func checkTablesCount(t *testing.T, tablet *cluster.Vttablet, showTableName stri query := fmt.Sprintf(`show tables like '%%%s%%';`, showTableName) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + rowcount := 0 + for { queryResult, err := tablet.VttabletProcess.QueryTablet(query, keyspaceName, true) require.Nil(t, err) @@ -381,11 +391,15 @@ func checkTablesCount(t *testing.T, tablet *cluster.Vttablet, showTableName stri } select { - case <-time.After(time.Second): + case <-ticker.C: + continue // Keep looping case <-ctx.Done(): - break + // Break below to the assertion } + + break } + assert.Equal(t, expectCount, rowcount) } @@ -480,7 +494,7 @@ func generateDelete(t *testing.T, conn *mysql.Conn) error { return err } -func runSingleConnection(ctx context.Context, t *testing.T, done *int64) { +func runSingleConnection(ctx context.Context, t *testing.T, sleepInterval time.Duration) { log.Infof("Running single connection") conn, err := mysql.Connect(ctx, &vtParams) require.Nil(t, err) @@ -491,11 +505,10 @@ func runSingleConnection(ctx context.Context, t *testing.T, done *int64) { _, err = conn.ExecuteFetch("set transaction isolation level read committed", 1000, true) require.Nil(t, err) + ticker := time.NewTicker(sleepInterval) + defer ticker.Stop() + for { - if atomic.LoadInt64(done) == 1 { - log.Infof("Terminating single connection") - return - } switch rand.Int31n(3) { case 0: err = generateInsert(t, conn) @@ -504,27 +517,39 @@ func runSingleConnection(ctx context.Context, t *testing.T, done *int64) { case 2: err = generateDelete(t, conn) } + select { + case <-ctx.Done(): + log.Infof("Terminating single connection") + return + case <-ticker.C: + } assert.Nil(t, err) - time.Sleep(singleConnectionSleepInterval) } } func runMultipleConnections(ctx context.Context, t *testing.T) { - log.Infof("Running multiple connections") - var done int64 + // The workload for a 16 vCPU machine is: + // - Concurrency of 16 + // - 2ms interval between queries for each connection + // As the number of vCPUs decreases, so do we decrease concurrency, and increase intervals. For example, on a 8 vCPU machine + // we run concurrency of 8 and interval of 4ms. On a 4 vCPU machine we run concurrency of 4 and interval of 8ms. + maxConcurrency := runtime.NumCPU() + sleepModifier := 16.0 / float64(maxConcurrency) + baseSleepInterval := 2 * time.Millisecond + singleConnectionSleepIntervalNanoseconds := float64(baseSleepInterval.Nanoseconds()) * sleepModifier + sleepInterval := time.Duration(int64(singleConnectionSleepIntervalNanoseconds)) + + log.Infof("Running multiple connections: maxConcurrency=%v, sleep interval=%v", maxConcurrency, sleepInterval) var wg sync.WaitGroup for i := 0; i < maxConcurrency; i++ { wg.Add(1) go func() { defer wg.Done() - runSingleConnection(ctx, t, &done) + runSingleConnection(ctx, t, sleepInterval) }() } - <-ctx.Done() - atomic.StoreInt64(&done, 1) - log.Infof("Running multiple connections: done") wg.Wait() - log.Infof("All connections cancelled") + log.Infof("Running multiple connections: done") } func initTable(t *testing.T) { diff --git a/go/test/endtoend/onlineddl/vtgate_util.go b/go/test/endtoend/onlineddl/vtgate_util.go index 5052065082b..b93c43bb7eb 100644 --- a/go/test/endtoend/onlineddl/vtgate_util.go +++ b/go/test/endtoend/onlineddl/vtgate_util.go @@ -246,9 +246,13 @@ func WaitForMigrationStatus(t *testing.T, vtParams *mysql.ConnParams, shards []c for _, status := range expectStatuses { statusesMap[string(status)] = true } - startTime := time.Now() + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + lastKnownStatus := "" - for time.Since(startTime) < timeout { + for { countMatchedShards := 0 r := VtgateExecQuery(t, vtParams, query, "") for _, row := range r.Named().Rows { @@ -265,9 +269,12 @@ func WaitForMigrationStatus(t *testing.T, vtParams *mysql.ConnParams, shards []c if countMatchedShards == len(shards) { return schema.OnlineDDLStatus(lastKnownStatus) } - time.Sleep(1 * time.Second) + select { + case <-ctx.Done(): + return schema.OnlineDDLStatus(lastKnownStatus) + case <-ticker.C: + } } - return schema.OnlineDDLStatus(lastKnownStatus) } // CheckMigrationArtifacts verifies given migration exists, and checks if it has artifacts From 5f550d66ac3687ccf3f16072aeda1820279e1635 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 22:42:37 -0600 Subject: [PATCH 213/233] [release-16.0] Automatic approval of `vitess-bot` clean backports (#14352) (#14355) Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- .github/workflows/auto_approve_pr.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/auto_approve_pr.yml diff --git a/.github/workflows/auto_approve_pr.yml b/.github/workflows/auto_approve_pr.yml new file mode 100644 index 00000000000..552f1ec2e68 --- /dev/null +++ b/.github/workflows/auto_approve_pr.yml @@ -0,0 +1,23 @@ +name: Auto Approval of Bot Pull Requests +on: + pull_request: + types: [opened, reopened] + +jobs: + auto_approve: + name: Auto Approve Pull Request + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Auto Approve Pull Request + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # here we are checking that the PR has been created by the vitess-bot[bot] account and that it is not a draft + # if there is a merge conflict in the backport, the PR will always be created as a draft, meaning we can rely + # on checking whether or not the PR is a draft + if [[ "${{github.event.pull_request.user.login}}" == "vitess-bot[bot]" ]] && [[ "${{github.event.pull_request.draft}}" == "false" ]]; then + gh pr review ${{ github.event.pull_request.number }} --approve + fi From 8fa5816f8e9c8011e5b28b0a016a354763511219 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 31 Oct 2023 21:16:23 +0530 Subject: [PATCH 214/233] Code freeze of release-16.0 (#14409) --- .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 efe1d6e8856..1bb74feee50 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 883b0f27da3822c5baac6b837a8072c08fd471e2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:19:46 +0530 Subject: [PATCH 215/233] [release-16.0] Upgrade the Golang version to `go1.20.11` (#14490) Signed-off-by: GitHub Signed-off-by: Harshit Gangal Co-authored-by: frouioui Co-authored-by: Harshit Gangal --- .github/workflows/assign_milestone.yml | 2 +- .github/workflows/check_make_vtadmin_authz_testgen.yml | 2 +- .github/workflows/check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr_mysql57.yml | 2 +- .../cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .github/workflows/cluster_endtoend_mysql_server_vault.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_scheduler.yml | 2 +- .../cluster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- ...luster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl.yml | 2 +- .../workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_consul.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_tablegc.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_throttler.yml | 2 +- ...uster_endtoend_tabletmanager_throttler_custom_config.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .../workflows/cluster_endtoend_topo_connection_cache.yml | 2 +- .../cluster_endtoend_vreplication_across_db_versions.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_basic.yml | 2 +- .../workflows/cluster_endtoend_vreplication_cellalias.yml | 2 +- ...ster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .../workflows/cluster_endtoend_vreplication_multicell.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_v2.yml | 2 +- .github/workflows/cluster_endtoend_vstream_failover.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_false.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_true.yml | 2 +- .../cluster_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- ...uster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_general_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_godriver.yml | 2 +- .../workflows/cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .../workflows/cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_reservedconn.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .../workflows/cluster_endtoend_vtgate_schema_tracker.yml | 2 +- .../cluster_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_consul.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_transaction.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_unsharded.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .github/workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 2 +- .github/workflows/docker_test_cluster_10.yml | 2 +- .github/workflows/docker_test_cluster_25.yml | 2 +- .github/workflows/e2e_race.yml | 2 +- .github/workflows/endtoend.yml | 2 +- .github/workflows/local_example.yml | 2 +- .github/workflows/region_example.yml | 2 +- .github/workflows/sonar_analysis.yml | 2 +- .github/workflows/static_checks_etc.yml | 2 +- .github/workflows/unit_race.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- .github/workflows/update_golang_version.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 2 +- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 2 +- .../upgrade_downgrade_test_backups_manual_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries.yml | 2 +- ...de_downgrade_test_query_serving_queries_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_schema.yml | 2 +- ...ade_downgrade_test_query_serving_schema_next_release.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 2 +- docker/lite/Dockerfile.ubi7.mysql80 | 2 +- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 2 +- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 2 +- docker/lite/Dockerfile.ubi8.mysql80 | 2 +- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- test.go | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_docker.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/dockerfile.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 128 files changed, 132 insertions(+), 128 deletions(-) diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index e0db014af02..93d853946ea 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index e1be68021ba..e4de2e1ac8c 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -48,7 +48,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index d4127e0ae85..940adfc3af8 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -50,7 +50,7 @@ jobs: uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index a3728489b2e..ca8d08fc063 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 e42b132ff87..b0a12f83492 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 672421c71e6..392b8f71b7b 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 87782ace706..30b0b7a7dd3 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 4236a5b5602..af01e8c42b2 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 8b7e034dab5..f3ae2848db8 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index d70a60e248d..7533b2f54e5 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index 42c1fdea759..903f9af4d4f 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 e53b2b434bb..1ec1c0d140e 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 f2816ad19cb..f686a4e92d8 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 be9f918d19f..abc077d37ff 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 93619a8fe33..855503838cb 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 75e7dffd7dc..e9fcd70a439 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 c7f931c08d6..9991dc8e095 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 a8c4a8caadf..844a2d4542e 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 9861da48efe..92069c38a61 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 6fb96d567ff..809ce19b694 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 0598a3ac862..74d3b457c83 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 426ab0bb1f8..7f8c75cf999 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 f509ee0560c..f2b5b43ff59 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 20664d82ed4..2ba485388aa 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 c2872e08c89..673c0b6edb6 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 542879d2f5a..fcfdcafc557 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 b446e263911..bb8bcafa1f7 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 a2cb365156f..5f8dad70671 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 db0ea91ca9e..4df0066460d 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 0c298fe398f..43c2c5696d7 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 f035ac9862e..f32873ab5e9 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 ee5a056008b..c94acf6cfe6 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 50aef792242..21a18695acc 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 21e9a388b10..d4b0adad619 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 f75275d9524..5f12dc5edde 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 20c0b64c666..7e5f1231c1e 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 a3ca80219a5..191f0957fae 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 09e88978a8d..b2df5188bce 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 55f52b3eb01..95b23e5878a 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 dde2333c390..1abcce30ccd 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 ac932e2869b..9043f6ce514 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 a8bd76ed6df..53228e39be6 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 871b80c1f03..8faacd79721 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 7230e4dfe2a..b5c68c18bf1 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 3e00be60bf3..298ed4972fe 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 beff08fdad1..a7a3957744b 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 6b45de10d12..d28cacc58d7 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index eb8e85cfea3..b18c6be59b9 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 a1c2790b916..e7e3175d17f 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 10feebb7f51..e62f03e8071 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 6aafd74c069..df47db0cb5d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 7539cf0d4bf..cf2c7ee4d06 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 d307a9d8ea9..addfb984f35 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 e5147006695..443681aed63 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 3141cf310bb..12c7f788809 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 e1deb75e8e3..6dc05b96360 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 2c50f274650..eea02ca6a1c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 e2a3ed42933..b212adff275 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 cedf53b5bbd..57aa528565d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 9bdb4b32d4f..9ebe1185550 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 79daf1ea32c..30251f372e3 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 62189eee8c7..99d86d9ba45 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 8bc3b88a11e..3b5acd850a7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 662d1df2c1d..251405c673e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 22b5457e78f..815b83d2112 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 c131de6f865..4e396915688 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 30610aa7c69..23eac8c1d97 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 7389342e421..6b5abeebf48 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 9756e653373..0243958aa8b 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 9b7b13d4074..de0de5e318c 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 c8890e6b556..68519eeca5b 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 1ee164a215b..6c26edfdc9c 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 25399090b6a..25285414f03 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -62,7 +62,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 f2b35b78460..33577c9f5ec 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -66,7 +66,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 1b918624156..29a01de0fa8 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -42,7 +42,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Get base dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 0dd36c64d1f..e22ea18e5cf 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index ffc60c2bd93..eebe5783935 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index 04eabd0ea87..ca5a7ab0c60 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -53,7 +53,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 5efaef57079..ec644608705 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index 23abd685ad9..905b5d7b75a 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -51,7 +51,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index d47928e558d..ede03c2b931 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index 07b23598327..1ece70c7f3e 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index acf47e28bbc..785f9bb39e2 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS run: | diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index ff0de2605f6..f97600801a9 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -100,7 +100,7 @@ jobs: 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@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 81b68a7cd75..3364a27a7eb 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -55,7 +55,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 3e77fbbe808..4efa80e0230 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index 3bf67da49b2..eb85fd4661d 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -61,7 +61,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index d63c6a14af8..28cfbb42940 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 8c95505eeb8..8ea4dbd13eb 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -83,7 +83,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 59ed0188f24..8f1c4275756 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -86,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index c828c005617..3cb404c19dd 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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 8311cca0276..6eafdce2d09 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index eee8534d91f..33680c28f3d 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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 d953ac4e462..c6add37645c 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 4de83a46b01..03a809d178d 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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 5778f8844a3..8805c43c66f 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 @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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 249da4df32d..ddee574be82 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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 bf1486de868..c8d47834b6e 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 98c80f81e10..44ed9469a65 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 719133f4c88..dda397c2430 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/Makefile b/Makefile index 17a4d46e78f..e0f3409aa06 100644 --- a/Makefile +++ b/Makefile @@ -275,7 +275,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=14.9 +BOOTSTRAP_VERSION=14.10 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index 512dc0c8eae..74636112f2f 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.20.10 || echo "Go version reported: `go version`. Version 1.20.10+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.20.11 || echo "Go version reported: `go version`. Version 1.20.11+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 30840ae46f2..71e81fc79e4 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index cc1b8390940..6b6576dfa49 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index b143eb85ac8..119e2f74d9c 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index ffccae2a40a..71dcbb21872 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index 9ff72f85ba9..cf1c815b979 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -88,4 +88,8 @@ List of changes between bootstrap image versions. ## [14.9] - 2023-10-10 ### Changes -- Update build to golang 1.20.10 \ No newline at end of file +- Update build to golang 1.20.10 + +## [14.10] - 2023-11-08 +### Changes +- Update build to golang 1.20.11 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 20eb47ebefb..d3128b45054 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.20.10-bullseye +FROM --platform=linux/amd64 golang:1.20.11-bullseye # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index d3d016cbe3c..0bd1efb25e5 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index 95cccb61c2b..a09b6a07a19 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index ee80f5f94a2..d22356ca209 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index 70512675ed9..ef5905bfcbe 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index 33f407a19f1..e445661f0d0 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index b35e9237cda..b417f310de3 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index 21615bde859..66c8417ee7d 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index a009f5a324c..93d126db29a 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index 59c662b6343..a6cdf6eb309 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index 375bb146767..51893110e21 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index d99815d4db8..5b5bfe9db73 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index f75256511e8..9bf718680d4 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index eb5a39b0b98..8d24db1cf2a 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index 53bec7153d6..5202028e6a9 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/test.go b/test.go index 85d44932cef..c899caf4c16 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "14.9", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "14.10", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index 8249ab24172..8850650bd1d 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -63,7 +63,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python 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 32df8d6ae4e..3edfae4308c 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - 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_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index b8c4d797bbe..593d0d03e45 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -68,7 +68,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index f2e614c099c..d5ca3c81b1c 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=14.9 +ARG bootstrap_version=14.10 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index a0a17180189..fd4c77ac3d6 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -59,7 +59,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v3 with: - go-version: 1.20.10 + go-version: 1.20.11 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' From 13c21fdf879e454136e73d245f8b975941dacc83 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:04:21 +0530 Subject: [PATCH 216/233] [release-16.0] vtgate/engine: Fix race condition in join logic (#14435) (#14439) Signed-off-by: Dirkjan Bussink Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- go/vt/vtgate/engine/join.go | 39 ++++++++++++++++------- go/vt/vtgate/engine/scalar_aggregation.go | 2 +- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/go/vt/vtgate/engine/join.go b/go/vt/vtgate/engine/join.go index 6343789aef8..fc44366ff65 100644 --- a/go/vt/vtgate/engine/join.go +++ b/go/vt/vtgate/engine/join.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "strings" + "sync" "sync/atomic" "vitess.io/vitess/go/sqltypes" @@ -96,22 +97,31 @@ func (jn *Join) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[st // TryStreamExecute performs a streaming exec. func (jn *Join) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { - var fieldNeeded atomic.Bool - fieldNeeded.Store(wantfields) - err := vcursor.StreamExecutePrimitive(ctx, jn.Left, bindVars, fieldNeeded.Load(), func(lresult *sqltypes.Result) error { + var mu sync.Mutex + // We need to use this atomic since we're also reading this + // value outside of it being locked with the mu lock. + // This is still racy, but worst case it means that we may + // retrieve the right hand side fields twice instead of once. + var fieldsSent atomic.Bool + fieldsSent.Store(!wantfields) + err := vcursor.StreamExecutePrimitive(ctx, jn.Left, bindVars, wantfields, func(lresult *sqltypes.Result) error { joinVars := make(map[string]*querypb.BindVariable) for _, lrow := range lresult.Rows { for k, col := range jn.Vars { joinVars[k] = sqltypes.ValueBindVariable(lrow[col]) } var rowSent atomic.Bool - err := vcursor.StreamExecutePrimitive(ctx, jn.Right, combineVars(bindVars, joinVars), fieldNeeded.Load(), func(rresult *sqltypes.Result) error { + err := vcursor.StreamExecutePrimitive(ctx, jn.Right, combineVars(bindVars, joinVars), !fieldsSent.Load(), func(rresult *sqltypes.Result) error { + // This needs to be locking since it's not safe to just use + // fieldsSent. This is because we can't have a race between + // checking fieldsSent and then actually calling the callback + // and in parallel another goroutine doing the same. That + // can lead to out of order execution of the callback. So the callback + // itself and the check need to be covered by the same lock. + mu.Lock() + defer mu.Unlock() result := &sqltypes.Result{} - if fieldNeeded.Load() { - // This code is currently unreachable because the first result - // will always be just the field info, which will cause the outer - // wantfields code path to be executed. But this may change in the future. - fieldNeeded.Store(false) + if fieldsSent.CompareAndSwap(false, true) { result.Fields = joinFields(lresult.Fields, rresult.Fields, jn.Cols) } for _, rrow := range rresult.Rows { @@ -135,8 +145,15 @@ func (jn *Join) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars return callback(result) } } - if fieldNeeded.Load() { - fieldNeeded.Store(false) + // This needs to be locking since it's not safe to just use + // fieldsSent. This is because we can't have a race between + // checking fieldsSent and then actually calling the callback + // and in parallel another goroutine doing the same. That + // can lead to out of order execution of the callback. So the callback + // itself and the check need to be covered by the same lock. + mu.Lock() + defer mu.Unlock() + if fieldsSent.CompareAndSwap(false, true) { for k := range jn.Vars { joinVars[k] = sqltypes.NullBindVariable } diff --git a/go/vt/vtgate/engine/scalar_aggregation.go b/go/vt/vtgate/engine/scalar_aggregation.go index 2b66073ac5e..5dfa8be7b51 100644 --- a/go/vt/vtgate/engine/scalar_aggregation.go +++ b/go/vt/vtgate/engine/scalar_aggregation.go @@ -133,8 +133,8 @@ func (sa *ScalarAggregate) TryStreamExecute(ctx context.Context, vcursor VCursor var current []sqltypes.Value var curDistincts []sqltypes.Value var fields []*querypb.Field - fieldsSent := false var mu sync.Mutex + fieldsSent := !wantfields err := vcursor.StreamExecutePrimitive(ctx, sa.Input, bindVars, wantfields, func(result *sqltypes.Result) error { // as the underlying primitive call is not sync From aa1cf497d2aae9c59f4e2006932b97a45463207c Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:08:44 +0530 Subject: [PATCH 217/233] [release-16.0] schemadiff: fix missing `DROP CONSTRAINT` in duplicate/redundant constraints scenario. (#14387) (#14389) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/schemadiff/table.go | 17 +++++++++++++-- go/vt/schemadiff/table_test.go | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/go/vt/schemadiff/table.go b/go/vt/schemadiff/table.go index f58faa06310..965b632bd2e 100644 --- a/go/vt/schemadiff/table.go +++ b/go/vt/schemadiff/table.go @@ -1196,11 +1196,14 @@ func (c *CreateTableEntity) diffConstraints(alterTable *sqlparser.AlterTable, } t1ConstraintsMap := map[string]*sqlparser.ConstraintDefinition{} t2ConstraintsMap := map[string]*sqlparser.ConstraintDefinition{} + t2ConstraintsCountMap := map[string]int{} for _, constraint := range t1Constraints { t1ConstraintsMap[normalizeConstraintName(constraint)] = constraint } for _, constraint := range t2Constraints { - t2ConstraintsMap[normalizeConstraintName(constraint)] = constraint + constraintName := normalizeConstraintName(constraint) + t2ConstraintsMap[constraintName] = constraint + t2ConstraintsCountMap[constraintName]++ } dropConstraintStatement := func(constraint *sqlparser.ConstraintDefinition) *sqlparser.DropKey { @@ -1213,12 +1216,22 @@ func (c *CreateTableEntity) diffConstraints(alterTable *sqlparser.AlterTable, // evaluate dropped constraints // for _, t1Constraint := range t1Constraints { - if _, ok := t2ConstraintsMap[normalizeConstraintName(t1Constraint)]; !ok { + // Due to how we normalize the constraint string (e.g. in ConstraintNamesIgnoreAll we + // completely discard the constraint name), it's possible to have multiple constraints under + // the same string. Effectively, this means the schema design has duplicate/redundant constraints, + // which of course is poor design -- but still valid. + // To deal with dropping constraints, we need to not only account for the _existence_ of a constraint, + // but also to _how many times_ it appears. + constraintName := normalizeConstraintName(t1Constraint) + if t2ConstraintsCountMap[constraintName] == 0 { // constraint exists in t1 but not in t2, hence it is dropped dropConstraint := dropConstraintStatement(t1Constraint) alterTable.AlterOptions = append(alterTable.AlterOptions, dropConstraint) + } else { + t2ConstraintsCountMap[constraintName]-- } } + // t2ConstraintsCountMap should not be used henceforth. for _, t2Constraint := range t2Constraints { normalizedT2ConstraintName := normalizeConstraintName(t2Constraint) diff --git a/go/vt/schemadiff/table_test.go b/go/vt/schemadiff/table_test.go index 18fce4ec759..9380f678b33 100644 --- a/go/vt/schemadiff/table_test.go +++ b/go/vt/schemadiff/table_test.go @@ -569,6 +569,14 @@ func TestCreateTableDiff(t *testing.T) { cdiff: "ALTER TABLE `t1` DROP CHECK `check3`", constraint: ConstraintNamesIgnoreAll, }, + { + name: "check constraints, remove duplicate", + from: "create table t1 (id int primary key, i int, constraint `chk_123abc` CHECK ((`i` > 2)), constraint `check3` CHECK ((`i` > 2)), constraint `chk_789def` CHECK ((`i` < 5)))", + to: "create table t2 (id int primary key, i int, constraint `chk_123abc` CHECK ((`i` > 2)), constraint `chk_789def` CHECK ((`i` < 5)))", + diff: "alter table t1 drop check check3", + cdiff: "ALTER TABLE `t1` DROP CHECK `check3`", + constraint: ConstraintNamesIgnoreAll, + }, { name: "check constraints, remove, ignore vitess, no match", from: "create table t1 (id int primary key, i int, constraint `chk_123abc` CHECK ((`i` > 2)), constraint `check3` CHECK ((`i` != 3)), constraint `chk_789def` CHECK ((`i` < 5)))", @@ -620,6 +628,37 @@ func TestCreateTableDiff(t *testing.T) { from: "create table t1 (id int primary key, i int, constraint f foreign key (i) references parent(id) on delete cascade)", to: "create table t2 (id int primary key, i int, constraint f foreign key (i) references parent(id) on delete cascade)", }, + { + name: "two identical foreign keys, dropping one", + from: "create table t1 (id int primary key, i int, key i_idex (i), constraint f1 foreign key (i) references parent(id), constraint f2 foreign key (i) references parent(id))", + to: "create table t2 (id int primary key, i int, key i_idex (i), constraint f1 foreign key (i) references parent(id))", + diff: "alter table t1 drop foreign key f2", + cdiff: "ALTER TABLE `t1` DROP FOREIGN KEY `f2`", + }, + { + name: "two identical foreign keys, dropping one, ignore vitess names", + from: "create table t1 (id int primary key, i int, key i_idex (i), constraint f1 foreign key (i) references parent(id), constraint f2 foreign key (i) references parent(id))", + to: "create table t2 (id int primary key, i int, key i_idex (i), constraint f1 foreign key (i) references parent(id))", + diff: "alter table t1 drop foreign key f2", + cdiff: "ALTER TABLE `t1` DROP FOREIGN KEY `f2`", + constraint: ConstraintNamesIgnoreVitess, + }, + { + name: "two identical foreign keys, dropping one, ignore all names", + from: "create table t1 (id int primary key, i int, key i_idex (i), constraint f1 foreign key (i) references parent(id), constraint f2 foreign key (i) references parent(id))", + to: "create table t2 (id int primary key, i int, key i_idex (i), constraint f1 foreign key (i) references parent(id))", + diff: "alter table t1 drop foreign key f2", + cdiff: "ALTER TABLE `t1` DROP FOREIGN KEY `f2`", + constraint: ConstraintNamesIgnoreAll, + }, + { + name: "add two identical foreign key constraints, ignore all names", + from: "create table t1 (id int primary key, i int, key i_idex (i))", + to: "create table t2 (id int primary key, i int, key i_idex (i), constraint f1 foreign key (i) references parent(id), constraint f2 foreign key (i) references parent(id))", + diff: "alter table t1 add constraint f1 foreign key (i) references parent (id), add constraint f2 foreign key (i) references parent (id)", + cdiff: "ALTER TABLE `t1` ADD CONSTRAINT `f1` FOREIGN KEY (`i`) REFERENCES `parent` (`id`), ADD CONSTRAINT `f2` FOREIGN KEY (`i`) REFERENCES `parent` (`id`)", + constraint: ConstraintNamesIgnoreAll, + }, { name: "implicit foreign key indexes", from: "create table t1 (id int primary key, i int, key f(i), constraint f foreign key (i) references parent(id) on delete cascade)", From 0a04f3dca21c2726a314fdcff8817d1f891d9389 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Sat, 11 Nov 2023 00:25:29 +0530 Subject: [PATCH 218/233] [release-16.0] Bump google.golang.org/grpc from 1.55.0-dev to 1.59.0 (#14364) (#14496) Signed-off-by: Harshit Gangal Co-authored-by: Harshit Gangal --- go.mod | 42 ++++---- go.sum | 95 +++++++++++-------- go/flags/endtoend/mysqlctl.txt | 8 +- go/flags/endtoend/mysqlctld.txt | 8 +- go/flags/endtoend/vtaclcheck.txt | 38 ++++---- go/flags/endtoend/vtbackup.txt | 8 +- go/flags/endtoend/vtctlclient.txt | 8 +- go/flags/endtoend/vtctld.txt | 8 +- go/flags/endtoend/vtctldclient.txt | 8 +- go/flags/endtoend/vtexplain.txt | 8 +- go/flags/endtoend/vtgate.txt | 8 +- go/flags/endtoend/vtgr.txt | 8 +- go/flags/endtoend/vtorc.txt | 8 +- go/flags/endtoend/vttablet.txt | 8 +- go/flags/endtoend/vttestserver.txt | 8 +- go/flags/endtoend/zkctl.txt | 36 +++---- go/flags/endtoend/zkctld.txt | 38 ++++---- go/test/endtoend/cluster/mysqlctld_process.go | 12 ++- go/test/endtoend/cluster/topo_process.go | 46 ++++++--- go/test/endtoend/cluster/vtctld_process.go | 11 ++- go/test/endtoend/cluster/vtgate_process.go | 6 +- go/test/endtoend/cluster/vtorc_process.go | 17 +++- .../endtoend/recovery/pitr/binlog_server.go | 8 +- go/vt/proto/automation/automation.pb.go | 2 +- .../automationservice/automationservice.pb.go | 2 +- go/vt/proto/binlogdata/binlogdata.pb.go | 2 +- go/vt/proto/binlogservice/binlogservice.pb.go | 2 +- go/vt/proto/logutil/logutil.pb.go | 2 +- go/vt/proto/mysqlctl/mysqlctl.pb.go | 2 +- go/vt/proto/query/query.pb.go | 2 +- go/vt/proto/queryservice/queryservice.pb.go | 2 +- .../replicationdata/replicationdata.pb.go | 2 +- go/vt/proto/tableacl/tableacl.pb.go | 2 +- .../tabletmanagerdata/tabletmanagerdata.pb.go | 2 +- .../tabletmanagerservice.pb.go | 2 +- go/vt/proto/throttlerdata/throttlerdata.pb.go | 2 +- .../throttlerservice/throttlerservice.pb.go | 2 +- go/vt/proto/topodata/topodata.pb.go | 2 +- go/vt/proto/vschema/vschema.pb.go | 2 +- go/vt/proto/vtadmin/vtadmin.pb.go | 2 +- go/vt/proto/vtctldata/vtctldata.pb.go | 2 +- go/vt/proto/vtctlservice/vtctlservice.pb.go | 2 +- go/vt/proto/vtgate/vtgate.pb.go | 2 +- go/vt/proto/vtgateservice/vtgateservice.pb.go | 2 +- go/vt/proto/vtrpc/vtrpc.pb.go | 2 +- go/vt/proto/vttest/vttest.pb.go | 2 +- go/vt/proto/vttime/vttime.pb.go | 2 +- 47 files changed, 300 insertions(+), 193 deletions(-) diff --git a/go.mod b/go.mod index 64c34db08bb..d489ed3dd6e 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module vitess.io/vitess go 1.20 require ( - cloud.google.com/go/storage v1.29.0 + cloud.google.com/go/storage v1.30.1 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 github.com/Azure/azure-pipeline-go v0.2.3 github.com/Azure/azure-storage-blob-go v0.15.0 @@ -22,13 +22,13 @@ require ( github.com/fsnotify/fsnotify v1.6.0 github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab github.com/go-sql-driver/mysql v1.7.0 - github.com/golang/glog v1.0.0 + github.com/golang/glog v1.1.2 github.com/golang/mock v1.6.0 - github.com/golang/protobuf v1.5.2 + github.com/golang/protobuf v1.5.3 github.com/golang/snappy v0.0.4 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/google/uuid v1.3.1 github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 @@ -76,22 +76,22 @@ require ( go.etcd.io/etcd/api/v3 v3.5.7 go.etcd.io/etcd/client/pkg/v3 v3.5.7 go.etcd.io/etcd/client/v3 v3.5.7 - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.15.0 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.17.0 - golang.org/x/oauth2 v0.4.0 - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 - golang.org/x/text v0.13.0 + golang.org/x/net v0.18.0 + golang.org/x/oauth2 v0.11.0 + golang.org/x/sys v0.14.0 // indirect + golang.org/x/term v0.14.0 + golang.org/x/text v0.14.0 golang.org/x/time v0.3.0 golang.org/x/tools v0.6.0 - google.golang.org/api v0.109.0 - google.golang.org/genproto v0.0.0-20230131230820-1c016267d619 // indirect - google.golang.org/grpc v1.52.3 + google.golang.org/api v0.128.0 + google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/grpc v1.59.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 google.golang.org/grpc/examples v0.0.0-20210430044426-28078834f35b - google.golang.org/protobuf v1.28.1 + google.golang.org/protobuf v1.31.0 gopkg.in/DataDog/dd-trace-go.v1 v1.47.0 gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect gopkg.in/gcfg.v1 v1.2.3 @@ -119,10 +119,10 @@ require ( ) require ( - cloud.google.com/go v0.109.0 // indirect - cloud.google.com/go/compute v1.18.0 // indirect + cloud.google.com/go v0.110.9 // indirect + cloud.google.com/go/compute v1.23.2 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.10.0 // indirect + cloud.google.com/go/iam v1.1.4 // indirect github.com/BurntSushi/toml v1.2.1 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.42.0 // indirect github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.42.0 // indirect @@ -150,8 +150,9 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gnostic v0.6.9 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect + github.com/google/s2a-go v0.1.4 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.4.0 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect @@ -194,8 +195,11 @@ require ( go4.org/intern v0.0.0-20220617035311-6925f38cc365 // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 // indirect golang.org/x/exp/typeparams v0.0.0-20230131160201-f062dba9d201 // indirect + golang.org/x/sync v0.3.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 7477905c562..24f543bbed7 100644 --- a/go.sum +++ b/go.sum @@ -17,23 +17,22 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.109.0 h1:38CZoKGlCnPZjGdyj0ZfpoGae0/wgNfy5F0byyxg0Gk= -cloud.google.com/go v0.109.0/go.mod h1:2sYycXt75t/CSB5R9M2wPU1tJmire7AQZTPtITcGBVE= +cloud.google.com/go v0.110.9 h1:e7ITSqGFFk4rbz/JFIqZh3G4VEHguhAL4BQcFlWtU68= +cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.23.2 h1:nWEMDhgbBkBJjfpVySqU4jgWdc22PLR0o4vEexZHers= +cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.10.0 h1:fpP/gByFs6US1ma53v7VxhvbJpO2Aapng6wabJ99MuI= -cloud.google.com/go/iam v0.10.0/go.mod h1:nXAECrMt2qHpF6RZUZseteD6QyanL68reN4OXPw0UWM= -cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= +cloud.google.com/go/iam v1.1.4 h1:K6n/GZHFTtEoKT5aUG3l9diPi0VduZNQ1PfdnpkkIFk= +cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -44,8 +43,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0= @@ -156,7 +155,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= @@ -216,6 +219,7 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= @@ -314,8 +318,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -347,8 +351,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -378,7 +383,7 @@ github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPg github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -392,20 +397,22 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/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/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= +github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -849,8 +856,9 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -956,8 +964,8 @@ golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= 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= @@ -967,8 +975,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -981,8 +989,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1063,14 +1072,14 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= 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= @@ -1081,10 +1090,11 @@ 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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 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= @@ -1180,8 +1190,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.109.0 h1:sW9hgHyX497PP5//NUM7nqfV8D0iDfBApqq7sOh1XR8= -google.golang.org/api v0.109.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1230,8 +1240,12 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230131230820-1c016267d619 h1:p0kMzw6AG0JEzd7Z+kXqOiLhC6gjUQTbtS2zR0Q3DbI= -google.golang.org/genproto v0.0.0-20230131230820-1c016267d619/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1252,8 +1266,9 @@ google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA5 google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= google.golang.org/grpc/examples v0.0.0-20210430044426-28078834f35b h1:D/GTYPo6I1oEo08Bfpuj3xl5XE+UGHj7//5fVyKxhsQ= @@ -1272,8 +1287,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/DataDog/dd-trace-go.v1 v1.47.0 h1:w3mHEgOR1o52mkyCbkTM+El8DG732+Fnug4FAGhIpsk= gopkg.in/DataDog/dd-trace-go.v1 v1.47.0/go.mod h1:aHb6c4hPRANXnB64LDAKyfWotKgfRjlHv23MnahM8AI= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/go/flags/endtoend/mysqlctl.txt b/go/flags/endtoend/mysqlctl.txt index c380ebfb557..c4e48d2832e 100644 --- a/go/flags/endtoend/mysqlctl.txt +++ b/go/flags/endtoend/mysqlctl.txt @@ -50,10 +50,12 @@ Global flags: --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --mysql_port int MySQL port (default 3306) @@ -72,9 +74,9 @@ Global flags: --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --service_map strings comma separated list of services to enable (or disable if prefixed with '-') Example: grpc-queryservice --socket_file string Local unix socket file to listen on - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --tablet_dir string The directory within the vtdataroot to store vttablet/mysql files. Defaults to being generated by the tablet uid. --tablet_uid uint Tablet UID (default 41983) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging diff --git a/go/flags/endtoend/mysqlctld.txt b/go/flags/endtoend/mysqlctld.txt index d5da79e347f..3ebe8a50000 100644 --- a/go/flags/endtoend/mysqlctld.txt +++ b/go/flags/endtoend/mysqlctld.txt @@ -61,10 +61,12 @@ Usage of mysqlctld: --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --mysql_port int MySQL port (default 3306) @@ -83,10 +85,10 @@ Usage of mysqlctld: --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --service_map strings comma separated list of services to enable (or disable if prefixed with '-') Example: grpc-queryservice --socket_file string Local unix socket file to listen on - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --tablet_dir string The directory within the vtdataroot to store vttablet/mysql files. Defaults to being generated by the tablet uid. --tablet_uid uint Tablet UID (default 41983) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --wait_time duration How long to wait for mysqld startup or shutdown (default 5m0s) diff --git a/go/flags/endtoend/vtaclcheck.txt b/go/flags/endtoend/vtaclcheck.txt index 6e2c57db109..6c93e5d8542 100644 --- a/go/flags/endtoend/vtaclcheck.txt +++ b/go/flags/endtoend/vtaclcheck.txt @@ -1,19 +1,21 @@ Usage of vtaclcheck: - --acl-file string The path of the JSON ACL file to check - --alsologtostderr log to standard error as well as files - -h, --help display usage and exit - --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) - --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) - --log_dir string If non-empty, write log files in this directory - --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 - --pprof strings enable profiling - --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) - --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) - --static-auth-file string The path of the auth_server_static JSON file to check - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) - --v Level log level for V logs - -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --acl-file string The path of the JSON ACL file to check + --alsologtostderr log to standard error as well as files + -h, --help display usage and exit + --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) + --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace + --log_dir string If non-empty, write log files in this directory + --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files + --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. + --logtostderr log to standard error instead of files + --pprof strings enable profiling + --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) + --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) + --static-auth-file string The path of the auth_server_static JSON file to check + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) + --v Level log level for V logs + -v, --version print binary version + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging diff --git a/go/flags/endtoend/vtbackup.txt b/go/flags/endtoend/vtbackup.txt index f9602cbc20d..a4d9ed474b1 100644 --- a/go/flags/endtoend/vtbackup.txt +++ b/go/flags/endtoend/vtbackup.txt @@ -93,10 +93,12 @@ Usage of vtbackup: --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --min_backup_interval duration Only take a new backup if it's been at least this long since the most recent backup. --min_retention_count int Always keep at least this many of the most recent backups in this backup storage location, even if some are older than the min_retention_time. This must be at least 1 since a backup must always exist to allow new backups to be made (default 1) @@ -145,7 +147,7 @@ Usage of vtbackup: --stats_common_tags strings Comma-separated list of common tags for the stats backend. It provides both label and values. Example: label1:value1,label2:value2 --stats_drop_variables string Variables to be dropped from the list of exported variables. --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --tablet_manager_grpc_ca string the server ca to use to validate servers when connecting --tablet_manager_grpc_cert string the cert to use to connect --tablet_manager_grpc_concurrency int concurrency to use to talk to a vttablet server for performance-sensitive RPCs (like ExecuteFetchAs{Dba,AllPrivs,App}) (default 8) @@ -173,7 +175,7 @@ Usage of vtbackup: --topo_zk_tls_key string the key to use to connect to the zk topo server, enables TLS --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --xbstream_restore_flags string Flags to pass to xbstream command during restore. These should be space separated and will be added to the end of the command. These need to match the ones used for backup e.g. --compress / --decompress, --encrypt / --decrypt --xtrabackup_backup_flags string Flags to pass to backup command. These should be space separated and will be added to the end of the command --xtrabackup_prepare_flags string Flags to pass to prepare command. These should be space separated and will be added to the end of the command diff --git a/go/flags/endtoend/vtctlclient.txt b/go/flags/endtoend/vtctlclient.txt index 207f31905f2..9f9aa042a2d 100644 --- a/go/flags/endtoend/vtctlclient.txt +++ b/go/flags/endtoend/vtctlclient.txt @@ -16,23 +16,25 @@ Usage of vtctlclient: --jaeger-agent-host string host and port to send spans to. if empty, no tracing will be done --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --pprof strings enable profiling --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --server string server to use for connection - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --tracer string tracing service to use (default "noop") --tracing-enable-logging whether to enable logging in the tracing service --tracing-sampling-rate float sampling rate for the probabilistic jaeger sampler (default 0.1) --tracing-sampling-type string sampling strategy to use for jaeger. possible values are 'const', 'probabilistic', 'rateLimiting', or 'remote' (default "const") --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vtctl_client_protocol string Protocol to use to talk to the vtctl server. (default "grpc") --vtctld_grpc_ca string the server ca to use to validate servers when connecting --vtctld_grpc_cert string the cert to use to connect diff --git a/go/flags/endtoend/vtctld.txt b/go/flags/endtoend/vtctld.txt index a252a7f1ff8..391d2e66cc5 100644 --- a/go/flags/endtoend/vtctld.txt +++ b/go/flags/endtoend/vtctld.txt @@ -62,10 +62,12 @@ Usage of vtctld: --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) @@ -100,7 +102,7 @@ Usage of vtctld: --stats_common_tags strings Comma-separated list of common tags for the stats backend. It provides both label and values. Example: label1:value1,label2:value2 --stats_drop_variables string Variables to be dropped from the list of exported variables. --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --tablet_dir string The directory within the vtdataroot to store vttablet/mysql files. Defaults to being generated by the tablet uid. --tablet_grpc_ca string the server ca to use to validate servers when connecting --tablet_grpc_cert string the cert to use to connect @@ -147,6 +149,6 @@ Usage of vtctld: --tracing-sampling-type string sampling strategy to use for jaeger. possible values are 'const', 'probabilistic', 'rateLimiting', or 'remote' (default "const") --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vtctl_healthcheck_topology_refresh duration refresh interval for re-reading the topology (default 30s) --vtctld_sanitize_log_messages When true, vtctld sanitizes logging. diff --git a/go/flags/endtoend/vtctldclient.txt b/go/flags/endtoend/vtctldclient.txt index 41c0b64076f..9f1e7d3240f 100644 --- a/go/flags/endtoend/vtctldclient.txt +++ b/go/flags/endtoend/vtctldclient.txt @@ -105,18 +105,20 @@ Flags: -h, --help help for vtctldclient --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --server string server to use for connection (required) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) -v, --v Level log level for V logs --version version for vtctldclient - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vtctl_client_protocol string Protocol to use to talk to the vtctl server. (default "grpc") --vtctld_grpc_ca string the server ca to use to validate servers when connecting --vtctld_grpc_cert string the cert to use to connect diff --git a/go/flags/endtoend/vtexplain.txt b/go/flags/endtoend/vtexplain.txt index a70067a9bc8..9044432fbec 100644 --- a/go/flags/endtoend/vtexplain.txt +++ b/go/flags/endtoend/vtexplain.txt @@ -9,10 +9,12 @@ Usage of vtexplain: --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --ks-shard-map string JSON map of keyspace name -> shard name -> ShardReference object. The inner map is the same as the output of FindAllShardsInKeyspace --ks-shard-map-file string File containing json blob of keyspace name -> shard name -> ShardReference object - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --normalize Whether to enable vtgate normalization @@ -29,9 +31,9 @@ Usage of vtexplain: --sql-file string Identifies the file that contains the SQL commands to analyze --sql-max-length-errors int truncate queries in error logs to the given length (default unlimited) --sql-max-length-ui int truncate queries in debug UIs to the given length (default 512) (default 512) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vschema string Identifies the VTGate routing schema --vschema-file string Identifies the VTGate routing schema file diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index 946b10a39b2..70ca393aff7 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -72,11 +72,13 @@ Usage of vtgate: --legacy_replication_lag_algorithm Use the legacy algorithm when selecting vttablets for serving. (default true) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) --lock_heartbeat_time duration If there is lock function used. This will keep the lock connection active by using this heartbeat (default 5s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_queries_to_file string Enable query logging to the specified file --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --max_memory_rows int Maximum number of rows that will be held in memory for intermediate results as well as the final result. (default 300000) @@ -155,7 +157,7 @@ Usage of vtgate: --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) --statsd_address string Address for statsd client --statsd_sample_rate float Sample rate for statsd metrics (default 1) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --stream_buffer_size int the number of bytes sent from vtgate for each stream call. It's recommended to keep this value in sync with vttablet's query-server-config-stream-buffer-size. (default 32768) --tablet_filters strings Specifies a comma-separated list of 'keyspace|shard_name or keyrange' values to filter the tablets to watch. --tablet_grpc_ca string the server ca to use to validate servers when connecting @@ -196,7 +198,7 @@ Usage of vtgate: --transaction_mode string SINGLE: disallow multi-db transactions, MULTI: allow multi-db transactions with best effort commit, TWOPC: allow multi-db transactions with 2pc commit (default "MULTI") --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vschema_ddl_authorized_users string List of users authorized to execute vschema ddl operations, or '%' to allow all users. --vtctld_addr string address of a vtctld instance --vtgate-config-terse-errors prevent bind vars from escaping in returned errors diff --git a/go/flags/endtoend/vtgr.txt b/go/flags/endtoend/vtgr.txt index 9e0798f9fca..12aa678de62 100644 --- a/go/flags/endtoend/vtgr.txt +++ b/go/flags/endtoend/vtgr.txt @@ -23,10 +23,12 @@ Usage of vtgr: --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --ping_tablet_timeout duration time to wait when we ping a tablet (default 2s) --pprof strings enable profiling @@ -41,7 +43,7 @@ Usage of vtgr: --stats_common_tags strings Comma-separated list of common tags for the stats backend. It provides both label and values. Example: label1:value1,label2:value2 --stats_drop_variables string Variables to be dropped from the list of exported variables. --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --tablet_manager_grpc_ca string the server ca to use to validate servers when connecting --tablet_manager_grpc_cert string the cert to use to connect --tablet_manager_grpc_concurrency int concurrency to use to talk to a vttablet server for performance-sensitive RPCs (like ExecuteFetchAs{Dba,AllPrivs,App}) (default 8) @@ -69,5 +71,5 @@ Usage of vtgr: --topo_zk_tls_key string the key to use to connect to the zk topo server, enables TLS --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vtgr_config string Config file for vtgr. diff --git a/go/flags/endtoend/vtorc.txt b/go/flags/endtoend/vtorc.txt index 68ffda88f1e..17cce68ea0d 100644 --- a/go/flags/endtoend/vtorc.txt +++ b/go/flags/endtoend/vtorc.txt @@ -24,10 +24,12 @@ Usage of vtorc: --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) @@ -50,7 +52,7 @@ Usage of vtorc: --stats_common_tags strings Comma-separated list of common tags for the stats backend. It provides both label and values. Example: label1:value1,label2:value2 --stats_drop_variables string Variables to be dropped from the list of exported variables. --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --tablet_manager_grpc_ca string the server ca to use to validate servers when connecting --tablet_manager_grpc_cert string the cert to use to connect --tablet_manager_grpc_concurrency int concurrency to use to talk to a vttablet server for performance-sensitive RPCs (like ExecuteFetchAs{Dba,AllPrivs,App}) (default 8) @@ -82,5 +84,5 @@ Usage of vtorc: --topo_zk_tls_key string the key to use to connect to the zk topo server, enables TLS --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --wait-replicas-timeout duration Duration for which to wait for replica's to respond when issuing RPCs (default 30s) diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index 9902b4b2076..c8fa87920ca 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -161,12 +161,14 @@ Usage of vttablet: --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) --lock_tables_timeout duration How long to keep the table locked before timing out (default 1m0s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_queries Enable query logging to syslog. --log_queries_to_file string Enable query logging to the specified file --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --max_concurrent_online_ddl int Maximum number of online DDL changes that may run concurrently (default 256) @@ -276,7 +278,7 @@ Usage of vttablet: --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) --statsd_address string Address for statsd client --statsd_sample_rate float Sample rate for statsd metrics (default 1) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --stream_health_buffer_size uint max streaming health entries to buffer per streaming health client (default 20) --table-acl-config string path to table access checker config file; send SIGHUP to reload this file --table-acl-config-reload-interval duration Ticker to reload ACLs. Duration flag, format e.g.: 30s. Default: do not reload @@ -349,7 +351,7 @@ Usage of vttablet: --use_super_read_only Set super_read_only flag when performing planned failover. --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vreplication-parallel-insert-workers int Number of parallel insertion workers to use during copy phase. Set <= 1 to disable parallelism, or > 1 to enable concurrent insertion during copy phase. (default 1) --vreplication_copy_phase_duration duration Duration for each copy phase loop (before running the next catchup: default 1h) (default 1h0m0s) --vreplication_copy_phase_max_innodb_history_list_length int The maximum InnoDB transaction history that can exist on a vstreamer (source) before starting another round of copying rows. This helps to limit the impact on the source tablet. (default 1000000) diff --git a/go/flags/endtoend/vttestserver.txt b/go/flags/endtoend/vttestserver.txt index 193070c5161..b63bc1ad30f 100644 --- a/go/flags/endtoend/vttestserver.txt +++ b/go/flags/endtoend/vttestserver.txt @@ -61,10 +61,12 @@ Usage of vttestserver: --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --keyspaces strings Comma separated list of keyspaces (default [test_keyspace]) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) --max_table_shard_size int The maximum number of initial rows in a table shard. Ignored if--initialize_with_random_data is false. The actual number is chosen randomly (default 10000) @@ -97,7 +99,7 @@ Usage of vttestserver: --snapshot_file string A MySQL DB snapshot file --sql-max-length-errors int truncate queries in error logs to the given length (default unlimited) --sql-max-length-ui int truncate queries in debug UIs to the given length (default 512) (default 512) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --tablet_dir string The directory within the vtdataroot to store vttablet/mysql files. Defaults to being generated by the tablet uid. --tablet_hostname string The hostname to use for the tablet otherwise it will be derived from OS' hostname (default "localhost") --tablet_manager_grpc_ca string the server ca to use to validate servers when connecting @@ -122,7 +124,7 @@ Usage of vttestserver: --transaction_mode string Transaction mode MULTI (default), SINGLE or TWOPC (default "MULTI") --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vschema_ddl_authorized_users string Comma separated list of users authorized to execute vschema ddl operations via vtgate --vtctl_client_protocol string Protocol to use to talk to the vtctl server. (default "grpc") --vtctld_grpc_ca string the server ca to use to validate servers when connecting diff --git a/go/flags/endtoend/zkctl.txt b/go/flags/endtoend/zkctl.txt index e7e41c4cb4d..58712c4e3b7 100644 --- a/go/flags/endtoend/zkctl.txt +++ b/go/flags/endtoend/zkctl.txt @@ -1,18 +1,20 @@ Usage of zkctl: - --alsologtostderr log to standard error as well as files - -h, --help display usage and exit - --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) - --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) - --log_dir string If non-empty, write log files in this directory - --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 - --pprof strings enable profiling - --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) - --v Level log level for V logs - -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging - --zk.cfg string zkid@server1:leaderPort1:electionPort1:clientPort1,...) (default "6@:3801:3802:3803") - --zk.myid uint which server do you want to be? only needed when running multiple instance on one box, otherwise myid is implied by hostname + --alsologtostderr log to standard error as well as files + -h, --help display usage and exit + --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) + --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace + --log_dir string If non-empty, write log files in this directory + --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files + --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. + --logtostderr log to standard error instead of files + --pprof strings enable profiling + --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) + --v Level log level for V logs + -v, --version print binary version + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging + --zk.cfg string zkid@server1:leaderPort1:electionPort1:clientPort1,...) (default "6@:3801:3802:3803") + --zk.myid uint which server do you want to be? only needed when running multiple instance on one box, otherwise myid is implied by hostname diff --git a/go/flags/endtoend/zkctld.txt b/go/flags/endtoend/zkctld.txt index 6ec026be814..d3e775916c4 100644 --- a/go/flags/endtoend/zkctld.txt +++ b/go/flags/endtoend/zkctld.txt @@ -1,19 +1,21 @@ Usage of zkctld: - --alsologtostderr log to standard error as well as files - -h, --help display usage and exit - --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) - --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) - --log_dir string If non-empty, write log files in this directory - --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 - --pprof strings enable profiling - --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) - --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) - --v Level log level for V logs - -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging - --zk.cfg string zkid@server1:leaderPort1:electionPort1:clientPort1,...) (default "6@:3801:3802:3803") - --zk.myid uint which server do you want to be? only needed when running multiple instance on one box, otherwise myid is implied by hostname + --alsologtostderr log to standard error as well as files + -h, --help display usage and exit + --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) + --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace + --log_dir string If non-empty, write log files in this directory + --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files + --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. + --logtostderr log to standard error instead of files + --pprof strings enable profiling + --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) + --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) + --v Level log level for V logs + -v, --version print binary version + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging + --zk.cfg string zkid@server1:leaderPort1:electionPort1:clientPort1,...) (default "6@:3801:3802:3803") + --zk.myid uint which server do you want to be? only needed when running multiple instance on one box, otherwise myid is implied by hostname diff --git a/go/test/endtoend/cluster/mysqlctld_process.go b/go/test/endtoend/cluster/mysqlctld_process.go index d71f2e3b1c8..13e9297fa7c 100644 --- a/go/test/endtoend/cluster/mysqlctld_process.go +++ b/go/test/endtoend/cluster/mysqlctld_process.go @@ -78,7 +78,15 @@ func (mysqlctld *MysqlctldProcess) Start() error { "--init_db_sql_file", mysqlctld.InitDBFile) } - errFile, _ := os.Create(path.Join(mysqlctld.LogDirectory, "mysqlctld-stderr.txt")) + err := os.MkdirAll(mysqlctld.LogDirectory, 0755) + if err != nil { + log.Errorf("Failed to create directory for mysqlctld logs: %v", err) + return err + } + errFile, err := os.Create(path.Join(mysqlctld.LogDirectory, "mysqlctld-stderr.txt")) + if err != nil { + log.Errorf("Failed to create directory for mysqlctld stderr: %v", err) + } tempProcess.Stderr = errFile tempProcess.Env = append(tempProcess.Env, os.Environ()...) @@ -87,7 +95,7 @@ func (mysqlctld *MysqlctldProcess) Start() error { log.Infof("%v", strings.Join(tempProcess.Args, " ")) - err := tempProcess.Start() + err = tempProcess.Start() if err != nil { return err } diff --git a/go/test/endtoend/cluster/topo_process.go b/go/test/endtoend/cluster/topo_process.go index 7326aa57a52..fd6f3c2f27b 100644 --- a/go/test/endtoend/cluster/topo_process.go +++ b/go/test/endtoend/cluster/topo_process.go @@ -124,11 +124,10 @@ func (topo *TopoProcess) SetupEtcd() (err error) { // SetupZookeeper spawns a new zookeeper topo service and initializes it with the defaults. // The service is kept running in the background until TearDown() is called. -func (topo *TopoProcess) SetupZookeeper(cluster *LocalProcessCluster) (err error) { - +func (topo *TopoProcess) SetupZookeeper(cluster *LocalProcessCluster) error { host, err := os.Hostname() if err != nil { - return + return err } topo.ZKPorts = fmt.Sprintf("%d:%d:%d", cluster.GetAndReservePort(), cluster.GetAndReservePort(), topo.Port) @@ -140,16 +139,21 @@ func (topo *TopoProcess) SetupZookeeper(cluster *LocalProcessCluster) (err error "init", ) - errFile, _ := os.Create(path.Join(topo.DataDirectory, "topo-stderr.txt")) + err = os.MkdirAll(topo.LogDirectory, 0755) + if err != nil { + log.Errorf("Failed to create log directory for zookeeper: %v", err) + return err + } + errFile, err := os.Create(path.Join(topo.LogDirectory, "topo-stderr.txt")) + if err != nil { + log.Errorf("Failed to create file for zookeeper stderr: %v", err) + return err + } topo.proc.Stderr = errFile topo.proc.Env = append(topo.proc.Env, os.Environ()...) log.Infof("Starting zookeeper with args %v", strings.Join(topo.proc.Args, " ")) - err = topo.proc.Run() - if err != nil { - return - } - return + return topo.proc.Run() } // ConsulConfigs are the configurations that are added the config files which are used by consul @@ -174,13 +178,25 @@ func (topo *TopoProcess) SetupConsul(cluster *LocalProcessCluster) (err error) { topo.VerifyURL = fmt.Sprintf("http://%s:%d/v1/kv/?keys", topo.Host, topo.Port) - _ = os.MkdirAll(topo.LogDirectory, os.ModePerm) - _ = os.MkdirAll(topo.DataDirectory, os.ModePerm) + err = os.MkdirAll(topo.LogDirectory, os.ModePerm) + if err != nil { + log.Errorf("Failed to create directory for consul logs: %v", err) + return + } + err = os.MkdirAll(topo.DataDirectory, os.ModePerm) + if err != nil { + log.Errorf("Failed to create directory for consul data: %v", err) + return + } configFile := path.Join(os.Getenv("VTDATAROOT"), "consul.json") logFile := path.Join(topo.LogDirectory, "/consul.log") - _, _ = os.Create(logFile) + _, err = os.Create(logFile) + if err != nil { + log.Errorf("Failed to create file for consul logs: %v", err) + return + } var config []byte configs := ConsulConfigs{ @@ -214,7 +230,11 @@ func (topo *TopoProcess) SetupConsul(cluster *LocalProcessCluster) (err error) { "-config-file", configFile, ) - errFile, _ := os.Create(path.Join(topo.DataDirectory, "topo-stderr.txt")) + errFile, err := os.Create(path.Join(topo.LogDirectory, "topo-stderr.txt")) + if err != nil { + log.Errorf("Failed to create file for consul stderr: %v", err) + return + } topo.proc.Stderr = errFile topo.proc.Env = append(topo.proc.Env, os.Environ()...) diff --git a/go/test/endtoend/cluster/vtctld_process.go b/go/test/endtoend/cluster/vtctld_process.go index 5e85f172ce1..4138390dbff 100644 --- a/go/test/endtoend/cluster/vtctld_process.go +++ b/go/test/endtoend/cluster/vtctld_process.go @@ -70,7 +70,16 @@ func (vtctld *VtctldProcess) Setup(cell string, extraArgs ...string) (err error) } vtctld.proc.Args = append(vtctld.proc.Args, extraArgs...) - errFile, _ := os.Create(path.Join(vtctld.LogDir, "vtctld-stderr.txt")) + err = os.MkdirAll(vtctld.LogDir, 0755) + if err != nil { + log.Errorf("cannot create log directory for vtctld: %v", err) + return err + } + errFile, err := os.Create(path.Join(vtctld.LogDir, "vtctld-stderr.txt")) + if err != nil { + log.Errorf("cannot create error log file for vtctld: %v", err) + return err + } vtctld.proc.Stderr = errFile vtctld.proc.Env = append(vtctld.proc.Env, os.Environ()...) diff --git a/go/test/endtoend/cluster/vtgate_process.go b/go/test/endtoend/cluster/vtgate_process.go index f037f53a055..eef34ae583d 100644 --- a/go/test/endtoend/cluster/vtgate_process.go +++ b/go/test/endtoend/cluster/vtgate_process.go @@ -123,7 +123,11 @@ func (vtgate *VtgateProcess) Setup() (err error) { vtgate.proc.Args = append(vtgate.proc.Args, vtgate.ExtraArgs...) - errFile, _ := os.Create(path.Join(vtgate.LogDir, "vtgate-stderr.txt")) + errFile, err := os.Create(path.Join(vtgate.LogDir, "vtgate-stderr.txt")) + if err != nil { + log.Errorf("cannot create error log file for vtgate: %v", err) + return err + } vtgate.proc.Stderr = errFile vtgate.proc.Env = append(vtgate.proc.Env, os.Environ()...) diff --git a/go/test/endtoend/cluster/vtorc_process.go b/go/test/endtoend/cluster/vtorc_process.go index 57347bb68e0..3502b794ed1 100644 --- a/go/test/endtoend/cluster/vtorc_process.go +++ b/go/test/endtoend/cluster/vtorc_process.go @@ -85,7 +85,16 @@ func (orc *VTOrcProcess) Setup() (err error) { // create the configuration file timeNow := time.Now().UnixNano() - configFile, _ := os.Create(path.Join(orc.LogDir, fmt.Sprintf("orc-config-%d.json", timeNow))) + err = os.MkdirAll(orc.LogDir, 0755) + if err != nil { + log.Errorf("cannot create log directory for vtorc: %v", err) + return err + } + configFile, err := os.Create(path.Join(orc.LogDir, fmt.Sprintf("orc-config-%d.json", timeNow))) + if err != nil { + log.Errorf("cannot create config file for vtorc: %v", err) + return err + } orc.ConfigPath = configFile.Name() // Add the default configurations and print them out @@ -128,7 +137,11 @@ func (orc *VTOrcProcess) Setup() (err error) { if orc.LogFileName == "" { orc.LogFileName = fmt.Sprintf("orc-stderr-%d.txt", timeNow) } - errFile, _ := os.Create(path.Join(orc.LogDir, orc.LogFileName)) + errFile, err := os.Create(path.Join(orc.LogDir, orc.LogFileName)) + if err != nil { + log.Errorf("cannot create error log file for vtorc: %v", err) + return err + } orc.proc.Stderr = errFile orc.proc.Env = append(orc.proc.Env, os.Environ()...) diff --git a/go/test/endtoend/recovery/pitr/binlog_server.go b/go/test/endtoend/recovery/pitr/binlog_server.go index 764af2b57cf..3b78b0d4ad7 100644 --- a/go/test/endtoend/recovery/pitr/binlog_server.go +++ b/go/test/endtoend/recovery/pitr/binlog_server.go @@ -93,14 +93,18 @@ func (bs *binLogServer) start(source mysqlSource) error { bs.proc.Args = append(bs.proc.Args, fmt.Sprintf("-ripple_master_password=%s", source.password)) } - errFile, _ := os.Create(path.Join(bs.dataDirectory, "log.txt")) + errFile, err := os.Create(path.Join(bs.dataDirectory, "log.txt")) + if err != nil { + log.Errorf("cannot create error log file for binlog server: %v", err) + return err + } bs.proc.Stderr = errFile bs.proc.Env = append(bs.proc.Env, os.Environ()...) log.Infof("Running binlog server with command: %v", strings.Join(bs.proc.Args, " ")) - err := bs.proc.Start() + err = bs.proc.Start() if err != nil { return err } diff --git a/go/vt/proto/automation/automation.pb.go b/go/vt/proto/automation/automation.pb.go index 45a2d192e46..6af0174f27b 100644 --- a/go/vt/proto/automation/automation.pb.go +++ b/go/vt/proto/automation/automation.pb.go @@ -20,7 +20,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: automation.proto diff --git a/go/vt/proto/automationservice/automationservice.pb.go b/go/vt/proto/automationservice/automationservice.pb.go index 2c3ff0b031c..0df7a6bc513 100644 --- a/go/vt/proto/automationservice/automationservice.pb.go +++ b/go/vt/proto/automationservice/automationservice.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: automationservice.proto diff --git a/go/vt/proto/binlogdata/binlogdata.pb.go b/go/vt/proto/binlogdata/binlogdata.pb.go index df2467d3e3c..5a26114225d 100644 --- a/go/vt/proto/binlogdata/binlogdata.pb.go +++ b/go/vt/proto/binlogdata/binlogdata.pb.go @@ -19,7 +19,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: binlogdata.proto diff --git a/go/vt/proto/binlogservice/binlogservice.pb.go b/go/vt/proto/binlogservice/binlogservice.pb.go index 44b47ac33f7..4ff35fbe17d 100644 --- a/go/vt/proto/binlogservice/binlogservice.pb.go +++ b/go/vt/proto/binlogservice/binlogservice.pb.go @@ -19,7 +19,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: binlogservice.proto diff --git a/go/vt/proto/logutil/logutil.pb.go b/go/vt/proto/logutil/logutil.pb.go index 4e41806d4a8..619328301bc 100644 --- a/go/vt/proto/logutil/logutil.pb.go +++ b/go/vt/proto/logutil/logutil.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: logutil.proto diff --git a/go/vt/proto/mysqlctl/mysqlctl.pb.go b/go/vt/proto/mysqlctl/mysqlctl.pb.go index b6a407ea601..20e4a0b629f 100644 --- a/go/vt/proto/mysqlctl/mysqlctl.pb.go +++ b/go/vt/proto/mysqlctl/mysqlctl.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: mysqlctl.proto diff --git a/go/vt/proto/query/query.pb.go b/go/vt/proto/query/query.pb.go index 29302b4e662..fa35af2306a 100644 --- a/go/vt/proto/query/query.pb.go +++ b/go/vt/proto/query/query.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: query.proto diff --git a/go/vt/proto/queryservice/queryservice.pb.go b/go/vt/proto/queryservice/queryservice.pb.go index 3d72458cb27..4a1a0b83307 100644 --- a/go/vt/proto/queryservice/queryservice.pb.go +++ b/go/vt/proto/queryservice/queryservice.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: queryservice.proto diff --git a/go/vt/proto/replicationdata/replicationdata.pb.go b/go/vt/proto/replicationdata/replicationdata.pb.go index 55bcdf99b55..f6436b483e9 100644 --- a/go/vt/proto/replicationdata/replicationdata.pb.go +++ b/go/vt/proto/replicationdata/replicationdata.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: replicationdata.proto diff --git a/go/vt/proto/tableacl/tableacl.pb.go b/go/vt/proto/tableacl/tableacl.pb.go index bdf863601be..53fbd4714bd 100644 --- a/go/vt/proto/tableacl/tableacl.pb.go +++ b/go/vt/proto/tableacl/tableacl.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: tableacl.proto diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go index 8104614f35d..22d95343a6f 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: tabletmanagerdata.proto diff --git a/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go b/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go index 1d5c48420ac..842df18beb5 100644 --- a/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go +++ b/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: tabletmanagerservice.proto diff --git a/go/vt/proto/throttlerdata/throttlerdata.pb.go b/go/vt/proto/throttlerdata/throttlerdata.pb.go index 8a52d2344f2..a109402cd9e 100644 --- a/go/vt/proto/throttlerdata/throttlerdata.pb.go +++ b/go/vt/proto/throttlerdata/throttlerdata.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: throttlerdata.proto diff --git a/go/vt/proto/throttlerservice/throttlerservice.pb.go b/go/vt/proto/throttlerservice/throttlerservice.pb.go index 83d6f506a79..7bf95215939 100644 --- a/go/vt/proto/throttlerservice/throttlerservice.pb.go +++ b/go/vt/proto/throttlerservice/throttlerservice.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: throttlerservice.proto diff --git a/go/vt/proto/topodata/topodata.pb.go b/go/vt/proto/topodata/topodata.pb.go index 2d129763459..99471b82ea4 100644 --- a/go/vt/proto/topodata/topodata.pb.go +++ b/go/vt/proto/topodata/topodata.pb.go @@ -20,7 +20,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: topodata.proto diff --git a/go/vt/proto/vschema/vschema.pb.go b/go/vt/proto/vschema/vschema.pb.go index e86c1613682..5a7d4f81666 100644 --- a/go/vt/proto/vschema/vschema.pb.go +++ b/go/vt/proto/vschema/vschema.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vschema.proto diff --git a/go/vt/proto/vtadmin/vtadmin.pb.go b/go/vt/proto/vtadmin/vtadmin.pb.go index 8b961cce4ac..15a049accf8 100644 --- a/go/vt/proto/vtadmin/vtadmin.pb.go +++ b/go/vt/proto/vtadmin/vtadmin.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtadmin.proto diff --git a/go/vt/proto/vtctldata/vtctldata.pb.go b/go/vt/proto/vtctldata/vtctldata.pb.go index c6419bf796b..710d34e8d55 100644 --- a/go/vt/proto/vtctldata/vtctldata.pb.go +++ b/go/vt/proto/vtctldata/vtctldata.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtctldata.proto diff --git a/go/vt/proto/vtctlservice/vtctlservice.pb.go b/go/vt/proto/vtctlservice/vtctlservice.pb.go index 615622a97aa..963f5bf1910 100644 --- a/go/vt/proto/vtctlservice/vtctlservice.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtctlservice.proto diff --git a/go/vt/proto/vtgate/vtgate.pb.go b/go/vt/proto/vtgate/vtgate.pb.go index 8f06d90a76c..6ba80e897dd 100644 --- a/go/vt/proto/vtgate/vtgate.pb.go +++ b/go/vt/proto/vtgate/vtgate.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtgate.proto diff --git a/go/vt/proto/vtgateservice/vtgateservice.pb.go b/go/vt/proto/vtgateservice/vtgateservice.pb.go index 7c7d049867d..ba174dec2ea 100644 --- a/go/vt/proto/vtgateservice/vtgateservice.pb.go +++ b/go/vt/proto/vtgateservice/vtgateservice.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtgateservice.proto diff --git a/go/vt/proto/vtrpc/vtrpc.pb.go b/go/vt/proto/vtrpc/vtrpc.pb.go index abde129b474..e45d6f37849 100644 --- a/go/vt/proto/vtrpc/vtrpc.pb.go +++ b/go/vt/proto/vtrpc/vtrpc.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtrpc.proto diff --git a/go/vt/proto/vttest/vttest.pb.go b/go/vt/proto/vttest/vttest.pb.go index 0ab40f16929..18ab7a83bb9 100644 --- a/go/vt/proto/vttest/vttest.pb.go +++ b/go/vt/proto/vttest/vttest.pb.go @@ -41,7 +41,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vttest.proto diff --git a/go/vt/proto/vttime/vttime.pb.go b/go/vt/proto/vttime/vttime.pb.go index 96ac33eecd9..ae64898857b 100644 --- a/go/vt/proto/vttime/vttime.pb.go +++ b/go/vt/proto/vttime/vttime.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vttime.proto From 8ad107652a239d342de63d33638a7668a37a347f Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 15:18:31 -0700 Subject: [PATCH 219/233] [release-16.0] Make column resolution closer to MySQL (#14426) (#14428) Signed-off-by: Andres Taylor Signed-off-by: Harshit Gangal Co-authored-by: Andres Taylor Co-authored-by: Harshit Gangal --- go/vt/vtgate/planbuilder/horizon_planning.go | 13 +-- .../planbuilder/operators/queryprojection.go | 59 ++++++++------ .../planbuilder/testdata/aggr_cases.json | 8 +- .../planbuilder/testdata/select_cases.json | 79 +++++++++++++++++++ 4 files changed, 120 insertions(+), 39 deletions(-) diff --git a/go/vt/vtgate/planbuilder/horizon_planning.go b/go/vt/vtgate/planbuilder/horizon_planning.go index 4e33f62ebe5..a1507d191be 100644 --- a/go/vt/vtgate/planbuilder/horizon_planning.go +++ b/go/vt/vtgate/planbuilder/horizon_planning.go @@ -517,10 +517,8 @@ func (hp *horizonPlanning) handleDistinctAggr(ctx *plancontext.PlanningContext, continue } - inner, innerWS, err := hp.qp.GetSimplifiedExpr(expr.Func.GetArg()) - if err != nil { - return nil, nil, nil, err - } + inner := expr.Func.GetArg() + innerWS := hp.qp.GetSimplifiedExpr(inner) if exprHasVindex(ctx.SemTable, innerWS, false) { aggrs = append(aggrs, expr) continue @@ -576,13 +574,10 @@ func newOffset(col int) offsets { func (hp *horizonPlanning) createGroupingsForColumns(columns []*sqlparser.ColName) ([]operators.GroupBy, error) { var lhsGrouping []operators.GroupBy for _, lhsColumn := range columns { - expr, wsExpr, err := hp.qp.GetSimplifiedExpr(lhsColumn) - if err != nil { - return nil, err - } + wsExpr := hp.qp.GetSimplifiedExpr(lhsColumn) lhsGrouping = append(lhsGrouping, operators.GroupBy{ - Inner: expr, + Inner: lhsColumn, WeightStrExpr: wsExpr, }) } diff --git a/go/vt/vtgate/planbuilder/operators/queryprojection.go b/go/vt/vtgate/planbuilder/operators/queryprojection.go index 8de53a762be..af12323f8cb 100644 --- a/go/vt/vtgate/planbuilder/operators/queryprojection.go +++ b/go/vt/vtgate/planbuilder/operators/queryprojection.go @@ -154,17 +154,14 @@ func CreateQPFromSelect(ctx *plancontext.PlanningContext, sel *sqlparser.Select) } for _, group := range sel.GroupBy { selectExprIdx, aliasExpr := qp.FindSelectExprIndexForExpr(ctx, group) - expr, weightStrExpr, err := qp.GetSimplifiedExpr(group) - if err != nil { - return nil, err - } + weightStrExpr := qp.GetSimplifiedExpr(group) err = checkForInvalidGroupingExpressions(weightStrExpr) if err != nil { return nil, err } groupBy := GroupBy{ - Inner: expr, + Inner: group, WeightStrExpr: weightStrExpr, InnerIndex: selectExprIdx, aliasedExpr: aliasExpr, @@ -292,17 +289,14 @@ func CreateQPFromUnion(union *sqlparser.Union) (*QueryProjection, error) { func (qp *QueryProjection) addOrderBy(orderBy sqlparser.OrderBy) error { canPushDownSorting := true for _, order := range orderBy { - expr, weightStrExpr, err := qp.GetSimplifiedExpr(order.Expr) - if err != nil { - return err - } + weightStrExpr := qp.GetSimplifiedExpr(order.Expr) if sqlparser.IsNull(weightStrExpr) { // ORDER BY null can safely be ignored continue } qp.OrderExprs = append(qp.OrderExprs, OrderBy{ Inner: &sqlparser.Order{ - Expr: expr, + Expr: order.Expr, Direction: order.Direction, }, WeightStrExpr: weightStrExpr, @@ -348,34 +342,47 @@ func (qp *QueryProjection) isExprInGroupByExprs(ctx *plancontext.PlanningContext } // GetSimplifiedExpr takes an expression used in ORDER BY or GROUP BY, and returns an expression that is simpler to evaluate -func (qp *QueryProjection) GetSimplifiedExpr(e sqlparser.Expr) (expr sqlparser.Expr, weightStrExpr sqlparser.Expr, err error) { +func (qp *QueryProjection) GetSimplifiedExpr(e sqlparser.Expr) (found sqlparser.Expr) { + if qp == nil { + return e + } // If the ORDER BY is against a column alias, we need to remember the expression // behind the alias. The weightstring(.) calls needs to be done against that expression and not the alias. // Eg - select music.foo as bar, weightstring(music.foo) from music order by bar - colExpr, isColName := e.(*sqlparser.ColName) - if !isColName { - return e, e, nil - } - - if sqlparser.IsNull(e) { - return e, nil, nil + in, isColName := e.(*sqlparser.ColName) + if !(isColName && in.Qualifier.IsEmpty()) { + // we are only interested in unqualified column names. if it's not a column name and not unqualified, we're done + return e } - if colExpr.Qualifier.IsEmpty() { - for _, selectExpr := range qp.SelectExprs { - aliasedExpr, isAliasedExpr := selectExpr.Col.(*sqlparser.AliasedExpr) - if !isAliasedExpr { + for _, selectExpr := range qp.SelectExprs { + ae, ok := selectExpr.Col.(*sqlparser.AliasedExpr) + if !ok { + continue + } + aliased := !ae.As.IsEmpty() + if aliased { + if in.Name.Equal(ae.As) { + return ae.Expr + } + } else { + seCol, ok := ae.Expr.(*sqlparser.ColName) + if !ok { continue } - isAliasExpr := !aliasedExpr.As.IsEmpty() - if isAliasExpr && colExpr.Name.Equal(aliasedExpr.As) { - return e, aliasedExpr.Expr, nil + if seCol.Name.Equal(in.Name) { + // If the column name matches, we have a match, even if the table name is not listed + return ae.Expr } } } - return e, e, nil + if found == nil { + found = e + } + + return found } // toString should only be used for tests diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index d1dedaa8d88..048c01b378e 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -4403,9 +4403,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select id, b as id, count(*), weight_string(b) from `user` where 1 != 1", + "FieldQuery": "select id, b as id, count(*), weight_string(id) from `user` where 1 != 1", "OrderBy": "(1|3) ASC", - "Query": "select id, b as id, count(*), weight_string(b) from `user` order by id asc", + "Query": "select id, b as id, count(*), weight_string(id) from `user` order by id asc", "Table": "`user`" } ] @@ -4499,9 +4499,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select id, weight_string(id) from `user` where 1 != 1 group by id, weight_string(id)", + "FieldQuery": "select id, weight_string(`user`.id) from `user` where 1 != 1 group by id, weight_string(`user`.id)", "OrderBy": "(0|1) ASC", - "Query": "select id, weight_string(id) from `user` group by id, weight_string(id) order by id asc", + "Query": "select id, weight_string(`user`.id) from `user` group by id, weight_string(`user`.id) order by id asc", "Table": "`user`" }, { diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index 57e48630c0e..9a448e7a7cb 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -8356,5 +8356,84 @@ "user.customer" ] } + }, + { + "comment": "column with qualifier is correctly used", + "query": "select u.foo, ue.foo as apa from user u, user_extra ue order by foo ", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select u.foo, ue.foo as apa from user u, user_extra ue order by foo ", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0,R:0", + "TableName": "`user`_user_extra", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select u.foo, weight_string(u.foo) from `user` as u where 1 != 1", + "OrderBy": "(0|1) ASC", + "Query": "select u.foo, weight_string(u.foo) from `user` as u order by foo asc", + "ResultColumns": 1, + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select ue.foo as apa from user_extra as ue where 1 != 1", + "Query": "select ue.foo as apa from user_extra as ue", + "Table": "user_extra" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select u.foo, ue.foo as apa from user u, user_extra ue order by foo ", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0,R:0", + "TableName": "`user`_user_extra", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select u.foo, weight_string(u.foo) from `user` as u where 1 != 1", + "OrderBy": "(0|1) ASC", + "Query": "select u.foo, weight_string(u.foo) from `user` as u order by foo asc", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select ue.foo as apa from user_extra as ue where 1 != 1", + "Query": "select ue.foo as apa from user_extra as ue", + "Table": "user_extra" + } + ] + }, + "TablesUsed": [ + "user.user", + "user.user_extra" + ] + } } ] From 79dd08a80fd20b4b45289a1c7c23658e3f73e1fc Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 15:18:47 -0700 Subject: [PATCH 220/233] [release-16.0] vtgate: Allow additional errors in warnings test (#14461) (#14463) Signed-off-by: Dirkjan Bussink Signed-off-by: Harshit Gangal Co-authored-by: Dirkjan Bussink --- .../endtoend/vtgate/errors_as_warnings/main_test.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/go/test/endtoend/vtgate/errors_as_warnings/main_test.go b/go/test/endtoend/vtgate/errors_as_warnings/main_test.go index 99d47a21227..fdeb73e2780 100644 --- a/go/test/endtoend/vtgate/errors_as_warnings/main_test.go +++ b/go/test/endtoend/vtgate/errors_as_warnings/main_test.go @@ -139,10 +139,17 @@ func TestScatterErrsAsWarns(t *testing.T) { utils.Exec(t, mode.conn, "use @replica") utils.Exec(t, mode.conn, fmt.Sprintf("set workload = %s", mode.m)) + expectedWarnings := []string{ + "operation not allowed in state NOT_SERVING", + "operation not allowed in state SHUTTING_DOWN", + "no valid tablet", + "no healthy tablet", + "mysql.sock: connect: no such file or directory", + } utils.AssertMatches(t, mode.conn, query1, `[[INT64(4)]]`) - assertContainsOneOf(t, mode.conn, showQ, "no valid tablet", "no healthy tablet", "mysql.sock: connect: no such file or directory") + assertContainsOneOf(t, mode.conn, showQ, expectedWarnings...) utils.AssertMatches(t, mode.conn, query2, `[[INT64(4)]]`) - assertContainsOneOf(t, mode.conn, showQ, "no valid tablet", "no healthy tablet", "mysql.sock: connect: no such file or directory") + assertContainsOneOf(t, mode.conn, showQ, expectedWarnings...) // invalid_field should throw error and not warning _, err = mode.conn.ExecuteFetch("SELECT /*vt+ PLANNER=Gen4 SCATTER_ERRORS_AS_WARNINGS */ invalid_field from t1;", 1, false) From c3bd6118aef202dce8560a8bd24cb66d50ba742a Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Sat, 11 Nov 2023 09:22:56 -0800 Subject: [PATCH 221/233] [release-16.0] examples: fix flag syntax for zkctl (#14469) (#14485) Signed-off-by: deepthi Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: deepthi --- .github/workflows/local_example.yml | 2 +- examples/common/scripts/zk-down.sh | 2 +- examples/common/scripts/zk-up.sh | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index ede03c2b931..0f197f9943d 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: os: [ubuntu-22.04] - topo: [consul,etcd,k8s] + topo: [consul,etcd,zk2] steps: - name: Skip CI diff --git a/examples/common/scripts/zk-down.sh b/examples/common/scripts/zk-down.sh index a9fa1e80a30..f244f2b0f05 100755 --- a/examples/common/scripts/zk-down.sh +++ b/examples/common/scripts/zk-down.sh @@ -21,6 +21,6 @@ source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" # Stop ZooKeeper servers. echo "Stopping zk servers..." for zkid in $zkids; do - zkctl -zk.myid $zkid -zk.cfg $zkcfg -log_dir $VTDATAROOT/tmp shutdown + zkctl --zk.myid $zkid --zk.cfg $zkcfg --log_dir $VTDATAROOT/tmp shutdown done diff --git a/examples/common/scripts/zk-up.sh b/examples/common/scripts/zk-up.sh index 519d5305b25..3137ed724cc 100755 --- a/examples/common/scripts/zk-up.sh +++ b/examples/common/scripts/zk-up.sh @@ -19,7 +19,6 @@ source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" cell=${CELL:-'test'} - # Start ZooKeeper servers. # The "zkctl init" command won't return until the server is able to contact its # peers, so we need to start them all in the background and then wait for them. @@ -32,7 +31,7 @@ for zkid in $zkids; do echo " $VTDATAROOT/$zkdir" action='start' fi - zkctl -zk.myid $zkid -zk.cfg $zkcfg -log_dir $VTDATAROOT/tmp $action \ + zkctl --zk.myid $zkid --zk.cfg $zkcfg --log_dir $VTDATAROOT/tmp $action \ > $VTDATAROOT/tmp/zkctl_$zkid.out 2>&1 & pids[$zkid]=$! done From 12d93c7736542b8be6c3dcd8dfab93a9c41532e3 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Sat, 11 Nov 2023 13:31:13 -0500 Subject: [PATCH 222/233] [release-16.0] VDiff: wait for shard streams of one table diff to complete for before starting that of the next table (#14345) (#14380) Signed-off-by: Matt Lord Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Matt Lord --- go/vt/sidecardb/schema/vdiff/vdiff.sql | 2 +- .../tabletmanager/vdiff/engine_test.go | 8 ++--- .../tabletmanager/vdiff/framework_test.go | 2 +- go/vt/vttablet/tabletmanager/vdiff/schema.go | 5 +-- .../tabletmanager/vdiff/table_differ.go | 34 ++++++++++++------- .../tabletmanager/vdiff/workflow_differ.go | 8 +++++ 6 files changed, 39 insertions(+), 20 deletions(-) diff --git a/go/vt/sidecardb/schema/vdiff/vdiff.sql b/go/vt/sidecardb/schema/vdiff/vdiff.sql index 24f5cf6e7ab..7bd6b81e770 100644 --- a/go/vt/sidecardb/schema/vdiff/vdiff.sql +++ b/go/vt/sidecardb/schema/vdiff/vdiff.sql @@ -28,7 +28,7 @@ CREATE TABLE IF NOT EXISTS _vt.vdiff `started_at` timestamp NULL DEFAULT NULL, `liveness_timestamp` timestamp NULL DEFAULT NULL, `completed_at` timestamp NULL DEFAULT NULL, - `last_error` varbinary(512) DEFAULT NULL, + `last_error` varbinary(1024) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uuid_idx` (`vdiff_uuid`), KEY `state` (`state`), diff --git a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go index 55a211475d2..71a28bfd063 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go @@ -84,7 +84,7 @@ func TestEngineOpen(t *testing.T) { ), nil) // Now let's short circuit the vdiff as we know that the open has worked as expected. - shortCircuitTestAfterQuery("update _vt.vdiff set state = 'started', last_error = '' , started_at = utc_timestamp() where id = 1", vdiffenv.dbClient) + shortCircuitTestAfterQuery("update _vt.vdiff set state = 'started', last_error = left('', 1024) , started_at = utc_timestamp() where id = 1", vdiffenv.dbClient) vdenv.vde.Open(context.Background(), vdiffenv.vre) defer vdenv.vde.Close() @@ -131,7 +131,7 @@ func TestVDiff(t *testing.T) { ), fmt.Sprintf("1|%s|%s|%s||9223372036854775807|9223372036854775807||PRIMARY,REPLICA|1669511347|0|Running||%s|200||1669511347|1|0||1", vdiffenv.workflow, vreplSource, vdiffSourceGtid, vdiffDBName), ), nil) - vdenv.dbClient.ExpectRequest("update _vt.vdiff set state = 'started', last_error = '' , started_at = utc_timestamp() where id = 1", singleRowAffected, nil) + vdenv.dbClient.ExpectRequest("update _vt.vdiff set state = 'started', last_error = left('', 1024) , started_at = utc_timestamp() where id = 1", singleRowAffected, nil) vdenv.dbClient.ExpectRequest("insert into _vt.vdiff_log(vdiff_id, message) values (1, 'State changed to: started')", singleRowAffected, nil) vdenv.dbClient.ExpectRequest(`select vdt.lastpk as lastpk, vdt.mismatch as mismatch, vdt.report as report from _vt.vdiff as vd inner join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) @@ -187,7 +187,7 @@ func TestVDiff(t *testing.T) { vdenv.dbClient.ExpectRequest("update _vt.vdiff_table set state = 'completed' where vdiff_id = 1 and table_name = 't1'", singleRowAffected, nil) vdenv.dbClient.ExpectRequest(`insert into _vt.vdiff_log(vdiff_id, message) values (1, 'completed: table \'t1\'')`, singleRowAffected, nil) vdenv.dbClient.ExpectRequest("select table_name as table_name from _vt.vdiff_table where vdiff_id = 1 and state != 'completed'", singleRowAffected, nil) - vdenv.dbClient.ExpectRequest("update _vt.vdiff set state = 'completed', last_error = '' , completed_at = utc_timestamp() where id = 1", singleRowAffected, nil) + vdenv.dbClient.ExpectRequest("update _vt.vdiff set state = 'completed', last_error = left('', 1024) , completed_at = utc_timestamp() where id = 1", singleRowAffected, nil) vdenv.dbClient.ExpectRequest("insert into _vt.vdiff_log(vdiff_id, message) values (1, 'State changed to: completed')", singleRowAffected, nil) vdenv.vde.mu.Lock() @@ -264,7 +264,7 @@ func TestEngineRetryErroredVDiffs(t *testing.T) { ), nil) // At this point we know that we kicked off the expected retry so we can short circit the vdiff. - shortCircuitTestAfterQuery(fmt.Sprintf("update _vt.vdiff set state = 'started', last_error = '' , started_at = utc_timestamp() where id = %s", id), vdiffenv.dbClient) + shortCircuitTestAfterQuery(fmt.Sprintf("update _vt.vdiff set state = 'started', last_error = left('', 1024) , started_at = utc_timestamp() where id = %s", id), vdiffenv.dbClient) expectedControllerCnt++ } diff --git a/go/vt/vttablet/tabletmanager/vdiff/framework_test.go b/go/vt/vttablet/tabletmanager/vdiff/framework_test.go index 5889720648b..5973326acbf 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/framework_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/framework_test.go @@ -194,7 +194,7 @@ func resetBinlogClient() { // has verified the necessary behavior. func shortCircuitTestAfterQuery(query string, dbClient *binlogplayer.MockDBClient) { dbClient.ExpectRequest(query, singleRowAffected, fmt.Errorf("Short circuiting test")) - dbClient.ExpectRequest("update _vt.vdiff set state = 'error', last_error = 'Short circuiting test' where id = 1", singleRowAffected, nil) + dbClient.ExpectRequest("update _vt.vdiff set state = 'error', last_error = left('Short circuiting test', 1024) where id = 1", singleRowAffected, nil) dbClient.ExpectRequest("insert into _vt.vdiff_log(vdiff_id, message) values (1, 'State changed to: error')", singleRowAffected, nil) dbClient.ExpectRequest("insert into _vt.vdiff_log(vdiff_id, message) values (1, 'Error: Short circuiting test')", singleRowAffected, nil) } diff --git a/go/vt/vttablet/tabletmanager/vdiff/schema.go b/go/vt/vttablet/tabletmanager/vdiff/schema.go index 619c0e5cc79..c31c224d708 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/schema.go +++ b/go/vt/vttablet/tabletmanager/vdiff/schema.go @@ -37,8 +37,9 @@ const ( IF(vdt.mismatch = 1, 1, 0) as has_mismatch, vdt.report as report from _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) where vd.id = %d` - // sqlUpdateVDiffState has a penultimate placeholder for any additional columns you want to update, e.g. `, foo = 1` - sqlUpdateVDiffState = "update _vt.vdiff set state = %s, last_error = %s %s where id = %d" + // sqlUpdateVDiffState has a penultimate placeholder for any additional columns you want to update, e.g. `, foo = 1`. + // It also truncates the error if needed to ensure that we can save the state when the error text is very long. + sqlUpdateVDiffState = "update _vt.vdiff set state = %s, last_error = left(%s, 1024) %s where id = %d" sqlUpdateVDiffStopped = `update _vt.vdiff as vd, _vt.vdiff_table as vdt set vd.state = 'stopped', vdt.state = 'stopped', vd.last_error = '' where vd.id = vdt.vdiff_id and vd.id = %d and vd.state != 'completed'` sqlGetVReplicationEntry = "select * from _vt.vreplication %s" diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go index 58757bdd672..3a88fe790ab 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go @@ -24,11 +24,6 @@ import ( "sync" "time" - "vitess.io/vitess/go/vt/proto/topodata" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" - "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/vt/topo" - "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" @@ -39,14 +34,19 @@ import ( "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/log" - binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" - querypb "vitess.io/vitess/go/vt/proto/query" - tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/engine" "vitess.io/vitess/go/vt/vtgate/evalengine" "vitess.io/vitess/go/vt/vttablet/tabletconn" + + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + querypb "vitess.io/vitess/go/vt/proto/query" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) // how long to wait for background operations to complete @@ -73,6 +73,12 @@ type tableDiffer struct { sourceQuery string table *tabletmanagerdatapb.TableDefinition lastPK *querypb.QueryResult + + // wgShardStreamers is used, with a cancellable context, to wait for all shard streamers + // to finish after each diff is complete. + wgShardStreamers sync.WaitGroup + shardStreamsCtx context.Context + shardStreamsCancel context.CancelFunc } func newTableDiffer(wd *workflowDiffer, table *tabletmanagerdatapb.TableDefinition, sourceQuery string) *tableDiffer { @@ -122,19 +128,21 @@ func (td *tableDiffer) initialize(ctx context.Context) error { } }() + td.shardStreamsCtx, td.shardStreamsCancel = context.WithCancel(ctx) + if err := td.selectTablets(ctx); err != nil { return err } if err := td.syncSourceStreams(ctx); err != nil { return err } - if err := td.startSourceDataStreams(ctx); err != nil { + if err := td.startSourceDataStreams(td.shardStreamsCtx); err != nil { return err } if err := td.syncTargetStreams(ctx); err != nil { return err } - if err := td.startTargetDataStream(ctx); err != nil { + if err := td.startTargetDataStream(td.shardStreamsCtx); err != nil { return err } td.setupRowSorters() @@ -204,7 +212,7 @@ func (td *tableDiffer) selectTablets(ctx context.Context) error { var ( wg sync.WaitGroup sourceErr, targetErr error - targetTablet *topodata.Tablet + targetTablet *topodatapb.Tablet ) // The cells from the vdiff record are a comma separated list. @@ -255,7 +263,7 @@ func (td *tableDiffer) selectTablets(ctx context.Context) error { return targetErr } -func pickTablet(ctx context.Context, ts *topo.Server, cells []string, keyspace, shard, tabletTypes string) (*topodata.Tablet, error) { +func pickTablet(ctx context.Context, ts *topo.Server, cells []string, keyspace, shard, tabletTypes string) (*topodatapb.Tablet, error) { tp, err := discovery.NewTabletPicker(ts, cells, keyspace, shard, tabletTypes) if err != nil { return nil, err @@ -355,10 +363,12 @@ func (td *tableDiffer) restartTargetVReplicationStreams(ctx context.Context) err func (td *tableDiffer) streamOneShard(ctx context.Context, participant *shardStreamer, query string, lastPK *querypb.QueryResult, gtidch chan string) { log.Infof("streamOneShard Start on %s using query: %s", participant.tablet.Alias.String(), query) + td.wgShardStreamers.Add(1) defer func() { log.Infof("streamOneShard End on %s", participant.tablet.Alias.String()) close(participant.result) close(gtidch) + td.wgShardStreamers.Done() }() participant.err = func() error { conn, err := tabletconn.GetDialer()(participant.tablet, false) diff --git a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go index 0671d676c7f..a5b3a89df56 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go @@ -94,6 +94,14 @@ func (wd *workflowDiffer) reconcileExtraRows(dr *DiffReport, maxExtraRowsToCompa } func (wd *workflowDiffer) diffTable(ctx context.Context, dbClient binlogplayer.DBClient, td *tableDiffer) error { + defer func() { + if td.shardStreamsCancel != nil { + td.shardStreamsCancel() + } + // Wait for all the shard streams to finish before returning. + td.wgShardStreamers.Wait() + }() + select { case <-ctx.Done(): return vterrors.Errorf(vtrpcpb.Code_CANCELED, "context has expired") From c4494a0fe5175916e1c42518434ba65897167538 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 11:45:27 +0530 Subject: [PATCH 223/233] [release-16.0] Ensure hexval and int don't share BindVar after Normalization (#14451) (#14477) Signed-off-by: William Martin Signed-off-by: Arthur Schreiber Co-authored-by: William Martin --- go/vt/sqlparser/normalizer.go | 30 ++++++++---------------------- go/vt/sqlparser/normalizer_test.go | 8 ++++++++ 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/go/vt/sqlparser/normalizer.go b/go/vt/sqlparser/normalizer.go index 6d7ee526bf6..07cc1851c0e 100644 --- a/go/vt/sqlparser/normalizer.go +++ b/go/vt/sqlparser/normalizer.go @@ -44,7 +44,7 @@ func Normalize(stmt Statement, reserved *ReservedVars, bindVars map[string]*quer type normalizer struct { bindVars map[string]*querypb.BindVariable reserved *ReservedVars - vals map[string]string + vals map[Literal]string err error inDerived bool } @@ -53,7 +53,7 @@ func newNormalizer(reserved *ReservedVars, bindVars map[string]*querypb.BindVari return &normalizer{ bindVars: bindVars, reserved: reserved, - vals: make(map[string]string), + vals: make(map[Literal]string), } } @@ -190,12 +190,11 @@ func (nz *normalizer) convertLiteralDedup(node *Literal, cursor *Cursor) { } // Check if there's a bindvar for that value already. - key := keyFor(bval, node) - bvname, ok := nz.vals[key] + bvname, ok := nz.vals[*node] if !ok { // If there's no such bindvar, make a new one. bvname = nz.reserved.nextUnusedVar() - nz.vals[key] = bvname + nz.vals[*node] = bvname nz.bindVars[bvname] = bval } @@ -203,18 +202,6 @@ func (nz *normalizer) convertLiteralDedup(node *Literal, cursor *Cursor) { cursor.Replace(NewArgument(bvname)) } -func keyFor(bval *querypb.BindVariable, lit *Literal) string { - if bval.Type != sqltypes.VarBinary && bval.Type != sqltypes.VarChar { - return lit.Val - } - - // Prefixing strings with "'" ensures that a string - // and number that have the same representation don't - // collide. - return "'" + lit.Val - -} - // convertLiteral converts an Literal without the dedup. func (nz *normalizer) convertLiteral(node *Literal, cursor *Cursor) { err := validateLiteral(node) @@ -273,15 +260,14 @@ func (nz *normalizer) parameterize(left, right Expr) Expr { if bval == nil { return nil } - key := keyFor(bval, lit) - bvname := nz.decideBindVarName(key, lit, col, bval) + bvname := nz.decideBindVarName(lit, col, bval) return Argument(bvname) } -func (nz *normalizer) decideBindVarName(key string, lit *Literal, col *ColName, bval *querypb.BindVariable) string { +func (nz *normalizer) decideBindVarName(lit *Literal, col *ColName, bval *querypb.BindVariable) string { if len(lit.Val) <= 256 { // first we check if we already have a bindvar for this value. if we do, we re-use that bindvar name - bvname, ok := nz.vals[key] + bvname, ok := nz.vals[*lit] if ok { return bvname } @@ -291,7 +277,7 @@ func (nz *normalizer) decideBindVarName(key string, lit *Literal, col *ColName, // Big values are most likely not for vindexes. // We save a lot of CPU because we avoid building bvname := nz.reserved.ReserveColName(col) - nz.vals[key] = bvname + nz.vals[*lit] = bvname nz.bindVars[bvname] = bval return bvname diff --git a/go/vt/sqlparser/normalizer_test.go b/go/vt/sqlparser/normalizer_test.go index fe3dc85b8c8..27c57ae2e6d 100644 --- a/go/vt/sqlparser/normalizer_test.go +++ b/go/vt/sqlparser/normalizer_test.go @@ -336,6 +336,14 @@ func TestNormalize(t *testing.T) { in: `select * from (select 12) as t`, outstmt: `select * from (select 12 from dual) as t`, outbv: map[string]*querypb.BindVariable{}, + }, { + // HexVal and Int should not share a bindvar just because they have the same value + in: `select * from t where v1 = x'31' and v2 = 31`, + outstmt: `select * from t where v1 = :v1 and v2 = :v2`, + outbv: map[string]*querypb.BindVariable{ + "v1": sqltypes.HexValBindVariable([]byte("x'31'")), + "v2": sqltypes.Int64BindVariable(31), + }, }} for _, tc := range testcases { t.Run(tc.in, func(t *testing.T) { From a7f80a82e5d99cf00c253c3902367bec5fa40e5d Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 13 Nov 2023 13:13:24 +0530 Subject: [PATCH 224/233] Release of v16.0.6 (#14410) Signed-off-by: Harshit Gangal --- .github/workflows/code_freeze.yml | 2 +- changelog/16.0/16.0.6/changelog.md | 43 +++++++++++++++++++ changelog/16.0/16.0.6/release_notes.md | 7 +++ changelog/16.0/README.md | 4 ++ 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 +++--- 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 +- 19 files changed, 135 insertions(+), 81 deletions(-) create mode 100644 changelog/16.0/16.0.6/changelog.md create mode 100644 changelog/16.0/16.0.6/release_notes.md diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 1bb74feee50..efe1d6e8856 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/16.0/16.0.6/changelog.md b/changelog/16.0/16.0.6/changelog.md new file mode 100644 index 00000000000..959bf2bd570 --- /dev/null +++ b/changelog/16.0/16.0.6/changelog.md @@ -0,0 +1,43 @@ +# Changelog of Vitess v16.0.6 + +### Bug fixes +#### CLI + * [release-16.0] Fix anonymous paths in cobra code-gen (#14185) [#14236](https://github.com/vitessio/vitess/pull/14236) +#### Examples + * [release-16.0] examples: fix flag syntax for zkctl (#14469) [#14485](https://github.com/vitessio/vitess/pull/14485) +#### Online DDL + * [Release 16.0]: Online DDL: timeouts for all gRPC calls (#14182) [#14191](https://github.com/vitessio/vitess/pull/14191) + * [release-16.0] schemadiff: fix missing `DROP CONSTRAINT` in duplicate/redundant constraints scenario. (#14387) [#14389](https://github.com/vitessio/vitess/pull/14389) +#### Query Serving + * [release-16.0] Rewrite `USING` to `ON` condition for joins (#13931) [#13940](https://github.com/vitessio/vitess/pull/13940) + * [release-16.0] Make column resolution closer to MySQL (#14426) [#14428](https://github.com/vitessio/vitess/pull/14428) + * [release-16.0] vtgate/engine: Fix race condition in join logic (#14435) [#14439](https://github.com/vitessio/vitess/pull/14439) + * [release-16.0] Ensure hexval and int don't share BindVar after Normalization (#14451) [#14477](https://github.com/vitessio/vitess/pull/14477) +#### Throttler + * [release-16.0] Tablet throttler: fix race condition by removing goroutine call (#14179) [#14200](https://github.com/vitessio/vitess/pull/14200) +#### VReplication + * [release-16.0] VDiff: wait for shard streams of one table diff to complete for before starting that of the next table (#14345) [#14380](https://github.com/vitessio/vitess/pull/14380) +### CI/Build +#### General + * [release-16.0] Upgrade the Golang version to `go1.20.9` [#14194](https://github.com/vitessio/vitess/pull/14194) + * [release-16.0] Upgrade the Golang version to `go1.20.10` [#14228](https://github.com/vitessio/vitess/pull/14228) +#### Online DDL + * [release-16.0] OnlineDDL: reduce vrepl_stress workload in forks (#14302) [#14347](https://github.com/vitessio/vitess/pull/14347) +### Dependabot +#### General + * [release-16.0] Bump github.com/cyphar/filepath-securejoin from 0.2.3 to 0.2.4 (#14239) [#14251](https://github.com/vitessio/vitess/pull/14251) + * [release-16.0] Bump golang.org/x/net from 0.14.0 to 0.17.0 (#14260) [#14262](https://github.com/vitessio/vitess/pull/14262) + * [release-16.0] Bump google.golang.org/grpc from 1.55.0-dev to 1.59.0 (#14364) [#14496](https://github.com/vitessio/vitess/pull/14496) +#### VTAdmin + * [release-16.0] Bump postcss from 8.4.21 to 8.4.31 in /web/vtadmin (#14173) [#14256](https://github.com/vitessio/vitess/pull/14256) + * [release-16.0] Bump @babel/traverse from 7.21.4 to 7.23.2 in /web/vtadmin (#14304) [#14306](https://github.com/vitessio/vitess/pull/14306) +### Enhancement +#### Build/CI + * [release-16.0] Automatic approval of `vitess-bot` clean backports (#14352) [#14355](https://github.com/vitessio/vitess/pull/14355) +### Release +#### General + * Code freeze of release-16.0 [#14409](https://github.com/vitessio/vitess/pull/14409) +### Testing +#### Query Serving + * [release-16.0] vtgate: Allow additional errors in warnings test (#14461) [#14463](https://github.com/vitessio/vitess/pull/14463) + diff --git a/changelog/16.0/16.0.6/release_notes.md b/changelog/16.0/16.0.6/release_notes.md new file mode 100644 index 00000000000..881ed26b348 --- /dev/null +++ b/changelog/16.0/16.0.6/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v16.0.6 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/16.0/16.0.6/changelog.md). + +The release includes 21 merged Pull Requests. + +Thanks to all our contributors: @app/github-actions, @app/vitess-bot, @harshit-gangal, @shlomi-noach + diff --git a/changelog/16.0/README.md b/changelog/16.0/README.md index d45a817ad48..2b25b22c476 100644 --- a/changelog/16.0/README.md +++ b/changelog/16.0/README.md @@ -1,5 +1,9 @@ ## v16.0 The dedicated team for this release can be found [here](team.md). +* **[16.0.6](16.0.6)** + * [Changelog](16.0.6/changelog.md) + * [Release Notes](16.0.6/release_notes.md) + * **[16.0.5](16.0.5)** * [Changelog](16.0.5/changelog.md) * [Release Notes](16.0.5/release_notes.md) diff --git a/docker/release.sh b/docker/release.sh index 6e0e0e0e580..7193dffe560 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='v16.0.6-SNAPSHOT' +vt_base_version='v16.0.6' 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 cf4d7e1ab32..b3315effbb3 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:v16.0.5 + image: vitess/lite:v16.0.6 ports: - "15000:$WEB_PORT" - "$GRPC_PORT" @@ -81,7 +81,7 @@ services: condition: service_healthy vtgate: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 ports: - "15099:$WEB_PORT" - "$GRPC_PORT" @@ -111,7 +111,7 @@ services: condition: service_healthy schemaload: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 command: - sh - -c @@ -144,12 +144,12 @@ services: environment: - KEYSPACES=$KEYSPACE - GRPC_PORT=15999 - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - .:/script vttablet100: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 ports: - "15100:$WEB_PORT" - "$GRPC_PORT" @@ -181,7 +181,7 @@ services: retries: 15 vttablet101: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 ports: - "15101:$WEB_PORT" - "$GRPC_PORT" @@ -213,7 +213,7 @@ services: retries: 15 vttablet102: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 ports: - "15102:$WEB_PORT" - "$GRPC_PORT" @@ -245,7 +245,7 @@ services: retries: 15 vttablet103: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 ports: - "15103:$WEB_PORT" - "$GRPC_PORT" @@ -277,7 +277,7 @@ services: retries: 15 vtorc: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 command: ["sh", "-c", "/script/vtorc-up.sh"] depends_on: - vtctld @@ -307,7 +307,7 @@ services: retries: 15 vreplication: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - ".:/script" environment: diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index f61de1b6af5..96e86a1425a 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - .:/script set_keyspace_durability_policy: @@ -115,7 +115,7 @@ services: environment: - KEYSPACES=test_keyspace lookup_keyspace - GRPC_PORT=15999 - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - .:/script vtctld: @@ -143,7 +143,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 ports: - 15000:8080 - "15999" @@ -160,7 +160,7 @@ services: --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 ports: - 15099:8080 - "15999" @@ -182,7 +182,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 ports: - 15302:8080 - "15999" diff --git a/examples/compose/vtcompose/docker-compose.test.yml b/examples/compose/vtcompose/docker-compose.test.yml index f44dbd6b6c1..b29163cfa4b 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - .:/script set_keyspace_durability_policy_test_keyspace: @@ -117,7 +117,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=test_keyspace - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - .:/script set_keyspace_durability_policy_unsharded_keyspace: @@ -130,7 +130,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=unsharded_keyspace - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - .:/script vtctld: @@ -159,7 +159,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 ports: - 15000:8080 - "15999" @@ -176,7 +176,7 @@ services: ''grpc-vtgateservice'' --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 ports: - 15099:8080 - "15999" @@ -199,7 +199,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 ports: - 15301:8080 - "15999" diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index c3dfbae4bac..4fcf3b5d967 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 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:v16.0.5 + image: vitess/lite:v16.0.6 ports: - "15000:%[1]d" - "%[2]d" @@ -696,7 +696,7 @@ func generateVtgate(opts vtOptions) string { - op: add path: /services/vtgate value: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 ports: - "15099:%[1]d" - "%[2]d" @@ -738,7 +738,7 @@ func generateVTOrc(dbInfo externalDbInfo, keyspaceInfoMap map[string]keyspaceInf - op: add path: /services/vtorc value: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - ".:/script" environment: @@ -763,7 +763,7 @@ func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - op: add path: /services/vreplication value: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - ".:/script" environment: @@ -791,7 +791,7 @@ func generateSetKeyspaceDurabilityPolicy( - op: add path: /services/set_keyspace_durability_policy_%[3]s value: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - ".:/script" environment: @@ -828,7 +828,7 @@ func generateSchemaload( - op: add path: /services/schemaload_%[7]s value: - image: vitess/lite:v16.0.5 + image: vitess/lite:v16.0.6 volumes: - ".:/script" environment: diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index 642e6dbc9a2..dce73a11c5f 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:v16.0.5 - vtadmin: vitess/vtadmin:v16.0.5 - vtgate: vitess/lite:v16.0.5 - vttablet: vitess/lite:v16.0.5 - vtbackup: vitess/lite:v16.0.5 - vtorc: vitess/lite:v16.0.5 + vtctld: vitess/lite:v16.0.6 + vtadmin: vitess/vtadmin:v16.0.6 + vtgate: vitess/lite:v16.0.6 + vttablet: vitess/lite:v16.0.6 + vtbackup: vitess/lite:v16.0.6 + vtorc: vitess/lite:v16.0.6 mysqld: - mysql80Compatible: vitess/lite:v16.0.5 + mysql80Compatible: vitess/lite:v16.0.6 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 15a6220a9b3..d2e65cce3c6 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:v16.0.5 - vtadmin: vitess/vtadmin:v16.0.5 - vtgate: vitess/lite:v16.0.5 - vttablet: vitess/lite:v16.0.5 - vtbackup: vitess/lite:v16.0.5 - vtorc: vitess/lite:v16.0.5 + vtctld: vitess/lite:v16.0.6 + vtadmin: vitess/vtadmin:v16.0.6 + vtgate: vitess/lite:v16.0.6 + vttablet: vitess/lite:v16.0.6 + vtbackup: vitess/lite:v16.0.6 + vtorc: vitess/lite:v16.0.6 mysqld: - mysql80Compatible: vitess/lite:v16.0.5 + mysql80Compatible: vitess/lite:v16.0.6 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 e39661a3f0b..800c9eaf75c 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:v16.0.5 - vtadmin: vitess/vtadmin:v16.0.5 - vtgate: vitess/lite:v16.0.5 - vttablet: vitess/lite:v16.0.5 - vtbackup: vitess/lite:v16.0.5 - vtorc: vitess/lite:v16.0.5 + vtctld: vitess/lite:v16.0.6 + vtadmin: vitess/vtadmin:v16.0.6 + vtgate: vitess/lite:v16.0.6 + vttablet: vitess/lite:v16.0.6 + vtbackup: vitess/lite:v16.0.6 + vtorc: vitess/lite:v16.0.6 mysqld: - mysql80Compatible: vitess/lite:v16.0.5 + mysql80Compatible: vitess/lite:v16.0.6 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 41911fe7ab0..4d318df0a73 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:v16.0.5 - vtadmin: vitess/vtadmin:v16.0.5 - vtgate: vitess/lite:v16.0.5 - vttablet: vitess/lite:v16.0.5 - vtbackup: vitess/lite:v16.0.5 - vtorc: vitess/lite:v16.0.5 + vtctld: vitess/lite:v16.0.6 + vtadmin: vitess/vtadmin:v16.0.6 + vtgate: vitess/lite:v16.0.6 + vttablet: vitess/lite:v16.0.6 + vtbackup: vitess/lite:v16.0.6 + vtorc: vitess/lite:v16.0.6 mysqld: - mysql80Compatible: vitess/lite:v16.0.5 + mysql80Compatible: vitess/lite:v16.0.6 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index d8ab30407b7..bfa319fe7d4 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 = "16.0.6-SNAPSHOT" +const versionName = "16.0.6" diff --git a/java/client/pom.xml b/java/client/pom.xml index f9bc829e85b..598477619f1 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.6-SNAPSHOT + 16.0.6 vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 5c19b596c79..22f667d9258 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.6-SNAPSHOT + 16.0.6 vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 356ac1ae471..4ed154f96ed 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.6-SNAPSHOT + 16.0.6 vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 57003a8987d..14777eefdd5 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.6-SNAPSHOT + 16.0.6 vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 55c86fe1279..6b60c2344a9 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.6-SNAPSHOT + 16.0.6 pom Vitess Java Client libraries [Parent] From 6017005f806456fead3ac31c78a4fed333396f5a Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 13 Nov 2023 14:43:36 +0530 Subject: [PATCH 225/233] Back to dev mode after v16.0.6 (#14509) Signed-off-by: Harshit Gangal --- 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 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index bfa319fe7d4..daec3d09cef 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 = "16.0.6" +const versionName = "16.0.7-SNAPSHOT" diff --git a/java/client/pom.xml b/java/client/pom.xml index 598477619f1..0dbcf3dfc95 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.6 + 16.0.7-SNAPSHOT vitess-client diff --git a/java/example/pom.xml b/java/example/pom.xml index 22f667d9258..9e08f976f04 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.6 + 16.0.7-SNAPSHOT vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 4ed154f96ed..bd9427ff9c7 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.6 + 16.0.7-SNAPSHOT vitess-grpc-client diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 14777eefdd5..dd8b4268e24 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 16.0.6 + 16.0.7-SNAPSHOT vitess-jdbc diff --git a/java/pom.xml b/java/pom.xml index 6b60c2344a9..8e5ec609182 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 16.0.6 + 16.0.7-SNAPSHOT pom Vitess Java Client libraries [Parent] From 76bdc1ff850f75f48e995a33d145fac7c6f64f56 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 15:59:08 -0600 Subject: [PATCH 226/233] [release-16.0] Update create_release.sh (#14492) (#14514) Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> --- tools/create_release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/create_release.sh b/tools/create_release.sh index 546b60d40c3..1c89696a427 100755 --- a/tools/create_release.sh +++ b/tools/create_release.sh @@ -52,7 +52,7 @@ function createRelease () { rm -f ./.github/workflows/code_freeze.yml.bak # Wait for release notes to be injected in the code base - echo -n Pausing so relase notes can be added. Press enter to continue + echo -n Pausing so release notes can be added. Press enter to continue read line git add --all From 1f393a49fc94be360b6bffe8be635e2ad1f06e3e Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 14 Nov 2023 12:46:09 -0600 Subject: [PATCH 227/233] [release-16.0] Build and push Docker Images from GitHub Actions (#14513) Signed-off-by: Florent Poinsard --- .github/workflows/docker_build_base.yml | 261 +++++++++++++++ .github/workflows/docker_build_lite.yml | 73 +++++ .../workflows/docker_build_vttestserver.yml | 65 ++++ doc/internal/ReleaseInstructions.md | 302 ++++++++---------- docker/release.sh | 73 ----- tools/back_to_dev_mode.sh | 1 - tools/create_release.sh | 1 - tools/release_utils.sh | 5 - 8 files changed, 529 insertions(+), 252 deletions(-) create mode 100644 .github/workflows/docker_build_base.yml create mode 100644 .github/workflows/docker_build_lite.yml create mode 100644 .github/workflows/docker_build_vttestserver.yml delete mode 100755 docker/release.sh diff --git a/.github/workflows/docker_build_base.yml b/.github/workflows/docker_build_base.yml new file mode 100644 index 00000000000..00848e2518e --- /dev/null +++ b/.github/workflows/docker_build_base.yml @@ -0,0 +1,261 @@ +name: Docker Build Base +on: + push: + branches: + - main + tags: + - '*' + +concurrency: + group: format('{0}-{1}', ${{ github.ref }}, 'Docker Build Base') + cancel-in-progress: true + +permissions: read-all + +jobs: + build_and_push_base: + name: Build and push vitess/base Docker images + runs-on: gh-hosted-runners-16cores-1 + if: github.repository == 'vitessio/vitess' + + strategy: + fail-fast: true + matrix: + branch: [ latest, mysql57, percona57, percona80 ] + + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set Dockerfile path + run: | + if [[ "${{ matrix.branch }}" == "latest" ]]; then + echo "DOCKERFILE=./docker/base/Dockerfile" >> $GITHUB_ENV + else + echo "DOCKERFILE=./docker/base/Dockerfile.${{ matrix.branch }}" >> $GITHUB_ENV + fi + + - name: Build and push on main + if: github.ref == 'refs/heads/main' + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ env.DOCKERFILE }} + push: true + tags: vitess/base:${{ matrix.branch }} + + ###### + # All code below only applies to new tags + ###### + + - name: Get the Git tag + if: startsWith(github.ref, 'refs/tags/') + run: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + + - name: Set Docker tag name + if: startsWith(github.ref, 'refs/tags/') && matrix.branch == 'latest' + run: | + if [[ "${{ matrix.branch }}" == "latest" ]]; then + echo "DOCKER_TAG=vitess/base:${TAG_NAME}" >> $GITHUB_ENV + fi + + - name: Build and push on tags + if: startsWith(github.ref, 'refs/tags/') && matrix.branch == 'latest' + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ env.DOCKERFILE }} + push: true + tags: ${{ env.DOCKER_TAG }} + + build_and_push_k8s: + needs: build_and_push_base + name: Build and push vitess/k8s image + runs-on: gh-hosted-runners-16cores-1 + if: github.repository == 'vitessio/vitess' + + strategy: + fail-fast: true + matrix: + debian: [ bullseye, bookworm ] + + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set Docker context path + run: | + echo "DOCKER_CTX=./docker/k8s" >> $GITHUB_ENV + + - name: Build and push on main latest tag + if: github.ref == 'refs/heads/main' && matrix.debian == 'bookworm' + uses: docker/build-push-action@v5 + with: + context: ${{ env.DOCKER_CTX }} + push: true + tags: vitess/k8s:latest + build-args: | + VT_BASE_VER=latest + DEBIAN_VER=${{ matrix.debian }}-slim + + - name: Build and push on main debian specific tag + if: github.ref == 'refs/heads/main' + uses: docker/build-push-action@v5 + with: + context: ${{ env.DOCKER_CTX }} + push: true + tags: vitess/k8s:latest-${{ matrix.debian }} + build-args: | + VT_BASE_VER=latest + DEBIAN_VER=${{ matrix.debian }}-slim + + ###### + # All code below only applies to new tags + ###### + + - name: Get the Git tag + if: startsWith(github.ref, 'refs/tags/') + run: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + + # We push git-tag-based k8s image to three tags, i.e. for 'v19.0.0' we push to: + # + # vitess/k8s:v19.0.0 (DOCKER_TAG_DEFAULT_DEBIAN) + # vitess/k8s:v19.0.0-bookworm (DOCKER_TAG) + # vitess/k8s:v19.0.0-bullseye (DOCKER_TAG) + # + - name: Set Docker tag name + if: startsWith(github.ref, 'refs/tags/') + run: | + echo "DOCKER_TAG_DEFAULT_DEBIAN=vitess/k8s:${TAG_NAME}" >> $GITHUB_ENV + echo "DOCKER_TAG=vitess/k8s:${TAG_NAME}-${{ matrix.debian }}" >> $GITHUB_ENV + + # Build and Push component image to DOCKER_TAG, applies to both debian version + - name: Build and push on tags using Debian extension + if: startsWith(github.ref, 'refs/tags/') + uses: docker/build-push-action@v5 + with: + context: ${{ env.DOCKER_CTX }} + push: true + tags: ${{ env.DOCKER_TAG }} + build-args: | + VT_BASE_VER=${{ env.TAG_NAME }} + DEBIAN_VER=${{ matrix.debian }}-slim + + # Build and Push component image to DOCKER_TAG_DEFAULT_DEBIAN, only applies when building the default Debian version (bookworm) + # It is fine to build a second time here when "matrix.debian == 'bookworm'" as we have cached the first build already + - name: Build and push on tags without Debian extension + if: startsWith(github.ref, 'refs/tags/') && matrix.debian == 'bookworm' + uses: docker/build-push-action@v5 + with: + context: ${{ env.DOCKER_CTX }} + push: true + tags: ${{ env.DOCKER_TAG_DEFAULT_DEBIAN }} + build-args: | + VT_BASE_VER=${{ env.TAG_NAME }} + DEBIAN_VER=${{ matrix.debian }}-slim + + + build_and_push_components: + needs: build_and_push_k8s + name: Build and push vitess components Docker images + runs-on: gh-hosted-runners-16cores-1 + if: github.repository == 'vitessio/vitess' + + strategy: + fail-fast: true + matrix: + debian: [ bullseye, bookworm ] + component: [ vtadmin, vtorc, vtgate, vttablet, mysqlctld, mysqlctl, vtctl, vtctlclient, vtctld, logrotate, logtail, vtbackup, vtexplain ] + + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set Docker context path + run: | + echo "DOCKER_CTX=./docker/k8s/${{ matrix.component }}" >> $GITHUB_ENV + + - name: Build and push on main latest tag + if: github.ref == 'refs/heads/main' && matrix.debian == 'bookworm' + uses: docker/build-push-action@v5 + with: + context: ${{ env.DOCKER_CTX }} + push: true + tags: vitess/${{ matrix.component }}:latest + build-args: | + VT_BASE_VER=latest + DEBIAN_VER=${{ matrix.debian }}-slim + + - name: Build and push on main debian specific tag + if: github.ref == 'refs/heads/main' + uses: docker/build-push-action@v5 + with: + context: ${{ env.DOCKER_CTX }} + push: true + tags: vitess/${{ matrix.component }}:latest-${{ matrix.debian }} + build-args: | + VT_BASE_VER=latest + DEBIAN_VER=${{ matrix.debian }}-slim + + ###### + # All code below only applies to new tags + ###### + + - name: Get the Git tag + if: startsWith(github.ref, 'refs/tags/') + run: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + + # We push git-tag-based images to three tags, i.e. for 'v19.0.0' we push to: + # + # vitess/${{ matrix.component }}:v19.0.0 (DOCKER_TAG_DEFAULT_DEBIAN) + # vitess/${{ matrix.component }}:v19.0.0-bookworm (DOCKER_TAG) + # vitess/${{ matrix.component }}:v19.0.0-bullseye (DOCKER_TAG) + # + - name: Set Docker tag name + if: startsWith(github.ref, 'refs/tags/') + run: | + echo "DOCKER_TAG_DEFAULT_DEBIAN=vitess/${{ matrix.component }}:${TAG_NAME}" >> $GITHUB_ENV + echo "DOCKER_TAG=vitess/${{ matrix.component }}:${TAG_NAME}-${{ matrix.debian }}" >> $GITHUB_ENV + + # Build and Push component image to DOCKER_TAG, applies to both debian version + - name: Build and push on tags using Debian extension + if: startsWith(github.ref, 'refs/tags/') + uses: docker/build-push-action@v5 + with: + context: ${{ env.DOCKER_CTX }} + push: true + tags: ${{ env.DOCKER_TAG }} + build-args: | + VT_BASE_VER=${{ env.TAG_NAME }} + DEBIAN_VER=${{ matrix.debian }}-slim + + # Build and Push component image to DOCKER_TAG_DEFAULT_DEBIAN, only applies when building the default Debian version (bookworm) + # It is fine to build a second time here when "matrix.debian == 'bookworm'" as we have cached the first build already + - name: Build and push on tags without Debian extension + if: startsWith(github.ref, 'refs/tags/') && matrix.debian == 'bookworm' + uses: docker/build-push-action@v5 + with: + context: ${{ env.DOCKER_CTX }} + push: true + tags: ${{ env.DOCKER_TAG_DEFAULT_DEBIAN }} + build-args: | + VT_BASE_VER=${{ env.TAG_NAME }} + DEBIAN_VER=${{ matrix.debian }}-slim diff --git a/.github/workflows/docker_build_lite.yml b/.github/workflows/docker_build_lite.yml new file mode 100644 index 00000000000..7f355ddfd32 --- /dev/null +++ b/.github/workflows/docker_build_lite.yml @@ -0,0 +1,73 @@ +name: Docker Build Lite +on: + push: + branches: + - main + tags: + - '*' + +concurrency: + group: format('{0}-{1}', ${{ github.ref }}, 'Docker Build Lite') + cancel-in-progress: true + +permissions: read-all + +jobs: + build_and_push: + name: Build and push vitess/lite Docker images + runs-on: gh-hosted-runners-16cores-1 + if: github.repository == 'vitessio/vitess' + + strategy: + fail-fast: true + matrix: + branch: [ latest, mysql57, mysql80, percona57, percona80 ] + + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set Dockerfile path + run: | + if [[ "${{ matrix.branch }}" == "latest" ]]; then + echo "DOCKERFILE=./docker/lite/Dockerfile" >> $GITHUB_ENV + else + echo "DOCKERFILE=./docker/lite/Dockerfile.${{ matrix.branch }}" >> $GITHUB_ENV + fi + + - name: Build and push on main + if: github.ref == 'refs/heads/main' + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ env.DOCKERFILE }} + push: true + tags: vitess/lite:${{ matrix.branch }} + + - name: Get the Git tag + if: startsWith(github.ref, 'refs/tags/') + run: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + + - name: Set Docker tag name + if: startsWith(github.ref, 'refs/tags/') + run: | + if [[ "${{ matrix.branch }}" == "latest" ]]; then + echo "DOCKER_TAG=vitess/lite:${TAG_NAME}" >> $GITHUB_ENV + else + echo "DOCKER_TAG=vitess/lite:${TAG_NAME}-${{ matrix.branch }}" >> $GITHUB_ENV + fi + + - name: Build and push on tags + if: startsWith(github.ref, 'refs/tags/') + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ env.DOCKERFILE }} + push: true + tags: ${{ env.DOCKER_TAG }} \ No newline at end of file diff --git a/.github/workflows/docker_build_vttestserver.yml b/.github/workflows/docker_build_vttestserver.yml new file mode 100644 index 00000000000..1223700527b --- /dev/null +++ b/.github/workflows/docker_build_vttestserver.yml @@ -0,0 +1,65 @@ +name: Docker Build vttestserver +on: + push: + branches: + - main + tags: + - '*' + +concurrency: + group: format('{0}-{1}', ${{ github.ref }}, 'Docker Build vttestserver') + cancel-in-progress: true + +permissions: read-all + +jobs: + build_and_push: + name: Build and push vitess/vttestserver Docker images + runs-on: gh-hosted-runners-16cores-1 + if: github.repository == 'vitessio/vitess' + + strategy: + fail-fast: true + matrix: + branch: [ mysql57, mysql80 ] + + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set Dockerfile path + run: | + echo "DOCKERFILE=./docker/vttestserver/Dockerfile.${{ matrix.branch }}" >> $GITHUB_ENV + + - name: Build and push on main + if: github.ref == 'refs/heads/main' + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ env.DOCKERFILE }} + push: true + tags: vitess/vttestserver:${{ matrix.branch }} + + - name: Get the Git tag + if: startsWith(github.ref, 'refs/tags/') + run: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + + - name: Set Docker tag name + if: startsWith(github.ref, 'refs/tags/') + run: | + echo "DOCKER_TAG=vitess/vttestserver:${TAG_NAME}-${{ matrix.branch }}" >> $GITHUB_ENV + + - name: Build and push on tags + if: startsWith(github.ref, 'refs/tags/') + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ env.DOCKERFILE }} + push: true + tags: ${{ env.DOCKER_TAG }} \ No newline at end of file diff --git a/doc/internal/ReleaseInstructions.md b/doc/internal/ReleaseInstructions.md index f45b9fb5902..fd5caa81e03 100644 --- a/doc/internal/ReleaseInstructions.md +++ b/doc/internal/ReleaseInstructions.md @@ -1,155 +1,53 @@ -# Release Instructions +# Release Cutover -This page describes the steps for cutting a new [open source release](https://github.com/vitessio/vitess/releases). +In this section we describe our current release process. Below is a summary of this document. -### Summary +- [**Pre-requisite for the release team**](#pre-requisites) +- [**Overview**](#overview) +- [**Pre-Release**](#pre-release) +- [**Release**](#release) +- [**Post-Release**](#post-release) +- [**How To prepare the release of Vitess**](#how-to-prepare-the-release-of-vitess) +- [**How To Release Vitess**](#how-to-release-vitess) +- [**How To Code Freeze**](#how-to-code-freeze) +- [**How To Merge During Code Freeze**](#how-to-merge-during-code-freeze) +- [**Java Packages: Deploy & Release**](#java-packages-deploy--release) -- [Versioning](#versioning) -- [Release Branches](#release-branches) -- [Release Tags](#release-tags) -- [Docker Images](#docker-images) -- [Java Packages](#java-packages) -- [Release Cutover](#release-cutover) -------- +----- -## Versioning - -Our versioning strategy is based on [VEP5](https://github.com/vitessio/enhancements/blob/main/veps/vep-5.md). - -### Major Release (vX) - -A new major release is needed when the public API changes in a -backward-incompatible way -- for example, when removing deprecated interfaces. - -Our public API includes (but is not limited to): - -* The VTGate [RPC interfaces](https://github.com/vitessio/vitess/tree/main/proto). -* The interfaces exposed by the VTGate client library in each language. - -Care must also be taken when changing the format of any data stored by a live -system, such as topology data or Vitess-internal tables (used for sequences, -distributed transactions, etc.). Although this data is considered as internal to -Vitess, if any change breaks the upgrade path for a live system (for example, -requiring that it be shut down and reinitialized from scratch), then it must be -considered as a breaking change. - -### Minor Release (vX.Y) - -A new minor release indicates that functionality has been added or changed in a -backward-compatible way. This should be the majority of normal releases. - -### Patch Release (vX.Y.Z) - -A patch release indicates that only a select set of bugfixes have been -cherry-picked onto the associated minor release. The expectation is that -upgrading by a patch release should be painless (not requiring any config -changes) and safe (isolated from active development on `main`). - -### Pre-Release Labels (vX.Y.Z-labelN) - -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 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. - -```shell -git checkout main -git pull --ff-only upstream main - -git checkout -b release-X.Y -git push upstream release-X.Y -``` - -The branches are named `release-X.Y` to distinguish them from point-in-time -tags, which are named `vX.Y.Z`. - -------- - -## Release Tags - -While the release branch is a moving target, release tags mark point-in-time -snapshots of the repository. Essentially, a tag assigns a human-readable name to -a specific Git commit hash. Although it's technically possible to reassign a tag -name to a different hash, we must never do this. - -------- - -## Docker Images - -Docker images built automatically on DockerHub and can be found [here](https://hub.docker.com/repository/docker/vitess/lite/). - -------- - -## Java Packages - -We publish binary packages for our [JDBC driver and Java client on Maven Central](https://search.maven.org/#search|ga|1|g:"io.vitess"). - -To do so, we use the http://oss.sonatype.org/ repository. -New packages must be uploaded there ("deployed") and will be automatically published ("released"). -Once they are released there, they will be automatically synchronized with Maven Central. -The synchronization takes only several minutes, but the update on http://search.maven.org may take up to two hours. - -### Access to oss.sonatype.org - -[Sign up here.](https://issues.sonatype.org/secure/Signup!default.jspa) -Then you must be added as member to our `io.vitess` namespace. -Therefore, file a JIRA ticket with Sonatype to get added ([example for a different namespace](https://issues.sonatype.org/browse/OSSRH-30604)). - -### One-time setup - -#### Set up GPG - -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 - -Create the `settings.xml` in the `$HOME/.m2/` directory as described in their [instructions](https://central.sonatype.org/pages/apache-maven.html). - -------- - -## Release Cutover - -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 +## 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 have access to the Java release, more information in the [**Java Packages**](./java-packages.md) section. - You must be able to create branches and have admin right on the `vitessio/vitess` and `planetscale/vitess-operator` repositories. -### Overview +----- + +## Overview -#### Schedule +### Schedule A new major version of Vitess is released every four months. For each major version there is at least one release candidate, which we release three weeks before the GA version. We usually create the RC1 during the first week of the month, and the GA version three weeks later. -#### Code Freeze +### 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) Regarding patch releases, no code freeze is planned. -#### Tracking Issue for each Release +### Tracking Issue for each Release For each release, it is recommended to create an issue like [this one](https://github.com/vitessio/vitess/issues/10476) to track the current and past progress of a release. It also allows us to document what happened during a release. -### Pre-Release +----- + +## Pre-Release This step happens a few weeks before the actual release (whether it is an RC, GA or a patch release). The main goal of this step is to make sure everything is ready to be released for the release day. @@ -158,8 +56,9 @@ That includes: > - All the Pull Requests that need to be in the release must be reviewed and merged before the code freeze. > - The code freeze usually happens a few days before the release. - **Making sure the people doing the release have access to all the tools and infrastructure needed to do the release.** - > - This includes write access to the Vitess repository and to the Maven repository. + > - This includes write access to the Vitess repository and to the Maven repository. - **Preparing and cleaning the release notes summary.** + > - If the release does not contain significant changes (i.e. a small patch release) then this step can be skipped > - One or more Pull Requests have to be submitted in advance to create and update the release summary. > - 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. @@ -171,6 +70,7 @@ 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. @@ -178,13 +78,33 @@ That includes: > - 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). - -### Release +- **Update the website documentation.** + > - We want to open a preparatory **draft** Pull Request to update the documentation. + > - There are several pages we want to update: + > - [The releases page](https://vitess.io/docs/releases/): we must add the new release to the list with all its information and link. The links can be broken (404 error) while we are preparing for the release, this is fine. + > - [The local install page](https://vitess.io/docs/get-started/local/): we must use the proper version increment for this guide and the proper SHA. The SHA will have to be modified once the Release Pull Request and the release is tagged is merged. + > - If we are doing a GA or RC release follow the instructions below: + > - There are two scripts in the website repository in `./tools/{ga|rc}_release.sh`, use them to update the website documentation. The scripts automate: + > - For an RC, we need to create a new entry in the sidebar which represents the next version on `main` and mark the version we are releasing as RC. + > - For a GA, we need to mark the version we are releasing as "Stable" and the next one as "Development". +- **Create a new GitHub Milestone** + > - Our GitHub Milestones is a good representation of all our ongoing development cycles. We have a Milestone for `main` and for all release branches. + > - After doing Code Freeze, we can create a new GitHub Milestone that matches the next development cycle. + > - **If we release a major version (v18.0.0-rc1):** we must create a `v19.0.0` Milestone. + > - **If we release a patch release (v17.0.3):** we must create a `v17.0.4` Milestone. + +----- + +## Release On the release day, there are several things to do: +- **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`.** + > - One Pull Request against `main` must be created, it will contain the new release notes that we are adding in the Release Pull Request. - **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. @@ -193,10 +113,9 @@ On the release day, there are several things to do: > - Applies only to GA releases. > - This step is explained in the [Java Packages: Deploy & Release](#java-packages-deploy--release) section. - **Update the website documentation repository.** - > - Applies only to GA and RC releases. - > - There are two scripts in the website repository in `./tools/{ga|rc}_release.sh`, use them to update the website documentation. The scripts automate: - > - For an RC, we need to create a new version in the sidebar and mark the current version as RC. - > - For a GA, we need to mark the version we are releasing as "Stable" and the next one as "Development". + > - Review the Website Pull Request that was opened during the Pre-Release. + > - The git SHA used in [the local install page](https://vitess.io/docs/get-started/local/) should be updated with the new proper SHA for this release. + > - Merge the Pull Request. - **Publish the blog post on the Vitess website.** > - Applies only to GA releases. > - The corresponding Pull Request was created beforehand during the pre-release. Merge it. @@ -206,21 +125,28 @@ 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 `main`.** - > - One Pull Request against `main` must be created, it will contain the new release notes. - **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. - > - To build and publish these images, run `./release.sh` from the directory `vitess/docker`. + > - The version constants across the codebase must be updated to `SNAPSHOT`. +- **Ensure the k8s images are available on DockerHub.** +- **Close the current GitHub Milestone** + > - Once we are done releasing the current version, we must close its corresponding GitHub Milestone as the development cycle for it is over. + > - **This does not apply if we are releasing an RC release.** For instance, if we are releasing `v18.0.0-rc1` we want to keep the `v18.0.0` milestone opened as development is not fully done for `v18.0.0`. + > - For instance, if we release `v18.0.1`, we must close the `v18.0.1` Milestone as the development cycle for `v18.0.1` is over. + > - When closing a Milestone, we need to look through all the PRs/Issues in that Milestone and re-assign a newer Milestone to them. + +----- -### Post-Release +## Post-Release 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 +Moreover, once the roadmap discussions are over for the next release, we need to update the roadmap presented in the Vitess website (https://vitess.io/docs/resources/roadmap/). +We must remove everything that is now done in this release and add new items based on the discussions. + +----- + +## 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. @@ -239,8 +165,8 @@ We need to verify that _arewefastyet_ has finished the benchmark too. ``` 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. + > 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 @@ -253,18 +179,15 @@ We need to verify that _arewefastyet_ has finished the benchmark too. 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 - go run ./go/tools/release-notes --from "v14.0.3" --to "HEAD" --version "v15.0.0-rc1" --summary "./changelog/15.0/15.0.0/summary.md" [--threads=[0-9.]] - ``` - 2. General Availability: - ```shell - go run ./go/tools/release-notes --from "v14.0.3" --to "HEAD" --version "v15.0.0" --summary "./changelog/15.0/15.0.0/summary.md" [--threads=[0-9.]] - ``` - - > Important note: The release note generation fetches a lot of data from the GitHub API. You might reach the API request limit. - In which case you should use the `--threads=` flag and set an integer value lower than 10 (the default). + 2. Run the following command to generate the release notes. Note that you can omit the `--summary` flag if there are no summary. + ```shell + go run ./go/tools/release-notes --version "v15.0.0" --summary "./changelog/15.0/15.0.0/summary.md" + ``` + + > Make sure to also run `go run ./go/tools/releases/releases.go` to update the `./changelog` directory. + + > Important note: The release note generation fetches a lot of data from the GitHub API. You might reach the API request limit. + In which case you should use the `--threads=` flag and set an integer value lower than 10 (the default). 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. @@ -273,25 +196,29 @@ We need to verify that _arewefastyet_ has finished the benchmark too. 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. -### How To Release Vitess +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: - [Creation of the tags and release notes](#creation-of-the-tags-and-release-notes). - [Creating Release or Release Candidate on the GitHub UI](#creating-release-or-release-candidate-on-the-github-ui) -#### Creation of the tags and release notes +### Creation of the tags and release notes > 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`. -> +> > 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. @@ -313,26 +240,26 @@ This section is divided into two parts: 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 +### Creating Release or Release Candidate on the GitHub UI > In the below steps, we use `v8.0.0` and `v9.0.0` as an example. -##### 1. Open the releases page +#### 1. Open the releases page On Vitess' GitHub repository main page, click on Code -> [Releases](https://github.com/vitessio/vitess/releases). ![alt text](.images/release-01.png) -##### 2. Draft a new release +#### 2. Draft a new release On the Releases page, click on `Draft a new release`. ![alt text](.images/release-02.png) -##### 3. Tag a new release +#### 3. Tag a new release When drafting a new release, we are asked to choose the release's tag and branch. We format the tag this way: `v9.0.0`. We append `-rcN` to the tag name for release candidates, @@ -340,7 +267,7 @@ with `N` being the increment of the release candidate. ![alt text](.images/release-03.png) -##### 4. Add release notes and release +#### 4. Add release notes and release Copy/paste the previously built Release Notes into the description of the release. @@ -350,7 +277,9 @@ And finally, click on `Publish release`. ![alt text](.images/release-04.png) -### How To Code Freeze +----- + +## How To Code Freeze In this example we are going to do a code freeze on the `release-15.0` branch. If we are doing a release candidate, there won't be a branch yet, hence we need to create it. @@ -359,6 +288,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: @@ -375,11 +307,35 @@ 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`. -### Java Packages: Deploy & Release +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, > or if the Java packages changed from one minor/patch version to another. -> +> > For this example, we assume we juste released `v12.0.0`. 1. Checkout to the release commit. @@ -387,7 +343,7 @@ The script will prompt the command that will allow you to push the code freeze c 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) @@ -403,10 +359,12 @@ The script will prompt the command that will allow you to push the code freeze c 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).

+ > **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/docker/release.sh b/docker/release.sh deleted file mode 100755 index 7193dffe560..00000000000 --- a/docker/release.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -set -ex - -vt_base_version='v16.0.6' -debian_versions='buster bullseye' -default_debian_version='bullseye' - -docker pull --platform linux/amd64 vitess/base:$vt_base_version - -for debian_version in $debian_versions -do - echo "####### Building vitess/vt:$debian_version" - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/k8s:$vt_base_version-$debian_version k8s - docker tag vitess/k8s:$vt_base_version-$debian_version vitess/k8s:$vt_base_version - docker push vitess/k8s:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/k8s:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/vtadmin:$vt_base_version-$debian_version k8s/vtadmin - docker tag vitess/vtadmin:$vt_base_version-$debian_version vitess/vtadmin:$vt_base_version - docker push vitess/vtadmin:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/vtadmin:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/vtorc:$vt_base_version-$debian_version k8s/vtorc - docker tag vitess/vtorc:$vt_base_version-$debian_version vitess/vtorc:$vt_base_version - docker push vitess/vtorc:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/vtorc:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/vtgate:$vt_base_version-$debian_version k8s/vtgate - docker tag vitess/vtgate:$vt_base_version-$debian_version vitess/vtgate:$vt_base_version - docker push vitess/vtgate:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/vtgate:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/vttablet:$vt_base_version-$debian_version k8s/vttablet - docker tag vitess/vttablet:$vt_base_version-$debian_version vitess/vttablet:$vt_base_version - docker push vitess/vttablet:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/vttablet:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/mysqlctld:$vt_base_version-$debian_version k8s/mysqlctld - docker tag vitess/mysqlctld:$vt_base_version-$debian_version vitess/mysqlctld:$vt_base_version - docker push vitess/mysqlctld:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/mysqlctld:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/mysqlctl:$vt_base_version-$debian_version k8s/mysqlctl - docker tag vitess/mysqlctl:$vt_base_version-$debian_version vitess/mysqlctl:$vt_base_version - docker push vitess/mysqlctl:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/mysqlctl:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/vtctl:$vt_base_version-$debian_version k8s/vtctl - docker tag vitess/vtctl:$vt_base_version-$debian_version vitess/vtctl:$vt_base_version - docker push vitess/vtctl:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/vtctl:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/vtctlclient:$vt_base_version-$debian_version k8s/vtctlclient - docker tag vitess/vtctlclient:$vt_base_version-$debian_version vitess/vtctlclient:$vt_base_version - docker push vitess/vtctlclient:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/vtctlclient:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/vtctld:$vt_base_version-$debian_version k8s/vtctld - docker tag vitess/vtctld:$vt_base_version-$debian_version vitess/vtctld:$vt_base_version - docker push vitess/vtctld:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/vtctld:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/logrotate:$vt_base_version-$debian_version k8s/logrotate - docker tag vitess/logrotate:$vt_base_version-$debian_version vitess/logrotate:$vt_base_version - docker push vitess/logrotate:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/logrotate:$vt_base_version; fi - - docker build --platform linux/amd64 --build-arg VT_BASE_VER=$vt_base_version --build-arg DEBIAN_VER=$debian_version-slim -t vitess/logtail:$vt_base_version-$debian_version k8s/logtail - docker tag vitess/logtail:$vt_base_version-$debian_version vitess/logtail:$vt_base_version - docker push vitess/logtail:$vt_base_version-$debian_version - if [[ $debian_version == $default_debian_version ]]; then docker push vitess/logtail:$vt_base_version; fi -done diff --git a/tools/back_to_dev_mode.sh b/tools/back_to_dev_mode.sh index 7bbc6bce25f..27ad0234eff 100755 --- a/tools/back_to_dev_mode.sh +++ b/tools/back_to_dev_mode.sh @@ -48,7 +48,6 @@ fi function doBackToDevMode () { # Preparing the "dev mode" commit updateJava $DEV_VERSION - updateDockerReleaseScript $DEV_VERSION updateVersionGo $DEV_VERSION git add --all diff --git a/tools/create_release.sh b/tools/create_release.sh index 1c89696a427..62bdbe83051 100755 --- a/tools/create_release.sh +++ b/tools/create_release.sh @@ -61,7 +61,6 @@ function createRelease () { # Preparing the release commit updateVitessExamples $RELEASE_VERSION $VTOP_VERSION updateJava $RELEASE_VERSION - updateDockerReleaseScript $RELEASE_VERSION updateVersionGo $RELEASE_VERSION ## Create the commit for this release and tag it diff --git a/tools/release_utils.sh b/tools/release_utils.sh index ff7d348bcd3..d94d2fe7f31 100755 --- a/tools/release_utils.sh +++ b/tools/release_utils.sh @@ -24,11 +24,6 @@ function checkGitState() { fi } -function updateDockerReleaseScript () { - 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 -} - function checkoutNewBranch () { branch_name=$1 From 53dfd30fcf824d961637c728fb153b3e36d7d381 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 00:13:16 -0600 Subject: [PATCH 228/233] [release-16.0] expression rewriting: enable more rewrites and limit CNF rewrites (#14560) (#14574) Co-authored-by: vitess-bot[bot] <108069721+vitess-bot[bot]@users.noreply.github.com> Co-authored-by: Florent Poinsard --- go/vt/sqlparser/predicate_rewriting.go | 71 +++++++++++++------ go/vt/sqlparser/predicate_rewriting_test.go | 16 ++++- go/vt/vtgate/executor_select_test.go | 2 +- .../planbuilder/testdata/filter_cases.json | 2 +- 4 files changed, 65 insertions(+), 26 deletions(-) diff --git a/go/vt/sqlparser/predicate_rewriting.go b/go/vt/sqlparser/predicate_rewriting.go index 0348f95f115..7e0852ef7ed 100644 --- a/go/vt/sqlparser/predicate_rewriting.go +++ b/go/vt/sqlparser/predicate_rewriting.go @@ -20,11 +20,26 @@ import ( "vitess.io/vitess/go/vt/log" ) +// This is the number of OR expressions in a predicate that will disable the CNF +// rewrite because we don't want to send large queries to MySQL +const CNFOrLimit = 5 + // RewritePredicate walks the input AST and rewrites any boolean logic into a simpler form // This simpler form is CNF plus logic for extracting predicates from OR, plus logic for turning ORs into IN // Note: In order to re-plan, we need to empty the accumulated metadata in the AST, // so ColName.Metadata will be nil:ed out as part of this rewrite func RewritePredicate(ast SQLNode) SQLNode { + count := 0 + _ = Walk(func(node SQLNode) (bool, error) { + if _, isExpr := node.(*OrExpr); isExpr { + count++ + } + + return true, nil + }, ast) + + allowCNF := count < CNFOrLimit + for { printExpr(ast) exprChanged := false @@ -37,7 +52,7 @@ func RewritePredicate(ast SQLNode) SQLNode { return true } - rewritten, state := simplifyExpression(e) + rewritten, state := simplifyExpression(e, allowCNF) if ch, isChange := state.(changed); isChange { printRule(ch.rule, ch.exprMatched) exprChanged = true @@ -56,12 +71,12 @@ func RewritePredicate(ast SQLNode) SQLNode { } } -func simplifyExpression(expr Expr) (Expr, rewriteState) { +func simplifyExpression(expr Expr, allowCNF bool) (Expr, rewriteState) { switch expr := expr.(type) { case *NotExpr: return simplifyNot(expr) case *OrExpr: - return simplifyOr(expr) + return simplifyOr(expr, allowCNF) case *XorExpr: return simplifyXor(expr) case *AndExpr: @@ -117,14 +132,14 @@ func ExtractINFromOR(expr *OrExpr) []Expr { return uniquefy(ins) } -func simplifyOr(expr *OrExpr) (Expr, rewriteState) { +func simplifyOr(expr *OrExpr, allowCNF bool) (Expr, rewriteState) { or := expr // first we search for ANDs and see how they can be simplified land, lok := or.Left.(*AndExpr) rand, rok := or.Right.(*AndExpr) - switch { - case lok && rok: + + if lok && rok { // (<> AND <>) OR (<> AND <>) var a, b, c Expr var change changed @@ -132,40 +147,51 @@ func simplifyOr(expr *OrExpr) (Expr, rewriteState) { case Equals.Expr(land.Left, rand.Left): change = newChange("(A and B) or (A and C) => A AND (B OR C)", f(expr)) a, b, c = land.Left, land.Right, rand.Right + return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, change case Equals.Expr(land.Left, rand.Right): change = newChange("(A and B) or (C and A) => A AND (B OR C)", f(expr)) a, b, c = land.Left, land.Right, rand.Left + return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, change case Equals.Expr(land.Right, rand.Left): change = newChange("(B and A) or (A and C) => A AND (B OR C)", f(expr)) a, b, c = land.Right, land.Left, rand.Right + return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, change case Equals.Expr(land.Right, rand.Right): change = newChange("(B and A) or (C and A) => A AND (B OR C)", f(expr)) a, b, c = land.Right, land.Left, rand.Left - default: - return expr, noChange{} + return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, change } - return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, change - case lok: - // (<> AND <>) OR <> + } + + // (<> AND <>) OR <> + if lok { // Simplification if Equals.Expr(or.Right, land.Left) || Equals.Expr(or.Right, land.Right) { return or.Right, newChange("(A AND B) OR A => A", f(expr)) } - // Distribution Law - return &AndExpr{Left: &OrExpr{Left: land.Left, Right: or.Right}, Right: &OrExpr{Left: land.Right, Right: or.Right}}, - newChange("(A AND B) OR C => (A OR C) AND (B OR C)", f(expr)) - case rok: - // <> OR (<> AND <>) + + if allowCNF { + // Distribution Law + return &AndExpr{Left: &OrExpr{Left: land.Left, Right: or.Right}, Right: &OrExpr{Left: land.Right, Right: or.Right}}, + newChange("(A AND B) OR C => (A OR C) AND (B OR C)", f(expr)) + } + } + + // <> OR (<> AND <>) + if rok { // Simplification if Equals.Expr(or.Left, rand.Left) || Equals.Expr(or.Left, rand.Right) { return or.Left, newChange("A OR (A AND B) => A", f(expr)) } - // Distribution Law - return &AndExpr{ - Left: &OrExpr{Left: or.Left, Right: rand.Left}, - Right: &OrExpr{Left: or.Left, Right: rand.Right}, - }, - newChange("C OR (A AND B) => (C OR A) AND (C OR B)", f(expr)) + + if allowCNF { + // Distribution Law + return &AndExpr{ + Left: &OrExpr{Left: or.Left, Right: rand.Left}, + Right: &OrExpr{Left: or.Left, Right: rand.Right}, + }, + newChange("C OR (A AND B) => (C OR A) AND (C OR B)", f(expr)) + } } // next, we want to try to turn multiple ORs into an IN when possible @@ -261,7 +287,6 @@ func simplifyAnd(expr *AndExpr) (Expr, rewriteState) { and := expr if or, ok := and.Left.(*OrExpr); ok { // Simplification - if Equals.Expr(or.Left, and.Right) { return and.Right, newChange("(A OR B) AND A => A", f(expr)) } diff --git a/go/vt/sqlparser/predicate_rewriting_test.go b/go/vt/sqlparser/predicate_rewriting_test.go index 34e23597894..fba3d2f01dd 100644 --- a/go/vt/sqlparser/predicate_rewriting_test.go +++ b/go/vt/sqlparser/predicate_rewriting_test.go @@ -91,7 +91,7 @@ func TestSimplifyExpression(in *testing.T) { expr, err := ParseExpr(tc.in) require.NoError(t, err) - expr, didRewrite := simplifyExpression(expr) + expr, didRewrite := simplifyExpression(expr, true) assert.True(t, didRewrite.changed()) assert.Equal(t, tc.expected, String(expr)) }) @@ -129,6 +129,17 @@ func TestRewritePredicate(in *testing.T) { }, { in: "A and (B or A)", expected: "A", + }, { + in: "(a = 1 and b = 41) or (a = 2 and b = 42)", + // this might look weird, but it allows the planner to either a or b in a vindex operation + expected: "a in (1, 2) and (a = 1 or b = 42) and ((b = 41 or a = 2) and b in (41, 42))", + }, { + in: "(a = 1 and b = 41) or (a = 2 and b = 42) or (a = 3 and b = 43)", + expected: "a in (1, 2, 3) and (a in (1, 2) or b = 43) and ((a = 1 or b = 42 or a = 3) and (a = 1 or b = 42 or b = 43)) and ((b = 41 or a = 2 or a = 3) and (b = 41 or a = 2 or b = 43) and ((b in (41, 42) or a = 3) and b in (41, 42, 43)))", + }, { + // this has too many OR expressions in it, so we don't even try the CNF rewriting + in: "a = 1 and b = 41 or a = 2 and b = 42 or a = 3 and b = 43 or a = 4 and b = 44 or a = 5 and b = 45 or a = 6 and b = 46", + expected: "a = 1 and b = 41 or a = 2 and b = 42 or a = 3 and b = 43 or a = 4 and b = 44 or a = 5 and b = 45 or a = 6 and b = 46", }} for _, tc := range tests { @@ -164,6 +175,9 @@ func TestExtractINFromOR(in *testing.T) { }, { in: "(a in (1, 5) and B or C and a in (5, 7))", expected: "a in (1, 5, 7)", + }, { + in: "(a = 5 and b = 1 or b = 2 and a = 6 or b = 3 and a = 4)", + expected: "", }} for _, tc := range tests { diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index d934c7805da..e7e6b38d850 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -1230,7 +1230,7 @@ func TestSelectINFromOR(t *testing.T) { _, err := executorExec(executor, "select 1 from user where id = 1 and name = 'apa' or id = 2 and name = 'toto'", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select 1 from `user` where id = 1 and `name` = 'apa' or id = 2 and `name` = 'toto'", + Sql: "select 1 from `user` where id in ::__vals and (id = 1 or `name` = 'toto') and (`name` = 'apa' or id = 2) and `name` in ('apa', 'toto')", BindVariables: map[string]*querypb.BindVariable{ "__vals": sqltypes.TestBindVariable([]any{int64(1), int64(2)}), }, diff --git a/go/vt/vtgate/planbuilder/testdata/filter_cases.json b/go/vt/vtgate/planbuilder/testdata/filter_cases.json index d217bde3706..72cb7cab2a7 100644 --- a/go/vt/vtgate/planbuilder/testdata/filter_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/filter_cases.json @@ -6571,7 +6571,7 @@ "Sharded": true }, "FieldQuery": "select id from `user` where 1 != 1", - "Query": "select id from `user` where id = 5 and `name` = 'foo' or id = 12 and `name` = 'bar'", + "Query": "select id from `user` where id in ::__vals and (id = 5 or `name` = 'bar') and (`name` = 'foo' or id = 12) and `name` in ('foo', 'bar')", "Table": "`user`", "Values": [ "(INT64(5), INT64(12))" From 551dbd13ad7e5b69efb068a38ae0aae0a9391b12 Mon Sep 17 00:00:00 2001 From: "vitess-bot[bot]" <108069721+vitess-bot[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 13:58:34 +0100 Subject: [PATCH 229/233] [release-16.0] fix concurrency on stream execute engine primitives (#14586) (#14590) Signed-off-by: Harshit Gangal Signed-off-by: Dirkjan Bussink Co-authored-by: Harshit Gangal Co-authored-by: Dirkjan Bussink --- go.mod | 2 +- go/sqltypes/parse_rows.go | 174 +++++++++++++++++++++ go/vt/vtgate/engine/distinct.go | 6 +- go/vt/vtgate/engine/distinct_test.go | 53 +++++++ go/vt/vtgate/engine/fake_primitive_test.go | 51 +++++- go/vt/vtgate/engine/filter.go | 7 +- go/vt/vtgate/engine/filter_test.go | 56 +++++++ go/vt/vtgate/engine/limit.go | 10 +- go/vt/vtgate/engine/limit_test.go | 67 ++++++++ go/vt/vtgate/engine/memory_sort.go | 5 + go/vt/vtgate/engine/memory_sort_test.go | 54 +++++++ go/vt/vtgate/engine/projection.go | 3 + go/vt/vtgate/engine/projection_test.go | 55 ++++++- 13 files changed, 528 insertions(+), 15 deletions(-) create mode 100644 go/sqltypes/parse_rows.go diff --git a/go.mod b/go.mod index d489ed3dd6e..856cece7dfe 100644 --- a/go.mod +++ b/go.mod @@ -114,6 +114,7 @@ require ( github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249 github.com/spyzhov/ajson v0.8.0 golang.org/x/exp v0.0.0-20230131160201-f062dba9d201 + golang.org/x/sync v0.3.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated modernc.org/sqlite v1.20.3 ) @@ -195,7 +196,6 @@ require ( go4.org/intern v0.0.0-20220617035311-6925f38cc365 // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 // indirect golang.org/x/exp/typeparams v0.0.0-20230131160201-f062dba9d201 // indirect - golang.org/x/sync v0.3.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect diff --git a/go/sqltypes/parse_rows.go b/go/sqltypes/parse_rows.go new file mode 100644 index 00000000000..2654141ed3b --- /dev/null +++ b/go/sqltypes/parse_rows.go @@ -0,0 +1,174 @@ +/* +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 sqltypes + +import ( + "fmt" + "io" + "reflect" + "strconv" + "strings" + "text/scanner" + + querypb "vitess.io/vitess/go/vt/proto/query" +) + +// ParseRows parses the output generated by fmt.Sprintf("#v", rows), and reifies the original []sqltypes.Row +// NOTE: This is not meant for production use! +func ParseRows(input string) ([]Row, error) { + type state int + const ( + stInvalid state = iota + stInit + stBeginRow + stInRow + stInValue0 + stInValue1 + stInValue2 + ) + + var ( + scan scanner.Scanner + result []Row + row Row + vtype int32 + st = stInit + ) + + scan.Init(strings.NewReader(input)) + + for tok := scan.Scan(); tok != scanner.EOF; tok = scan.Scan() { + var next state + + switch st { + case stInit: + if tok == '[' { + next = stBeginRow + } + case stBeginRow: + switch tok { + case '[': + next = stInRow + case ']': + return result, nil + } + case stInRow: + switch tok { + case ']': + result = append(result, row) + row = nil + next = stBeginRow + case scanner.Ident: + ident := scan.TokenText() + + if ident == "NULL" { + row = append(row, NULL) + continue + } + + var ok bool + vtype, ok = querypb.Type_value[ident] + if !ok { + return nil, fmt.Errorf("unknown SQL type %q at %s", ident, scan.Position) + } + next = stInValue0 + } + case stInValue0: + if tok == '(' { + next = stInValue1 + } + case stInValue1: + literal := scan.TokenText() + switch tok { + case scanner.String: + var err error + literal, err = strconv.Unquote(literal) + if err != nil { + return nil, fmt.Errorf("failed to parse literal string at %s: %w", scan.Position, err) + } + fallthrough + case scanner.Int, scanner.Float: + row = append(row, MakeTrusted(Type(vtype), []byte(literal))) + next = stInValue2 + } + case stInValue2: + if tok == ')' { + next = stInRow + } + } + if next == stInvalid { + return nil, fmt.Errorf("unexpected token '%s' at %s", scan.TokenText(), scan.Position) + } + st = next + } + return nil, io.ErrUnexpectedEOF +} + +type RowMismatchError struct { + err error + want, got []Row +} + +func (e *RowMismatchError) Error() string { + return fmt.Sprintf("results differ: %v\n\twant: %v\n\tgot: %v", e.err, e.want, e.got) +} + +func RowsEquals(want, got []Row) error { + if len(want) != len(got) { + return &RowMismatchError{ + err: fmt.Errorf("expected %d rows in result, got %d", len(want), len(got)), + want: want, + got: got, + } + } + + var matched = make([]bool, len(want)) + for _, aa := range want { + var ok bool + for i, bb := range got { + if matched[i] { + continue + } + if reflect.DeepEqual(aa, bb) { + matched[i] = true + ok = true + break + } + } + if !ok { + return &RowMismatchError{ + err: fmt.Errorf("row %v is missing from result", aa), + want: want, + got: got, + } + } + } + for _, m := range matched { + if !m { + return fmt.Errorf("not all elements matched") + } + } + return nil +} + +func RowsEqualsStr(wantStr string, got []Row) error { + want, err := ParseRows(wantStr) + if err != nil { + return fmt.Errorf("malformed row assertion: %w", err) + } + return RowsEquals(want, got) +} diff --git a/go/vt/vtgate/engine/distinct.go b/go/vt/vtgate/engine/distinct.go index 5baa7ca9c1f..b00430369e1 100644 --- a/go/vt/vtgate/engine/distinct.go +++ b/go/vt/vtgate/engine/distinct.go @@ -19,6 +19,7 @@ package engine import ( "context" "fmt" + "sync" "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/sqltypes" @@ -197,13 +198,16 @@ func (d *Distinct) TryExecute(ctx context.Context, vcursor VCursor, bindVars map // TryStreamExecute implements the Primitive interface func (d *Distinct) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { - pt := newProbeTable(d.CheckCols) + var mu sync.Mutex + pt := newProbeTable(d.CheckCols) err := vcursor.StreamExecutePrimitive(ctx, d.Source, bindVars, wantfields, func(input *sqltypes.Result) error { result := &sqltypes.Result{ Fields: input.Fields, InsertID: input.InsertID, } + mu.Lock() + defer mu.Unlock() for _, row := range input.Rows { exists, err := pt.exists(row) if err != nil { diff --git a/go/vt/vtgate/engine/distinct_test.go b/go/vt/vtgate/engine/distinct_test.go index 5e39d2c4425..45bef7efe2a 100644 --- a/go/vt/vtgate/engine/distinct_test.go +++ b/go/vt/vtgate/engine/distinct_test.go @@ -129,6 +129,59 @@ func TestDistinct(t *testing.T) { } } +func TestDistinctStreamAsync(t *testing.T) { + distinct := &Distinct{ + Source: &fakePrimitive{ + results: sqltypes.MakeTestStreamingResults(sqltypes.MakeTestFields("myid|id|num|name", "varchar|int64|int64|varchar"), + "a|1|1|a", + "a|1|1|a", + "a|1|1|a", + "a|1|1|a", + "---", + "c|1|1|a", + "a|1|1|a", + "z|1|1|a", + "a|1|1|t", + "a|1|1|a", + "a|1|1|a", + "a|1|1|a", + "---", + "c|1|1|a", + "a|1|1|a", + "---", + "c|1|1|a", + "a|1|1|a", + "a|1|1|a", + "c|1|1|a", + "a|1|1|a", + "a|1|1|a", + "---", + "c|1|1|a", + "a|1|1|a", + ), + async: true, + }, + CheckCols: []CheckCol{ + {Col: 0, Collation: collations.CollationUtf8mb4ID}, + {Col: 1, Collation: collations.CollationBinaryID}, + {Col: 2, Collation: collations.CollationBinaryID}, + {Col: 3, Collation: collations.CollationUtf8mb4ID}, + }, + } + + qr := &sqltypes.Result{} + err := distinct.TryStreamExecute(context.Background(), &noopVCursor{}, nil, true, func(result *sqltypes.Result) error { + qr.Rows = append(qr.Rows, result.Rows...) + return nil + }) + require.NoError(t, err) + require.NoError(t, sqltypes.RowsEqualsStr(` +[[VARCHAR("c") INT64(1) INT64(1) VARCHAR("a")] +[VARCHAR("a") INT64(1) INT64(1) VARCHAR("a")] +[VARCHAR("z") INT64(1) INT64(1) VARCHAR("a")] +[VARCHAR("a") INT64(1) INT64(1) VARCHAR("t")]]`, qr.Rows)) +} + func TestWeightStringFallBack(t *testing.T) { offsetOne := 1 checkCols := []CheckCol{{ diff --git a/go/vt/vtgate/engine/fake_primitive_test.go b/go/vt/vtgate/engine/fake_primitive_test.go index 1a168dc3dc4..4183ac6e3cc 100644 --- a/go/vt/vtgate/engine/fake_primitive_test.go +++ b/go/vt/vtgate/engine/fake_primitive_test.go @@ -23,8 +23,9 @@ import ( "strings" "testing" - "vitess.io/vitess/go/sqltypes" + "golang.org/x/sync/errgroup" + "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" ) @@ -41,6 +42,8 @@ type fakePrimitive struct { log []string allResultsInOneCall bool + + async bool } func (f *fakePrimitive) Inputs() []Primitive { @@ -86,6 +89,13 @@ func (f *fakePrimitive) TryStreamExecute(ctx context.Context, vcursor VCursor, b return f.sendErr } + if f.async { + return f.asyncCall(callback) + } + return f.syncCall(wantfields, callback) +} + +func (f *fakePrimitive) syncCall(wantfields bool, callback func(*sqltypes.Result) error) error { readMoreResults := true for readMoreResults && f.curResult < len(f.results) { readMoreResults = f.allResultsInOneCall @@ -116,9 +126,46 @@ func (f *fakePrimitive) TryStreamExecute(ctx context.Context, vcursor VCursor, b } } } - return nil } + +func (f *fakePrimitive) asyncCall(callback func(*sqltypes.Result) error) error { + var g errgroup.Group + var fields []*querypb.Field + if len(f.results) > 0 { + fields = f.results[0].Fields + } + for _, res := range f.results { + qr := res + g.Go(func() error { + if qr == nil { + return f.sendErr + } + if err := callback(&sqltypes.Result{Fields: fields}); err != nil { + return err + } + result := &sqltypes.Result{} + for i := 0; i < len(qr.Rows); i++ { + result.Rows = append(result.Rows, qr.Rows[i]) + // Send only two rows at a time. + if i%2 == 1 { + if err := callback(result); err != nil { + return err + } + result = &sqltypes.Result{} + } + } + if len(result.Rows) != 0 { + if err := callback(result); err != nil { + return err + } + } + return nil + }) + } + return g.Wait() +} + func (f *fakePrimitive) GetFields(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { f.log = append(f.log, fmt.Sprintf("GetFields %v", printBindVars(bindVars))) return f.TryExecute(ctx, vcursor, bindVars, true /* wantfields */) diff --git a/go/vt/vtgate/engine/filter.go b/go/vt/vtgate/engine/filter.go index fb696a9d679..32291543076 100644 --- a/go/vt/vtgate/engine/filter.go +++ b/go/vt/vtgate/engine/filter.go @@ -18,6 +18,7 @@ package engine import ( "context" + "sync" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/evalengine" @@ -79,10 +80,14 @@ func (f *Filter) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[s // TryStreamExecute satisfies the Primitive interface. func (f *Filter) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { + var mu sync.Mutex + env := evalengine.EnvWithBindVars(bindVars, vcursor.ConnCollation()) filter := func(results *sqltypes.Result) error { var rows [][]sqltypes.Value - env.Fields = results.Fields + + mu.Lock() + defer mu.Unlock() for _, row := range results.Rows { env.Row = row evalResult, err := env.Evaluate(f.Predicate) diff --git a/go/vt/vtgate/engine/filter_test.go b/go/vt/vtgate/engine/filter_test.go index b6d8730a869..05602ed2f9a 100644 --- a/go/vt/vtgate/engine/filter_test.go +++ b/go/vt/vtgate/engine/filter_test.go @@ -101,3 +101,59 @@ func TestFilterPass(t *testing.T) { }) } } + +func TestFilterStreaming(t *testing.T) { + predicate := &sqlparser.ComparisonExpr{ + Operator: sqlparser.GreaterThanOp, + Left: sqlparser.NewColName("left"), + Right: sqlparser.NewColName("right"), + } + + tcases := []struct { + name string + res []*sqltypes.Result + expRes string + }{{ + name: "int32", + res: sqltypes.MakeTestStreamingResults(sqltypes.MakeTestFields("left|right", "int32|int32"), "0|1", "---", "1|0", "2|3"), + expRes: `[[INT32(1) INT32(0)]]`, + }, { + name: "uint16", + res: sqltypes.MakeTestStreamingResults(sqltypes.MakeTestFields("left|right", "uint16|uint16"), "0|1", "1|0", "---", "2|3"), + expRes: `[[UINT16(1) UINT16(0)]]`, + }, { + name: "uint64_int64", + res: sqltypes.MakeTestStreamingResults(sqltypes.MakeTestFields("left|right", "uint64|int64"), "0|1", "---", "1|0", "2|3"), + expRes: `[[UINT64(1) INT64(0)]]`, + }, { + name: "int32_uint32", + res: sqltypes.MakeTestStreamingResults(sqltypes.MakeTestFields("left|right", "int32|uint32"), "0|1", "---", "1|0", "---", "2|3"), + expRes: `[[INT32(1) UINT32(0)]]`, + }, { + name: "uint16_int8", + res: sqltypes.MakeTestStreamingResults(sqltypes.MakeTestFields("left|right", "uint16|int8"), "0|1", "1|0", "2|3", "---"), + expRes: `[[UINT16(1) INT8(0)]]`, + }, { + name: "uint64_int32", + res: sqltypes.MakeTestStreamingResults(sqltypes.MakeTestFields("left|right", "uint64|int32"), "0|1", "1|0", "2|3", "---", "0|1", "1|3", "5|3"), + expRes: `[[UINT64(1) INT32(0)] [UINT64(5) INT32(3)]]`, + }} + for _, tc := range tcases { + t.Run(tc.name, func(t *testing.T) { + pred, err := evalengine.Translate(predicate, &dummyTranslator{}) + require.NoError(t, err) + + filter := &Filter{ + Predicate: pred, + Input: &fakePrimitive{results: tc.res, async: true}, + } + qr := &sqltypes.Result{} + err = filter.TryStreamExecute(context.Background(), &noopVCursor{}, nil, false, func(result *sqltypes.Result) error { + qr.Rows = append(qr.Rows, result.Rows...) + return nil + }) + require.NoError(t, err) + require.NoError(t, sqltypes.RowsEqualsStr(tc.expRes, qr.Rows)) + }) + } +} diff --git a/go/vt/vtgate/engine/limit.go b/go/vt/vtgate/engine/limit.go index 14fd0d7e15f..566f79fbe7e 100644 --- a/go/vt/vtgate/engine/limit.go +++ b/go/vt/vtgate/engine/limit.go @@ -20,12 +20,11 @@ import ( "context" "fmt" "io" - - "vitess.io/vitess/go/vt/vtgate/evalengine" + "sync" "vitess.io/vitess/go/sqltypes" - querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/vtgate/evalengine" ) var _ Primitive = (*Limit)(nil) @@ -95,8 +94,11 @@ func (l *Limit) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars // the offset in memory from the result of the scatter query with count + offset. bindVars["__upper_limit"] = sqltypes.Int64BindVariable(int64(count + offset)) + var mu sync.Mutex err = vcursor.StreamExecutePrimitive(ctx, l.Input, bindVars, wantfields, func(qr *sqltypes.Result) error { - if len(qr.Fields) != 0 { + mu.Lock() + defer mu.Unlock() + if wantfields && len(qr.Fields) != 0 { if err := callback(&sqltypes.Result{Fields: qr.Fields}); err != nil { return err } diff --git a/go/vt/vtgate/engine/limit_test.go b/go/vt/vtgate/engine/limit_test.go index dcdc43880a0..5f9d4e7da9f 100644 --- a/go/vt/vtgate/engine/limit_test.go +++ b/go/vt/vtgate/engine/limit_test.go @@ -450,6 +450,73 @@ func TestLimitStreamExecute(t *testing.T) { } } +func TestLimitStreamExecuteAsync(t *testing.T) { + bindVars := make(map[string]*querypb.BindVariable) + fields := sqltypes.MakeTestFields( + "col1|col2", + "int64|varchar", + ) + inputResults := sqltypes.MakeTestStreamingResults( + fields, + "a|1", + "b|2", + "d|3", + "e|4", + "a|1", + "b|2", + "d|3", + "e|4", + "---", + "c|7", + "x|8", + "y|9", + "c|7", + "x|8", + "y|9", + "c|7", + "x|8", + "y|9", + "---", + "l|4", + "m|5", + "n|6", + "l|4", + "m|5", + "n|6", + "l|4", + "m|5", + "n|6", + ) + fp := &fakePrimitive{ + results: inputResults, + async: true, + } + + const maxCount = 26 + for i := 0; i <= maxCount*20; i++ { + expRows := i + l := &Limit{ + Count: evalengine.NewLiteralInt(int64(expRows)), + Input: fp, + } + // Test with limit smaller than input. + results := &sqltypes.Result{} + + err := l.TryStreamExecute(context.Background(), &noopVCursor{}, bindVars, true, func(qr *sqltypes.Result) error { + if qr != nil { + results.Rows = append(results.Rows, qr.Rows...) + } + return nil + }) + require.NoError(t, err) + if expRows > maxCount { + expRows = maxCount + } + require.Len(t, results.Rows, expRows) + } + +} + func TestOffsetStreamExecute(t *testing.T) { bindVars := make(map[string]*querypb.BindVariable) fields := sqltypes.MakeTestFields( diff --git a/go/vt/vtgate/engine/memory_sort.go b/go/vt/vtgate/engine/memory_sort.go index 6085f36a7ed..42fbd9ac78f 100644 --- a/go/vt/vtgate/engine/memory_sort.go +++ b/go/vt/vtgate/engine/memory_sort.go @@ -24,6 +24,7 @@ import ( "reflect" "sort" "strings" + "sync" "vitess.io/vitess/go/vt/vtgate/evalengine" @@ -108,7 +109,11 @@ func (ms *MemorySort) TryStreamExecute(ctx context.Context, vcursor VCursor, bin comparers: extractSlices(ms.OrderBy), reverse: true, } + + var mu sync.Mutex err = vcursor.StreamExecutePrimitive(ctx, ms.Input, bindVars, wantfields, func(qr *sqltypes.Result) error { + mu.Lock() + defer mu.Unlock() if len(qr.Fields) != 0 { if err := cb(&sqltypes.Result{Fields: qr.Fields}); err != nil { return err diff --git a/go/vt/vtgate/engine/memory_sort_test.go b/go/vt/vtgate/engine/memory_sort_test.go index 93b76876783..71964de2922 100644 --- a/go/vt/vtgate/engine/memory_sort_test.go +++ b/go/vt/vtgate/engine/memory_sort_test.go @@ -659,3 +659,57 @@ func TestMemorySortExecuteNoVarChar(t *testing.T) { t.Errorf("StreamExecute err: %v, want %v", err, want) } } + +func TestMemorySortStreamAsync(t *testing.T) { + fields := sqltypes.MakeTestFields( + "c1|c2", + "varbinary|decimal", + ) + fp := &fakePrimitive{ + results: sqltypes.MakeTestStreamingResults( + fields, + "a|1", + "g|2", + "a|1", + "---", + "c|3", + "g|2", + "a|1", + "---", + "c|4", + "c|3", + "g|2", + "a|1", + "---", + "c|4", + "c|3", + "g|2", + "a|1", + "---", + "c|4", + "c|3", + ), + async: true, + } + + ms := &MemorySort{ + OrderBy: []OrderByParams{{ + WeightStringCol: -1, + Col: 1, + }}, + Input: fp, + } + + qr := &sqltypes.Result{} + err := ms.TryStreamExecute(context.Background(), &noopVCursor{}, nil, true, func(res *sqltypes.Result) error { + qr.Rows = append(qr.Rows, res.Rows...) + return nil + }) + require.NoError(t, err) + require.NoError(t, sqltypes.RowsEqualsStr( + `[[VARBINARY("a") DECIMAL(1)] [VARBINARY("a") DECIMAL(1)] [VARBINARY("a") DECIMAL(1)] [VARBINARY("a") DECIMAL(1)] [VARBINARY("a") DECIMAL(1)] +[VARBINARY("g") DECIMAL(2)] [VARBINARY("g") DECIMAL(2)] [VARBINARY("g") DECIMAL(2)] [VARBINARY("g") DECIMAL(2)] +[VARBINARY("c") DECIMAL(3)] [VARBINARY("c") DECIMAL(3)] [VARBINARY("c") DECIMAL(3)] [VARBINARY("c") DECIMAL(3)] +[VARBINARY("c") DECIMAL(4)] [VARBINARY("c") DECIMAL(4)] [VARBINARY("c") DECIMAL(4)]]`, + qr.Rows)) +} diff --git a/go/vt/vtgate/engine/projection.go b/go/vt/vtgate/engine/projection.go index 0c0875d19d9..5d759385954 100644 --- a/go/vt/vtgate/engine/projection.go +++ b/go/vt/vtgate/engine/projection.go @@ -87,8 +87,11 @@ func (p *Projection) TryStreamExecute(ctx context.Context, vcursor VCursor, bind env := evalengine.EnvWithBindVars(bindVars, vcursor.ConnCollation()) var once sync.Once var fields []*querypb.Field + var mu sync.Mutex return vcursor.StreamExecutePrimitive(ctx, p.Input, bindVars, wantfields, func(qr *sqltypes.Result) error { var err error + mu.Lock() + defer mu.Unlock() if wantfields { once.Do(func() { env.Fields = qr.Fields diff --git a/go/vt/vtgate/engine/projection_test.go b/go/vt/vtgate/engine/projection_test.go index 701ee8e2aaf..e487b82d349 100644 --- a/go/vt/vtgate/engine/projection_test.go +++ b/go/vt/vtgate/engine/projection_test.go @@ -70,6 +70,49 @@ func TestMultiply(t *testing.T) { assert.Equal(t, "[[UINT64(6)] [UINT64(0)] [UINT64(2)]]", fmt.Sprintf("%v", qr.Rows)) } +func TestProjectionStreaming(t *testing.T) { + expr := &sqlparser.BinaryExpr{ + Operator: sqlparser.MultOp, + Left: &sqlparser.Offset{V: 0}, + Right: &sqlparser.Offset{V: 1}, + } + evalExpr, err := evalengine.Translate(expr, nil) + require.NoError(t, err) + fp := &fakePrimitive{ + results: sqltypes.MakeTestStreamingResults( + sqltypes.MakeTestFields("a|b", "uint64|uint64"), + "3|2", + "1|0", + "6|2", + "---", + "3|2", + "---", + "1|0", + "---", + "1|2", + "4|2", + "---", + "5|5", + "4|10", + ), + async: true, + } + proj := &Projection{ + Cols: []string{"apa"}, + Exprs: []evalengine.Expr{evalExpr}, + Input: fp, + } + + qr := &sqltypes.Result{} + err = proj.TryStreamExecute(context.Background(), &noopVCursor{}, nil, true, func(result *sqltypes.Result) error { + qr.Rows = append(qr.Rows, result.Rows...) + return nil + }) + require.NoError(t, err) + require.NoError(t, sqltypes.RowsEqualsStr(`[[UINT64(25)] [UINT64(40)] [UINT64(6)] [UINT64(2)] [UINT64(8)] [UINT64(0)] [UINT64(6)] [UINT64(0)] [UINT64(12)]]`, + qr.Rows)) +} + func TestEmptyInput(t *testing.T) { expr := &sqlparser.BinaryExpr{ Operator: sqlparser.MultOp, @@ -91,18 +134,18 @@ func TestEmptyInput(t *testing.T) { require.NoError(t, err) assert.Equal(t, "[]", fmt.Sprintf("%v", qr.Rows)) - //fp = &fakePrimitive{ + // fp = &fakePrimitive{ // results: []*sqltypes.Result{sqltypes.MakeTestResult( // sqltypes.MakeTestFields("a|b", "uint64|uint64"), // "3|2", // "1|0", // "1|2", // )}, - //} - //proj.Input = fp - //qr, err = wrapStreamExecute(proj, newNoopVCursor(context.Background()), nil, true) - //require.NoError(t, err) - //assert.Equal(t, "[[UINT64(6)] [UINT64(0)] [UINT64(2)]]", fmt.Sprintf("%v", qr.Rows)) + // } + // proj.Input = fp + // qr, err = wrapStreamExecute(proj, newNoopVCursor(context.Background()), nil, true) + // require.NoError(t, err) + // assert.Equal(t, "[[UINT64(6)] [UINT64(0)] [UINT64(2)]]", fmt.Sprintf("%v", qr.Rows)) } func TestHexAndBinaryArgument(t *testing.T) { From a8b6d48918fbf7dbfc2a245d371006c4ca97466b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Taylor?= Date: Thu, 23 Nov 2023 16:49:43 +0100 Subject: [PATCH 230/233] [16.0] bug fix: stop all kinds of expressions from cnf-exploding (#14595) --- go/vt/sqlparser/predicate_rewriting.go | 391 ++++++++------------ go/vt/sqlparser/predicate_rewriting_test.go | 9 +- 2 files changed, 157 insertions(+), 243 deletions(-) diff --git a/go/vt/sqlparser/predicate_rewriting.go b/go/vt/sqlparser/predicate_rewriting.go index 7e0852ef7ed..4545cd7de5a 100644 --- a/go/vt/sqlparser/predicate_rewriting.go +++ b/go/vt/sqlparser/predicate_rewriting.go @@ -16,32 +16,14 @@ limitations under the License. package sqlparser -import ( - "vitess.io/vitess/go/vt/log" -) - -// This is the number of OR expressions in a predicate that will disable the CNF -// rewrite because we don't want to send large queries to MySQL -const CNFOrLimit = 5 - // RewritePredicate walks the input AST and rewrites any boolean logic into a simpler form // This simpler form is CNF plus logic for extracting predicates from OR, plus logic for turning ORs into IN -// Note: In order to re-plan, we need to empty the accumulated metadata in the AST, -// so ColName.Metadata will be nil:ed out as part of this rewrite func RewritePredicate(ast SQLNode) SQLNode { - count := 0 - _ = Walk(func(node SQLNode) (bool, error) { - if _, isExpr := node.(*OrExpr); isExpr { - count++ - } - - return true, nil - }, ast) - - allowCNF := count < CNFOrLimit + original := CloneSQLNode(ast) - for { - printExpr(ast) + // Beware: converting to CNF in this loop might cause exponential formula growth. + // We bail out early to prevent going overboard. + for loop := 0; loop < 15; loop++ { exprChanged := false stopOnChange := func(SQLNode, SQLNode) bool { return !exprChanged @@ -52,9 +34,8 @@ func RewritePredicate(ast SQLNode) SQLNode { return true } - rewritten, state := simplifyExpression(e, allowCNF) - if ch, isChange := state.(changed); isChange { - printRule(ch.rule, ch.exprMatched) + rewritten, changed := simplifyExpression(e) + if changed { exprChanged = true cursor.Replace(rewritten) } @@ -69,70 +50,44 @@ func RewritePredicate(ast SQLNode) SQLNode { return ast } } + + return original } -func simplifyExpression(expr Expr, allowCNF bool) (Expr, rewriteState) { +func simplifyExpression(expr Expr) (Expr, bool) { switch expr := expr.(type) { case *NotExpr: return simplifyNot(expr) case *OrExpr: - return simplifyOr(expr, allowCNF) + return simplifyOr(expr) case *XorExpr: return simplifyXor(expr) case *AndExpr: return simplifyAnd(expr) } - return expr, noChange{} + return expr, false } -func simplifyNot(expr *NotExpr) (Expr, rewriteState) { +func simplifyNot(expr *NotExpr) (Expr, bool) { switch child := expr.Expr.(type) { case *NotExpr: - return child.Expr, - newChange("NOT NOT A => A", f(expr)) + return child.Expr, true case *OrExpr: - return &AndExpr{Right: &NotExpr{Expr: child.Right}, Left: &NotExpr{Expr: child.Left}}, - newChange("NOT (A OR B) => NOT A AND NOT B", f(expr)) + // not(or(a,b)) => and(not(a),not(b)) + return &AndExpr{Right: &NotExpr{Expr: child.Right}, Left: &NotExpr{Expr: child.Left}}, true case *AndExpr: - return &OrExpr{Right: &NotExpr{Expr: child.Right}, Left: &NotExpr{Expr: child.Left}}, - newChange("NOT (A AND B) => NOT A OR NOT B", f(expr)) + // not(and(a,b)) => or(not(a), not(b)) + return &OrExpr{Right: &NotExpr{Expr: child.Right}, Left: &NotExpr{Expr: child.Left}}, true } - return expr, noChange{} + return expr, false } -// ExtractINFromOR will add additional predicated to an OR. -// this rewriter should not be used in a fixed point way, since it returns the original expression with additions, -// and it will therefor OOM before it stops rewriting -func ExtractINFromOR(expr *OrExpr) []Expr { - // we check if we have two comparisons on either side of the OR - // that we can add as an ANDed comparison. - // WHERE (a = 5 and B) or (a = 6 AND C) => - // WHERE (a = 5 AND B) OR (a = 6 AND C) AND a IN (5,6) - // This rewrite makes it possible to find a better route than Scatter if the `a` column has a helpful vindex - lftPredicates := SplitAndExpression(nil, expr.Left) - rgtPredicates := SplitAndExpression(nil, expr.Right) - var ins []Expr - for _, lft := range lftPredicates { - l, ok := lft.(*ComparisonExpr) - if !ok { - continue - } - for _, rgt := range rgtPredicates { - r, ok := rgt.(*ComparisonExpr) - if !ok { - continue - } - in, state := tryTurningOrIntoIn(l, r) - if state.changed() { - ins = append(ins, in) - } - } +func simplifyOr(expr *OrExpr) (Expr, bool) { + res, rewritten := distinctOr(expr) + if rewritten { + return res, true } - return uniquefy(ins) -} - -func simplifyOr(expr *OrExpr, allowCNF bool) (Expr, rewriteState) { or := expr // first we search for ANDs and see how they can be simplified @@ -141,25 +96,21 @@ func simplifyOr(expr *OrExpr, allowCNF bool) (Expr, rewriteState) { if lok && rok { // (<> AND <>) OR (<> AND <>) + // or(and(T1,T2), and(T2, T3)) => and(T1, or(T2, T2)) var a, b, c Expr - var change changed switch { case Equals.Expr(land.Left, rand.Left): - change = newChange("(A and B) or (A and C) => A AND (B OR C)", f(expr)) a, b, c = land.Left, land.Right, rand.Right - return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, change + return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, true case Equals.Expr(land.Left, rand.Right): - change = newChange("(A and B) or (C and A) => A AND (B OR C)", f(expr)) a, b, c = land.Left, land.Right, rand.Left - return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, change + return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, true case Equals.Expr(land.Right, rand.Left): - change = newChange("(B and A) or (A and C) => A AND (B OR C)", f(expr)) a, b, c = land.Right, land.Left, rand.Right - return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, change + return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, true case Equals.Expr(land.Right, rand.Right): - change = newChange("(B and A) or (C and A) => A AND (B OR C)", f(expr)) a, b, c = land.Right, land.Left, rand.Left - return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, change + return &AndExpr{Left: a, Right: &OrExpr{Left: b, Right: c}}, true } } @@ -167,31 +118,38 @@ func simplifyOr(expr *OrExpr, allowCNF bool) (Expr, rewriteState) { if lok { // Simplification if Equals.Expr(or.Right, land.Left) || Equals.Expr(or.Right, land.Right) { - return or.Right, newChange("(A AND B) OR A => A", f(expr)) + // or(and(a,b), c) => c where c=a or c=b + return or.Right, true } - if allowCNF { - // Distribution Law - return &AndExpr{Left: &OrExpr{Left: land.Left, Right: or.Right}, Right: &OrExpr{Left: land.Right, Right: or.Right}}, - newChange("(A AND B) OR C => (A OR C) AND (B OR C)", f(expr)) - } + // Distribution Law + // or(c, and(a,b)) => and(or(c,a), or(c,b)) + return &AndExpr{ + Left: &OrExpr{ + Left: land.Left, + Right: or.Right, + }, + Right: &OrExpr{ + Left: land.Right, + Right: or.Right, + }, + }, true } // <> OR (<> AND <>) if rok { // Simplification if Equals.Expr(or.Left, rand.Left) || Equals.Expr(or.Left, rand.Right) { - return or.Left, newChange("A OR (A AND B) => A", f(expr)) + // or(a,and(b,c)) => a + return or.Left, true } - if allowCNF { - // Distribution Law - return &AndExpr{ - Left: &OrExpr{Left: or.Left, Right: rand.Left}, - Right: &OrExpr{Left: or.Left, Right: rand.Right}, - }, - newChange("C OR (A AND B) => (C OR A) AND (C OR B)", f(expr)) - } + // Distribution Law + // or(and(a,b), c) => and(or(c,a), or(c,b)) + return &AndExpr{ + Left: &OrExpr{Left: or.Left, Right: rand.Left}, + Right: &OrExpr{Left: or.Left, Right: rand.Right}, + }, true } // next, we want to try to turn multiple ORs into an IN when possible @@ -199,63 +157,131 @@ func simplifyOr(expr *OrExpr, allowCNF bool) (Expr, rewriteState) { rgtCmp, rok := or.Right.(*ComparisonExpr) if lok && rok { newExpr, rewritten := tryTurningOrIntoIn(lftCmp, rgtCmp) - if rewritten.changed() { - return newExpr, rewritten + if rewritten { + // or(a=x,a=y) => in(a,[x,y]) + return newExpr, true } } // Try to make distinct - return distinctOr(expr) + result, changed := distinctOr(expr) + if changed { + return result, true + } + return result, false +} + +func simplifyXor(expr *XorExpr) (Expr, bool) { + // xor(a,b) => and(or(a,b), not(and(a,b)) + return &AndExpr{ + Left: &OrExpr{Left: expr.Left, Right: expr.Right}, + Right: &NotExpr{Expr: &AndExpr{Left: expr.Left, Right: expr.Right}}, + }, true } -func tryTurningOrIntoIn(l, r *ComparisonExpr) (Expr, rewriteState) { +func simplifyAnd(expr *AndExpr) (Expr, bool) { + res, rewritten := distinctAnd(expr) + if rewritten { + return res, true + } + and := expr + if or, ok := and.Left.(*OrExpr); ok { + // Simplification + // and(or(a,b),c) => c when c=a or c=b + if Equals.Expr(or.Left, and.Right) { + return and.Right, true + } + if Equals.Expr(or.Right, and.Right) { + return and.Right, true + } + } + if or, ok := and.Right.(*OrExpr); ok { + // Simplification + if Equals.Expr(or.Left, and.Left) { + return and.Left, true + } + if Equals.Expr(or.Right, and.Left) { + return and.Left, true + } + } + + return expr, false +} + +// ExtractINFromOR will add additional predicated to an OR. +// this rewriter should not be used in a fixed point way, since it returns the original expression with additions, +// and it will therefor OOM before it stops rewriting +func ExtractINFromOR(expr *OrExpr) []Expr { + // we check if we have two comparisons on either side of the OR + // that we can add as an ANDed comparison. + // WHERE (a = 5 and B) or (a = 6 AND C) => + // WHERE (a = 5 AND B) OR (a = 6 AND C) AND a IN (5,6) + // This rewrite makes it possible to find a better route than Scatter if the `a` column has a helpful vindex + lftPredicates := SplitAndExpression(nil, expr.Left) + rgtPredicates := SplitAndExpression(nil, expr.Right) + var ins []Expr + for _, lft := range lftPredicates { + l, ok := lft.(*ComparisonExpr) + if !ok { + continue + } + for _, rgt := range rgtPredicates { + r, ok := rgt.(*ComparisonExpr) + if !ok { + continue + } + in, changed := tryTurningOrIntoIn(l, r) + if changed { + ins = append(ins, in) + } + } + } + + return uniquefy(ins) +} + +func tryTurningOrIntoIn(l, r *ComparisonExpr) (Expr, bool) { // looks for A = X OR A = Y and turns them into A IN (X, Y) col, ok := l.Left.(*ColName) if !ok || !Equals.Expr(col, r.Left) { - return nil, noChange{} + return nil, false } var tuple ValTuple - var ruleStr string + switch l.Operator { case EqualOp: tuple = ValTuple{l.Right} - ruleStr = "A = <>" case InOp: lft, ok := l.Right.(ValTuple) if !ok { - return nil, noChange{} + return nil, false } tuple = lft - ruleStr = "A IN (<>, <>)" default: - return nil, noChange{} + return nil, false } - ruleStr += " OR " - switch r.Operator { case EqualOp: tuple = append(tuple, r.Right) - ruleStr += "A = <>" + case InOp: lft, ok := r.Right.(ValTuple) if !ok { - return nil, noChange{} + return nil, false } tuple = append(tuple, lft...) - ruleStr += "A IN (<>, <>)" + default: - return nil, noChange{} + return nil, false } - ruleStr += " => A IN (<>, <>)" - return &ComparisonExpr{ Operator: InOp, Left: col, Right: uniquefy(tuple), - }, newChange(ruleStr, f(&OrExpr{Left: l, Right: r})) + }, true } func uniquefy(tuple ValTuple) (output ValTuple) { @@ -271,44 +297,7 @@ outer: return } -func simplifyXor(expr *XorExpr) (Expr, rewriteState) { - // DeMorgan Rewriter - return &AndExpr{ - Left: &OrExpr{Left: expr.Left, Right: expr.Right}, - Right: &NotExpr{Expr: &AndExpr{Left: expr.Left, Right: expr.Right}}, - }, newChange("(A XOR B) => (A OR B) AND NOT (A AND B)", f(expr)) -} - -func simplifyAnd(expr *AndExpr) (Expr, rewriteState) { - res, rewritten := distinctAnd(expr) - if rewritten.changed() { - return res, rewritten - } - and := expr - if or, ok := and.Left.(*OrExpr); ok { - // Simplification - if Equals.Expr(or.Left, and.Right) { - return and.Right, newChange("(A OR B) AND A => A", f(expr)) - } - if Equals.Expr(or.Right, and.Right) { - return and.Right, newChange("(A OR B) AND B => B", f(expr)) - } - } - if or, ok := and.Right.(*OrExpr); ok { - // Simplification - if Equals.Expr(or.Left, and.Left) { - return and.Left, newChange("A AND (A OR B) => A", f(expr)) - } - if Equals.Expr(or.Right, and.Left) { - return and.Left, newChange("A AND (B OR A) => A", f(expr)) - } - } - - return expr, noChange{} -} - -func distinctOr(in *OrExpr) (Expr, rewriteState) { - var skipped []*OrExpr +func distinctOr(in *OrExpr) (result Expr, changed bool) { todo := []*OrExpr{in} var leaves []Expr for len(todo) > 0 { @@ -325,27 +314,23 @@ func distinctOr(in *OrExpr) (Expr, rewriteState) { addAnd(curr.Left) addAnd(curr.Right) } - original := len(leaves) + var predicates []Expr outer1: - for len(leaves) > 0 { - curr := leaves[0] - leaves = leaves[1:] + for _, curr := range leaves { for _, alreadyIn := range predicates { if Equals.Expr(alreadyIn, curr) { - if log.V(0) { - skipped = append(skipped, &OrExpr{Left: alreadyIn, Right: curr}) - } + changed = true continue outer1 } } predicates = append(predicates, curr) } - if original == len(predicates) { - return in, noChange{} + if !changed { + return in, false } - var result Expr + for i, curr := range predicates { if i == 0 { result = curr @@ -354,25 +339,10 @@ outer1: result = &OrExpr{Left: result, Right: curr} } - return result, newChange("A OR A => A", func() Expr { - var result Expr - for _, orExpr := range skipped { - if result == nil { - result = orExpr - continue - } - - result = &OrExpr{ - Left: result, - Right: orExpr, - } - } - return result - }) + return } -func distinctAnd(in *AndExpr) (Expr, rewriteState) { - var skipped []*AndExpr +func distinctAnd(in *AndExpr) (result Expr, changed bool) { todo := []*AndExpr{in} var leaves []Expr for len(todo) > 0 { @@ -388,25 +358,23 @@ func distinctAnd(in *AndExpr) (Expr, rewriteState) { addExpr(curr.Left) addExpr(curr.Right) } - original := len(leaves) var predicates []Expr outer1: for _, curr := range leaves { for _, alreadyIn := range predicates { if Equals.Expr(alreadyIn, curr) { - if log.V(0) { - skipped = append(skipped, &AndExpr{Left: alreadyIn, Right: curr}) - } + changed = true continue outer1 } } predicates = append(predicates, curr) } - if original == len(predicates) { - return in, noChange{} + + if !changed { + return in, false } - var result Expr + for i, curr := range predicates { if i == 0 { result = curr @@ -414,62 +382,5 @@ outer1: } result = &AndExpr{Left: result, Right: curr} } - return AndExpressions(leaves...), newChange("A AND A => A", func() Expr { - var result Expr - for _, andExpr := range skipped { - if result == nil { - result = andExpr - continue - } - - result = &AndExpr{ - Left: result, - Right: andExpr, - } - } - return result - }) -} - -type ( - rewriteState interface { - changed() bool - } - noChange struct{} - - // changed makes it possible to make sure we have a rule string for each change we do in the expression tree - changed struct { - rule string - - // ExprMatched is a function here so building of this expression can be paid only when we are debug logging - exprMatched func() Expr - } -) - -func (noChange) changed() bool { return false } -func (changed) changed() bool { return true } - -// f returns a function that returns the expression. It's short by design, so it interferes minimally -// used for logging -func f(e Expr) func() Expr { - return func() Expr { return e } -} - -func printRule(rule string, expr func() Expr) { - if log.V(10) { - log.Infof("Rule: %s ON %s", rule, String(expr())) - } -} - -func printExpr(expr SQLNode) { - if log.V(10) { - log.Infof("Current: %s", String(expr)) - } -} - -func newChange(rule string, exprMatched func() Expr) changed { - return changed{ - rule: rule, - exprMatched: exprMatched, - } + return AndExpressions(leaves...), true } diff --git a/go/vt/sqlparser/predicate_rewriting_test.go b/go/vt/sqlparser/predicate_rewriting_test.go index fba3d2f01dd..e106a56f1aa 100644 --- a/go/vt/sqlparser/predicate_rewriting_test.go +++ b/go/vt/sqlparser/predicate_rewriting_test.go @@ -91,8 +91,8 @@ func TestSimplifyExpression(in *testing.T) { expr, err := ParseExpr(tc.in) require.NoError(t, err) - expr, didRewrite := simplifyExpression(expr, true) - assert.True(t, didRewrite.changed()) + expr, changed := simplifyExpression(expr) + assert.True(t, changed) assert.Equal(t, tc.expected, String(expr)) }) } @@ -137,9 +137,12 @@ func TestRewritePredicate(in *testing.T) { in: "(a = 1 and b = 41) or (a = 2 and b = 42) or (a = 3 and b = 43)", expected: "a in (1, 2, 3) and (a in (1, 2) or b = 43) and ((a = 1 or b = 42 or a = 3) and (a = 1 or b = 42 or b = 43)) and ((b = 41 or a = 2 or a = 3) and (b = 41 or a = 2 or b = 43) and ((b in (41, 42) or a = 3) and b in (41, 42, 43)))", }, { - // this has too many OR expressions in it, so we don't even try the CNF rewriting + // the following two tests show some pathological cases that would grow too much, and so we abort the rewriting in: "a = 1 and b = 41 or a = 2 and b = 42 or a = 3 and b = 43 or a = 4 and b = 44 or a = 5 and b = 45 or a = 6 and b = 46", expected: "a = 1 and b = 41 or a = 2 and b = 42 or a = 3 and b = 43 or a = 4 and b = 44 or a = 5 and b = 45 or a = 6 and b = 46", + }, { + in: "not n0 xor not (n2 and n3) xor (not n2 and (n1 xor n1) xor (n0 xor n0 xor n2))", + expected: "not n0 xor not (n2 and n3) xor (not n2 and (n1 xor n1) xor (n0 xor n0 xor n2))", }} for _, tc := range tests { From 151b1b06496eb7b0ba7ad0c13db9cb78f0f52029 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Tue, 28 Nov 2023 07:48:47 +0200 Subject: [PATCH 231/233] [release-16.0] Replace use of `WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS` with `WAIT_FOR_EXECUTED_GTID_SET` (#14612) (#14620) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/mysql/flavor_mysql.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/mysql/flavor_mysql.go b/go/mysql/flavor_mysql.go index 3650d085960..ce5f9a982cf 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -275,7 +275,7 @@ func (mysqlFlavor) waitUntilPositionCommand(ctx context.Context, pos Position) ( } } - return fmt.Sprintf("SELECT WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS('%s', %v)", pos, timeoutSeconds), nil + return fmt.Sprintf("SELECT WAIT_FOR_EXECUTED_GTID_SET('%s', %v)", pos, timeoutSeconds), nil } // readBinlogEvent is part of the Flavor interface. From 93764173916fb2130de82c5491999c8f50c6aa0b Mon Sep 17 00:00:00 2001 From: Arthur Schreiber Date: Mon, 19 Feb 2024 10:25:55 +0000 Subject: [PATCH 232/233] Expose the `--tablet_types_to_wait` flag in `vtcombo`. Signed-off-by: Arthur Schreiber --- go/cmd/vtcombo/main.go | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/go/cmd/vtcombo/main.go b/go/cmd/vtcombo/main.go index 61e862475dc..7d5b7ee85f7 100644 --- a/go/cmd/vtcombo/main.go +++ b/go/cmd/vtcombo/main.go @@ -41,6 +41,7 @@ import ( "vitess.io/vitess/go/vt/srvtopo" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" + "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vtcombo" "vitess.io/vitess/go/vt/vtctld" @@ -63,15 +64,18 @@ var ( "If true, vtcombo will use the flags defined in topo/server.go to open topo server") plannerName = flags.String("planner-version", "", "Sets the default planner to use when the session has not changed it. Valid values are: V3, Gen4, Gen4Greedy and Gen4Fallback. Gen4Fallback tries the gen4 planner and falls back to the V3 planner if the gen4 fails.") - tpb vttestpb.VTTestTopology - ts *topo.Server - resilientServer *srvtopo.ResilientServer + tpb vttestpb.VTTestTopology + ts *topo.Server + resilientServer *srvtopo.ResilientServer + tabletTypesToWait []topodatapb.TabletType ) func init() { flags.Var(vttest.TextTopoData(&tpb), "proto_topo", "vttest proto definition of the topology, encoded in compact text format. See vttest.proto for more information.") flags.Var(vttest.JSONTopoData(&tpb), "json_topo", "vttest proto definition of the topology, encoded in json format. See vttest.proto for more information.") + flags.Var((*topoproto.TabletTypeListFlag)(&tabletTypesToWait), "tablet_types_to_wait", "Wait till connected for specified tablet types during Gateway initialization. Should be provided as a comma-separated set of tablet types.") + servenv.RegisterDefaultFlags() servenv.RegisterFlags() servenv.RegisterGRPCServerFlags() @@ -273,18 +277,29 @@ func main() { // vtgate configuration and init resilientServer = srvtopo.NewResilientServer(ts, "ResilientSrvTopoServer") - tabletTypesToWait := []topodatapb.TabletType{ - topodatapb.TabletType_PRIMARY, - topodatapb.TabletType_REPLICA, - topodatapb.TabletType_RDONLY, + + tabletTypes := make([]topodatapb.TabletType, 0, 1) + if len(tabletTypesToWait) != 0 { + for _, tt := range tabletTypesToWait { + if topoproto.IsServingType(tt) { + tabletTypes = append(tabletTypes, tt) + } + } + + if len(tabletTypes) == 0 { + log.Exitf("tablet_types_to_wait should contain at least one serving tablet type") + } + } else { + tabletTypes = append(tabletTypes, topodatapb.TabletType_PRIMARY, topodatapb.TabletType_REPLICA, topodatapb.TabletType_RDONLY) } + plannerVersion, _ := plancontext.PlannerNameToVersion(*plannerName) vtgate.QueryLogHandler = "/debug/vtgate/querylog" vtgate.QueryLogzHandler = "/debug/vtgate/querylogz" vtgate.QueryzHandler = "/debug/vtgate/queryz" // pass nil for healthcheck, it will get created - vtg := vtgate.Init(context.Background(), nil, resilientServer, tpb.Cells[0], tabletTypesToWait, plannerVersion) + vtg := vtgate.Init(context.Background(), nil, resilientServer, tpb.Cells[0], tabletTypes, plannerVersion) // vtctld configuration and init err = vtctld.InitVtctld(ts) From bab4912f12452bb9cec1987fe99ee27c85a0a0d1 Mon Sep 17 00:00:00 2001 From: Henri Maurer Date: Thu, 21 Mar 2024 16:28:52 +0000 Subject: [PATCH 233/233] Backport https://github.com/vitessio/vitess/pull/15275 --- go/vt/mysqlctl/schema.go | 18 ++++++------------ go/vt/vtexplain/vtexplain_vttablet.go | 8 ++++---- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/go/vt/mysqlctl/schema.go b/go/vt/mysqlctl/schema.go index 406b5c59499..757eab757bc 100644 --- a/go/vt/mysqlctl/schema.go +++ b/go/vt/mysqlctl/schema.go @@ -60,12 +60,6 @@ func (mysqld *Mysqld) executeSchemaCommands(sql string) error { return mysqld.executeMysqlScript(params, strings.NewReader(sql)) } -func encodeEntityName(name string) string { - var buf strings.Builder - sqltypes.NewVarChar(name).EncodeSQL(&buf) - return buf.String() -} - // tableListSQL returns an IN clause "('t1', 't2'...) for a list of tables." func tableListSQL(tables []string) (string, error) { if len(tables) == 0 { @@ -74,7 +68,7 @@ func tableListSQL(tables []string) (string, error) { encodedTables := make([]string, len(tables)) for i, tableName := range tables { - encodedTables[i] = encodeEntityName(tableName) + encodedTables[i] = sqltypes.EncodeStringSQL(tableName) } return "(" + strings.Join(encodedTables, ", ") + ")", nil @@ -304,9 +298,9 @@ func GetColumnsList(dbName, tableName string, exec func(string, int, bool) (*sql if dbName == "" { dbName2 = "database()" } else { - dbName2 = encodeEntityName(dbName) + dbName2 = sqltypes.EncodeStringSQL(dbName) } - query := fmt.Sprintf(GetColumnNamesQuery, dbName2, encodeEntityName(sqlescape.UnescapeID(tableName))) + query := fmt.Sprintf(GetColumnNamesQuery, dbName2, sqltypes.EncodeStringSQL(sqlescape.UnescapeID(tableName))) qr, err := exec(query, -1, true) if err != nil { return "", err @@ -393,7 +387,7 @@ func (mysqld *Mysqld) getPrimaryKeyColumns(ctx context.Context, dbName string, t FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = %s AND TABLE_NAME IN %s AND LOWER(INDEX_NAME) = 'primary' ORDER BY table_name, SEQ_IN_INDEX` - sql = fmt.Sprintf(sql, encodeEntityName(dbName), tableList) + sql = fmt.Sprintf(sql, sqltypes.EncodeStringSQL(dbName), tableList) qr, err := conn.ExecuteFetch(sql, len(tables)*100, true) if err != nil { return nil, err @@ -622,8 +616,8 @@ func (mysqld *Mysqld) GetPrimaryKeyEquivalentColumns(ctx context.Context, dbName ) AS pke ON index_cols.INDEX_NAME = pke.INDEX_NAME WHERE index_cols.TABLE_SCHEMA = %s AND index_cols.TABLE_NAME = %s AND NON_UNIQUE = 0 AND NULLABLE != 'YES' ORDER BY SEQ_IN_INDEX ASC` - encodedDbName := encodeEntityName(dbName) - encodedTable := encodeEntityName(table) + encodedDbName := sqltypes.EncodeStringSQL(dbName) + encodedTable := sqltypes.EncodeStringSQL(table) sql = fmt.Sprintf(sql, encodedDbName, encodedTable, encodedDbName, encodedTable, encodedDbName, encodedTable) qr, err := conn.ExecuteFetch(sql, 1000, true) if err != nil { diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index 4f0a3f7d102..9a82cc915bf 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -437,8 +437,8 @@ func newTabletEnvironment(ddls []sqlparser.DDLStatement, opts *Options) (*tablet } tEnv.addResult(query, tEnv.getResult(likeQuery)) - likeQuery = fmt.Sprintf(mysqlctl.GetColumnNamesQuery, "database()", sqlescape.UnescapeID(likeTable)) - query = fmt.Sprintf(mysqlctl.GetColumnNamesQuery, "database()", sqlescape.UnescapeID(table)) + likeQuery = fmt.Sprintf(mysqlctl.GetColumnNamesQuery, "database()", sqltypes.EncodeStringSQL(likeTable)) + query = fmt.Sprintf(mysqlctl.GetColumnNamesQuery, "database()", sqltypes.EncodeStringSQL(table)) if tEnv.getResult(likeQuery) == nil { return nil, fmt.Errorf("check your schema, table[%s] doesn't exist", likeTable) } @@ -477,7 +477,7 @@ func newTabletEnvironment(ddls []sqlparser.DDLStatement, opts *Options) (*tablet tEnv.addResult("SELECT * FROM "+backtickedTable+" WHERE 1 != 1", &sqltypes.Result{ Fields: rowTypes, }) - query := fmt.Sprintf(mysqlctl.GetColumnNamesQuery, "database()", sqlescape.UnescapeID(table)) + query := fmt.Sprintf(mysqlctl.GetColumnNamesQuery, "database()", sqltypes.EncodeStringSQL(table)) tEnv.addResult(query, &sqltypes.Result{ Fields: colTypes, Rows: colValues, @@ -558,7 +558,7 @@ func (t *explainTablet) handleSelect(query string) (*sqltypes.Result, error) { // Gen4 supports more complex queries so we now need to // handle multiple FROM clauses - tables := make([]*sqlparser.AliasedTableExpr, len(selStmt.From)) + tables := make([]*sqlparser.AliasedTableExpr, 0, len(selStmt.From)) for _, from := range selStmt.From { tables = append(tables, getTables(from)...) }