diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2a4f4dbb866..a0a380c7712 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,7 +4,7 @@ bootstrap.sh @ajm188 @deepthi @frouioui @vmg /.github/workflows/ @deepthi @frouioui @mattlord /config/mycnf/ @deepthi @shlomi-noach @mattlord /doc/ @deepthi @frouioui @GuptaManan100 @rsajwani -/docker/ @deepthi @derekperkins @dkhenry @mattlord +/docker/ @deepthi @derekperkins @dkhenry @mattlord @GuptaManan100 @frouioui /examples/compose @shlomi-noach @GuptaManan100 @frouioui /examples/demo @mattlord @rohit-nayak-ps /examples/legacy_local @deepthi diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index e403c64604e..ca74a8e9dfd 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -18,7 +18,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -38,7 +38,7 @@ jobs: - '.github/workflows/check_make_vtadmin_authz_testgen.yml' - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: go-version: 1.18.9 diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index eaaf651a21d..00bdab7c918 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -18,7 +18,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -40,7 +40,7 @@ jobs: - '.github/workflows/check_make_vtadmin_web_proto.yml' - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: go-version: 1.18.9 diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 89e28a615da..f8b1c5c30b9 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_13.yml b/.github/workflows/cluster_endtoend_13.yml index 8539fff4013..56dcfb35898 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_15.yml b/.github/workflows/cluster_endtoend_15.yml index bc0f2b75cbb..324ab7c6321 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_18.yml b/.github/workflows/cluster_endtoend_18.yml index 6844a755ead..b947e5ae3b9 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_21.yml b/.github/workflows/cluster_endtoend_21.yml index 880c95849c6..2df268e9fb6 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_22.yml b/.github/workflows/cluster_endtoend_22.yml index 0342ee17c13..a1c6c3abade 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_26.yml b/.github/workflows/cluster_endtoend_26.yml deleted file mode 100644 index 40f1c0663f0..00000000000 --- a/.github/workflows/cluster_endtoend_26.yml +++ /dev/null @@ -1,107 +0,0 @@ -# DO NOT MODIFY: THIS FILE IS GENERATED USING "make generate_ci_workflows" - -name: Cluster (26) -on: [push, pull_request] -concurrency: - group: format('{0}-{1}', ${{ github.ref }}, 'Cluster (26)') - cancel-in-progress: true - -jobs: - build: - name: Run endtoend tests on Cluster (26) - runs-on: ubuntu-20.04 - permissions: - id-token: write - contents: read - - steps: - - name: Check if workflow needs to be skipped - id: skip-workflow - run: | - skip='false' - if [[ "${{github.event.pull_request}}" == "" ]] && [[ "${{github.ref}}" != "refs/heads/main" ]] && [[ ! "${{github.ref}}" =~ ^refs/heads/release-[0-9]+\.[0-9]$ ]] && [[ ! "${{github.ref}}" =~ "refs/tags/.*" ]]; then - skip='true' - fi - echo Skip ${skip} - echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - - name: Check out code - if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 - - - name: Check for changes in relevant files - if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: frouioui/paths-filter@main - id: changes - with: - token: '' - filters: | - end_to_end: - - 'go/**/*.go' - - 'test.go' - - 'Makefile' - - 'build.env' - - 'go.sum' - - 'go.mod' - - 'proto/*.proto' - - 'tools/**' - - 'config/**' - - 'bootstrap.sh' - - '.github/workflows/cluster_endtoend_26.yml' - - - name: Set up Go - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 - with: - go-version: 1.18.9 - - - name: Set up python - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 - - - name: Tune the OS - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - run: | - # Limit local port range to not use ports that overlap with server side - # ports that we listen on. - sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - # Increase the asynchronous non-blocking I/O. More information at https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_use_native_aio - echo "fs.aio-max-nr = 1048576" | sudo tee -a /etc/sysctl.conf - sudo sysctl -p /etc/sysctl.conf - - - name: Get dependencies - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - run: | - - # Get key to latest MySQL repo - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29 - # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.20-1_all.deb - echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections - sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* - sudo apt-get update - # Install everything else we need, and configure - sudo apt-get install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils - - sudo service mysql stop - sudo service etcd stop - sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ - sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld - go mod download - - # install JUnit report formatter - go install github.com/vitessio/go-junit-report@HEAD - - - name: Run cluster endtoend test - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 45 - run: | - # We set the VTDATAROOT to the /tmp folder to reduce the file path of mysql.sock file - # which musn't be more than 107 characters long. - export VTDATAROOT="/tmp/" - source build.env - - set -x - - # run the tests however you normally do, then produce a JUnit XML file - eatmydata -- go run test.go -docker=false -follow -shard 26 diff --git a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml index f19d800b76a..ec52d47b8a0 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_mysql80.yml b/.github/workflows/cluster_endtoend_mysql80.yml index 78883d7f4d6..85759bd60e6 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_mysql_server_vault.yml b/.github/workflows/cluster_endtoend_mysql_server_vault.yml index b3a90de85f1..32960d5f71f 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_declarative.yml b/.github/workflows/cluster_endtoend_onlineddl_declarative.yml index 2195c161025..706f2adeeb4 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_declarative.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_declarative.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_declarative_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_declarative_mysql57.yml index e839788199d..3bb311b87ad 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_declarative_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_declarative_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml index 9c2ebfeb8da..8ed3ac1956e 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml index 90e814fc2ba..36d8aafbabb 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert.yml b/.github/workflows/cluster_endtoend_onlineddl_revert.yml index 38356581b5a..c0f315b749a 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml index d36eacc3cd2..3925ae235ab 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revertible.yml b/.github/workflows/cluster_endtoend_onlineddl_revertible.yml index 766e7c3cec8..ac6cd567a92 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revertible.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revertible.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revertible_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_revertible_mysql57.yml index 62234ad74ca..5ecee59f025 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revertible_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revertible_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml index a071219dae2..e6df6eea577 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml index a7b97dcdda8..5679ffe8afe 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_singleton.yml b/.github/workflows/cluster_endtoend_onlineddl_singleton.yml index a3a734705fd..b5c04aa8ebf 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_singleton.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_singleton.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_singleton_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_singleton_mysql57.yml index f8333e3f052..9b93e4b5ced 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_singleton_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_singleton_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml index a9a82381db0..92365edc713 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml index 522fe67abcf..7500e41d5ac 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml index 04731a97299..294dcb85591 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml index e141b30a8c1..4c0a6e37929 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml index 56be178eb6b..660236f4e02 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml index 975d77a86e6..4abbb6252d1 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml index 3a1868c577c..ffed44826b6 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml index 78776556359..1d538e9ac40 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml index 3bcb1ff611a..be36493fc1d 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml index bd1788ab1a1..5fae3e60abe 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml index 0072fd5ae85..fd3ffa2af8e 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml index 5d94bd0d00f..1d5e97391e6 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml index 3a73839a608..ee57156c701 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml index 221998d44d4..2f9e7194009 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml index f317444397b..dbb33ee7c69 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_custom_config.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_topo_connection_cache.yml b/.github/workflows/cluster_endtoend_topo_connection_cache.yml index 0bce2196342..1bc200a4232 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml index 677235fa0ea..158886259b0 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_basic.yml b/.github/workflows/cluster_endtoend_vreplication_basic.yml index b1bfbf5f30b..afe3e36ca89 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml index 67e9d4757f2..7cfb1ad6902 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml index cd7001209ef..4d7ba6f9e03 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_multicell.yml b/.github/workflows/cluster_endtoend_vreplication_multicell.yml index 2a83337a469..5f0816457cc 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_v2.yml b/.github/workflows/cluster_endtoend_vreplication_v2.yml index 9960ad7a2d4..856d6147c0d 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_failover.yml b/.github/workflows/cluster_endtoend_vstream_failover.yml index 2bfbaf78e07..8f1e3640b4b 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml index c1d6ed798ef..d88ed0e18ba 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml index 497e433173f..95bc1f81f6a 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml index f2d122cf973..42bc76d6997 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup_transform.yml b/.github/workflows/cluster_endtoend_vtbackup_transform.yml index eb27b0fc5c5..44978cba1e0 100644 --- a/.github/workflows/cluster_endtoend_vtbackup_transform.yml +++ b/.github/workflows/cluster_endtoend_vtbackup_transform.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml index 3cb2780e3ca..6ed075a3def 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml index 225b829b33c..fc1f4c00e0d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_gen4.yml b/.github/workflows/cluster_endtoend_vtgate_gen4.yml index addfda26ba8..20cf8a8ecea 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml index 3fa8d4899ae..b361e6d6b27 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_godriver.yml b/.github/workflows/cluster_endtoend_vtgate_godriver.yml index 72da0eaedac..e86a1dfb61a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml index ace4e6e6066..92de29d023f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_queries.yml b/.github/workflows/cluster_endtoend_vtgate_queries.yml index d93bbf8f7d9..e1d94f2783a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml index be42a14816b..d5605d3f05d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml index dabc0448a81..45346a52047 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_schema.yml b/.github/workflows/cluster_endtoend_vtgate_schema.yml index 3a62e835905..7afbe5c91a6 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml index 4bf3f6dfe27..eb908e8383c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml index 4649bdd64e5..85aae0bb929 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo.yml b/.github/workflows/cluster_endtoend_vtgate_topo.yml index 957dc9151a9..a1582cecc3a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml index 3968e9db40d..e004dac3b45 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml index 3553a7b8698..5a2d78b9ad1 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_transaction.yml b/.github/workflows/cluster_endtoend_vtgate_transaction.yml index 5191898ff48..ae0e1e30a9b 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml index 393c31aa33b..39495965889 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml index 58885e3a4a5..1f172f89bd3 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_vschema.yml b/.github/workflows/cluster_endtoend_vtgate_vschema.yml index d85be488bea..07964dc91a7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtorc.yml b/.github/workflows/cluster_endtoend_vtorc.yml index 3e03a3d4fd2..3315be23255 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml index cf4d74d4d09..41e58cf8c40 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml index 29d2d2ff305..7c6ae266274 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_backup.yml b/.github/workflows/cluster_endtoend_xb_backup.yml index d07cd5621b3..671acb6c358 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml index dcdf9d9ad37..08e3318c8b9 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -29,7 +29,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -53,13 +53,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_recovery.yml b/.github/workflows/cluster_endtoend_xb_recovery.yml index eb8474c601b..b58e77b3416 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -24,7 +24,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,13 +48,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml index f5538ecc3e0..659746911b5 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -29,7 +29,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -53,13 +53,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/codeql_analysis.yml b/.github/workflows/codeql_analysis.yml index 788e2f3a0b9..6757a5eec67 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -39,7 +39,7 @@ jobs: # queries: security-extended,security-and-quality - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 @@ -78,11 +78,25 @@ jobs: sudo apt-get update sudo apt-get install percona-xtrabackup-24 - - name: Building last release's binaries - timeout-minutes: 10 + - name: Building binaries + timeout-minutes: 30 run: | source build.env make build - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 + + - name: Slack Workflow Notification + if: ${{ failure() }} + uses: Gamesight/slack-workflow-status@master + with: + repo_token: ${{secrets.GITHUB_TOKEN}} + slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} + channel: '#codeql' + name: 'CodeQL Workflows' + + - name: Fail if needed + if: ${{ failure() }} + run: | + exit 1 \ No newline at end of file diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 0f651082079..cb681c0a5a1 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 @@ -29,7 +29,7 @@ jobs: # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - name: Check out code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies run: | diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index 06aaba68c00..7f8d6d78f01 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -19,7 +19,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -44,7 +44,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index e9dda7d7c31..ced90f7e550 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -19,7 +19,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -44,7 +44,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 677d23e3eaa..91d23757588 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -18,7 +18,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -42,7 +42,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index 154f914dde4..441cf8d04a2 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -18,7 +18,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -42,7 +42,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index 8c2db274bfc..08bd888f504 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -23,7 +23,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,7 +48,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index 8da29dbb6d3..ddfbe472280 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -23,7 +23,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -48,7 +48,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/release_notes_label.yml b/.github/workflows/release_notes_label.yml index 220bd07da30..703082afda6 100644 --- a/.github/workflows/release_notes_label.yml +++ b/.github/workflows/release_notes_label.yml @@ -14,21 +14,12 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'vitessio/vitess' steps: - - uses: mheap/github-action-required-labels@v1 - name: Check release notes label - id: required_label - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - mode: exactly - count: 0 - labels: "release notes (needs details)" - - - name: Print helper - if: failure() && steps.required_label.outcome == 'failure' + - name: Release Notes label run: | - echo The "release notes (needs details)" label is set. The changes made in this Pull Request need to be documented in the release notes summary "('./doc/releasenotes/15_0_0_summary.md')". Once documented, the "release notes (needs details)" label can be removed. - exit 1 + if [[ "${{contains( github.event.pull_request.labels.*.name, 'release notes (needs details)')}}" == "true" ]]; then + echo The "release notes (needs details)" label is set. The changes made in this Pull Request need to be documented in the release notes summary "('./changelog/15.0/15.0.3/summary.md')". Once documented, the "release notes (needs details)" label can be removed. + exit 1 + fi - name: Check type and component labels env: @@ -50,3 +41,32 @@ jobs: echo "Expecting PR to have label 'Type: ...'" exit 1 fi + + - name: Check NeedsWebsiteDocsUpdate and NeedsDescriptionUpdate are off + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + LABELS_JSON="/tmp/labels.json" + # Get labels for this pull request + curl -s \ + -H 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Content-type: application/json" \ + "https://api.github.com/repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/labels" \ + > "$LABELS_JSON" + if cat ${LABELS_JSON} | jq -r '.[].name ' | grep -q 'NeedsDescriptionUpdate' ; then + echo "Expecting PR to not have the NeedsDescriptionUpdate label, please update the PR's description and remove the label." + exit 1 + fi + if cat ${LABELS_JSON} | jq -r '.[].name ' | grep -q 'NeedsWebsiteDocsUpdate' ; then + echo "Expecting PR to not have the NeedsWebsiteDocsUpdate label, please update the documentation and remove the label." + exit 1 + fi + + + - name: Do Not Merge label + run: | + if [[ "${{contains( github.event.pull_request.labels.*.name, 'Do Not Merge')}}" == "true" ]]; then + echo "This PR should not be merged. The 'Do Not Merge' label is set. Please unset it if you wish to merge this PR." + exit 1 + fi \ No newline at end of file diff --git a/.github/workflows/sonar_analysis.yml b/.github/workflows/sonar_analysis.yml index 871e6cc7f83..84f53a3968f 100644 --- a/.github/workflows/sonar_analysis.yml +++ b/.github/workflows/sonar_analysis.yml @@ -10,7 +10,7 @@ jobs: steps: - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.13 @@ -25,7 +25,7 @@ jobs: # DON'T FORGET TO REMOVE CODE ABOVE WHEN ISSUE IS ADRESSED! - name: Check out code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies run: | diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 909d293ae6f..3abab4f92f7 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -22,7 +22,7 @@ jobs: - name: Checkout code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Run FOSSA scan and upload build data if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -90,10 +90,13 @@ 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') - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 @@ -199,3 +202,17 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && (steps.changes.outputs.go_files == 'true' || steps.changes.outputs.ci_config == 'true') run: | go run ./go/tools/ci-config/main.go || exit 1 + + - name: Check changelog + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.release_notes == 'true' + run: | + set -e + go run ./go/tools/releases/releases.go + output=$(git status -s) + if [ -z "${output}" ]; then + exit 0 + fi + echo 'We wish to maintain a consistent changelog directory, please run `go run ./go/tools/releases/releases.go`, commit and push again.' + echo 'Running `go run ./go/tools/releases/releases.go` on CI yields the following changes:' + echo "$output" + echo "" \ No newline at end of file diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 37a354245a2..13311e57ef7 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -22,7 +22,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -46,7 +46,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/unit_test_mariadb103.yml b/.github/workflows/unit_test_mariadb103.yml index 6738268662f..ec9b68f2eed 100644 --- a/.github/workflows/unit_test_mariadb103.yml +++ b/.github/workflows/unit_test_mariadb103.yml @@ -23,7 +23,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -47,7 +47,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 5e93a8a1240..51f4df0b1e0 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -23,7 +23,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -47,7 +47,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index c83bb683431..13d2b7f0596 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -23,7 +23,7 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -47,7 +47,7 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 diff --git a/.github/workflows/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/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 1092700c58a..550474eabe2 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -10,14 +10,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Backups - E2E runs-on: ubuntu-latest outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -31,7 +31,7 @@ jobs: upgrade_downgrade_test_e2e: timeout-minutes: 60 if: always() && needs.get_previous_release.result == 'success' - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Backups - E2E runs-on: ubuntu-20.04 needs: - get_previous_release @@ -49,7 +49,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -74,13 +74,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -110,7 +110,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -132,7 +132,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -188,4 +188,4 @@ jobs: mkdir -p /tmp/vtdataroot set -x source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_backups + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_backups diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 9a82e337355..a8dd59b91fe 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -10,14 +10,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Backups - E2E - Next Release runs-on: ubuntu-latest outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -31,7 +31,7 @@ jobs: upgrade_downgrade_test_e2e: timeout-minutes: 60 if: always() && needs.get_next_release.result == 'success' - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Backups - E2E - Next Release runs-on: ubuntu-20.04 needs: - get_next_release @@ -52,7 +52,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -77,13 +77,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.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' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -113,7 +113,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -135,7 +135,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -191,4 +191,4 @@ jobs: mkdir -p /tmp/vtdataroot set -x source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_backups + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_backups diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index ae1a78ab3b2..5d768e2f2e0 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -10,14 +10,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get a recent LTS release + name: Get Previous Release - Backups - Manual runs-on: ubuntu-20.04 outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -32,7 +32,7 @@ jobs: upgrade_downgrade_test_manual: timeout-minutes: 40 if: always() && (needs.get_previous_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Backups - Manual runs-on: ubuntu-20.04 needs: - get_previous_release @@ -51,7 +51,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -76,13 +76,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -151,7 +151,7 @@ jobs: # Checkout to the last release of Vitess - name: Checkout to the other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -173,7 +173,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml index b8675c202ad..52a540a5fe9 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -10,14 +10,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get a recent LTS release + name: Get Previous Release - Backups - Manual - Next Release runs-on: ubuntu-20.04 outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -32,7 +32,7 @@ jobs: upgrade_downgrade_test_manual: timeout-minutes: 40 if: always() && (needs.get_next_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Backups - Manual - Next Release runs-on: ubuntu-20.04 needs: - get_next_release @@ -54,7 +54,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -79,13 +79,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.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' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -154,7 +154,7 @@ jobs: # Checkout to the next release of Vitess - name: Checkout to the other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -176,7 +176,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index e0ef5d67e70..ce911f269a3 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Query Serving (Queries) runs-on: ubuntu-latest outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_previous_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Query Serving (Queries) runs-on: ubuntu-latest needs: - get_previous_release @@ -51,7 +51,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -76,13 +76,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -128,7 +128,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -150,7 +150,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -174,7 +174,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries # Swap the binaries in the bin. Use vtgate version n-1 and keep vttablet at version n - name: Use last release's VTGate @@ -194,7 +194,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries # Swap the binaries again. This time, vtgate will be at version n, and vttablet will be at version n-1 - name: Use current version VTGate, and other version VTTablet @@ -216,4 +216,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml index 0d615c6f2a2..25319498cce 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Query Serving (Queries) Next Release runs-on: ubuntu-latest outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_next_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Query Serving (Queries) Next Release runs-on: ubuntu-latest needs: - get_next_release @@ -54,7 +54,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -79,13 +79,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.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' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -131,7 +131,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -153,7 +153,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -177,7 +177,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries # Swap the binaries in the bin. Use vtgate version n+1 and keep vttablet at version n - name: Use next release's VTGate @@ -197,7 +197,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries # Swap the binaries again. This time, vtgate will be at version n, and vttablet will be at version n+1 - name: Use current version VTGate, and other version VTTablet @@ -219,4 +219,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 26f194787f8..a9043ecaf61 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Query Serving (Schema) runs-on: ubuntu-latest outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_previous_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Query Serving (Schema) runs-on: ubuntu-latest needs: - get_previous_release @@ -51,7 +51,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -76,13 +76,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -128,7 +128,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -150,7 +150,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -174,7 +174,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema # Swap the binaries in the bin. Use vtgate version n-1 and keep vttablet at version n - name: Use last release's VTGate @@ -194,7 +194,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema # Swap the binaries again. This time, vtgate will be at version n, and vttablet will be at version n-1 - name: Use current version VTGate, and other version VTTablet @@ -216,4 +216,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml index e404df0f998..e5d4601f245 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Query Serving (Schema) Next Release runs-on: ubuntu-latest outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_next_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Query Serving (Schema) Next Release runs-on: ubuntu-latest needs: - get_next_release @@ -54,7 +54,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -79,13 +79,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.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' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -131,7 +131,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -153,7 +153,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -177,7 +177,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema # Swap the binaries in the bin. Use vtgate version n+1 and keep vttablet at version n - name: Use next release's VTGate @@ -197,7 +197,7 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema # Swap the binaries again. This time, vtgate will be at version n, and vttablet will be at version n+1 - name: Use current version VTGate, and other version VTTablet @@ -219,4 +219,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_schema diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml index 23828451b01..a533d28526d 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Reparent New Vtctl runs-on: ubuntu-latest outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_next_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Reparent New Vtctl runs-on: ubuntu-latest needs: - get_next_release @@ -54,7 +54,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -79,13 +79,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.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' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -131,7 +131,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -153,7 +153,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -191,4 +191,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_reparent + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_reparent diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml index ec848449286..c6499adc5d8 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_next_release: if: always() - name: Get latest release + name: Get Latest Release - Reparent New VTTablet runs-on: ubuntu-latest outputs: next_release: ${{ steps.output-next-release-ref.outputs.next_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_next_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Reparent New VTTablet runs-on: ubuntu-latest needs: - get_next_release @@ -54,7 +54,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -79,13 +79,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.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' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -131,7 +131,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ needs.get_next_release.outputs.next_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_next_release.outputs.next_release }} @@ -153,7 +153,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -188,4 +188,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_reparent + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_reparent diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index ecd0550dc22..043042ed626 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Reparent Old Vtctl runs-on: ubuntu-latest outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_previous_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Reparent Old Vtctl runs-on: ubuntu-latest needs: - get_previous_release @@ -51,7 +51,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -76,13 +76,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -128,7 +128,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -150,7 +150,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -188,4 +188,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_reparent + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_reparent diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 5af4c4a7fb3..9775add29d7 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -13,14 +13,14 @@ concurrency: jobs: get_previous_release: if: always() - name: Get latest release + name: Get Previous Release - Reparent Old VTTablet runs-on: ubuntu-latest outputs: previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} steps: - name: Check out to HEAD - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -33,7 +33,7 @@ jobs: upgrade_downgrade_test: if: always() && (needs.get_previous_release.result == 'success') - name: Run Upgrade Downgrade Test + name: Run Upgrade Downgrade Test - Reparent Old VTTablet runs-on: ubuntu-latest needs: - get_previous_release @@ -51,7 +51,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -76,13 +76,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.18.9 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -128,7 +128,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ needs.get_previous_release.outputs.previous_release }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ needs.get_previous_release.outputs.previous_release }} @@ -150,7 +150,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -185,4 +185,4 @@ jobs: mkdir -p /tmp/vtdataroot source build.env - eatmydata -- go run test.go -skip-build -keep-data -docker=false -print-log -follow -tag upgrade_downgrade_reparent + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_reparent diff --git a/.github/workflows/vtadmin_web_build.yml b/.github/workflows/vtadmin_web_build.yml index 8af9982b9a5..fdb70ecc49e 100644 --- a/.github/workflows/vtadmin_web_build.yml +++ b/.github/workflows/vtadmin_web_build.yml @@ -26,7 +26,7 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/setup-node@v2 diff --git a/.github/workflows/vtadmin_web_lint.yml b/.github/workflows/vtadmin_web_lint.yml index 4c2ef845ee6..0a0977caa66 100644 --- a/.github/workflows/vtadmin_web_lint.yml +++ b/.github/workflows/vtadmin_web_lint.yml @@ -26,7 +26,7 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/setup-node@v2 diff --git a/.github/workflows/vtadmin_web_unit_tests.yml b/.github/workflows/vtadmin_web_unit_tests.yml index e6d248124ff..abb884dcdd9 100644 --- a/.github/workflows/vtadmin_web_unit_tests.yml +++ b/.github/workflows/vtadmin_web_unit_tests.yml @@ -26,7 +26,7 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/setup-node@v2 diff --git a/.gitignore b/.gitignore index 6e48b17eca9..60b397f1ec6 100644 --- a/.gitignore +++ b/.gitignore @@ -70,7 +70,7 @@ _test/ /vendor/*/ # release folder -releases +/releases/ # Angular2 Bower Libs /web/vtctld2/.bowerrc~ diff --git a/Makefile b/Makefile index c0fee347ac3..f8eedc38f1a 100644 --- a/Makefile +++ b/Makefile @@ -92,12 +92,6 @@ endif -ldflags "$(shell tools/build_version_flags.sh)" \ -o ${VTROOTBIN} ./go/... - # build vtorc with CGO, because it depends on sqlite - CGO_ENABLED=1 go build \ - -trimpath $(EXTRA_BUILD_FLAGS) $(VT_GO_PARALLEL) \ - -ldflags "$(shell tools/build_version_flags.sh)" \ - -o ${VTROOTBIN} ./go/cmd/vtorc/... - # cross-build can be used to cross-compile Vitess client binaries # Outside of select client binaries (namely vtctlclient & vtexplain), cross-compiled Vitess Binaries are not recommended for production deployments # Usage: GOOS=darwin GOARCH=amd64 make cross-build @@ -120,8 +114,6 @@ endif echo "Missing vttablet at: ${VTROOTBIN}/${GOOS}_${GOARCH}." && exit; \ fi - # Cross-compiling w/ cgo isn't trivial and we don't need vtorc, so we can skip building it - debug: ifndef NOBANNER echo $$(date): Building source tree @@ -145,8 +137,7 @@ install: build cross-install: cross-build # binaries mkdir -p "$${PREFIX}/bin" - # Still no vtorc for cross-compile - cp "${VTROOTBIN}/${GOOS}_${GOARCH}/"{mysqlctl,mysqlctld,vtadmin,vtctld,vtctlclient,vtctldclient,vtgate,vttablet,vtbackup} "$${PREFIX}/bin/" + cp "${VTROOTBIN}/${GOOS}_${GOARCH}/"{mysqlctl,mysqlctld,vtorc,vtadmin,vtctld,vtctlclient,vtctldclient,vtgate,vttablet,vtbackup} "$${PREFIX}/bin/" # Install local install the binaries needed to run vitess locally # Usage: make install-local PREFIX=/path/to/install/root diff --git a/doc/releasenotes/10_0_0_release_notes.md b/changelog/10.0/10.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_0_release_notes.md rename to changelog/10.0/10.0.0/release_notes.md diff --git a/doc/releasenotes/10_0_1_release_notes.md b/changelog/10.0/10.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_1_release_notes.md rename to changelog/10.0/10.0.1/release_notes.md diff --git a/doc/releasenotes/10_0_2_release_notes.md b/changelog/10.0/10.0.2/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_2_release_notes.md rename to changelog/10.0/10.0.2/release_notes.md diff --git a/doc/releasenotes/10_0_3_release_notes.md b/changelog/10.0/10.0.3/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_3_release_notes.md rename to changelog/10.0/10.0.3/release_notes.md diff --git a/doc/releasenotes/10_0_3_summary.md b/changelog/10.0/10.0.3/summary.md similarity index 100% rename from doc/releasenotes/10_0_3_summary.md rename to changelog/10.0/10.0.3/summary.md diff --git a/doc/releasenotes/10_0_4_release_notes.md b/changelog/10.0/10.0.4/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_4_release_notes.md rename to changelog/10.0/10.0.4/release_notes.md diff --git a/doc/releasenotes/10_0_4_summary.md b/changelog/10.0/10.0.4/summary.md similarity index 100% rename from doc/releasenotes/10_0_4_summary.md rename to changelog/10.0/10.0.4/summary.md diff --git a/doc/releasenotes/10_0_5_release_notes.md b/changelog/10.0/10.0.5/release_notes.md similarity index 100% rename from doc/releasenotes/10_0_5_release_notes.md rename to changelog/10.0/10.0.5/release_notes.md diff --git a/doc/releasenotes/10_0_5_summary.md b/changelog/10.0/10.0.5/summary.md similarity index 100% rename from doc/releasenotes/10_0_5_summary.md rename to changelog/10.0/10.0.5/summary.md diff --git a/changelog/10.0/README.md b/changelog/10.0/README.md new file mode 100644 index 00000000000..304cc933a16 --- /dev/null +++ b/changelog/10.0/README.md @@ -0,0 +1,18 @@ +## v10.0 +* **[10.0.5](10.0.5)** + * [Release Notes](10.0.5/release_notes.md) + +* **[10.0.4](10.0.4)** + * [Release Notes](10.0.4/release_notes.md) + +* **[10.0.3](10.0.3)** + * [Release Notes](10.0.3/release_notes.md) + +* **[10.0.2](10.0.2)** + * [Release Notes](10.0.2/release_notes.md) + +* **[10.0.1](10.0.1)** + * [Release Notes](10.0.1/release_notes.md) + +* **[10.0.0](10.0.0)** + * [Release Notes](10.0.0/release_notes.md) diff --git a/doc/releasenotes/11_0_0_release_notes.md b/changelog/11.0/11.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/11_0_0_release_notes.md rename to changelog/11.0/11.0.0/release_notes.md diff --git a/doc/releasenotes/11_0_1_release_notes.md b/changelog/11.0/11.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/11_0_1_release_notes.md rename to changelog/11.0/11.0.1/release_notes.md diff --git a/doc/releasenotes/11_0_2_release_notes.md b/changelog/11.0/11.0.2/release_notes.md similarity index 100% rename from doc/releasenotes/11_0_2_release_notes.md rename to changelog/11.0/11.0.2/release_notes.md diff --git a/doc/releasenotes/11_0_2_summary.md b/changelog/11.0/11.0.2/summary.md similarity index 100% rename from doc/releasenotes/11_0_2_summary.md rename to changelog/11.0/11.0.2/summary.md diff --git a/doc/releasenotes/11_0_3_release_notes.md b/changelog/11.0/11.0.3/release_notes.md similarity index 100% rename from doc/releasenotes/11_0_3_release_notes.md rename to changelog/11.0/11.0.3/release_notes.md diff --git a/doc/releasenotes/11_0_3_summary.md b/changelog/11.0/11.0.3/summary.md similarity index 100% rename from doc/releasenotes/11_0_3_summary.md rename to changelog/11.0/11.0.3/summary.md diff --git a/doc/releasenotes/11_0_4_release_notes.md b/changelog/11.0/11.0.4/release_notes.md similarity index 100% rename from doc/releasenotes/11_0_4_release_notes.md rename to changelog/11.0/11.0.4/release_notes.md diff --git a/doc/releasenotes/11_0_4_summary.md b/changelog/11.0/11.0.4/summary.md similarity index 100% rename from doc/releasenotes/11_0_4_summary.md rename to changelog/11.0/11.0.4/summary.md diff --git a/changelog/11.0/README.md b/changelog/11.0/README.md new file mode 100644 index 00000000000..51dfb2e5648 --- /dev/null +++ b/changelog/11.0/README.md @@ -0,0 +1,15 @@ +## v11.0 +* **[11.0.4](11.0.4)** + * [Release Notes](11.0.4/release_notes.md) + +* **[11.0.3](11.0.3)** + * [Release Notes](11.0.3/release_notes.md) + +* **[11.0.2](11.0.2)** + * [Release Notes](11.0.2/release_notes.md) + +* **[11.0.1](11.0.1)** + * [Release Notes](11.0.1/release_notes.md) + +* **[11.0.0](11.0.0)** + * [Release Notes](11.0.0/release_notes.md) diff --git a/doc/releasenotes/12_0_0_release_notes.md b/changelog/12.0/12.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/12_0_0_release_notes.md rename to changelog/12.0/12.0.0/release_notes.md diff --git a/doc/releasenotes/12_0_0_summary.md b/changelog/12.0/12.0.0/summary.md similarity index 100% rename from doc/releasenotes/12_0_0_summary.md rename to changelog/12.0/12.0.0/summary.md diff --git a/doc/releasenotes/12_0_1_release_notes.md b/changelog/12.0/12.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/12_0_1_release_notes.md rename to changelog/12.0/12.0.1/release_notes.md diff --git a/doc/releasenotes/12_0_1_summary.md b/changelog/12.0/12.0.1/summary.md similarity index 100% rename from doc/releasenotes/12_0_1_summary.md rename to changelog/12.0/12.0.1/summary.md diff --git a/doc/releasenotes/12_0_2_release_notes.md b/changelog/12.0/12.0.2/release_notes.md similarity index 100% rename from doc/releasenotes/12_0_2_release_notes.md rename to changelog/12.0/12.0.2/release_notes.md diff --git a/doc/releasenotes/12_0_2_summary.md b/changelog/12.0/12.0.2/summary.md similarity index 100% rename from doc/releasenotes/12_0_2_summary.md rename to changelog/12.0/12.0.2/summary.md diff --git a/doc/releasenotes/12_0_3_release_notes.md b/changelog/12.0/12.0.3/release_notes.md similarity index 100% rename from doc/releasenotes/12_0_3_release_notes.md rename to changelog/12.0/12.0.3/release_notes.md diff --git a/doc/releasenotes/12_0_3_summary.md b/changelog/12.0/12.0.3/summary.md similarity index 100% rename from doc/releasenotes/12_0_3_summary.md rename to changelog/12.0/12.0.3/summary.md diff --git a/doc/releasenotes/12_0_4_release_notes.md b/changelog/12.0/12.0.4/release_notes.md similarity index 100% rename from doc/releasenotes/12_0_4_release_notes.md rename to changelog/12.0/12.0.4/release_notes.md diff --git a/doc/releasenotes/12_0_5_changelog.md b/changelog/12.0/12.0.5/changelog.md similarity index 100% rename from doc/releasenotes/12_0_5_changelog.md rename to changelog/12.0/12.0.5/changelog.md diff --git a/doc/releasenotes/12_0_5_release_notes.md b/changelog/12.0/12.0.5/release_notes.md similarity index 92% rename from doc/releasenotes/12_0_5_release_notes.md rename to changelog/12.0/12.0.5/release_notes.md index fc2c613e4da..dbff8a5aade 100644 --- a/doc/releasenotes/12_0_5_release_notes.md +++ b/changelog/12.0/12.0.5/release_notes.md @@ -9,7 +9,7 @@ Below is a summary of this patch release. You can learn more [here](https://go.d > go1.17.12 (released 2022-07-12) includes security fixes to the compress/gzip, encoding/gob, encoding/xml, go/parser, io/fs, net/http, and path/filepath packages, as well as bug fixes to the compiler, the go command, the runtime, and the runtime/metrics package. [See the Go 1.17.12 milestone](https://github.com/golang/go/issues?q=milestone%3AGo1.17.12+label%3ACherryPickApproved) on our issue tracker for details. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/12_0_5_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/12.0/12.0.5/changelog.md). The release includes 7 commits (excluding merges) diff --git a/doc/releasenotes/12_0_6_changelog.md b/changelog/12.0/12.0.6/changelog.md similarity index 100% rename from doc/releasenotes/12_0_6_changelog.md rename to changelog/12.0/12.0.6/changelog.md diff --git a/doc/releasenotes/12_0_6_release_notes.md b/changelog/12.0/12.0.6/release_notes.md similarity index 93% rename from doc/releasenotes/12_0_6_release_notes.md rename to changelog/12.0/12.0.6/release_notes.md index 8afbe0a4239..c9c743d95ea 100644 --- a/doc/releasenotes/12_0_6_release_notes.md +++ b/changelog/12.0/12.0.6/release_notes.md @@ -15,7 +15,7 @@ This change is documented on our website [here](https://vitess.io/docs/12.0/over ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/12_0_6_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/12.0/12.0.6/changelog.md). The release includes 11 commits (excluding merges) diff --git a/doc/releasenotes/12_0_6_summary.md b/changelog/12.0/12.0.6/summary.md similarity index 100% rename from doc/releasenotes/12_0_6_summary.md rename to changelog/12.0/12.0.6/summary.md diff --git a/changelog/12.0/README.md b/changelog/12.0/README.md new file mode 100644 index 00000000000..131b2df443d --- /dev/null +++ b/changelog/12.0/README.md @@ -0,0 +1,23 @@ +## v12.0 +* **[12.0.6](12.0.6)** + * [Changelog](12.0.6/changelog.md) + * [Release Notes](12.0.6/release_notes.md) + +* **[12.0.5](12.0.5)** + * [Changelog](12.0.5/changelog.md) + * [Release Notes](12.0.5/release_notes.md) + +* **[12.0.4](12.0.4)** + * [Release Notes](12.0.4/release_notes.md) + +* **[12.0.3](12.0.3)** + * [Release Notes](12.0.3/release_notes.md) + +* **[12.0.2](12.0.2)** + * [Release Notes](12.0.2/release_notes.md) + +* **[12.0.1](12.0.1)** + * [Release Notes](12.0.1/release_notes.md) + +* **[12.0.0](12.0.0)** + * [Release Notes](12.0.0/release_notes.md) diff --git a/doc/releasenotes/13_0_0_release_notes.md b/changelog/13.0/13.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/13_0_0_release_notes.md rename to changelog/13.0/13.0.0/release_notes.md diff --git a/doc/releasenotes/13_0_0_summary.md b/changelog/13.0/13.0.0/summary.md similarity index 100% rename from doc/releasenotes/13_0_0_summary.md rename to changelog/13.0/13.0.0/summary.md diff --git a/doc/releasenotes/13_0_1_release_notes.md b/changelog/13.0/13.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/13_0_1_release_notes.md rename to changelog/13.0/13.0.1/release_notes.md diff --git a/doc/releasenotes/13_0_2_changelog.md b/changelog/13.0/13.0.2/changelog.md similarity index 100% rename from doc/releasenotes/13_0_2_changelog.md rename to changelog/13.0/13.0.2/changelog.md diff --git a/doc/releasenotes/13_0_2_release_notes.md b/changelog/13.0/13.0.2/release_notes.md similarity index 93% rename from doc/releasenotes/13_0_2_release_notes.md rename to changelog/13.0/13.0.2/release_notes.md index 310eb5e633a..12692031e2a 100644 --- a/doc/releasenotes/13_0_2_release_notes.md +++ b/changelog/13.0/13.0.2/release_notes.md @@ -9,7 +9,7 @@ Below is a summary of this patch release. You can learn more [here](https://go.d > go1.17.12 (released 2022-07-12) includes security fixes to the compress/gzip, encoding/gob, encoding/xml, go/parser, io/fs, net/http, and path/filepath packages, as well as bug fixes to the compiler, the go command, the runtime, and the runtime/metrics package. [See the Go 1.17.12 milestone](https://github.com/golang/go/issues?q=milestone%3AGo1.17.12+label%3ACherryPickApproved) on our issue tracker for details. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/13_0_2_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/13.0/13.0.2/changelog.md). The release includes 28 commits (excluding merges) Thanks to all our contributors: @GuptaManan100, @aquarapid, @frouioui, @harshit-gangal, @mattlord, @rohit-nayak-ps, @systay, @vitess-bot[bot], @vmg \ No newline at end of file diff --git a/doc/releasenotes/13_0_2_summary.md b/changelog/13.0/13.0.2/summary.md similarity index 100% rename from doc/releasenotes/13_0_2_summary.md rename to changelog/13.0/13.0.2/summary.md diff --git a/doc/releasenotes/13_0_3_changelog.md b/changelog/13.0/13.0.3/changelog.md similarity index 100% rename from doc/releasenotes/13_0_3_changelog.md rename to changelog/13.0/13.0.3/changelog.md diff --git a/doc/releasenotes/13_0_3_release_notes.md b/changelog/13.0/13.0.3/release_notes.md similarity index 93% rename from doc/releasenotes/13_0_3_release_notes.md rename to changelog/13.0/13.0.3/release_notes.md index 3fee980f099..b04c0d69d20 100644 --- a/doc/releasenotes/13_0_3_release_notes.md +++ b/changelog/13.0/13.0.3/release_notes.md @@ -15,7 +15,7 @@ This change is documented on our website [here](https://vitess.io/docs/13.0/over ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/13_0_3_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/13.0/13.0.3/changelog.md). The release includes 17 commits(excluding merges) diff --git a/doc/releasenotes/13_0_3_summary.md b/changelog/13.0/13.0.3/summary.md similarity index 100% rename from doc/releasenotes/13_0_3_summary.md rename to changelog/13.0/13.0.3/summary.md diff --git a/changelog/13.0/README.md b/changelog/13.0/README.md new file mode 100644 index 00000000000..780625ef69a --- /dev/null +++ b/changelog/13.0/README.md @@ -0,0 +1,14 @@ +## v13.0 +* **[13.0.3](13.0.3)** + * [Changelog](13.0.3/changelog.md) + * [Release Notes](13.0.3/release_notes.md) + +* **[13.0.2](13.0.2)** + * [Changelog](13.0.2/changelog.md) + * [Release Notes](13.0.2/release_notes.md) + +* **[13.0.1](13.0.1)** + * [Release Notes](13.0.1/release_notes.md) + +* **[13.0.0](13.0.0)** + * [Release Notes](13.0.0/release_notes.md) diff --git a/doc/releasenotes/14_0_0_changelog.md b/changelog/14.0/14.0.0/changelog.md similarity index 100% rename from doc/releasenotes/14_0_0_changelog.md rename to changelog/14.0/14.0.0/changelog.md diff --git a/doc/releasenotes/14_0_0_release_notes.md b/changelog/14.0/14.0.0/release_notes.md similarity index 99% rename from doc/releasenotes/14_0_0_release_notes.md rename to changelog/14.0/14.0.0/release_notes.md index a7b4bcf4ef0..5f88f6975db 100644 --- a/doc/releasenotes/14_0_0_release_notes.md +++ b/changelog/14.0/14.0.0/release_notes.md @@ -319,7 +319,7 @@ Work has gone into making the advisory locks (`get_lock()`, `release_lock()`, et A long time ago, the sharding column and type were specified at the keyspace level. This syntax is now deprecated and will be removed in v15. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/14_0_0_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/14.0/14.0.0/changelog.md). The release includes 1101 commits (excluding merges) diff --git a/doc/releasenotes/14_0_0_summary.md b/changelog/14.0/14.0.0/summary.md similarity index 100% rename from doc/releasenotes/14_0_0_summary.md rename to changelog/14.0/14.0.0/summary.md diff --git a/doc/releasenotes/14_0_1_changelog.md b/changelog/14.0/14.0.1/changelog.md similarity index 100% rename from doc/releasenotes/14_0_1_changelog.md rename to changelog/14.0/14.0.1/changelog.md diff --git a/doc/releasenotes/14_0_1_release_notes.md b/changelog/14.0/14.0.1/release_notes.md similarity index 94% rename from doc/releasenotes/14_0_1_release_notes.md rename to changelog/14.0/14.0.1/release_notes.md index 57d68be31c2..639af4fce96 100644 --- a/doc/releasenotes/14_0_1_release_notes.md +++ b/changelog/14.0/14.0.1/release_notes.md @@ -13,7 +13,7 @@ Below is a summary of this patch release. You can learn more [here](https://go.d > go1.18.4 (released 2022-07-12) includes security fixes to the compress/gzip, encoding/gob, encoding/xml, go/parser, io/fs, net/http, and path/filepath packages, as well as bug fixes to the compiler, the go command, the linker, the runtime, and the runtime/metrics package. [See the Go 1.18.4 milestone](https://github.com/golang/go/issues?q=milestone%3AGo1.18.4+label%3ACherryPickApproved) on our issue tracker for details. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/14_0_1_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/14.0/14.0.1/changelog.md). The release includes 25 commits (excluding merges) diff --git a/doc/releasenotes/14_0_1_summary.md b/changelog/14.0/14.0.1/summary.md similarity index 100% rename from doc/releasenotes/14_0_1_summary.md rename to changelog/14.0/14.0.1/summary.md diff --git a/doc/releasenotes/14_0_2_changelog.md b/changelog/14.0/14.0.2/changelog.md similarity index 100% rename from doc/releasenotes/14_0_2_changelog.md rename to changelog/14.0/14.0.2/changelog.md diff --git a/doc/releasenotes/14_0_2_release_notes.md b/changelog/14.0/14.0.2/release_notes.md similarity index 95% rename from doc/releasenotes/14_0_2_release_notes.md rename to changelog/14.0/14.0.2/release_notes.md index d83b940f45c..724673af576 100644 --- a/doc/releasenotes/14_0_2_release_notes.md +++ b/changelog/14.0/14.0.2/release_notes.md @@ -18,7 +18,7 @@ Since the end-of-life of MariaDB 10.2, its Docker image is unavailable, and we d You can find more information on the list of supported databases on our documentation website, [here](https://vitess.io/docs/14.0/overview/supported-databases/). ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/14_0_2_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/14.0/14.0.2/changelog.md). The release includes 23 commits (excluding merges) diff --git a/doc/releasenotes/14_0_2_summary.md b/changelog/14.0/14.0.2/summary.md similarity index 100% rename from doc/releasenotes/14_0_2_summary.md rename to changelog/14.0/14.0.2/summary.md diff --git a/doc/releasenotes/14_0_3_changelog.md b/changelog/14.0/14.0.3/changelog.md similarity index 100% rename from doc/releasenotes/14_0_3_changelog.md rename to changelog/14.0/14.0.3/changelog.md diff --git a/doc/releasenotes/14_0_3_release_notes.md b/changelog/14.0/14.0.3/release_notes.md similarity index 93% rename from doc/releasenotes/14_0_3_release_notes.md rename to changelog/14.0/14.0.3/release_notes.md index 721c47640e2..5d5cc9b871c 100644 --- a/doc/releasenotes/14_0_3_release_notes.md +++ b/changelog/14.0/14.0.3/release_notes.md @@ -12,7 +12,7 @@ This problem could be resolved by restarting the VTOrc so that it discovers all frequently, this posed a greater challenge, since some pods when evicted and rescheduled on a different node, would sometimes fail to be discovered by VTOrc. This has problem has been addressed in this patch by the fix https://github.com/vitessio/vitess/pull/10662. ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/14_0_3_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/14.0/14.0.3/changelog.md). The release includes 12 commits (excluding merges) diff --git a/doc/releasenotes/14_0_3_summary.md b/changelog/14.0/14.0.3/summary.md similarity index 100% rename from doc/releasenotes/14_0_3_summary.md rename to changelog/14.0/14.0.3/summary.md diff --git a/changelog/14.0/README.md b/changelog/14.0/README.md new file mode 100644 index 00000000000..0aaddf7abb6 --- /dev/null +++ b/changelog/14.0/README.md @@ -0,0 +1,16 @@ +## v14.0 +* **[14.0.3](14.0.3)** + * [Changelog](14.0.3/changelog.md) + * [Release Notes](14.0.3/release_notes.md) + +* **[14.0.2](14.0.2)** + * [Changelog](14.0.2/changelog.md) + * [Release Notes](14.0.2/release_notes.md) + +* **[14.0.1](14.0.1)** + * [Changelog](14.0.1/changelog.md) + * [Release Notes](14.0.1/release_notes.md) + +* **[14.0.0](14.0.0)** + * [Changelog](14.0.0/changelog.md) + * [Release Notes](14.0.0/release_notes.md) diff --git a/doc/releasenotes/15_0_0_changelog.md b/changelog/15.0/15.0.0/changelog.md similarity index 100% rename from doc/releasenotes/15_0_0_changelog.md rename to changelog/15.0/15.0.0/changelog.md diff --git a/doc/releasenotes/15_0_0_release_notes.md b/changelog/15.0/15.0.0/release_notes.md similarity index 99% rename from doc/releasenotes/15_0_0_release_notes.md rename to changelog/15.0/15.0.0/release_notes.md index 430100fa8f5..f60fd0547f1 100644 --- a/doc/releasenotes/15_0_0_release_notes.md +++ b/changelog/15.0/15.0.0/release_notes.md @@ -455,7 +455,7 @@ Below are the changes for each binary. - [zkctld](https://github.com/vitessio/vitess/blob/release-15.0/doc/flags/14.0-to-15.0-transition/zkctld.diff) ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/15_0_0_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/15.0/15.0.0/changelog.md). The release includes 595 commits (excluding merges) diff --git a/doc/releasenotes/15_0_0_summary.md b/changelog/15.0/15.0.0/summary.md similarity index 100% rename from doc/releasenotes/15_0_0_summary.md rename to changelog/15.0/15.0.0/summary.md diff --git a/doc/releasenotes/15_0_1_changelog.md b/changelog/15.0/15.0.1/changelog.md similarity index 100% rename from doc/releasenotes/15_0_1_changelog.md rename to changelog/15.0/15.0.1/changelog.md diff --git a/doc/releasenotes/15_0_1_release_notes.md b/changelog/15.0/15.0.1/release_notes.md similarity index 93% rename from doc/releasenotes/15_0_1_release_notes.md rename to changelog/15.0/15.0.1/release_notes.md index caeba725787..1737f0fd2f8 100644 --- a/doc/releasenotes/15_0_1_release_notes.md +++ b/changelog/15.0/15.0.1/release_notes.md @@ -16,7 +16,7 @@ This issue is fixed in 15.0.1. The full issue can be found [here](https://github ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/15_0_1_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/15.0/15.0.1/changelog.md). The release includes 25 commits (excluding merges) diff --git a/doc/releasenotes/15_0_1_summary.md b/changelog/15.0/15.0.1/summary.md similarity index 100% rename from doc/releasenotes/15_0_1_summary.md rename to changelog/15.0/15.0.1/summary.md diff --git a/doc/releasenotes/15_0_2_changelog.md b/changelog/15.0/15.0.2/changelog.md similarity index 100% rename from doc/releasenotes/15_0_2_changelog.md rename to changelog/15.0/15.0.2/changelog.md diff --git a/doc/releasenotes/15_0_2_release_notes.md b/changelog/15.0/15.0.2/release_notes.md similarity index 91% rename from doc/releasenotes/15_0_2_release_notes.md rename to changelog/15.0/15.0.2/release_notes.md index 92317b60dc4..33ece0e1c73 100644 --- a/doc/releasenotes/15_0_2_release_notes.md +++ b/changelog/15.0/15.0.2/release_notes.md @@ -12,7 +12,7 @@ Below is a summary of this patch release. You can learn more [here](https://grou ------------ -The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/doc/releasenotes/15_0_2_changelog.md). +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/15.0/15.0.2/changelog.md). The release includes 14 commits (excluding merges) diff --git a/doc/releasenotes/15_0_2_summary.md b/changelog/15.0/15.0.2/summary.md similarity index 79% rename from doc/releasenotes/15_0_2_summary.md rename to changelog/15.0/15.0.2/summary.md index 6f3346efa47..b12a97879a5 100644 --- a/doc/releasenotes/15_0_2_summary.md +++ b/changelog/15.0/15.0.2/summary.md @@ -3,7 +3,7 @@ ### Upgrade to `go1.18.9` Vitess `v15.0.2` now runs on `go1.18.9`. -The patch release of Go, `go1.18.9`, was one of the main reasons for this release as it includes an important security fixe to `net/http` package, which is use extensively by Vitess. +The patch release of Go, `go1.18.9`, was one of the main reasons for this release as it includes an important security fix to `net/http` package, which is used extensively by Vitess. Below is a summary of this patch release. You can learn more [here](https://groups.google.com/g/golang-announce/c/L_3rmdT0BMU). > go1.18.9 (released 2022-12-06) includes security fixes to the net/http and os packages, as well as bug fixes to cgo, the compiler, the runtime, and the crypto/x509 and os/exec packages. diff --git a/changelog/15.0/15.0.3/changelog.md b/changelog/15.0/15.0.3/changelog.md new file mode 100644 index 00000000000..5634b7aa24a --- /dev/null +++ b/changelog/15.0/15.0.3/changelog.md @@ -0,0 +1,89 @@ +# Changelog of Vitess v15.0.3 + +### Bug fixes +#### Backup and Restore + * mysqlctl: flags should be added to vtbackup [#12048](https://github.com/vitessio/vitess/pull/12048) +#### Build/CI + * Fix `codeql` workflow timeout issue [#11760](https://github.com/vitessio/vitess/pull/11760) + * [release-15.0] Use `go1.20.1` in upgrade/downgrade tests [#12512](https://github.com/vitessio/vitess/pull/12512) +#### CLI + * Purge logs without panicking [#12187](https://github.com/vitessio/vitess/pull/12187) + * Fix `vtctldclient`'s Root command to return an error on unknown command [#12481](https://github.com/vitessio/vitess/pull/12481) +#### Cluster management + * Skip `TestReparentDoesntHangIfPrimaryFails` in vttablet v16 and above [#12387](https://github.com/vitessio/vitess/pull/12387) + * Fix initialization code to also stop replication to prevent crash [#12534](https://github.com/vitessio/vitess/pull/12534) +#### Observability + * Reset the current lag when closing the replication lag reader. [#12683](https://github.com/vitessio/vitess/pull/12683) +#### Online DDL + * Bugfix/Backport to v15: Fix schema migrations requested_timestamp zero values [#12263](https://github.com/vitessio/vitess/pull/12263) + * Mysqld.GetSchema: tolerate tables being dropped while inspecting schema [#12641](https://github.com/vitessio/vitess/pull/12641) +#### Operator + * Fix rbac config in the vtop example [#12034](https://github.com/vitessio/vitess/pull/12034) +#### Query Serving + * [release-15.0] only expand when we have full information (#11998) [#12002](https://github.com/vitessio/vitess/pull/12002) + * Fix: Date math with Interval keyword [#12082](https://github.com/vitessio/vitess/pull/12082) + * BugFix: Cast expression translation by evaluation engine [#12111](https://github.com/vitessio/vitess/pull/12111) + * [Gen4] Fix lookup vindexes with `autocommit` enabled [#12172](https://github.com/vitessio/vitess/pull/12172) + * VTGate: Ensure HealthCheck Cache Secondary Maps Stay in Sync With Authoritative Map on Tablet Delete [#12178](https://github.com/vitessio/vitess/pull/12178) + * Fix aggregation on outer joins [#12298](https://github.com/vitessio/vitess/pull/12298) + * [release-15.0] fix: added null safe operator precendence rule (#12297) [#12306](https://github.com/vitessio/vitess/pull/12306) + * [release-15.0] Fix bug in vtexplain around JOINs (#12376) [#12383](https://github.com/vitessio/vitess/pull/12383) + * Fix scalar aggregation engine primitive for column truncation [#12468](https://github.com/vitessio/vitess/pull/12468) + * [release-16.0] BugFix: Unsharded query using a derived table and a dual table [#12484](https://github.com/vitessio/vitess/pull/12484) + * [bug fix] USING planning on information_schema [#12542](https://github.com/vitessio/vitess/pull/12542) + * handle filter on top of UNION [#12543](https://github.com/vitessio/vitess/pull/12543) + * collations: fix sorting in UCA900 collations [#12555](https://github.com/vitessio/vitess/pull/12555) + * VSchema DDL: Add grammar to accept qualified table names in Vindex option values [#12577](https://github.com/vitessio/vitess/pull/12577) + * [release-15.0] `ApplyVSchemaDDL`: escape Sequence names when writing the VSchema (#12519) [#12598](https://github.com/vitessio/vitess/pull/12598) + * [gen4 planner] Make sure to not push down expressions when not possible [#12607](https://github.com/vitessio/vitess/pull/12607) + * Fix `panic` when executing a prepare statement with over `65,528` parameters [#12614](https://github.com/vitessio/vitess/pull/12614) + * [planner bugfix] add expressions to HAVING [#12668](https://github.com/vitessio/vitess/pull/12668) + * Use a left join to make sure that tables with tablespace=innodb_system are included in the schema [#12672](https://github.com/vitessio/vitess/pull/12672) + * [release-15.0] Always add columns in the `Derived` operator [#12680](https://github.com/vitessio/vitess/pull/12680) + * [planner fix] make unknown column an error only for sharded queries [#12704](https://github.com/vitessio/vitess/pull/12704) +#### VReplication + * VReplication Last Error: retry error if it happens after timeout [#12114](https://github.com/vitessio/vitess/pull/12114) +#### VTorc + * Fix unhandled error in VTOrc `recoverDeadPrimary` [#12511](https://github.com/vitessio/vitess/pull/12511) +### CI/Build +#### Build/CI + * [release-15.0] Make upgrade downgrade job names unique [#12498](https://github.com/vitessio/vitess/pull/12498) + * v15 backport: CI: increase overall test timeouts for all OnlineDDL tests [#12591](https://github.com/vitessio/vitess/pull/12591) +#### Online DDL + * CI: extend timeouts in onlineddl_vrepl due to slow CI runners [#12583](https://github.com/vitessio/vitess/pull/12583) +#### Query Serving + * [release-15.0] Flakes: Properly Test HealthCheck Cache Response Handling (#12226) [#12227](https://github.com/vitessio/vitess/pull/12227) +### Dependabot +#### Build/CI + * Bump golang.org/x/net from 0.5.0 to 0.7.0 (#12390) [#12405](https://github.com/vitessio/vitess/pull/12405) +### Enhancement +#### Build/CI + * Auto upgrade the Golang version [#12585](https://github.com/vitessio/vitess/pull/12585) +#### Governance + * [release-15.0] Add manan and florent to Docker files CODEOWNERS (#11981) [#11983](https://github.com/vitessio/vitess/pull/11983) +#### VTorc + * Release-15: Cherry pick vtorc no cgo [#12223](https://github.com/vitessio/vitess/pull/12223) +### Internal Cleanup +#### Build/CI + * [15.0] CI: remove pitrtls test [#12064](https://github.com/vitessio/vitess/pull/12064) +#### General + * Remove removed flags from being used for v16+ binaries [#12128](https://github.com/vitessio/vitess/pull/12128) + * [release-15.0] Fix release script for the version in the docker script [#12285](https://github.com/vitessio/vitess/pull/12285) +### Other +#### Other + * Code freeze of release-15.0 [#12764](https://github.com/vitessio/vitess/pull/12764) +### Performance +#### Cluster management + * Bug fix: Cache filtered out tablets in topology watcher to avoid unnecessary GetTablet calls to topo [#12194](https://github.com/vitessio/vitess/pull/12194) +### Release +#### Build/CI + * [release-15.0] Tooling improvements backports [#12527](https://github.com/vitessio/vitess/pull/12527) +#### Documentation + * Re-organize the `releasenotes` directory into `changelog` [#12566](https://github.com/vitessio/vitess/pull/12566) +#### General + * Release of v15.0.2 [#11961](https://github.com/vitessio/vitess/pull/11961) + * Back to dev mode after v15.0.2 [#11962](https://github.com/vitessio/vitess/pull/11962) +### Testing +#### General + * Fix vtbackup upgrade/downgrade test [#12437](https://github.com/vitessio/vitess/pull/12437) + diff --git a/changelog/15.0/15.0.3/release_notes.md b/changelog/15.0/15.0.3/release_notes.md new file mode 100644 index 00000000000..aabb3770528 --- /dev/null +++ b/changelog/15.0/15.0.3/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v15.0.3 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/15.0/15.0.3/changelog.md). + +The release includes 52 commits (excluding merges) + +Thanks to all our contributors: @GuptaManan100, @ajm188, @dbussink, @deepthi, @frouioui, @harshit-gangal, @mattlord, @rsajwani, @shlomi-noach, @systay, @vitess-bot[bot], @vmg + diff --git a/changelog/15.0/README.md b/changelog/15.0/README.md new file mode 100644 index 00000000000..f6985e8252b --- /dev/null +++ b/changelog/15.0/README.md @@ -0,0 +1,13 @@ +## v15.0 +The dedicated team for this release can be found [here](team.md). +* **[15.0.2](15.0.2)** + * [Changelog](15.0.2/changelog.md) + * [Release Notes](15.0.2/release_notes.md) + +* **[15.0.1](15.0.1)** + * [Changelog](15.0.1/changelog.md) + * [Release Notes](15.0.1/release_notes.md) + +* **[15.0.0](15.0.0)** + * [Changelog](15.0.0/changelog.md) + * [Release Notes](15.0.0/release_notes.md) diff --git a/changelog/15.0/team.md b/changelog/15.0/team.md new file mode 100644 index 00000000000..b8cbdf809bf --- /dev/null +++ b/changelog/15.0/team.md @@ -0,0 +1,5 @@ +## Release Team for v15 + +- **Lead:** Rameez Sajwani ([rsajwani](https://github.com/rsajwani)) rameez@planetscale.com +- **Shadow:** Manan Gupta ([GuptaManan100](https://github.com/GuptaManan100)) manan@planetscale.com +- **Mentor:** Florent Poinsard ([frouioui](https://github.com/frouioui)) florent@planetscale.com \ No newline at end of file diff --git a/doc/releasenotes/7_0_0_release_notes.md b/changelog/7.0/7.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/7_0_0_release_notes.md rename to changelog/7.0/7.0.0/release_notes.md diff --git a/doc/releasenotes/7_0_1_release_notes.md b/changelog/7.0/7.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/7_0_1_release_notes.md rename to changelog/7.0/7.0.1/release_notes.md diff --git a/doc/releasenotes/7_0_2_release_notes.md b/changelog/7.0/7.0.2/release_notes.md similarity index 100% rename from doc/releasenotes/7_0_2_release_notes.md rename to changelog/7.0/7.0.2/release_notes.md diff --git a/doc/releasenotes/7_0_3_release_notes.md b/changelog/7.0/7.0.3/release_notes.md similarity index 100% rename from doc/releasenotes/7_0_3_release_notes.md rename to changelog/7.0/7.0.3/release_notes.md diff --git a/changelog/7.0/README.md b/changelog/7.0/README.md new file mode 100644 index 00000000000..7177c6be673 --- /dev/null +++ b/changelog/7.0/README.md @@ -0,0 +1,12 @@ +## v7.0 +* **[7.0.3](7.0.3)** + * [Release Notes](7.0.3/release_notes.md) + +* **[7.0.2](7.0.2)** + * [Release Notes](7.0.2/release_notes.md) + +* **[7.0.1](7.0.1)** + * [Release Notes](7.0.1/release_notes.md) + +* **[7.0.0](7.0.0)** + * [Release Notes](7.0.0/release_notes.md) diff --git a/doc/releasenotes/8_0_0_release_notes.md b/changelog/8.0/8.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/8_0_0_release_notes.md rename to changelog/8.0/8.0.0/release_notes.md diff --git a/changelog/8.0/README.md b/changelog/8.0/README.md new file mode 100644 index 00000000000..fa359e7302f --- /dev/null +++ b/changelog/8.0/README.md @@ -0,0 +1,3 @@ +## v8.0 +* **[8.0.0](8.0.0)** + * [Release Notes](8.0.0/release_notes.md) diff --git a/doc/releasenotes/9_0_0_release_notes.md b/changelog/9.0/9.0.0/release_notes.md similarity index 100% rename from doc/releasenotes/9_0_0_release_notes.md rename to changelog/9.0/9.0.0/release_notes.md diff --git a/doc/releasenotes/9_0_1_release_notes.md b/changelog/9.0/9.0.1/release_notes.md similarity index 100% rename from doc/releasenotes/9_0_1_release_notes.md rename to changelog/9.0/9.0.1/release_notes.md diff --git a/doc/releasenotes/9_0_2_release_notes.md b/changelog/9.0/9.0.2/release_notes.md similarity index 100% rename from doc/releasenotes/9_0_2_release_notes.md rename to changelog/9.0/9.0.2/release_notes.md diff --git a/changelog/9.0/README.md b/changelog/9.0/README.md new file mode 100644 index 00000000000..17f49aa3b47 --- /dev/null +++ b/changelog/9.0/README.md @@ -0,0 +1,9 @@ +## v9.0 +* **[9.0.2](9.0.2)** + * [Release Notes](9.0.2/release_notes.md) + +* **[9.0.1](9.0.1)** + * [Release Notes](9.0.1/release_notes.md) + +* **[9.0.0](9.0.0)** + * [Release Notes](9.0.0/release_notes.md) diff --git a/changelog/README.md b/changelog/README.md new file mode 100644 index 00000000000..7f7147b6fb1 --- /dev/null +++ b/changelog/README.md @@ -0,0 +1,10 @@ +## Releases +* [15.0](15.0) +* [14.0](14.0) +* [13.0](13.0) +* [12.0](12.0) +* [11.0](11.0) +* [10.0](10.0) +* [9.0](9.0) +* [8.0](8.0) +* [7.0](7.0) \ No newline at end of file diff --git a/doc/internal/ReleaseInstructions.md b/doc/internal/ReleaseInstructions.md index bff6fa640d4..836ceb9e633 100644 --- a/doc/internal/ReleaseInstructions.md +++ b/doc/internal/ReleaseInstructions.md @@ -55,7 +55,7 @@ Pre-release versions should be labeled with a suffix like `-beta2` or `-rc1`. ## Release Branches Each major and minor releases (X.Y) should have a [release branch](https://github.com/vitessio/vitess/branches/all?query=release) named -`release-X.Y`. This branch should diverge from `main` when the code freeze when the release +`release-X.Y`. This branch should diverge from `main` when the release is declared, after which point only bugfix PRs should be cherry-picked onto the branch. All other activity on `main` will go out with a subsequent major or minor release. @@ -109,6 +109,7 @@ Therefore, file a JIRA ticket with Sonatype to get added ([example for a differe Follow [Sonatype's GPG instructions](https://central.sonatype.org/pages/working-with-pgp-signatures.html). Install `gpg-agent` (needed below) e.g. on Ubuntu via: `sudo apt-get install gnupg-agent`. +for Mac you need to install 'gnupg' via 'brew install gnupg' #### Login configuration @@ -118,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 @@ -131,7 +140,8 @@ We usually create the RC1 during the first week of the month, and the GA version #### Code Freeze Before creating RC1, there is a code freeze. Assuming the release of RC1 happens on a Tuesday, the release branch will be frozen Friday of the previous week. -This allows us to test that the release branch can be released and avoid discovering unwanted events during the release day. Once the RC1 is released, there are three more weeks to backport bug fixes into the release branches. However, we also proceed to a code freeze the Friday before the GA release. (Assuming GA is on a Tuesday) +This allows us to test that the release branch can be released and avoid discovering unwanted events during the release day. Once the RC1 is released, there are three more weeks to backport bug fixes into the release branches. +However, we also proceed to a code freeze the Friday before the GA release. (Assuming GA is on a Tuesday) Regarding patch releases, no code freeze is planned. #### Tracking Issue for each Release @@ -151,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. @@ -160,17 +171,29 @@ That includes: > - As soon as we go into code freeze, if we are doing an RC, create the release branch. > - If we are doing a GA release, do not merge any new Pull Requests. > - The guide on how to do a code freeze is available in the [How To Code Freeze](#how-to-code-freeze) section. + > - It is not advised to merge a PR during code freeze, but if it is deemed necessary by the release lead, then follow the steps in [How To Merge During Code Freeze](#how-to-merge-during-code-freeze) section. +- **Create the Vitess release.** + > - A guide on how to create a Vitess release is available in the [How to prepare the release of Vitess](#how-to-prepare-the-release-of-vitess) section. + > - This step will create a Release Pull Request, it must be reviewed and merged before the release day. The release commit will be used to tag the release. - **Preparing the Vitess Operator release.** > - While the Vitess Operator is located in a different repository, we also need to do a release for it. > - The Operator follows the same cycle: RC1 -> GA -> Patches. > - Documentation for the pre-release of the Vitess Operator is available [here](https://github.com/planetscale/vitess-operator/blob/main/docs/release-process.md#prepare-for-release). +- **Update the release notes on `main`.** + > - One Pull Request against `main` must be created, it will contain the new release notes that we are adding in the Release Pull Request. + > - We open this Pull Request now to avoid waiting on the CI during release day. + > - All future changes to the release notes during the code freeze will need to be ported to both PRs: the one on `main` and the Release Pull Request. ### Release On the release day, there are several things to do: -- **Create the Vitess release.** - > - A guide on how to create a Vitess release is available in the [How To Release Vitess](#how-to-release-vitess) section. +- **Merge the Release Pull Request.** + > - During the code freeze, we created a Release Pull Request. It must be merged. +- **Tag the Vitess release.** + > - A guide on how to tag a version is available in the [How To Release Vitess](#how-to-release-vitess) section. +- **Update the release notes on `main`.** + > - During the code freeze, we created a Pull Request against `main` to update the release notes. It must be merged. - **Create the corresponding Vitess operator release.** > - Applies only to versions greater or equal to `v14.0.0`. > - If we are doing an RC release, then we will need to create the Vitess Operator RC too. If we are doing a GA release, we're also doing a GA release in the Operator. @@ -192,10 +215,8 @@ On the release day, there are several things to do: > - After a while, those elements will finish their execution and their status will be green. > - This step is even more important for GA releases as we often include a link to _arewefastyet_ in the blog post. > - The benchmarks need to complete before announcing the blog posts or before they get cross-posted. -- **Update the release notes on the release branch and on `main`.** - > - Two new Pull Requests have to be created. - > - One against `main`, it will contain only the new release notes. - > - And another against the release branch, this one contains the release notes and the release commit. (The commit on which we did `git tag`) +- **Go back to dev mode on the release branch.** + > - The version constants across the codebase must be updated to `SNAPSHOT`. - **Build k8s Docker images and publish them** > - The docker image for `base`, `lite`, etc are built automatically by DockerHub. The k8s images however are dependent on these images and are required to be built manually. > - These images should be built after the `base` image has been built and available on DockerHub. @@ -206,6 +227,56 @@ On the release day, there are several things to do: Once the release is over, we need to announce it on both Slack and Twitter. We also want to make sure the blog post was cross-posted, if applicable. We need to verify that _arewefastyet_ has finished the benchmark too. +### How to prepare the release of Vitess + +> In this example our current version is `v14.0.3` and we release the version `v15.0.0`. +> Alongside Vitess' release, we also release a new version of the operator. +> Since we are releasing a release candidate here, the new version of the operator will also be a release candidate. +> In this example, the new operator version is `2.8.0`. +> +> It is important to note that before the RC, there is a code freeze during which we create the release branch. +> +> The release branch in this example is `release-15.0`. +> +> The example also assumes that `origin` is the `vitessio/vitess` remote. + +1. Fetch `github.com/vitessio/vitess`'s remote. + ```shell + git fetch origin + ``` + +2. Creation of the Release Pull Request. + > This step will create the Release Pull Request that will then be reviewed ahead of the release day. + > The merge commit of that Pull Request will be used during the release day to tag the release. + 1. Run the `create_release` script using the Makefile: + 1. Release Candidate: + ```shell + make BASE_BRANCH="release-15.0" BASE_REMOTE="origin" RELEASE_VERSION="15.0.0-rc1" VTOP_VERSION="2.8.0-rc1" create_release + ``` + 2. General Availability: + ```shell + make BASE_BRANCH="release-15.0" BASE_REMOTE="origin" RELEASE_VERSION="15.0.0" VTOP_VERSION="2.8.0" create_release + ``` + + The script will prompt you `Pausing so release notes can be added. Press enter to continue`. We are now going to generate the release notes, continue to the next sub-step. + + 2. Run the following command to generate the release notes: + 1. Release Candidate: + ```shell + make VERSION="v15.0.0-rc1" FROM="v14.0.3" TO="HEAD" SUMMARY="./changelog/15.0/15.0.0/summary.md" release-notes + ``` + 2. General Availability: + ```shell + make VERSION="v15.0.0-rc1" FROM="v14.0.3" TO="HEAD" SUMMARY="./changelog/15.0/15.0.0/summary.md" release-notes + ``` + This command will generate the release notes by looking at all the commits between the tag `v14.0.3` and the reference `HEAD`. + It will also use the file located in `./changelog/15.0/15.0.0/summary.md` to prefix the release notes with a text that the maintainers wrote before the release. + Please verify the generated release notes to make sure it is well-formatted and all the bookmarks are generated properly. + + +3. Follow the instruction prompted by the `create_release` Makefile command's output in order to push the newly created branch and create the Release Pull Request on GitHub. + +4. If we are doing an RC release it means we created a new branch from `main`. We need to update `main` with the next SNAPSHOT version. If `main` was on `15.0.0-SNAPSHOT`, we need to update it to `16.0.0-SNAPSHOT`. A simple find and replace in the IDE is sufficient, there only a handful of files that must be changed: `version.go` and several java files. ### How To Release Vitess This section is divided into two parts: @@ -214,7 +285,10 @@ This section is divided into two parts: #### Creation of the tags and release notes -> In this example our current version is `v14` and we release the version `v15.0.0`. +> This step implies that you have created a [Release Pull Request](#how-to-prepare-the-release-of-vitess) beforehand and that it has been reviewed. +> The merge commit of this Release Pull Request will be used to tag the release. +> +> In this example our current version is `v14.0.3` and we release the version `v15.0.0`. > Alongside Vitess' release, we also release a new version of the operator. > Since we are releasing a release candidate here, the new version of the operator will also be a release candidate. > In this example, the new operator version is `2.8.0`. @@ -230,37 +304,22 @@ This section is divided into two parts: git fetch origin ``` -2. Creation of the release notes and tags. - 1. Run the release script using the Makefile: - 1. Release Candidate: - ```shell - make BASE_BRANCH="release-15.0" BASE_REMOTE="origin" RELEASE_VERSION="15.0.0-rc1" DEV_VERSION="15.0.0-SNAPSHOT" VTOP_VERSION="2.8.0-rc1" do_release - ``` - 2. General Availability: - ```shell - make BASE_BRANCH="release-15.0" BASE_REMOTE="origin" RELEASE_VERSION="15.0.0" DEV_VERSION="15.0.1-SNAPSHOT" VTOP_VERSION="2.8.0" do_release - ``` +2. Checkout to the merge commit of the Release Pull Request. - 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. +3. Tag the release and push the tags + ```shell + git tag v15.0.0 && git tag v0.15.0 && git push origin v15.0.0 && git push origin v0.15.0 + ``` - 2. Run the following command to generate the release notes: - 1. Release Candidate: - ```shell - make VERSION="v15.0.0-rc1" FROM="v14.0.0" TO="HEAD" SUMMARY="./doc/releasenotes/15_0_0_summary.md" release-notes - ``` - 2. General Availability: - ```shell - make VERSION="v15.0.0-rc1" FROM="v14.0.0" TO="HEAD" SUMMARY="./doc/releasenotes/15_0_0_summary.md" release-notes - ``` - This command will generate the release notes by looking at all the commits between the tag `v14.0.0` and the reference `HEAD`. - It will also use the file located in `./doc/releasenotes/15_0_0_summary.md` to prefix the release notes with a text that the maintainers wrote before the release. +4. Create a Pull Request against the `main` branch with the release notes found in `./changelog/15.0/15.0.0/15_0_0_*.md`. - -3. Follow the instruction prompted by the `do_release` Makefile command's output in order to push the tags, branches and create the Pull Requests. - -4. Create a Pull Request against the `main` branch with the newly created release notes. - -5. Release the tag on GitHub UI as explained in the following section. +5. Run the back to dev mode tool. + ```shell + make BASE_BRANCH="release-15.0" BASE_REMOTE="origin" RELEASE_VERSION="15.0.0-rc1" DEV_VERSION="15.0.0-SNAPSHOT" back_to_dev_mode + ``` + > You will then need to follow the instructions given by the output of the back_to_dev_mode Makefile command. You will need to push the newly created branch and open a Pull Request. + +6. Release the tag on GitHub UI as explained in the following section. #### Creating Release or Release Candidate on the GitHub UI @@ -305,6 +364,9 @@ git fetch --all git checkout -b release-15.0 origin/main ``` +> Important: after creating the new branch `release-15.0`, we need to create new branch protection rules on the GitHub UI. +> The rules can be copied from the rules that are on the `main` branch. + The new branch will be based on `origin/main`, here `origin` points to `vitessio/vitess`. If we are not doing a release candidate, then the branch already exists and we can checkout on it. Now, if we are doing a GA release, let's update the branch: @@ -321,6 +383,26 @@ Finally, let's run the code freeze script: The script will prompt the command that will allow you to push the code freeze change. Once pushed, open a PR that will be merged on `release-15.0`. +Remember, you should also disable the Launchable integration from the newly created release branch. + +### How To Merge During Code Freeze + +> **Warning:** It is not advised to merge a PR during code-freeze. If it is deemed absolutely necessary, then the following steps can be followed. + +The PR that needs to be merged will be failing on the `Code Freeze` CI. To merge this PR, we'll have to mark this CI action as not required. +You will need administrator privileges on the vitess repository to be able to make this change. + +1. Go to the GitHub repository and click on `Settings`. +2. Under the `Code and automation` section, select `Branches`. +3. Find the branch that you want to merge the PR against and then select `Edit`. +4. Scroll down to find the list of required checks. +5. Within this list find `Code Freeze` and click on the cross next to it to remove it from this list. +6. Save your changes on the bottom of the page. +7. Refresh the page of the PR, and you should be able to merge it. +8. After merging the PR, you need to do 2 more things - + 1. Add `Code Freeze` back as a required check. + 2. Check if the release PR has any merge conflicts. If it does, fix them and push. + ### Java Packages: Deploy & Release > **Warning:** This section's steps need to be executed only when releasing a new major version of Vitess, @@ -328,12 +410,12 @@ The script will prompt the command that will allow you to push the code freeze c > > For this example, we assume we juste released `v12.0.0`. -1. Checkout to the release commit. +1. Checkout to the release commit. ```shell git checkout v12.0.0 ``` -2. Run `gpg-agent` to avoid that Maven will constantly prompt you for the password of your private key. +2. Run `gpg-agent` to avoid that Maven will constantly prompt you for the password of your private key. Note that this can print error messages that can be ignored on Mac. ```bash eval $(gpg-agent --daemon --no-grab --write-env-file $HOME/.gpg-agent-info) @@ -341,11 +423,20 @@ The script will prompt the command that will allow you to push the code freeze c export GPG_AGENT_INFO ``` -3. Deploy (upload) the Java code to the oss.sonatype.org repository: +3. Export following to avoid any version conflicts + ```bash + export MAVEN_OPTS="--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED + --add-opens=java.desktop/java.awt.font=ALL-UNNAMED" + ``` + +4. Deploy (upload) the Java code to the oss.sonatype.org repository: > **Warning:** After the deployment, the Java packages will be automatically released. Once released, you cannot delete them. The only option is to upload a newer version (e.g. increment the patch level).
```bash + cd ./java/ mvn clean deploy -P release -DskipTests cd .. ``` + +5. It will take some time for artifacts to appear on [maven directory](https://mvnrepository.com/artifact/io.vitess/vitess-client) diff --git a/docker/release.sh b/docker/release.sh index 5298e6b902c..13d467b40d9 100755 --- a/docker/release.sh +++ b/docker/release.sh @@ -1,7 +1,7 @@ #!/bin/bash set -ex -vt_base_version='15.0.2' +vt_base_version='v15.0.3' debian_versions='buster bullseye' default_debian_version='bullseye' diff --git a/examples/compose/docker-compose.beginners.yml b/examples/compose/docker-compose.beginners.yml index 5073807f910..3c132b88cec 100644 --- a/examples/compose/docker-compose.beginners.yml +++ b/examples/compose/docker-compose.beginners.yml @@ -58,7 +58,7 @@ services: - "3306" vtctld: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15000:$WEB_PORT" - "$GRPC_PORT" @@ -83,7 +83,7 @@ services: condition: service_healthy vtgate: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15099:$WEB_PORT" - "$GRPC_PORT" @@ -113,7 +113,7 @@ services: condition: service_healthy schemaload: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 command: - sh - -c @@ -146,12 +146,12 @@ services: environment: - KEYSPACES=$KEYSPACE - GRPC_PORT=15999 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script vttablet100: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15100:$WEB_PORT" - "$GRPC_PORT" @@ -183,7 +183,7 @@ services: retries: 15 vttablet101: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15101:$WEB_PORT" - "$GRPC_PORT" @@ -215,7 +215,7 @@ services: retries: 15 vttablet102: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15102:$WEB_PORT" - "$GRPC_PORT" @@ -247,7 +247,7 @@ services: retries: 15 vttablet103: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15103:$WEB_PORT" - "$GRPC_PORT" @@ -279,7 +279,7 @@ services: retries: 15 vtorc: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 command: ["sh", "-c", "/script/vtorc-up.sh"] depends_on: - vtctld @@ -309,7 +309,7 @@ services: retries: 15 vreplication: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - ".:/script" environment: diff --git a/examples/compose/docker-compose.yml b/examples/compose/docker-compose.yml index c63547db1c7..b6e40154a7f 100644 --- a/examples/compose/docker-compose.yml +++ b/examples/compose/docker-compose.yml @@ -75,7 +75,7 @@ services: - SCHEMA_FILES=lookup_keyspace_schema_file.sql - POST_LOAD_FILE= - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script schemaload_test_keyspace: @@ -101,7 +101,7 @@ services: - SCHEMA_FILES=test_keyspace_schema_file.sql - POST_LOAD_FILE= - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script set_keyspace_durability_policy: @@ -115,7 +115,7 @@ services: environment: - KEYSPACES=test_keyspace lookup_keyspace - GRPC_PORT=15999 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script vreplication: @@ -129,7 +129,7 @@ services: - TOPOLOGY_FLAGS=--topo_implementation consul --topo_global_server_address consul1:8500 --topo_global_root vitess/global - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script vtctld: @@ -143,7 +143,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15000:8080 - "15999" @@ -160,7 +160,7 @@ services: --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15099:8080 - "15999" @@ -182,7 +182,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 13000:8080 volumes: @@ -217,7 +217,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15101:8080 - "15999" @@ -254,7 +254,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15102:8080 - "15999" @@ -291,7 +291,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15201:8080 - "15999" @@ -328,7 +328,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15202:8080 - "15999" @@ -365,7 +365,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15301:8080 - "15999" @@ -402,7 +402,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15302:8080 - "15999" diff --git a/examples/compose/vtcompose/docker-compose.test.yml b/examples/compose/vtcompose/docker-compose.test.yml index d8d8bb7f310..3a858eed1a3 100644 --- a/examples/compose/vtcompose/docker-compose.test.yml +++ b/examples/compose/vtcompose/docker-compose.test.yml @@ -79,7 +79,7 @@ services: - SCHEMA_FILES=test_keyspace_schema_file.sql - POST_LOAD_FILE= - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script schemaload_unsharded_keyspace: @@ -103,7 +103,7 @@ services: - SCHEMA_FILES=unsharded_keyspace_schema_file.sql - POST_LOAD_FILE= - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script set_keyspace_durability_policy_test_keyspace: @@ -117,7 +117,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=test_keyspace - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script set_keyspace_durability_policy_unsharded_keyspace: @@ -130,7 +130,7 @@ services: environment: - GRPC_PORT=15999 - KEYSPACES=unsharded_keyspace - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script vreplication: @@ -144,7 +144,7 @@ services: - TOPOLOGY_FLAGS=--topo_implementation consul --topo_global_server_address consul1:8500 --topo_global_root vitess/global - EXTERNAL_DB=0 - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - .:/script vtctld: @@ -159,7 +159,7 @@ services: depends_on: external_db_host: condition: service_healthy - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15000:8080 - "15999" @@ -176,7 +176,7 @@ services: ''grpc-vtgateservice'' --normalize_queries=true ' depends_on: - vtctld - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15099:8080 - "15999" @@ -199,7 +199,7 @@ services: - EXTERNAL_DB=0 - DB_USER= - DB_PASS= - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 13000:8080 volumes: @@ -234,7 +234,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15101:8080 - "15999" @@ -271,7 +271,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15102:8080 - "15999" @@ -308,7 +308,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15201:8080 - "15999" @@ -345,7 +345,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15202:8080 - "15999" @@ -382,7 +382,7 @@ services: - CMD-SHELL - curl -s --fail --show-error localhost:8080/debug/health timeout: 10s - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - 15301:8080 - "15999" diff --git a/examples/compose/vtcompose/vtcompose.go b/examples/compose/vtcompose/vtcompose.go index e0f66a652b9..57a352ffb06 100644 --- a/examples/compose/vtcompose/vtcompose.go +++ b/examples/compose/vtcompose/vtcompose.go @@ -533,7 +533,7 @@ func generateDefaultShard(tabAlias int, shard string, keyspaceData keyspaceInfo, - op: add path: /services/init_shard_primary%[2]d value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 command: ["sh", "-c", "/vt/bin/vtctlclient %[5]s InitShardPrimary -force %[4]s/%[3]s %[6]s-%[2]d "] %[1]s `, dependsOn, aliases[0], shard, keyspaceData.keyspace, opts.topologyFlags, opts.cell) @@ -565,7 +565,7 @@ func generateExternalPrimary( - op: add path: /services/vttablet%[1]d value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15%[1]d:%[3]d" - "%[4]d" @@ -627,7 +627,7 @@ func generateDefaultTablet(tabAlias int, shard, role, keyspace string, dbInfo ex - op: add path: /services/vttablet%[1]d value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15%[1]d:%[4]d" - "%[5]d" @@ -665,7 +665,7 @@ func generateVtctld(opts vtOptions) string { - op: add path: /services/vtctld value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15000:%[1]d" - "%[2]d" @@ -698,7 +698,7 @@ func generateVtgate(opts vtOptions) string { - op: add path: /services/vtgate value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 ports: - "15099:%[1]d" - "%[2]d" @@ -740,7 +740,7 @@ func generateVTOrc(dbInfo externalDbInfo, keyspaceInfoMap map[string]keyspaceInf - op: add path: /services/vtorc value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - ".:/script" environment: @@ -765,7 +765,7 @@ func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - op: add path: /services/vreplication value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - ".:/script" environment: @@ -793,7 +793,7 @@ func generateSetKeyspaceDurabilityPolicy( - op: add path: /services/set_keyspace_durability_policy_%[3]s value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - ".:/script" environment: @@ -830,7 +830,7 @@ func generateSchemaload( - op: add path: /services/schemaload_%[7]s value: - image: vitess/lite:v15.0.2 + image: vitess/lite:v15.0.3 volumes: - ".:/script" environment: diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index 070db67b6a2..f3381214915 100644 --- a/examples/operator/101_initial_cluster.yaml +++ b/examples/operator/101_initial_cluster.yaml @@ -8,14 +8,14 @@ metadata: name: example spec: images: - vtctld: vitess/lite:v15.0.2 - vtadmin: vitess/vtadmin:v15.0.0-rc1 - vtgate: vitess/lite:v15.0.2 - vttablet: vitess/lite:v15.0.2 - vtbackup: vitess/lite:v15.0.2 - vtorc: vitess/lite:v15.0.2 + vtctld: vitess/lite:v15.0.3 + vtadmin: vitess/vtadmin:v15.0.3 + vtgate: vitess/lite:v15.0.3 + vttablet: vitess/lite:v15.0.3 + vtbackup: vitess/lite:v15.0.3 + vtorc: vitess/lite:v15.0.3 mysqld: - mysql56Compatible: vitess/lite:v15.0.2 + mysql56Compatible: vitess/lite:v15.0.3 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 @@ -236,8 +236,7 @@ stringData: clusters: ["*"] - resource: "Shard" actions: - - "emergency_reparent_shard" - - "planned_reparent_shard" + - "emergency_failover_shard" + - "planned_failover_shard" subjects: ["*"] - clusters: - - "local" + clusters: ["*"] diff --git a/examples/operator/201_customer_tablets.yaml b/examples/operator/201_customer_tablets.yaml index 0b2f459c668..c3f96e3ac9a 100644 --- a/examples/operator/201_customer_tablets.yaml +++ b/examples/operator/201_customer_tablets.yaml @@ -4,14 +4,14 @@ metadata: name: example spec: images: - vtctld: vitess/lite:v15.0.2 - vtadmin: vitess/vtadmin:v15.0.0-rc1 - vtgate: vitess/lite:v15.0.2 - vttablet: vitess/lite:v15.0.2 - vtbackup: vitess/lite:v15.0.2 - vtorc: vitess/lite:v15.0.2 + vtctld: vitess/lite:v15.0.3 + vtadmin: vitess/vtadmin:v15.0.3 + vtgate: vitess/lite:v15.0.3 + vttablet: vitess/lite:v15.0.3 + vtbackup: vitess/lite:v15.0.3 + vtorc: vitess/lite:v15.0.3 mysqld: - mysql56Compatible: vitess/lite:v15.0.2 + mysql56Compatible: vitess/lite:v15.0.3 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/302_new_shards.yaml b/examples/operator/302_new_shards.yaml index 9082abd9d24..e268b3e907c 100644 --- a/examples/operator/302_new_shards.yaml +++ b/examples/operator/302_new_shards.yaml @@ -4,14 +4,14 @@ metadata: name: example spec: images: - vtctld: vitess/lite:v15.0.2 - vtadmin: vitess/vtadmin:v15.0.0-rc1 - vtgate: vitess/lite:v15.0.2 - vttablet: vitess/lite:v15.0.2 - vtbackup: vitess/lite:v15.0.2 - vtorc: vitess/lite:v15.0.2 + vtctld: vitess/lite:v15.0.3 + vtadmin: vitess/vtadmin:v15.0.3 + vtgate: vitess/lite:v15.0.3 + vttablet: vitess/lite:v15.0.3 + vtbackup: vitess/lite:v15.0.3 + vtorc: vitess/lite:v15.0.3 mysqld: - mysql56Compatible: vitess/lite:v15.0.2 + mysql56Compatible: vitess/lite:v15.0.3 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/306_down_shard_0.yaml b/examples/operator/306_down_shard_0.yaml index 6109c2369c5..50be80d0d72 100644 --- a/examples/operator/306_down_shard_0.yaml +++ b/examples/operator/306_down_shard_0.yaml @@ -4,14 +4,14 @@ metadata: name: example spec: images: - vtctld: vitess/lite:v15.0.2 - vtadmin: vitess/vtadmin:v15.0.0-rc1 - vtgate: vitess/lite:v15.0.2 - vttablet: vitess/lite:v15.0.2 - vtbackup: vitess/lite:v15.0.2 - vtorc: vitess/lite:v15.0.2 + vtctld: vitess/lite:v15.0.3 + vtadmin: vitess/vtadmin:v15.0.3 + vtgate: vitess/lite:v15.0.3 + vttablet: vitess/lite:v15.0.3 + vtbackup: vitess/lite:v15.0.3 + vtorc: vitess/lite:v15.0.3 mysqld: - mysql56Compatible: vitess/lite:v15.0.2 + mysql56Compatible: vitess/lite:v15.0.3 mysqldExporter: prom/mysqld-exporter:v0.11.0 cells: - name: zone1 diff --git a/examples/operator/operator.yaml b/examples/operator/operator.yaml index 18e72584887..caa0ec3ea53 100644 --- a/examples/operator/operator.yaml +++ b/examples/operator/operator.yaml @@ -5615,7 +5615,7 @@ spec: fieldPath: metadata.name - name: OPERATOR_NAME value: vitess-operator - image: planetscale/vitess-operator:v2.8.2 + image: planetscale/vitess-operator:v2.8.3 name: vitess-operator resources: limits: diff --git a/go.mod b/go.mod index 7a1497afe26..6ae8e1d6d45 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/golang/mock v1.5.0 github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.3 - github.com/google/go-cmp v0.5.8 + github.com/google/go-cmp v0.5.9 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/google/uuid v1.3.0 github.com/googleapis/gnostic v0.4.1 // indirect @@ -49,7 +49,7 @@ require ( github.com/klauspost/pgzip v1.2.4 github.com/krishicks/yaml-patch v0.0.10 github.com/magiconair/properties v1.8.5 - github.com/mattn/go-sqlite3 v1.14.14 + github.com/mattn/go-sqlite3 v1.14.16 // indirect github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1 github.com/mitchellh/go-testing-interface v1.14.0 // indirect github.com/montanaflynn/stats v0.6.3 @@ -88,11 +88,11 @@ require ( golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b + golang.org/x/net v0.7.0 golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f - golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 - golang.org/x/text v0.3.8 + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 + golang.org/x/text v0.7.0 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac golang.org/x/tools v0.1.12 google.golang.org/api v0.45.0 @@ -117,7 +117,8 @@ require ( require ( github.com/bndr/gotabulate v1.1.2 - github.com/openark/golib v0.0.0-20210531070646-355f37940af8 + github.com/hashicorp/go-version v1.6.0 + modernc.org/sqlite v1.20.3 ) require ( @@ -131,6 +132,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect github.com/cyphar/filepath-securejoin v0.2.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect github.com/fatih/color v1.9.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect github.com/frankban/quicktest v1.14.3 // indirect @@ -147,9 +149,10 @@ require ( github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/json-iterator/go v1.1.11 // indirect github.com/jstemmer/go-junit-report v0.9.1 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/mattn/go-colorable v0.1.6 // indirect github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d // indirect - github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect github.com/mattn/go-runewidth v0.0.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -162,6 +165,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/procfs v0.6.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/satori/go.uuid v1.2.0 // indirect github.com/spf13/afero v1.6.0 // indirect @@ -186,5 +190,14 @@ require ( k8s.io/klog/v2 v2.4.0 // indirect k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd // indirect k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect + lukechampine.com/uint128 v1.2.0 // indirect + modernc.org/cc/v3 v3.40.0 // indirect + modernc.org/ccgo/v3 v3.16.13 // indirect + modernc.org/libc v1.22.2 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.4.0 // indirect + modernc.org/opt v0.1.3 // indirect + modernc.org/strutil v1.1.3 // indirect + modernc.org/token v1.0.1 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.0.3 // indirect ) diff --git a/go.sum b/go.sum index 551e6199f9d..4771e29c54f 100644 --- a/go.sum +++ b/go.sum @@ -183,6 +183,7 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dvyukov/go-fuzz v0.0.0-20210914135545-4980593459a1/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -332,8 +333,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v27 v27.0.4/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -355,6 +356,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -424,6 +426,8 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= @@ -475,6 +479,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -517,13 +523,14 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -577,8 +584,6 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/openark/golib v0.0.0-20210531070646-355f37940af8 h1:9ciIHNuyFqRWi9NpMNw9sVLB6z1ItpP5ZhTY9Q1xVu4= -github.com/openark/golib v0.0.0-20210531070646-355f37940af8/go.mod h1:1jj8x1eDVZxgc/Z4VyamX4qTbAdHPUQA6NeVtCd8Sl8= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02 h1:0R5mDLI66Qw13qN80TRz85zthQ2nf2+uDyiV23w6c3Q= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= @@ -638,6 +643,8 @@ github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3x github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -878,8 +885,8 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -978,11 +985,12 @@ golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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= @@ -992,8 +1000,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1271,6 +1279,30 @@ k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAG k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/libc v1.22.2 h1:4U7v51GyhlWqQmwCHj28Rdq2Yzwk55ovjFrdPjs8Hb0= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.4.0 h1:crykUfNSnMAXaOJnnxcSzbUGMqkLWjklJKkBK2nwZwk= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.20.3 h1:SqGJMMxjj1PHusLxdYxeQSodg7Jxn9WWkaAQjKrntZs= +modernc.org/sqlite v1.20.3/go.mod h1:zKcGyrICaxNTMEHSr1HQ2GUraP0j+845GYw37+EyT6A= +modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.15.0 h1:oY+JeD11qVVSgVvodMJsu7Edf8tr5E/7tuhF5cNYz34= +modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/go/cmd/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 0d53c97c72d..0adce0774d7 100644 --- a/go/cmd/vtctldclient/command/root.go +++ b/go/cmd/vtctldclient/command/root.go @@ -19,12 +19,14 @@ package command import ( "context" "errors" + "fmt" "io" "time" "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" ) @@ -48,6 +50,7 @@ var ( // We use PersistentPreRun to set up the tracer, grpc client, and // command context for every command. PersistentPreRunE: func(cmd *cobra.Command, args []string) (err error) { + logutil.PurgeLogs() traceCloser = trace.StartTracing("vtctldclient") if VtctldClientProtocol != "local" { if err := ensureServerArg(); err != nil { @@ -82,6 +85,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/cmd/vtorc/main.go b/go/cmd/vtorc/main.go index f5418819a05..0d28c8da9bf 100644 --- a/go/cmd/vtorc/main.go +++ b/go/cmd/vtorc/main.go @@ -22,8 +22,8 @@ import ( "strings" _ "github.com/go-sql-driver/mysql" - _ "github.com/mattn/go-sqlite3" "github.com/spf13/pflag" + _ "modernc.org/sqlite" "vitess.io/vitess/go/acl" "vitess.io/vitess/go/vt/grpccommon" diff --git a/go/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/flags/endtoend/mysqlctl.txt b/go/flags/endtoend/mysqlctl.txt index 6444c8f4575..c9f500d7b74 100644 --- a/go/flags/endtoend/mysqlctl.txt +++ b/go/flags/endtoend/mysqlctl.txt @@ -67,7 +67,7 @@ Global flags: --mysqlctl_client_protocol string the protocol to use to talk to the mysqlctl server (default "grpc") --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. --pool_hostname_resolve_interval duration if set force an update to all hostnames and reconnect if changed, defaults to 0 (disabled) diff --git a/go/flags/endtoend/mysqlctld.txt b/go/flags/endtoend/mysqlctld.txt index f34697b39ef..f0a00822a1e 100644 --- a/go/flags/endtoend/mysqlctld.txt +++ b/go/flags/endtoend/mysqlctld.txt @@ -71,7 +71,7 @@ Usage of mysqlctld: --mysql_socket string Path to the mysqld socket file --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. --pool_hostname_resolve_interval duration if set force an update to all hostnames and reconnect if changed, defaults to 0 (disabled) diff --git a/go/flags/endtoend/vtbackup.txt b/go/flags/endtoend/vtbackup.txt index 7f8147265ab..a588976126d 100644 --- a/go/flags/endtoend/vtbackup.txt +++ b/go/flags/endtoend/vtbackup.txt @@ -12,6 +12,8 @@ Usage of vtbackup: --backup_storage_implementation string Which backup storage implementation to use for creating and restoring backups. --backup_storage_number_blocks int if backup_storage_compress is true, backup_storage_number_blocks sets the number of blocks that can be processed, at once, before the writer blocks, during compression (default is 2). It should be equal to the number of CPUs available for compression. (default 2) --ceph_backup_storage_config string Path to JSON config file for ceph backup storage. (default "ceph_backup_config.json") + --compression-engine-name string compressor engine used for compression. (default "pargzip") + --compression-level int what level to pass to the compressor. (default 1) --concurrency int (init restore parameter) how many concurrent files to restore at once (default 4) --consul_auth_static_file string JSON File to read the topos/tokens from. --db-credentials-file string db credentials file; send SIGHUP to reload this file @@ -63,6 +65,9 @@ Usage of vtbackup: --db_tls_min_version string Configures the minimal TLS version negotiated when SSL is enabled. Defaults to TLSv1.2. Options: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. --detach detached mode - run backups detached from the terminal --emit_stats If set, emit stats to push-based monitoring and stats backends + --external-compressor string command with arguments to use when compressing a backup. + --external-compressor-extension string extension to use when using an external compressor. + --external-decompressor string command with arguments to use when decompressing a backup. --file_backup_storage_root string Root directory for the file backup storage. --gcs_backup_storage_bucket string Google Cloud Storage bucket to use for backups. --gcs_backup_storage_root string Root prefix for all backup-related object names. diff --git a/go/flags/endtoend/vtctld.txt b/go/flags/endtoend/vtctld.txt index 887a4da95bc..83eac50a108 100644 --- a/go/flags/endtoend/vtctld.txt +++ b/go/flags/endtoend/vtctld.txt @@ -65,7 +65,7 @@ Usage of vtctld: --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --opentsdb_uri string URI of opentsdb /api/put method --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. diff --git a/go/flags/endtoend/vtctldclient.txt b/go/flags/endtoend/vtctldclient.txt index 35c70924db4..79905723cfe 100644 --- a/go/flags/endtoend/vtctldclient.txt +++ b/go/flags/endtoend/vtctldclient.txt @@ -1,6 +1,7 @@ Executes a cluster management command on the remote vtctld server. Usage: + vtctldclient [flags] vtctldclient [command] Available Commands: diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index e9e8591896c..f6b6ef51945 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -118,7 +118,7 @@ Usage of vtgate: --mysql_tcp_version string Select tcp, tcp4, or tcp6 to control the socket type. (default "tcp") --no_scatter when set to true, the planner will fail instead of producing a plan that includes scatter queries --normalize_queries Rewrite queries with bind vars. Turn this off if the app itself sends normalized queries with bind vars. (default true) - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --opentsdb_uri string URI of opentsdb /api/put method --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. diff --git a/go/flags/endtoend/vtorc.txt b/go/flags/endtoend/vtorc.txt index 74ab84c90d8..3c57dd3bddf 100644 --- a/go/flags/endtoend/vtorc.txt +++ b/go/flags/endtoend/vtorc.txt @@ -29,7 +29,7 @@ Usage of vtorc: --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. --port int port for the server diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index 25807a7a687..09badc91a58 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -191,7 +191,7 @@ Usage of vttablet: --mysql_server_version string MySQL server version to advertise. --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --opentsdb_uri string URI of opentsdb /api/put method --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. diff --git a/go/flags/endtoend/vttestserver.txt b/go/flags/endtoend/vttestserver.txt index d30ab355abe..de7edcc522a 100644 --- a/go/flags/endtoend/vttestserver.txt +++ b/go/flags/endtoend/vttestserver.txt @@ -75,7 +75,7 @@ Usage of vttestserver: --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) --null_probability float The probability to initialize a field with 'NULL' if --initialize_with_random_data is true. Only applies to fields that can contain NULL values. (default 0.1) --num_shards strings Comma separated shard count (one per keyspace) (default [2]) - --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 1ns) + --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --persistent_mode If this flag is set, the MySQL data directory is not cleaned up when LocalCluster.TearDown() is called. This is useful for running vttestserver as a database container in local developer environments. Note that db migration files (--schema_dir option) and seeding of random data (--initialize_with_random_data option) will only run during cluster startup if the data directory does not already exist. vschema migrations are run every time the cluster starts, since persistence for the topology server has not been implemented yet --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. diff --git a/go/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/flavor_mysql.go b/go/mysql/flavor_mysql.go index ba4982db4d3..62d07ba796a 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -348,7 +348,7 @@ const TablesWithSize80 = `SELECT t.table_name, SUM(i.file_size), SUM(i.allocated_size) FROM information_schema.tables t -INNER JOIN information_schema.innodb_tablespaces i +LEFT JOIN information_schema.innodb_tablespaces i ON i.name LIKE CONCAT(database(), '/%') AND (i.name = CONCAT(t.table_schema, '/', t.table_name) OR i.name LIKE CONCAT(t.table_schema, '/', t.table_name, '#p#%')) WHERE t.table_schema = database() GROUP BY t.table_name, t.table_type, t.create_time, t.table_comment` diff --git a/go/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/backup/vtbackup/backup_only_test.go b/go/test/endtoend/backup/vtbackup/backup_only_test.go index f67b5fadeed..b9f780c770d 100644 --- a/go/test/endtoend/backup/vtbackup/backup_only_test.go +++ b/go/test/endtoend/backup/vtbackup/backup_only_test.go @@ -66,6 +66,9 @@ func TestTabletInitialBackup(t *testing.T) { // Restore the Tablets restore(t, primary, "replica", "NOT_SERVING") err := localCluster.VtctlclientProcess.ExecuteCommand( + "SetReadWrite", primary.Alias) + require.Nil(t, err) + err = localCluster.VtctlclientProcess.ExecuteCommand( "TabletExternallyReparented", primary.Alias) require.Nil(t, err) restore(t, replica1, "replica", "SERVING") @@ -152,17 +155,19 @@ func firstBackupTest(t *testing.T, tabletType string) { cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 2) // check that the restored replica has the right local_metadata - result, err := replica2.VttabletProcess.QueryTabletWithDB("select * from local_metadata", "_vt") - require.Nil(t, err) - require.NotNil(t, result) - require.NotEmpty(t, result.Rows) - assert.Equal(t, replica2.Alias, result.Rows[0][1].ToString(), "Alias") - assert.Equal(t, "ks.0", result.Rows[1][1].ToString(), "ClusterAlias") - assert.Equal(t, cell, result.Rows[2][1].ToString(), "DataCenter") - if tabletType == "replica" { - assert.Equal(t, "neutral", result.Rows[3][1].ToString(), "PromotionRule") - } else { - assert.Equal(t, "must_not", result.Rows[3][1].ToString(), "PromotionRule") + if localCluster.VtTabletMajorVersion <= 15 { + result, err := replica2.VttabletProcess.QueryTabletWithDB("select * from local_metadata", "_vt") + require.Nil(t, err) + require.NotNil(t, result) + require.NotEmpty(t, result.Rows) + assert.Equal(t, replica2.Alias, result.Rows[0][1].ToString(), "Alias") + assert.Equal(t, "ks.0", result.Rows[1][1].ToString(), "ClusterAlias") + assert.Equal(t, cell, result.Rows[2][1].ToString(), "DataCenter") + if tabletType == "replica" { + assert.Equal(t, "neutral", result.Rows[3][1].ToString(), "PromotionRule") + } else { + assert.Equal(t, "must_not", result.Rows[3][1].ToString(), "PromotionRule") + } } removeBackups(t) diff --git a/go/test/endtoend/backup/vtbackup/main_test.go b/go/test/endtoend/backup/vtbackup/main_test.go index ce0720e77c4..0ac5cb521bf 100644 --- a/go/test/endtoend/backup/vtbackup/main_test.go +++ b/go/test/endtoend/backup/vtbackup/main_test.go @@ -135,6 +135,16 @@ func TestMain(m *testing.M) { } } + if localCluster.VtTabletMajorVersion >= 16 { + // If vttablets are any lower than version 16, then they are running the replication manager. + // Running VTOrc and replication manager sometimes creates the situation where VTOrc has set up semi-sync on the primary, + // but the replication manager starts replication on the replica without setting semi-sync. This hangs the primary. + // Even if VTOrc fixes it, since there is no ongoing traffic, the state remains blocked. + if err := localCluster.StartVTOrc(keyspaceName); err != nil { + return 1, err + } + } + return m.Run(), nil }() diff --git a/go/test/endtoend/cluster/cluster_process.go b/go/test/endtoend/cluster/cluster_process.go index cb6fbb4fd40..8d922a3c179 100644 --- a/go/test/endtoend/cluster/cluster_process.go +++ b/go/test/endtoend/cluster/cluster_process.go @@ -251,6 +251,22 @@ func (cluster *LocalProcessCluster) StartTopo() (err error) { return } +// StartVTOrc starts a VTOrc instance +func (cluster *LocalProcessCluster) StartVTOrc(keyspace string) error { + // Start vtorc + vtorcProcess := cluster.NewVTOrcProcess(VTOrcConfiguration{}) + err := vtorcProcess.Setup() + if err != nil { + log.Error(err.Error()) + return err + } + if keyspace != "" { + vtorcProcess.ExtraArgs = append(vtorcProcess.ExtraArgs, fmt.Sprintf(`--clusters_to_watch="%s"`, keyspace)) + } + cluster.VTOrcProcesses = append(cluster.VTOrcProcesses, vtorcProcess) + return nil +} + // StartUnshardedKeyspace starts unshared keyspace with shard name as "0" func (cluster *LocalProcessCluster) StartUnshardedKeyspace(keyspace Keyspace, replicaCount int, rdonly bool) error { return cluster.StartKeyspace(keyspace, []string{"0"}, replicaCount, rdonly) diff --git a/go/test/endtoend/cluster/vtctld_process.go b/go/test/endtoend/cluster/vtctld_process.go index 074234fb97c..48408a8db34 100644 --- a/go/test/endtoend/cluster/vtctld_process.go +++ b/go/test/endtoend/cluster/vtctld_process.go @@ -58,8 +58,6 @@ func (vtctld *VtctldProcess) Setup(cell string, extraArgs ...string) (err error) "--topo_global_server_address", vtctld.CommonArg.TopoGlobalAddress, "--topo_global_root", vtctld.CommonArg.TopoGlobalRoot, "--cell", cell, - "--workflow_manager_init", - "--workflow_manager_use_election", "--service_map", vtctld.ServiceMap, "--backup_storage_implementation", vtctld.BackupStorageImplementation, "--file_backup_storage_root", vtctld.FileBackupStorageRoot, @@ -67,6 +65,7 @@ func (vtctld *VtctldProcess) Setup(cell string, extraArgs ...string) (err error) "--port", fmt.Sprintf("%d", vtctld.Port), "--grpc_port", fmt.Sprintf("%d", vtctld.GrpcPort), ) + if *isCoverage { vtctld.proc.Args = append(vtctld.proc.Args, "--test.coverprofile="+getCoveragePath("vtctld.out")) } diff --git a/go/test/endtoend/cluster/vttablet_process.go b/go/test/endtoend/cluster/vttablet_process.go index 46f55f579e3..60ca23a059e 100644 --- a/go/test/endtoend/cluster/vttablet_process.go +++ b/go/test/endtoend/cluster/vttablet_process.go @@ -117,9 +117,25 @@ func (vttablet *VttabletProcess) Setup() (err error) { if vttablet.SupportsBackup { vttablet.proc.Args = append(vttablet.proc.Args, "--restore_from_backup") } + var majorVersion int + majorVersion, err = GetMajorVersion("vttablet") + if err != nil { + return err + } + if vttablet.EnableSemiSync { - vttablet.proc.Args = append(vttablet.proc.Args, "--enable_semi_sync") + // enable_semi_sync is removed in v16 and shouldn't be set on any release v16+ + if majorVersion <= 15 { + vttablet.proc.Args = append(vttablet.proc.Args, "--enable_semi_sync") + } } + + // enable_semi_sync is removed in v16 and shouldn't be set on any release v16+ + if majorVersion >= 16 { + disableReplicationFlag := "--disable-replication-manager" + vttablet.proc.Args = append(vttablet.proc.Args, disableReplicationFlag) + } + if vttablet.DbFlavor != "" { vttablet.proc.Args = append(vttablet.proc.Args, fmt.Sprintf("--db_flavor=%s", vttablet.DbFlavor)) } diff --git a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go index c3364a94434..93420b0f326 100644 --- a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go +++ b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go @@ -46,8 +46,8 @@ var ( onlineDDLThrottlerAppName = "online-ddl" vstreamerThrottlerAppName = "vstreamer" - normalMigrationWait = 20 * time.Second - extendedMigrationWait = 20 * time.Second + normalMigrationWait = 45 * time.Second + extendedMigrationWait = 60 * time.Second hostname = "localhost" keyspaceName = "ks" diff --git a/go/test/endtoend/recovery/pitrtls/shardedpitr_tls_test.go b/go/test/endtoend/recovery/pitrtls/shardedpitr_tls_test.go deleted file mode 100644 index ab0020d3734..00000000000 --- a/go/test/endtoend/recovery/pitrtls/shardedpitr_tls_test.go +++ /dev/null @@ -1,544 +0,0 @@ -/* -Copyright 2020 The Vitess Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package pitrtls - -import ( - "context" - "crypto/x509" - "encoding/pem" - "fmt" - "os" - "os/exec" - "path" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "vitess.io/vitess/go/mysql" - "vitess.io/vitess/go/test/endtoend/cluster" - "vitess.io/vitess/go/vt/log" -) - -var ( - createTable = `create table product (id bigint(20) primary key, name char(10), created bigint(20));` - insertTable = `insert into product (id, name, created) values(%d, '%s', unix_timestamp());` - getCountID = `select count(*) from product` -) - -var ( - clusterInstance *cluster.LocalProcessCluster - - primary *cluster.Vttablet - replica *cluster.Vttablet - shard0Primary *cluster.Vttablet - shard0Replica *cluster.Vttablet - shard1Primary *cluster.Vttablet - shard1Replica *cluster.Vttablet - - cell = "zone1" - hostname = "localhost" - keyspaceName = "ks" - restoreKS1Name = "restoreks1" - restoreKS2Name = "restoreks2" - restoreKS3Name = "restoreks3" - shardName = "0" - shard0Name = "-80" - shard1Name = "80-" - dbName = "vt_ks" - mysqlUserName = "vt_dba" - mysqlPassword = "password" - vSchema = `{ - "sharded": true, - "vindexes": { - "hash_index": { - "type": "hash" - } - }, - "tables": { - "product": { - "column_vindexes": [ - { - "column": "id", - "name": "hash_index" - } - ] - } - } - }` - commonTabletArg = []string{ - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", - "--vreplication_retry_delay", "1s", - "--degraded_threshold", "5s", - "--lock_tables_timeout", "5s", - "--watch_replication_stream", - "--serving_state_grace_period", "1s"} -) - -func removeTablets(t *testing.T, tablets []*cluster.Vttablet) { - var mysqlProcs []*exec.Cmd - for _, tablet := range tablets { - proc, _ := tablet.MysqlctlProcess.StopProcess() - mysqlProcs = append(mysqlProcs, proc) - } - for _, proc := range mysqlProcs { - err := proc.Wait() - require.NoError(t, err) - } - for _, tablet := range tablets { - tablet.VttabletProcess.TearDown() - } -} - -func initializeCluster(t *testing.T) { - clusterInstance = cluster.NewCluster(cell, hostname) - - // Start topo server - err := clusterInstance.StartTopo() - require.NoError(t, err) - - // Start keyspace - keyspace := &cluster.Keyspace{ - Name: keyspaceName, - } - clusterInstance.Keyspaces = append(clusterInstance.Keyspaces, *keyspace) - - shard := &cluster.Shard{ - Name: shardName, - } - shard0 := &cluster.Shard{ - Name: shard0Name, - } - shard1 := &cluster.Shard{ - Name: shard1Name, - } - - // Defining all the tablets - primary = clusterInstance.NewVttabletInstance("replica", 0, "") - replica = clusterInstance.NewVttabletInstance("replica", 0, "") - shard0Primary = clusterInstance.NewVttabletInstance("replica", 0, "") - shard0Replica = clusterInstance.NewVttabletInstance("replica", 0, "") - shard1Primary = clusterInstance.NewVttabletInstance("replica", 0, "") - shard1Replica = clusterInstance.NewVttabletInstance("replica", 0, "") - - shard.Vttablets = []*cluster.Vttablet{primary, replica} - shard0.Vttablets = []*cluster.Vttablet{shard0Primary, shard0Replica} - shard1.Vttablets = []*cluster.Vttablet{shard1Primary, shard1Replica} - - clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, commonTabletArg...) - clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--restore_from_backup") - - err = clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard, *shard0, *shard1}) - require.NoError(t, err) - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) - out, err := vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, "--durability-policy=semi_sync") - require.NoError(t, err, out) - // Start MySql - var mysqlCtlProcessList []*exec.Cmd - for _, shard := range clusterInstance.Keyspaces[0].Shards { - for _, tablet := range shard.Vttablets { - tablet.MysqlctlProcess.SecureTransport = true - proc, err := tablet.MysqlctlProcess.StartProcess() - require.NoError(t, err) - mysqlCtlProcessList = append(mysqlCtlProcessList, proc) - } - } - - // Wait for mysql processes to start - for _, proc := range mysqlCtlProcessList { - err = proc.Wait() - require.NoError(t, err) - } - - queryCmds := []string{ - fmt.Sprintf("CREATE USER '%s'@'%%' IDENTIFIED BY '%s';", mysqlUserName, mysqlPassword), - fmt.Sprintf("GRANT ALL ON *.* TO '%s'@'%%';", mysqlUserName), - fmt.Sprintf("GRANT GRANT OPTION ON *.* TO '%s'@'%%';", mysqlUserName), - fmt.Sprintf("create database %s;", "vt_ks"), - "FLUSH PRIVILEGES;", - } - - for _, tablet := range []*cluster.Vttablet{primary, replica, shard0Primary, shard0Replica, shard1Primary, shard1Replica} { - for _, query := range queryCmds { - _, err = tablet.VttabletProcess.QueryTablet(query, keyspace.Name, false) - require.NoError(t, err) - } - - err = tablet.VttabletProcess.Setup() - require.NoError(t, err) - } - - err = clusterInstance.VtctlclientProcess.InitShardPrimary(keyspaceName, shard.Name, cell, primary.TabletUID) - require.NoError(t, err) - - // Start vtgate - err = clusterInstance.StartVtgate() - require.NoError(t, err) -} - -func insertRow(t *testing.T, id int, productName string, isSlow bool) { - ctx := context.Background() - vtParams := mysql.ConnParams{ - Host: clusterInstance.Hostname, - Port: clusterInstance.VtgateMySQLPort, - } - conn, err := mysql.Connect(ctx, &vtParams) - require.NoError(t, err) - defer conn.Close() - - insertSmt := fmt.Sprintf(insertTable, id, productName) - _, err = conn.ExecuteFetch(insertSmt, 1000, true) - require.NoError(t, err) - - if isSlow { - time.Sleep(1 * time.Second) - } -} - -func createRestoreKeyspace(t *testing.T, timeToRecover, restoreKeyspaceName string) { - output, err := clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput("CreateKeyspace", "--", - "--keyspace_type=SNAPSHOT", "--base_keyspace="+keyspaceName, - "--snapshot_time", timeToRecover, restoreKeyspaceName) - log.Info(output) - require.NoError(t, err) -} - -// Test pitr (Point in time recovery). -// ------------------------------------------- -// The following test will: -// - create a shard with primary and replica -// - run InitShardPrimary -// - insert some data using vtgate (e.g. here we have inserted rows 1,2) -// - verify the replication -// - take backup of replica -// - insert some data using vtgate (e.g. we inserted rows 3 4 5 6), while inserting row-4, note down the time (restoreTime1) -// - perform a resharding to create 2 shards (-80, 80-), and delete the old shard -// - insert some data using vtgate (e.g. we will insert 7 8 9 10) and verify we get required number of rows in -80, 80- shard -// - take backup of both shards -// - insert some more data using vtgate (e.g. we will insert 11 12 13 14 15), while inserting row-13, note down the time (restoreTime2) -// - note down the current time (restoreTime3) - -// - Till now we did all the presetup for assertions - -// - asserting that restoring to restoreTime1 (going from 2 shards to 1 shard) is working, i.e. we should get 4 rows. -// - asserting that while restoring if we give small timeout value, it will restore upto to the last available backup (asserting only -80 shard) -// - asserting that restoring to restoreTime2 (going from 2 shards to 2 shards with past time) is working, it will assert for both shards -// - asserting that restoring to restoreTime3 is working, we should get complete data after restoring, as we have in existing shards. -func TestTLSPITRRecovery(t *testing.T) { - defer cluster.PanicHandler(nil) - initializeCluster(t) - defer clusterInstance.Teardown() - - // Creating the table - _, err := primary.VttabletProcess.QueryTablet(createTable, keyspaceName, true) - require.NoError(t, err) - - insertRow(t, 1, "prd-1", false) - insertRow(t, 2, "prd-2", false) - - cluster.VerifyRowsInTabletForTable(t, replica, keyspaceName, 2, "product") - - // backup the replica - err = clusterInstance.VtctlclientProcess.ExecuteCommand("Backup", replica.Alias) - require.NoError(t, err) - - // check that the backup shows up in the listing - output, err := clusterInstance.ListBackups("ks/0") - require.NoError(t, err) - assert.Equal(t, 1, len(output)) - - // now insert some more data to simulate the changes after regular backup - // every insert has some time lag/difference to simulate the time gap between rows - // and when we recover to certain time, this time gap will be able to identify the exact eligible row - var restoreTime1 string - for counter := 3; counter <= 6; counter++ { - if counter == 4 { // we want to recovery till this, so noting the time - tm := time.Now().Add(1 * time.Second).UTC() - restoreTime1 = tm.Format(time.RFC3339) - } - insertRow(t, counter, fmt.Sprintf("prd-%d", counter), true) - } - - // creating restore keyspace with snapshot time as restoreTime1 - // Need to test this before resharding and we tear down the - // original mysql replica, which we use as a binlog source - createRestoreKeyspace(t, restoreTime1, restoreKS1Name) - - // Launching a recovery tablet which recovers data from the primary till the restoreTime1 - tlsTestTabletRecovery(t, replica, "2m", restoreKS1Name, "0", "INT64(4)") - - // starting resharding process - tlsPerformResharding(t) - - for counter := 7; counter <= 10; counter++ { - insertRow(t, counter, fmt.Sprintf("prd-%d", counter), false) - } - - // wait till all the shards have required data - cluster.VerifyRowsInTabletForTable(t, shard0Replica, keyspaceName, 6, "product") - cluster.VerifyRowsInTabletForTable(t, shard1Replica, keyspaceName, 4, "product") - - // take the backup (to simulate the regular backup) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("Backup", shard0Replica.Alias) - require.NoError(t, err) - // take the backup (to simulate the regular backup) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("Backup", shard1Replica.Alias) - require.NoError(t, err) - - backups, err := clusterInstance.ListBackups(keyspaceName + "/-80") - require.NoError(t, err) - require.Equal(t, len(backups), 1) - - backups, err = clusterInstance.ListBackups(keyspaceName + "/80-") - require.NoError(t, err) - require.Equal(t, len(backups), 1) - - // now insert some more data to simulate the changes after regular backup - // every insert has some time lag/difference to simulate the time gap between rows - // and when we recover to certain time, this time gap will be able to identify the exact eligible row - var restoreTime2 string - for counter := 11; counter <= 15; counter++ { - if counter == 13 { // we want to recovery till this, so noting the time - tm := time.Now().Add(1 * time.Second).UTC() - restoreTime2 = tm.Format(time.RFC3339) - } - insertRow(t, counter, fmt.Sprintf("prd-%d", counter), true) - } - restoreTime3 := time.Now().UTC().Format(time.RFC3339) - - // create restoreKeyspace with snapshot time as restoreTime2 - createRestoreKeyspace(t, restoreTime2, restoreKS2Name) - - // test the recovery with smaller binlog_lookup_timeout for shard0 - // since we have small lookup timeout, it will just get whatever available in the backup - // mysql> select * from product; - // +----+--------+------------+ - // | id | name | created | - // +----+--------+------------+ - // | 1 | prd-1 | 1597219030 | - // | 2 | prd-2 | 1597219030 | - // | 3 | prd-3 | 1597219043 | - // | 5 | prd-5 | 1597219045 | - // | 9 | prd-9 | 1597219130 | - // | 10 | prd-10 | 1597219130 | - // +----+--------+------------+ - tlsTestTabletRecovery(t, shard0Replica, "1ms", restoreKS2Name, "-80", "INT64(6)") - - // test the recovery with valid binlog_lookup_timeout for shard0 and getting the data till the restoreTime2 - // mysql> select * from product; - // +----+--------+------------+ - // | id | name | created | - // +----+--------+------------+ - // | 1 | prd-1 | 1597219030 | - // | 2 | prd-2 | 1597219030 | - // | 3 | prd-3 | 1597219043 | - // | 5 | prd-5 | 1597219045 | - // | 9 | prd-9 | 1597219130 | - // | 10 | prd-10 | 1597219130 | - // | 13 | prd-13 | 1597219141 | - // +----+--------+------------+ - tlsTestTabletRecovery(t, shard0Replica, "2m", restoreKS2Name, "-80", "INT64(7)") - - // test the recovery with valid binlog_lookup_timeout for shard1 and getting the data till the restoreTime2 - // mysql> select * from product; - // +----+--------+------------+ - // | id | name | created | - // +----+--------+------------+ - // | 4 | prd-4 | 1597219044 | - // | 6 | prd-6 | 1597219046 | - // | 7 | prd-7 | 1597219130 | - // | 8 | prd-8 | 1597219130 | - // | 11 | prd-11 | 1597219139 | - // | 12 | prd-12 | 1597219140 | - // +----+--------+------------+ - tlsTestTabletRecovery(t, shard1Replica, "2m", restoreKS2Name, "80-", "INT64(6)") - - // test the recovery with timetorecover > (timestamp of last binlog event in binlog server) - createRestoreKeyspace(t, restoreTime3, restoreKS3Name) - - // mysql> select * from product; - // +----+--------+------------+ - // | id | name | created | - // +----+--------+------------+ - // | 1 | prd-1 | 1597219030 | - // | 2 | prd-2 | 1597219030 | - // | 3 | prd-3 | 1597219043 | - // | 5 | prd-5 | 1597219045 | - // | 9 | prd-9 | 1597219130 | - // | 10 | prd-10 | 1597219130 | - // | 13 | prd-13 | 1597219141 | - // | 15 | prd-15 | 1597219142 | - // +----+--------+------------+ - tlsTestTabletRecovery(t, shard0Replica, "2m", restoreKS3Name, "-80", "INT64(8)") - - // mysql> select * from product; - // +----+--------+------------+ - // | id | name | created | - // +----+--------+------------+ - // | 4 | prd-4 | 1597219044 | - // | 6 | prd-6 | 1597219046 | - // | 7 | prd-7 | 1597219130 | - // | 8 | prd-8 | 1597219130 | - // | 11 | prd-11 | 1597219139 | - // | 12 | prd-12 | 1597219140 | - // | 14 | prd-14 | 1597219142 | - // +----+--------+------------+ - tlsTestTabletRecovery(t, shard1Replica, "2m", restoreKS3Name, "80-", "INT64(7)") -} - -func tlsPerformResharding(t *testing.T) { - err := clusterInstance.VtctlclientProcess.ApplyVSchema(keyspaceName, vSchema) - require.NoError(t, err) - - err = clusterInstance.VtctlProcess.ExecuteCommand("InitShardPrimary", "--", "--force", "ks/-80", shard0Primary.Alias) - require.NoError(t, err) - - err = clusterInstance.VtctlProcess.ExecuteCommand("InitShardPrimary", "--", "--force", "ks/80-", shard1Primary.Alias) - require.NoError(t, err) - - // we need to create the schema, and the worker will do data copying - for _, keyspaceShard := range []string{"ks/-80", "ks/80-"} { - err = clusterInstance.VtctlclientProcess.ExecuteCommand("CopySchemaShard", "ks/0", keyspaceShard) - require.NoError(t, err) - } - - err = clusterInstance.VtctlclientProcess.ExecuteCommand("Reshard", "ks.reshardWorkflow", "0", "--", "-80,80-") - require.NoError(t, err) - - err = clusterInstance.VtctlclientProcess.ExecuteCommand("SwitchReads", "--", "--tablet_type=rdonly", "ks.reshardWorkflow") - require.NoError(t, err) - - err = clusterInstance.VtctlclientProcess.ExecuteCommand("SwitchReads", "--", "--tablet_type=replica", "ks.reshardWorkflow") - require.NoError(t, err) - - // then serve primary from the split shards - err = clusterInstance.VtctlclientProcess.ExecuteCommand("SwitchWrites", "ks.reshardWorkflow") - require.NoError(t, err) - - // remove the original tablets in the original shard - removeTablets(t, []*cluster.Vttablet{primary, replica}) - - for _, tablet := range []*cluster.Vttablet{replica} { - err = clusterInstance.VtctlclientProcess.ExecuteCommand("DeleteTablet", tablet.Alias) - require.NoError(t, err) - } - err = clusterInstance.VtctlclientProcess.ExecuteCommand("DeleteTablet", "--", "--allow_primary", primary.Alias) - require.NoError(t, err) - - // rebuild the serving graph, all mentions of the old shards should be gone - err = clusterInstance.VtctlclientProcess.ExecuteCommand("RebuildKeyspaceGraph", "ks") - require.NoError(t, err) - - // delete the original shard - err = clusterInstance.VtctlclientProcess.ExecuteCommand("DeleteShard", "ks/0") - require.NoError(t, err) - - // Restart vtgate process - err = clusterInstance.VtgateProcess.TearDown() - require.NoError(t, err) - - err = clusterInstance.VtgateProcess.Setup() - require.NoError(t, err) - - clusterInstance.WaitForTabletsToHealthyInVtgate() -} - -func tlsTestTabletRecovery(t *testing.T, tabletForBinlogs *cluster.Vttablet, lookupTimeout, restoreKeyspaceName, shardName, expectedRows string) { - recoveryTablet := clusterInstance.NewVttabletInstance("replica", 0, cell) - tlsLaunchRecoveryTablet(t, recoveryTablet, tabletForBinlogs, lookupTimeout, restoreKeyspaceName, shardName) - - sqlRes, err := recoveryTablet.VttabletProcess.QueryTablet(getCountID, keyspaceName, true) - require.NoError(t, err) - assert.Equal(t, expectedRows, sqlRes.Rows[0][0].String()) - - defer recoveryTablet.MysqlctlProcess.Stop() - defer recoveryTablet.VttabletProcess.TearDown() -} - -func tlsLaunchRecoveryTablet(t *testing.T, tablet *cluster.Vttablet, tabletForBinlogs *cluster.Vttablet, lookupTimeout, restoreKeyspaceName, shardName string) { - tablet.MysqlctlProcess = *cluster.MysqlCtlProcessInstance(tablet.TabletUID, tablet.MySQLPort, clusterInstance.TmpDirectory) - tablet.MysqlctlProcess.SecureTransport = true - err := tablet.MysqlctlProcess.Start() - require.NoError(t, err) - - tablet.VttabletProcess = cluster.VttabletProcessInstance( - tablet.HTTPPort, - tablet.GrpcPort, - tablet.TabletUID, - clusterInstance.Cell, - shardName, - keyspaceName, - clusterInstance.VtctldProcess.Port, - tablet.Type, - clusterInstance.TopoProcess.Port, - clusterInstance.Hostname, - clusterInstance.TmpDirectory, - clusterInstance.VtTabletExtraArgs, - clusterInstance.EnableSemiSync, - clusterInstance.DefaultCharset) - tablet.Alias = tablet.VttabletProcess.TabletPath - tablet.VttabletProcess.SupportsBackup = true - tablet.VttabletProcess.Keyspace = restoreKeyspaceName - - certDir := path.Join(os.Getenv("VTDATAROOT"), fmt.Sprintf("/ssl_%010d", tablet.MysqlctlProcess.TabletUID)) - tablet.VttabletProcess.ExtraArgs = []string{ - "--disable_active_reparents", - "--enable_replication_reporter=false", - "--init_db_name_override", dbName, - "--init_tablet_type", "replica", - "--init_keyspace", restoreKeyspaceName, - "--init_shard", shardName, - "--binlog_host", clusterInstance.Hostname, - "--binlog_port", fmt.Sprintf("%d", tabletForBinlogs.MySQLPort), - "--binlog_user", mysqlUserName, - "--binlog_password", mysqlPassword, - "--binlog_ssl_ca", certDir + "/ca-cert.pem", - "--binlog_ssl_server_name", getCNFromCertPEM(certDir + "/server-001-cert.pem"), - "--pitr_gtid_lookup_timeout", lookupTimeout, - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", - "--vreplication_tablet_type", "replica", - "--vreplication_retry_delay", "1s", - "--degraded_threshold", "5s", - "--lock_tables_timeout", "5s", - "--watch_replication_stream", - "--serving_state_grace_period", "1s", - } - tablet.VttabletProcess.ServingStatus = "" - - err = tablet.VttabletProcess.Setup() - require.NoError(t, err) - - tablet.VttabletProcess.WaitForTabletStatusesForTimeout([]string{"SERVING"}, 20*time.Second) -} - -func getCNFromCertPEM(filename string) string { - pemBytes, _ := os.ReadFile(filename) - block, _ := pem.Decode(pemBytes) - cert, _ := x509.ParseCertificate(block.Bytes) - rdn := cert.Subject.ToRDNSequence()[0][0] - t := rdn.Type - - // 2.5.4.3 is ASN OID for "CN" - if len(t) == 4 && t[0] == 2 && t[1] == 5 && t[2] == 4 && t[3] == 3 { - return fmt.Sprintf("%s", rdn.Value) - } - // As good a fallback as any - return "localhost" -} diff --git a/go/test/endtoend/reparent/emergencyreparent/ers_test.go b/go/test/endtoend/reparent/emergencyreparent/ers_test.go index 3564ba3badb..4828731b444 100644 --- a/go/test/endtoend/reparent/emergencyreparent/ers_test.go +++ b/go/test/endtoend/reparent/emergencyreparent/ers_test.go @@ -387,10 +387,12 @@ func TestERSForInitialization(t *testing.T) { shard.Vttablets = tablets clusterInstance.VtTabletExtraArgs = []string{ "--lock_tables_timeout", "5s", - "--enable_semi_sync", "--init_populate_metadata", "--track_schema_versions=true", } + if clusterInstance.VtTabletMajorVersion <= 15 { + clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--enable_semi_sync") + } // Initialize Cluster err = clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard}) diff --git a/go/test/endtoend/reparent/newfeaturetest/reparent_test.go b/go/test/endtoend/reparent/newfeaturetest/reparent_test.go index b450fb44420..4fb2b827539 100644 --- a/go/test/endtoend/reparent/newfeaturetest/reparent_test.go +++ b/go/test/endtoend/reparent/newfeaturetest/reparent_test.go @@ -169,3 +169,16 @@ func rowNumberFromPosition(pos string) int { rowNum, _ := strconv.Atoi(rowNumStr) return rowNum } + +// TestTabletRestart tests that a running tablet can be restarted and everything is still fine +func TestTabletRestart(t *testing.T) { + defer cluster.PanicHandler(t) + clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + defer utils.TeardownCluster(clusterInstance) + tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets + + utils.StopTablet(t, tablets[1], false) + tablets[1].VttabletProcess.ServingStatus = "SERVING" + err := tablets[1].VttabletProcess.Setup() + require.NoError(t, err) +} diff --git a/go/test/endtoend/reparent/plannedreparent/reparent_test.go b/go/test/endtoend/reparent/plannedreparent/reparent_test.go index 66db2908380..d33992d5a81 100644 --- a/go/test/endtoend/reparent/plannedreparent/reparent_test.go +++ b/go/test/endtoend/reparent/plannedreparent/reparent_test.go @@ -25,6 +25,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + utilstest "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/reparent/utils" "vitess.io/vitess/go/vt/log" @@ -183,13 +185,13 @@ func TestReparentFromOutsideWithNoPrimary(t *testing.T) { } func reparentFromOutside(t *testing.T, clusterInstance *cluster.LocalProcessCluster, downPrimary bool) { - //This test will start a primary and 3 replicas. - //Then: - //- one replica will be the new primary - //- one replica will be reparented to that new primary - //- one replica will be busted and dead in the water and we'll call TabletExternallyReparented. - //Args: - //downPrimary: kills the old primary first + // This test will start a primary and 3 replicas. + // Then: + // - one replica will be the new primary + // - one replica will be reparented to that new primary + // - one replica will be busted and dead in the water and we'll call TabletExternallyReparented. + // Args: + // downPrimary: kills the old primary first ctx := context.Background() tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -202,7 +204,7 @@ func reparentFromOutside(t *testing.T, clusterInstance *cluster.LocalProcessClus demoteCommands := "SET GLOBAL read_only = ON; FLUSH TABLES WITH READ LOCK; UNLOCK TABLES" utils.RunSQL(ctx, t, demoteCommands, tablets[0]) - //Get the position of the old primary and wait for the new one to catch up. + // Get the position of the old primary and wait for the new one to catch up. err := utils.WaitForReplicationPosition(t, tablets[0], tablets[1]) require.NoError(t, err) } @@ -359,9 +361,16 @@ func TestChangeTypeSemiSync(t *testing.T) { } func TestReparentDoesntHangIfPrimaryFails(t *testing.T) { + utilstest.SkipIfBinaryIsAboveVersion(t, 15, "vttablet") + defer cluster.PanicHandler(t) clusterInstance := utils.SetupReparentCluster(t, "semi_sync") defer utils.TeardownCluster(clusterInstance) + + // This test is no longer valid post v16 + if clusterInstance.VtTabletMajorVersion >= 16 { + t.Skip("Skipping TestReparentDoesntHangIfPrimaryFails in CI environment for v16") + } tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets // Change the schema of the _vt.reparent_journal table, so that @@ -369,7 +378,6 @@ func TestReparentDoesntHangIfPrimaryFails(t *testing.T) { _, err := tablets[0].VttabletProcess.QueryTabletWithDB( "ALTER TABLE reparent_journal DROP COLUMN replication_position", "_vt") require.NoError(t, err) - // Perform a planned reparent operation, the primary will fail the // insert. The replicas should then abort right away. out, err := utils.Prs(t, clusterInstance, tablets[1]) diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index a3359d172d5..d85b3ac52c0 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -82,7 +82,8 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s clusterInstance := cluster.NewCluster(cells[0], Hostname) keyspace := &cluster.Keyspace{Name: KeyspaceName} - if durability == "semi_sync" { + // enable_semi_sync is removed in v16 and shouldn't be set on any release v16+ + if durability == "semi_sync" && clusterInstance.VtTabletMajorVersion <= 15 { clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--enable_semi_sync") } @@ -113,6 +114,10 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s shard := &cluster.Shard{Name: shardName} shard.Vttablets = tablets + disableReplicationFlag := "--disable_active_reparents" + if clusterInstance.VtTabletMajorVersion >= 15 { + disableReplicationFlag = "--disable-replication-manager" + } clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--lock_tables_timeout", "5s", "--init_populate_metadata", @@ -129,7 +134,7 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s // the replication manager to silently fix the replication in case ERS or PRS mess up. All the // tests in this test suite should work irrespective of this flag. Each run of ERS, PRS should be // setting up the replication correctly. - "--disable_active_reparents") + disableReplicationFlag) // Initialize Cluster err = clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard}) diff --git a/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go b/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go index 3284ab65d49..d9a24b3b444 100644 --- a/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go +++ b/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go @@ -159,8 +159,7 @@ func waitForSourcePort(ctx context.Context, t *testing.T, tablet cluster.Vttable for time.Now().Before(timeout) { // Check that initially replication is setup correctly on the replica tablet replicaStatus, err := tmcGetReplicationStatus(ctx, tablet.GrpcPort) - require.NoError(t, err) - if replicaStatus.SourcePort == expectedPort { + if err == nil && replicaStatus.SourcePort == expectedPort { return nil } time.Sleep(300 * time.Millisecond) diff --git a/go/test/endtoend/utils/utils.go b/go/test/endtoend/utils/utils.go index bd80385342f..ae9514b26a7 100644 --- a/go/test/endtoend/utils/utils.go +++ b/go/test/endtoend/utils/utils.go @@ -154,6 +154,17 @@ func SkipIfBinaryIsBelowVersion(t *testing.T, majorVersion int, binary string) { } } +// SkipIfBinaryIsAboveVersion skips the given test if the binary's major version is above majorVersion. +func SkipIfBinaryIsAboveVersion(t *testing.T, majorVersion int, binary string) { + version, err := cluster.GetMajorVersion(binary) + if err != nil { + return + } + if version > majorVersion { + t.Skip("Current version of ", binary, ": v", version, ", expected version >= v", majorVersion) + } +} + // AssertMatchesWithTimeout asserts that the given query produces the expected result. // The query will be executed every 'r' duration until it matches the expected result. // If after 'd' duration we still did not find the expected result, the test will be marked as failed. diff --git a/go/test/endtoend/vreplication/vstream_test.go b/go/test/endtoend/vreplication/vstream_test.go index c596ed084f7..e9d71898324 100644 --- a/go/test/endtoend/vreplication/vstream_test.go +++ b/go/test/endtoend/vreplication/vstream_test.go @@ -188,7 +188,7 @@ const vschemaUnsharded = ` } ` const schemaSharded = ` -create table customer(cid int, name varbinary(128), primary key(cid)) CHARSET=utf8mb4; +create table customer(cid int, name varbinary(128), primary key(cid)) TABLESPACE innodb_system CHARSET=utf8mb4; ` const vschemaSharded = ` { diff --git a/go/test/endtoend/vtgate/lookup_test.go b/go/test/endtoend/vtgate/lookup_test.go index c984459ab97..3294c1898d6 100644 --- a/go/test/endtoend/vtgate/lookup_test.go +++ b/go/test/endtoend/vtgate/lookup_test.go @@ -42,6 +42,45 @@ func TestUnownedLookupInsertNull(t *testing.T) { utils.Exec(t, conn, "insert into t8(id, parent_id, t9_id) VALUES (3, 2, 2)") } +func TestLookupUniqueWithAutocommit(t *testing.T) { + conn, closer := start(t) + defer closer() + + // conn2 is to check entries in the lookup table + conn2, err := mysql.Connect(context.Background(), &vtParams) + require.Nil(t, err) + defer conn2.Close() + + // Test that all vindex writes are autocommitted outside of any ongoing transactions. + // + // Also test that autocommited vindex entries are visible inside transactions, as lookups + // should also use the autocommit connection. + + utils.Exec(t, conn, "insert into t10(id, sharding_key) VALUES (1, 1)") + + utils.AssertMatches(t, conn2, "select id from t10_id_to_keyspace_id_idx order by id asc", "[[INT64(1)]]") + utils.AssertMatches(t, conn, "select id from t10 where id = 1", "[[INT64(1)]]") + + utils.Exec(t, conn, "begin") + + utils.Exec(t, conn, "insert into t10(id, sharding_key) VALUES (2, 1)") + + utils.AssertMatches(t, conn2, "select id from t10_id_to_keyspace_id_idx order by id asc", "[[INT64(1)] [INT64(2)]]") + utils.AssertMatches(t, conn, "select id from t10 where id = 2", "[[INT64(2)]]") + + utils.Exec(t, conn, "insert into t10(id, sharding_key) VALUES (3, 1)") + + utils.AssertMatches(t, conn2, "select id from t10_id_to_keyspace_id_idx order by id asc", "[[INT64(1)] [INT64(2)] [INT64(3)]]") + utils.AssertMatches(t, conn, "select id from t10 where id = 3", "[[INT64(3)]]") + + utils.Exec(t, conn, "savepoint sp_foobar") + + utils.Exec(t, conn, "insert into t10(id, sharding_key) VALUES (4, 1)") + + utils.AssertMatches(t, conn2, "select id from t10_id_to_keyspace_id_idx order by id asc", "[[INT64(1)] [INT64(2)] [INT64(3)] [INT64(4)]]") + utils.AssertMatches(t, conn, "select id from t10 where id = 4", "[[INT64(4)]]") +} + func TestUnownedLookupInsertChecksKeyspaceIdsAreMatching(t *testing.T) { conn, closer := start(t) defer closer() diff --git a/go/test/endtoend/vtgate/main_test.go b/go/test/endtoend/vtgate/main_test.go index f683be5cef1..1d2bc59b50a 100644 --- a/go/test/endtoend/vtgate/main_test.go +++ b/go/test/endtoend/vtgate/main_test.go @@ -110,7 +110,7 @@ func start(t *testing.T) (*mysql.Conn, func()) { deleteAll := func() { utils.Exec(t, conn, "use ks") - tables := []string{"t1", "t2", "vstream_test", "t3", "t4", "t6", "t7_xxhash", "t7_xxhash_idx", "t7_fk", "t8", "t9", "t9_id_to_keyspace_id_idx", "t1_id2_idx", "t2_id4_idx", "t3_id7_idx", "t4_id2_idx", "t5_null_vindex", "t6_id2_idx"} + tables := []string{"t1", "t2", "vstream_test", "t3", "t4", "t6", "t7_xxhash", "t7_xxhash_idx", "t7_fk", "t8", "t9", "t9_id_to_keyspace_id_idx", "t10", "t10_id_to_keyspace_id_idx", "t1_id2_idx", "t2_id4_idx", "t3_id7_idx", "t4_id2_idx", "t5_null_vindex", "t6_id2_idx"} for _, table := range tables { _, _ = utils.ExecAllowError(t, conn, "delete from "+table) } diff --git a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go index d3b7364afa6..29d94e42c77 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go @@ -33,7 +33,7 @@ func start(t *testing.T) (utils.MySQLCompare, func()) { deleteAll := func() { _, _ = utils.ExecAllowError(t, mcmp.VtConn, "set workload = oltp") - tables := []string{"t9", "aggr_test", "t3", "t7_xxhash", "aggr_test_dates", "t7_xxhash_idx", "t1", "t2"} + tables := []string{"t9", "aggr_test", "t3", "t7_xxhash", "aggr_test_dates", "t7_xxhash_idx", "t1", "t2", "t11"} for _, table := range tables { _, _ = mcmp.ExecAndIgnore("delete from " + table) } @@ -386,3 +386,54 @@ func TestAggregateRandom(t *testing.T) { utils.Exec(t, mcmp.MySQLConn, "set sql_mode=''") mcmp.AssertMatches("SELECT /*vt+ PLANNER=gen4 */ t1.shardKey, t1.name, count(t2.id) FROM t1 JOIN t2 ON t1.value != t2.shardKey GROUP BY t1.t1_id", `[[INT64(1) VARCHAR("name 1") INT64(2)] [INT64(2) VARCHAR("name 2") INT64(2)]]`) } + +// TestAggregateLeftJoin tests that aggregates work with left joins and does not ignore the count when column value does not match the right side table. +func TestAggregateLeftJoin(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + mcmp.Exec("insert into t1(t1_id, name, value, shardKey) values (11, 'r', 'r', 1), (3, 'r', 'r', 0)") + mcmp.Exec("insert into t2(id, shardKey) values (11, 1)") + + mcmp.AssertMatchesNoOrder("SELECT t1.shardkey FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[INT64(1)] [INT64(0)]]`) + mcmp.AssertMatches("SELECT count(t1.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[INT64(2)]]`) + mcmp.AssertMatches("SELECT count(*) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[INT64(2)]]`) + mcmp.AssertMatches("SELECT sum(t1.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[DECIMAL(1)]]`) +} + +// 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)]]`) +} + +func TestAggregationRandomOnAnAggregatedValue(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + mcmp.Exec("insert into t11(k, a, b) values (0, 100, 10), (10, 200, 20);") + + mcmp.AssertMatchesNoOrder("select /*vt+ PLANNER=gen4 */ A.a, A.b, (A.a / A.b) as d from (select sum(a) as a, sum(b) as b from t11 where a = 100) A;", + `[[DECIMAL(100) DECIMAL(10) DECIMAL(10.0000)]]`) +} diff --git a/go/test/endtoend/vtgate/queries/aggregation/schema.sql b/go/test/endtoend/vtgate/queries/aggregation/schema.sql index a6ce793b4e7..0b59819dda5 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/schema.sql +++ b/go/test/endtoend/vtgate/queries/aggregation/schema.sql @@ -70,3 +70,8 @@ CREATE TABLE t2 ( PRIMARY KEY (id) ) ENGINE InnoDB; +CREATE TABLE t11 ( + k BIGINT PRIMARY KEY, + a INT, + b INT +); diff --git a/go/test/endtoend/vtgate/queries/aggregation/vschema.json b/go/test/endtoend/vtgate/queries/aggregation/vschema.json index c2d3f133a35..727d6adc1d0 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/vschema.json +++ b/go/test/endtoend/vtgate/queries/aggregation/vschema.json @@ -123,6 +123,14 @@ "name": "hash" } ] + }, + "t11": { + "column_vindexes": [ + { + "column": "k", + "name": "hash" + } + ] } } } \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index fb66f395f9e..2f77d20b78e 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -17,8 +17,14 @@ limitations under the License. package misc import ( + "database/sql" + "fmt" + "strconv" + "strings" "testing" + _ "github.com/go-sql-driver/mysql" + "github.com/stretchr/testify/require" "vitess.io/vitess/go/test/endtoend/cluster" @@ -89,3 +95,68 @@ func TestInvalidDateTimeTimestampVals(t *testing.T) { _, err = mcmp.ExecAllowAndCompareError(`select timestamp'2022'`) require.Error(t, err) } + +// TestIntervalWithMathFunctions tests that the Interval keyword can be used with math functions. +func TestIntervalWithMathFunctions(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + // Set the time zone explicitly to UTC, otherwise the output of FROM_UNIXTIME is going to be dependent + // on the time zone of the system. + mcmp.Exec("SET time_zone = '+00:00'") + mcmp.AssertMatches("select '2020-01-01' + interval month(DATE_SUB(FROM_UNIXTIME(1234), interval 1 month))-1 month", `[[CHAR("2020-12-01")]]`) + mcmp.AssertMatches("select DATE_ADD(MIN(FROM_UNIXTIME(1673444922)),interval -DAYOFWEEK(MIN(FROM_UNIXTIME(1673444922)))+1 DAY)", `[[DATETIME("2023-01-08 13:48:42")]]`) +} + +// TestCast tests the queries that contain the cast function. +func TestCast(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + mcmp.AssertMatches("select cast('2023-01-07 12:34:56' as date) limit 1", `[[DATE("2023-01-07")]]`) + mcmp.AssertMatches("select cast('2023-01-07 12:34:56' as date)", `[[DATE("2023-01-07")]]`) + mcmp.AssertMatches("select cast('3.2' as float)", `[[FLOAT32(3.2)]]`) + mcmp.AssertMatches("select cast('3.2' as double)", `[[FLOAT64(3.2)]]`) + mcmp.AssertMatches("select cast('3.2' as unsigned)", `[[UINT64(3)]]`) +} + +// 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) +} diff --git a/go/test/endtoend/vtgate/schema.sql b/go/test/endtoend/vtgate/schema.sql index c597bd7e53e..536bec397ec 100644 --- a/go/test/endtoend/vtgate/schema.sql +++ b/go/test/endtoend/vtgate/schema.sql @@ -138,3 +138,17 @@ create table t9_id_to_keyspace_id_idx keyspace_id varbinary(10), primary key (id) ) Engine = InnoDB; + +create table t10 +( + id bigint, + sharding_key bigint, + primary key (id) +) Engine = InnoDB; + +create table t10_id_to_keyspace_id_idx +( + id bigint, + keyspace_id varbinary(10), + primary key (id) +) Engine = InnoDB; diff --git a/go/test/endtoend/vtgate/vschema.json b/go/test/endtoend/vtgate/vschema.json index 3aafd1106b5..8d16beec2a6 100644 --- a/go/test/endtoend/vtgate/vschema.json +++ b/go/test/endtoend/vtgate/vschema.json @@ -79,6 +79,16 @@ "to": "keyspace_id" }, "owner": "t9" + }, + "t10_id_to_keyspace_id_idx": { + "type": "lookup_unique", + "params": { + "autocommit": "true", + "table": "t10_id_to_keyspace_id_idx", + "from": "id", + "to": "keyspace_id" + }, + "owner": "t10" } }, "tables": { @@ -271,6 +281,26 @@ "name": "hash" } ] + }, + "t10": { + "column_vindexes": [ + { + "column": "sharding_key", + "name": "hash" + }, + { + "column": "id", + "name": "t10_id_to_keyspace_id_idx" + } + ] + }, + "t10_id_to_keyspace_id_idx": { + "column_vindexes": [ + { + "column": "id", + "name": "hash" + } + ] } } } diff --git a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go index c6426021d6c..8dbd4761f93 100644 --- a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go +++ b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go @@ -30,9 +30,9 @@ import ( "vitess.io/vitess/go/vt/vtorc/server" _ "github.com/go-sql-driver/mysql" - _ "github.com/mattn/go-sqlite3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + _ "modernc.org/sqlite" ) func TestReadTopologyInstanceBufferable(t *testing.T) { diff --git a/go/tools/go-upgrade/go-upgrade.go b/go/tools/go-upgrade/go-upgrade.go new file mode 100644 index 00000000000..4083a7a8e30 --- /dev/null +++ b/go/tools/go-upgrade/go-upgrade.go @@ -0,0 +1,504 @@ +/* +Copyright 2023 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "fmt" + "io" + "log" + "net/http" + "os" + "path" + "regexp" + "strconv" + "strings" + "time" + + "encoding/json" + + "github.com/hashicorp/go-version" + "github.com/spf13/cobra" +) + +const ( + goDevAPI = "https://go.dev/dl/?mode=json" +) + +type latestGolangRelease struct { + Version string `json:"version"` + Stable bool `json:"stable"` +} + +var ( + workflowUpdate = true + allowMajorUpgrade = false + isMainBranch = false + goTo = "" + + rootCmd = &cobra.Command{ + Use: "go-upgrade", + Short: "Automates the Golang upgrade.", + Long: `go-upgrade allows us to automate some tasks required to bump the version of Golang used throughout our codebase. + +It mostly used by the update_golang_version.yml CI workflow that runs on a CRON. + +This tool is meant to be run at the root of the repository. +`, + Run: func(cmd *cobra.Command, args []string) { + _ = cmd.Help() + }, + Args: cobra.NoArgs, + } + + getCmd = &cobra.Command{ + Use: "get", + Short: "Command to get useful information about the codebase.", + Long: "Command to get useful information about the codebase.", + Run: func(cmd *cobra.Command, args []string) { + _ = cmd.Help() + }, + Args: cobra.NoArgs, + } + + getGoCmd = &cobra.Command{ + Use: "go-version", + Short: "go-version prints the Golang version used by the current codebase.", + Long: "go-version prints the Golang version used by the current codebase.", + Run: runGetGoCmd, + Args: cobra.NoArgs, + } + + getBootstrapCmd = &cobra.Command{ + Use: "bootstrap-version", + Short: "bootstrap-version prints the Docker Bootstrap version used by the current codebase.", + Long: "bootstrap-version prints the Docker Bootstrap version used by the current codebase.", + Run: runGetBootstrapCmd, + Args: cobra.NoArgs, + } + + upgradeCmd = &cobra.Command{ + Use: "upgrade", + Short: "upgrade will upgrade the Golang and Bootstrap versions of the codebase to the latest available version.", + Long: `This command bumps the Golang and Bootstrap versions of the codebase. + +The latest available version of Golang will be fetched and used instead of the old version. + +By default, we do not allow major Golang version upgrade such as 1.20 to 1.21 but this can be overridden using the +--allow-major-upgrade CLI flag. Usually, we only allow such upgrade on the main branch of the repository. + +In CI, particularly, we do not want to modify the workflow files before automatically creating a Pull Request to +avoid permission issues. The rewrite of workflow files can be disabled using the --workflow-update=false CLI flag. + +Moreover, this command automatically bumps the bootstrap version of our codebase. If we are on the main branch, we +want to use the CLI flag --main to remember to increment the bootstrap version by 1 instead of 0.1.`, + Run: runUpgradeCmd, + Args: cobra.NoArgs, + } + + upgradeWorkflowsCmd = &cobra.Command{ + Use: "workflows", + Short: "workflows will upgrade the Golang version used in our CI workflows files.", + Long: "This step is omitted by the bot since. We let the maintainers of Vitess manually upgrade the version used by the workflows using this command.", + Run: runUpgradeWorkflowsCmd, + Args: cobra.NoArgs, + } +) + +func init() { + rootCmd.AddCommand(getCmd) + rootCmd.AddCommand(upgradeCmd) + + getCmd.AddCommand(getGoCmd) + getCmd.AddCommand(getBootstrapCmd) + + upgradeCmd.AddCommand(upgradeWorkflowsCmd) + + upgradeCmd.Flags().BoolVar(&workflowUpdate, "workflow-update", workflowUpdate, "Whether or not the workflow files should be updated. Useful when using this script to auto-create PRs.") + upgradeCmd.Flags().BoolVar(&allowMajorUpgrade, "allow-major-upgrade", allowMajorUpgrade, "Defines if Golang major version upgrade are allowed.") + upgradeCmd.Flags().BoolVar(&isMainBranch, "main", isMainBranch, "Defines if the current branch is the main branch.") + + upgradeWorkflowsCmd.Flags().StringVar(&goTo, "go-to", goTo, "The Golang version we want to upgrade to.") +} + +func main() { + cobra.CheckErr(rootCmd.Execute()) +} + +func runGetGoCmd(_ *cobra.Command, _ []string) { + currentVersion, err := currentGolangVersion() + if err != nil { + log.Fatal(err) + } + fmt.Println(currentVersion.String()) +} + +func runGetBootstrapCmd(_ *cobra.Command, _ []string) { + currentVersion, err := currentBootstrapVersion() + if err != nil { + log.Fatal(err) + } + fmt.Println(currentVersion) +} + +func runUpgradeWorkflowsCmd(_ *cobra.Command, _ []string) { + err := updateWorkflowFilesOnly(goTo) + if err != nil { + log.Fatal(err) + } +} + +func runUpgradeCmd(_ *cobra.Command, _ []string) { + err := upgradePath(allowMajorUpgrade, workflowUpdate, isMainBranch) + if err != nil { + log.Fatal(err) + } +} + +func updateWorkflowFilesOnly(goTo string) error { + newV, err := version.NewVersion(goTo) + if err != nil { + return err + } + filesToChange, err := getListOfFilesInPaths([]string{"./.github/workflows"}) + if err != nil { + return err + } + + for _, fileToChange := range filesToChange { + err = replaceInFile( + []*regexp.Regexp{regexp.MustCompile(`go-version:[[:space:]]*([0-9.]+).*`)}, + []string{"go-version: " + newV.String()}, + fileToChange, + ) + if err != nil { + return err + } + } + return nil +} + +func upgradePath(allowMajorUpgrade, workflowUpdate, isMainBranch bool) error { + currentVersion, err := currentGolangVersion() + if err != nil { + return err + } + + availableVersions, err := getLatestStableGolangReleases() + if err != nil { + return err + } + + upgradeTo := chooseNewVersion(currentVersion, availableVersions, allowMajorUpgrade) + if upgradeTo == nil { + return nil + } + + err = replaceGoVersionInCodebase(currentVersion, upgradeTo, workflowUpdate) + if err != nil { + return err + } + + currentBootstrapVersionF, err := currentBootstrapVersion() + if err != nil { + return err + } + nextBootstrapVersionF := currentBootstrapVersionF + if isMainBranch { + nextBootstrapVersionF += 1 + } else { + nextBootstrapVersionF += 0.1 + } + err = updateBootstrapVersionInCodebase(currentBootstrapVersionF, nextBootstrapVersionF, upgradeTo) + if err != nil { + return err + } + return nil +} + +// currentGolangVersion gets the running version of Golang in Vitess +// and returns it as a *version.Version. +// +// The file `./build.env` describes which version of Golang is expected by Vitess. +// We use this file to detect the current Golang version of our codebase. +// The file contains `goversion_min x.xx.xx`, we will grep `goversion_min` to finally find +// the precise golang version we're using. +func currentGolangVersion() (*version.Version, error) { + contentRaw, err := os.ReadFile("build.env") + if err != nil { + return nil, err + } + content := string(contentRaw) + + versre := regexp.MustCompile("(?i).*goversion_min[[:space:]]*([0-9.]+).*") + versionStr := versre.FindStringSubmatch(content) + if len(versionStr) != 2 { + return nil, fmt.Errorf("malformatted error, got: %v", versionStr) + } + return version.NewVersion(versionStr[1]) +} + +func currentBootstrapVersion() (float64, error) { + contentRaw, err := os.ReadFile("Makefile") + if err != nil { + return 0, err + } + content := string(contentRaw) + + versre := regexp.MustCompile("(?i).*BOOTSTRAP_VERSION[[:space:]]*=[[:space:]]*([0-9.]+).*") + versionStr := versre.FindStringSubmatch(content) + if len(versionStr) != 2 { + return 0, fmt.Errorf("malformatted error, got: %v", versionStr) + } + f, err := strconv.ParseFloat(versionStr[1], 64) + if err != nil { + return 0, err + } + return f, nil +} + +// getLatestStableGolangReleases fetches the latest stable releases of Golang from +// the official website using the goDevAPI URL. +// Once fetched, the releases are returned as version.Collection. +func getLatestStableGolangReleases() (version.Collection, error) { + resp, err := http.Get(goDevAPI) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var latestGoReleases []latestGolangRelease + err = json.Unmarshal(body, &latestGoReleases) + if err != nil { + return nil, err + } + + var versions version.Collection + for _, release := range latestGoReleases { + if !release.Stable { + continue + } + if !strings.HasPrefix(release.Version, "go") { + return nil, fmt.Errorf("golang version malformatted: %s", release.Version) + } + newVersion, err := version.NewVersion(release.Version[2:]) + if err != nil { + return nil, err + } + versions = append(versions, newVersion) + } + return versions, nil +} + +// chooseNewVersion decides what will be the next version we're going to use in our codebase. +// Given the current Golang version, the available latest versions and whether we allow major upgrade or not, +// chooseNewVersion will return either the new version or nil if we cannot/don't need to upgrade. +func chooseNewVersion(curVersion *version.Version, latestVersions version.Collection, allowMajorUpgrade bool) *version.Version { + selectedVersion := curVersion + for _, latestVersion := range latestVersions { + if !allowMajorUpgrade && !isSameMajorMinorVersion(latestVersion, selectedVersion) { + continue + } + if latestVersion.GreaterThan(selectedVersion) { + selectedVersion = latestVersion + } + } + // No change detected, return nil meaning that we do not want to have a new Golang version. + if selectedVersion.Equal(curVersion) { + return nil + } + return selectedVersion +} + +// replaceGoVersionInCodebase goes through all the files in the codebase where the +// Golang version must be updated +func replaceGoVersionInCodebase(old, new *version.Version, workflowUpdate bool) error { + if old.Equal(new) { + return nil + } + explore := []string{ + "./test/templates", + "./build.env", + "./docker/bootstrap/Dockerfile.common", + } + if workflowUpdate { + explore = append(explore, "./.github/workflows") + } + filesToChange, err := getListOfFilesInPaths(explore) + if err != nil { + return err + } + + for _, fileToChange := range filesToChange { + err = replaceInFile( + []*regexp.Regexp{regexp.MustCompile(fmt.Sprintf(`(%s)`, old.String()))}, + []string{new.String()}, + fileToChange, + ) + if err != nil { + return err + } + } + + if !isSameMajorMinorVersion(old, new) { + err = replaceInFile( + []*regexp.Regexp{regexp.MustCompile(`go[[:space:]]*([0-9.]+)`)}, + []string{fmt.Sprintf("go %d.%d", new.Segments()[0], new.Segments()[1])}, + "./go.mod", + ) + if err != nil { + return err + } + } + return nil +} + +func updateBootstrapVersionInCodebase(old, new float64, newGoVersion *version.Version) error { + if old == new { + return nil + } + files, err := getListOfFilesInPaths([]string{ + "./docker/base", + "./docker/lite", + "./docker/local", + "./docker/vttestserver", + "./Makefile", + "./test/templates", + }) + if err != nil { + return err + } + + for _, file := range files { + err = replaceInFile( + []*regexp.Regexp{ + regexp.MustCompile(`ARG[[:space:]]*bootstrap_version[[:space:]]*=[[:space:]]*[0-9.]+`), // Dockerfile + regexp.MustCompile(`BOOTSTRAP_VERSION[[:space:]]*=[[:space:]]*[0-9.]+`), // Makefile + }, + []string{ + fmt.Sprintf("ARG bootstrap_version=%-1g", new), // Dockerfile + fmt.Sprintf("BOOTSTRAP_VERSION=%-1g", new), // Makefile + }, + file, + ) + if err != nil { + return err + } + } + + err = replaceInFile( + []*regexp.Regexp{regexp.MustCompile(`\"bootstrap-version\",[[:space:]]*\"([0-9.]+)\"`)}, + []string{fmt.Sprintf("\"bootstrap-version\", \"%-1g\"", new)}, + "./test.go", + ) + if err != nil { + return err + } + + err = updateBootstrapChangelog(new, newGoVersion) + if err != nil { + return err + } + + return nil +} + +func updateBootstrapChangelog(new float64, goVersion *version.Version) error { + file, err := os.OpenFile("./docker/bootstrap/CHANGELOG.md", os.O_RDWR, 0600) + if err != nil { + return err + } + defer file.Close() + + s, err := file.Stat() + if err != nil { + return err + } + newContent := fmt.Sprintf(` + +## [%-1g] - %s +### Changes +- Update build to golang %s`, new, time.Now().Format("2006-01-02"), goVersion.String()) + + _, err = file.WriteAt([]byte(newContent), s.Size()) + if err != nil { + return err + } + return nil +} + +func isSameMajorMinorVersion(a, b *version.Version) bool { + return a.Segments()[0] == b.Segments()[0] && a.Segments()[1] == b.Segments()[1] +} + +func getListOfFilesInPaths(pathsToExplore []string) ([]string, error) { + var filesToChange []string + for _, pathToExplore := range pathsToExplore { + stat, err := os.Stat(pathToExplore) + if err != nil { + return nil, err + } + if stat.IsDir() { + dirEntries, err := os.ReadDir(pathToExplore) + if err != nil { + return nil, err + } + for _, entry := range dirEntries { + if entry.IsDir() { + continue + } + filesToChange = append(filesToChange, path.Join(pathToExplore, entry.Name())) + } + } else { + filesToChange = append(filesToChange, pathToExplore) + } + } + return filesToChange, nil +} + +// replaceInFile replaces old with new in the given file. +func replaceInFile(oldexps []*regexp.Regexp, new []string, fileToChange string) error { + if len(oldexps) != len(new) { + panic("old and new should be of the same length") + } + + f, err := os.OpenFile(fileToChange, os.O_RDWR, 0600) + if err != nil { + return err + } + defer f.Close() + + content, err := io.ReadAll(f) + if err != nil { + return err + } + contentStr := string(content) + + for i, oldex := range oldexps { + contentStr = oldex.ReplaceAllString(contentStr, new[i]) + } + + _, err = f.WriteAt([]byte(contentStr), 0) + if err != nil { + return err + } + return nil +} 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 +} diff --git a/go/vt/discovery/healthcheck.go b/go/vt/discovery/healthcheck.go index be085288892..be0d022ff98 100644 --- a/go/vt/discovery/healthcheck.go +++ b/go/vt/discovery/healthcheck.go @@ -429,8 +429,29 @@ func (hc *HealthCheckImpl) deleteTablet(tablet *topodata.Tablet) { hc.mu.Lock() defer hc.mu.Unlock() - key := KeyFromTablet(tablet) tabletAlias := tabletAliasString(topoproto.TabletAliasString(tablet.Alias)) + defer func() { + // We want to be sure the tablet is gone from the secondary + // maps even if it's already gone from the authoritative map. + // The tablet's type also may have recently changed as well, + // so ensure that the tablet we're removing is removed from + // any possible secondary map keys: + // key: keyspace.shard.tabletType -> val: map[tabletAlias]tabletHealth + for _, tabletType := range topoproto.AllTabletTypes { + key := KeyspaceShardTabletType(fmt.Sprintf("%s.%s.%s", tablet.Keyspace, tablet.Shard, topoproto.TabletTypeLString(tabletType))) + // delete from map by keyspace.shard.tabletType + ths, ok := hc.healthData[key] + if !ok { + continue + } + delete(ths, tabletAlias) + // delete from healthy list + healthy, ok := hc.healthy[key] + if ok && len(healthy) > 0 { + hc.recomputeHealthy(key) + } + } + }() // delete from authoritative map th, ok := hc.healthByAlias[tabletAlias] if !ok { @@ -441,18 +462,6 @@ func (hc *HealthCheckImpl) deleteTablet(tablet *topodata.Tablet) { // which will call finalizeConn, which will close the connection. th.cancelFunc() delete(hc.healthByAlias, tabletAlias) - // delete from map by keyspace.shard.tabletType - ths, ok := hc.healthData[key] - if !ok { - log.Warningf("We have no health data for target: %v", key) - return - } - delete(ths, tabletAlias) - // delete from healthy list - healthy, ok := hc.healthy[key] - if ok && len(healthy) > 0 { - hc.recomputeHealthy(key) - } } func (hc *HealthCheckImpl) updateHealth(th *TabletHealth, prevTarget *query.Target, trivialUpdate bool, up bool) { diff --git a/go/vt/discovery/healthcheck_test.go b/go/vt/discovery/healthcheck_test.go index 5ba47f69025..e61915a9b85 100644 --- a/go/vt/discovery/healthcheck_test.go +++ b/go/vt/discovery/healthcheck_test.go @@ -684,7 +684,7 @@ func TestRemoveTablet(t *testing.T) { // there will be a first result, get and discard it <-resultChan - shr := &querypb.StreamHealthResponse{ + shrReplica := &querypb.StreamHealthResponse{ TabletAlias: tablet.Alias, Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}, Serving: true, @@ -698,7 +698,7 @@ func TestRemoveTablet(t *testing.T) { Stats: &querypb.RealtimeStats{ReplicationLagSeconds: 1, CpuUsage: 0.2}, PrimaryTermStartTime: 0, }} - input <- shr + input <- shrReplica <-resultChan // check it's there a := hc.GetHealthyTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) @@ -708,6 +708,71 @@ func TestRemoveTablet(t *testing.T) { hc.RemoveTablet(tablet) a = hc.GetHealthyTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) assert.Empty(t, a, "wrong result, expected empty list") + + // Now confirm that when a tablet's type changes between when it's added to the + // cache and when it's removed, that the tablet is entirely removed from the + // cache since in the secondary maps it's keyed in part by tablet type. + // Note: we are using GetTabletStats here to check the healthData map (rather + // than the healthy map that we checked above) because that is the data + // structure that is used when printing the contents of the healthcheck cache + // in the /debug/status endpoint and in the SHOW VITESS_TABLETS; SQL command + // output. + + // Add the tablet back. + hc.AddTablet(tablet) + // Receive and discard the initial result as we have not yet sent the first + // StreamHealthResponse with the dynamic serving and stats information. + <-resultChan + // Send the first StreamHealthResponse with the dynamic serving and stats + // information. + input <- shrReplica + <-resultChan + // Confirm it's there in the cache. + a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) + mustMatch(t, want, a, "unexpected result") + + // Change the tablet type to RDONLY. + tablet.Type = topodatapb.TabletType_RDONLY + shrRdonly := &querypb.StreamHealthResponse{ + TabletAlias: tablet.Alias, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_RDONLY}, + Serving: true, + TabletExternallyReparentedTimestamp: 0, + RealtimeStats: &querypb.RealtimeStats{ReplicationLagSeconds: 2, CpuUsage: 0.4}, + } + + // Now Replace it, which does a Remove and Add. The tablet should be removed + // from the cache and all its maps even though the tablet type had changed + // in-between the initial Add and Remove. + hc.ReplaceTablet(tablet, tablet) + // Receive and discard the initial result as we have not yet sent the first + // StreamHealthResponse with the dynamic serving and stats information. + <-resultChan + // Confirm that the old entry is gone. + a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) + assert.Empty(t, a, "wrong result, expected empty list") + // Send the first StreamHealthResponse with the dynamic serving and stats + // information. + input <- shrRdonly + <-resultChan + // Confirm that the new entry is there in the cache. + want = []*TabletHealth{{ + Tablet: tablet, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_RDONLY}, + Serving: true, + Stats: &querypb.RealtimeStats{ReplicationLagSeconds: 2, CpuUsage: 0.4}, + PrimaryTermStartTime: 0, + }} + a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_RDONLY}) + mustMatch(t, want, a, "unexpected result") + + // Delete the tablet, confirm again that it's gone in both tablet type + // forms. + hc.RemoveTablet(tablet) + a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}) + assert.Empty(t, a, "wrong result, expected empty list") + a = hc.GetTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_RDONLY}) + assert.Empty(t, a, "wrong result, expected empty list") } // TestGetHealthyTablets tests the functionality of GetHealthyTabletStats. diff --git a/go/vt/discovery/topology_watcher.go b/go/vt/discovery/topology_watcher.go index a2a70a1f2d0..5e5c54ab57a 100644 --- a/go/vt/discovery/topology_watcher.go +++ b/go/vt/discovery/topology_watcher.go @@ -199,9 +199,6 @@ func (tw *TopologyWatcher) loadTablets() { log.Errorf("cannot get tablet for alias %v: %v", alias, err) return } - if !(tw.tabletFilter == nil || tw.tabletFilter.IsIncluded(tablet.Tablet)) { - return - } tw.mu.Lock() aliasStr := topoproto.TabletAliasString(alias) newTablets[aliasStr] = &tabletInfo{ @@ -217,6 +214,10 @@ func (tw *TopologyWatcher) loadTablets() { tw.mu.Lock() for alias, newVal := range newTablets { + if tw.tabletFilter != nil && !tw.tabletFilter.IsIncluded(newVal.tablet) { + continue + } + // trust the alias from topo and add it if it doesn't exist if val, ok := tw.tablets[alias]; ok { // check if the host and port have changed. If yes, replace tablet. @@ -236,6 +237,10 @@ func (tw *TopologyWatcher) loadTablets() { } for _, val := range tw.tablets { + if tw.tabletFilter != nil && !tw.tabletFilter.IsIncluded(val.tablet) { + continue + } + if _, ok := newTablets[val.alias]; !ok { tw.healthcheck.RemoveTablet(val.tablet) topologyWatcherOperations.Add(topologyWatcherOpRemoveTablet, 1) diff --git a/go/vt/discovery/topology_watcher_test.go b/go/vt/discovery/topology_watcher_test.go index 9d0876cf424..dff8ba720c7 100644 --- a/go/vt/discovery/topology_watcher_test.go +++ b/go/vt/discovery/topology_watcher_test.go @@ -17,12 +17,13 @@ limitations under the License. package discovery import ( + "context" "math/rand" "testing" "time" - "context" - + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" "vitess.io/vitess/go/vt/logutil" @@ -44,19 +45,14 @@ func checkOpCounts(t *testing.T, prevCounts, deltas map[string]int64) map[string newVal = 0 } - if newVal != prevVal+delta { - t.Errorf("expected %v to increase by %v, got %v -> %v", key, delta, prevVal, newVal) - } + assert.Equal(t, newVal, prevVal+delta, "expected %v to increase by %v, got %v -> %v", key, delta, prevVal, newVal) } return newCounts } func checkChecksum(t *testing.T, tw *TopologyWatcher, want uint32) { t.Helper() - got := tw.TopoChecksum() - if want != got { - t.Errorf("want checksum %v got %v", want, got) - } + assert.Equal(t, want, tw.TopoChecksum()) } func TestStartAndCloseTopoWatcher(t *testing.T) { @@ -506,3 +502,115 @@ func TestFilterByKeyspace(t *testing.T) { } } } + +// TestFilterByKeypsaceSkipsIgnoredTablets confirms a bug fix for the case when a TopologyWatcher +// has a FilterByKeyspace TabletFilter configured along with refreshKnownTablets turned off. We want +// to ensure that the TopologyWatcher: +// - does not continuosly call GetTablets for tablets that do not satisfy the filter +// - does not add or remove these filtered out tablets from the its healtcheck +func TestFilterByKeypsaceSkipsIgnoredTablets(t *testing.T) { + ts := memorytopo.NewServer("aa") + fhc := NewFakeHealthCheck(nil) + topologyWatcherOperations.ZeroAll() + counts := topologyWatcherOperations.Counts() + f := NewFilterByKeyspace(testKeyspacesToWatch) + tw := NewCellTabletsWatcher(context.Background(), ts, fhc, f, "aa", 10*time.Minute, false /*refreshKnownTablets*/, 5) + + counts = checkOpCounts(t, counts, map[string]int64{}) + checkChecksum(t, tw, 0) + + // Add a tablet from a tracked keyspace to the topology. + tablet := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "aa", + Uid: 0, + }, + Hostname: "host1", + PortMap: map[string]int32{ + "vt": 123, + }, + Keyspace: "ks1", + Shard: "shard", + } + require.NoError(t, ts.CreateTablet(context.Background(), tablet)) + + tw.loadTablets() + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1, "GetTablet": 1, "AddTablet": 1}) + checkChecksum(t, tw, 3238442862) + + // Check tablet is reported by HealthCheck + allTablets := fhc.GetAllTablets() + key := TabletToMapKey(tablet) + assert.Contains(t, allTablets, key) + assert.True(t, proto.Equal(tablet, allTablets[key])) + + // Add a second tablet to the topology that should get filtered out by the keyspace filter + tablet2 := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "aa", + Uid: 2, + }, + Hostname: "host2", + PortMap: map[string]int32{ + "vt": 789, + }, + Keyspace: "ks3", + Shard: "shard", + } + require.NoError(t, ts.CreateTablet(context.Background(), tablet2)) + + tw.loadTablets() + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1, "GetTablet": 1}) + checkChecksum(t, tw, 2762153755) + + // Check the new tablet is NOT reported by HealthCheck. + allTablets = fhc.GetAllTablets() + assert.Len(t, allTablets, 1) + key = TabletToMapKey(tablet2) + assert.NotContains(t, allTablets, key) + + // Load the tablets again to show that when refreshKnownTablets is disabled, + // only the list is read from the topo and the checksum doesn't change + tw.loadTablets() + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1}) + checkChecksum(t, tw, 2762153755) + + // With refreshKnownTablets set to false, changes to the port map for the same tablet alias + // should not be reflected in the HealtCheck state + _, err := ts.UpdateTabletFields(context.Background(), tablet.Alias, func(t *topodatapb.Tablet) error { + t.PortMap["vt"] = 456 + return nil + }) + require.NoError(t, err) + + tw.loadTablets() + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1}) + checkChecksum(t, tw, 2762153755) + + allTablets = fhc.GetAllTablets() + assert.Len(t, allTablets, 1) + origKey := TabletToMapKey(tablet) + tabletWithNewPort := proto.Clone(tablet).(*topodatapb.Tablet) + tabletWithNewPort.PortMap["vt"] = 456 + keyWithNewPort := TabletToMapKey(tabletWithNewPort) + assert.Contains(t, allTablets, origKey) + assert.NotContains(t, allTablets, keyWithNewPort) + + // Remove the tracked tablet from the topo and check that it is detected as being gone. + require.NoError(t, ts.DeleteTablet(context.Background(), tablet.Alias)) + + tw.loadTablets() + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1, "RemoveTablet": 1}) + checkChecksum(t, tw, 789108290) + assert.Empty(t, fhc.GetAllTablets()) + + // Remove ignored tablet and check that we didn't try to remove it from the health check + require.NoError(t, ts.DeleteTablet(context.Background(), tablet2.Alias)) + + tw.loadTablets() + checkOpCounts(t, counts, map[string]int64{"ListTablets": 1}) + checkChecksum(t, tw, 0) + assert.Empty(t, fhc.GetAllTablets()) + + tw.Stop() +} diff --git a/go/vt/vtgr/external/golib/sqlutils/dialect.go b/go/vt/external/golib/sqlutils/dialect.go similarity index 100% rename from go/vt/vtgr/external/golib/sqlutils/dialect.go rename to go/vt/external/golib/sqlutils/dialect.go diff --git a/go/vt/vtgr/external/golib/sqlutils/sqlite_dialect.go b/go/vt/external/golib/sqlutils/sqlite_dialect.go similarity index 100% rename from go/vt/vtgr/external/golib/sqlutils/sqlite_dialect.go rename to go/vt/external/golib/sqlutils/sqlite_dialect.go diff --git a/go/vt/vtgr/external/golib/sqlutils/sqlite_dialect_test.go b/go/vt/external/golib/sqlutils/sqlite_dialect_test.go similarity index 100% rename from go/vt/vtgr/external/golib/sqlutils/sqlite_dialect_test.go rename to go/vt/external/golib/sqlutils/sqlite_dialect_test.go diff --git a/go/vt/vtgr/external/golib/sqlutils/sqlutils.go b/go/vt/external/golib/sqlutils/sqlutils.go similarity index 96% rename from go/vt/vtgr/external/golib/sqlutils/sqlutils.go rename to go/vt/external/golib/sqlutils/sqlutils.go index f89d96229a3..91e83f0a4e4 100644 --- a/go/vt/vtgr/external/golib/sqlutils/sqlutils.go +++ b/go/vt/external/golib/sqlutils/sqlutils.go @@ -38,7 +38,7 @@ const DateTimeFormat = "2006-01-02 15:04:05.999999" // for easy, typed getters by column name. type RowMap map[string]CellData -// Cell data is the result of a single (atomic) column in a single row +// CellData is the result of a single (atomic) column in a single row type CellData sql.NullString func (this *CellData) MarshalJSON() ([]byte, error) { @@ -200,22 +200,22 @@ func GetDB(mysql_uri string) (*sql.DB, bool, error) { return GetGenericDB("mysql", mysql_uri) } -// GetDB returns a SQLite DB instance based on DB file name. +// GetSQLiteDB returns a SQLite DB instance based on DB file name. // bool result indicates whether the DB was returned from cache; err func GetSQLiteDB(dbFile string) (*sql.DB, bool, error) { - return GetGenericDB("sqlite3", dbFile) + return GetGenericDB("sqlite", dbFile) } // RowToArray is a convenience function, typically not called directly, which maps a // single read database row into a NullString -func RowToArray(rows *sql.Rows, columns []string) []CellData { +func RowToArray(rows *sql.Rows, columns []string) ([]CellData, error) { buff := make([]any, len(columns)) data := make([]CellData, len(columns)) for i := range buff { buff[i] = data[i].NullString() } - rows.Scan(buff...) - return data + err := rows.Scan(buff...) + return data, err } // ScanRowsToArrays is a convenience function, typically not called directly, which maps rows @@ -223,8 +223,11 @@ func RowToArray(rows *sql.Rows, columns []string) []CellData { func ScanRowsToArrays(rows *sql.Rows, on_row func([]CellData) error) error { columns, _ := rows.Columns() for rows.Next() { - arr := RowToArray(rows, columns) - err := on_row(arr) + arr, err := RowToArray(rows, columns) + if err != nil { + return err + } + err = on_row(arr) if err != nil { return err } diff --git a/go/vt/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/mysqlctl/compression.go b/go/vt/mysqlctl/compression.go index 4687bec0265..ea8f96cc100 100644 --- a/go/vt/mysqlctl/compression.go +++ b/go/vt/mysqlctl/compression.go @@ -65,7 +65,7 @@ var ( ) func init() { - for _, cmd := range []string{"vtcombo", "vttablet", "vttestserver", "vtctld", "vtctldclient"} { + for _, cmd := range []string{"vtbackup", "vtcombo", "vttablet", "vttestserver", "vtctld", "vtctldclient"} { servenv.OnParseFor(cmd, registerBackupCompressionFlags) } } diff --git a/go/vt/mysqlctl/schema.go b/go/vt/mysqlctl/schema.go index 9c7ed553a25..c5c10afdc7f 100644 --- a/go/vt/mysqlctl/schema.go +++ b/go/vt/mysqlctl/schema.go @@ -24,6 +24,7 @@ import ( "strings" "sync" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/vterrors" @@ -109,6 +110,15 @@ func (mysqld *Mysqld) GetSchema(ctx context.Context, dbName string, request *tab fields, columns, schema, err := mysqld.collectSchema(ctx, dbName, td.Name, td.Type, request.TableSchemaOnly) if err != nil { + // There's a possible race condition: it could happen that a table was dropped in between reading + // the list of tables (collectBasicTableData(), earlier) and the point above where we investigate + // the table. + // This is fine. We identify the situation and keep the table without any fields/columns/key information + sqlErr, isSQLErr := mysql.NewSQLErrorFromError(err).(*mysql.SQLError) + if isSQLErr && sqlErr != nil && sqlErr.Number() == mysql.ERNoSuchTable { + return + } + allErrors.RecordError(err) cancel() return @@ -121,6 +131,8 @@ func (mysqld *Mysqld) GetSchema(ctx context.Context, dbName string, request *tab } // Get primary columns concurrently. + // The below runs a single query on `INFORMATION_SCHEMA` and does not interact with the actual tables. + // It is therefore safe to run even if some tables are dropped in the interim. colMap := map[string][]string{} if len(tableNames) > 0 { wg.Add(1) 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 f0144359d7f..d86afd95e5a 100644 --- a/go/vt/servenv/servenv.go +++ b/go/vt/servenv/servenv.go @@ -78,7 +78,7 @@ var ( var ( lameduckPeriod = 50 * time.Millisecond onTermTimeout = 10 * time.Second - onCloseTimeout = time.Nanosecond + onCloseTimeout = 10 * time.Second catchSigpipe bool ) @@ -319,6 +319,8 @@ func ParseFlags(cmd string) { _flag.Usage() log.Exitf("%s doesn't take any positional arguments, got '%s'", cmd, strings.Join(args, " ")) } + + logutil.PurgeLogs() } // GetFlagSetFor returns the flag set for a given command. @@ -348,6 +350,8 @@ func ParseFlagsWithArgs(cmd string) []string { log.Exitf("%s expected at least one positional argument", cmd) } + logutil.PurgeLogs() + return args } diff --git a/go/vt/servenv/servenv_test.go b/go/vt/servenv/servenv_test.go index 3d835fcea1a..b7bd874989a 100644 --- a/go/vt/servenv/servenv_test.go +++ b/go/vt/servenv/servenv_test.go @@ -65,9 +65,7 @@ func TestFireOnCloseHooksTimeout(t *testing.T) { time.Sleep(1 * time.Second) }) - // we deliberatly test the flag to make sure it's not accidently set to a - // high value. - if finished, want := fireOnCloseHooks(onCloseTimeout), false; finished != want { + if finished, want := fireOnCloseHooks(1*time.Nanosecond), false; finished != want { t.Errorf("finished = %v, want %v", finished, want) } } diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index 8af53ffda4a..f4cab7cbb11 100644 --- a/go/vt/servenv/version.go +++ b/go/vt/servenv/version.go @@ -1,5 +1,5 @@ /* -Copyright 2022 The Vitess Authors. +Copyright 2023 The Vitess Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,4 +19,4 @@ package servenv // THIS FILE IS AUTO-GENERATED DURING NEW RELEASES BY ./tools/do_releases.sh // DO NOT EDIT -const versionName = "15.0.2" +const versionName = "15.0.3" diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 8ece2749788..afa130eb279 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -210,97 +210,101 @@ func (ct *ColumnType) DescribeType() string { // SQLType returns the sqltypes type code for the given column func (ct *ColumnType) SQLType() querypb.Type { - switch strings.ToLower(ct.Type) { - case keywordStrings[TINYINT]: - if ct.Unsigned { + return SQLTypeToQueryType(ct.Type, ct.Unsigned) +} + +func SQLTypeToQueryType(typeName string, unsigned bool) querypb.Type { + switch keywordVals[strings.ToLower(typeName)] { + case TINYINT: + if unsigned { return sqltypes.Uint8 } return sqltypes.Int8 - case keywordStrings[SMALLINT]: - if ct.Unsigned { + case SMALLINT: + if unsigned { return sqltypes.Uint16 } return sqltypes.Int16 - case keywordStrings[MEDIUMINT]: - if ct.Unsigned { + case MEDIUMINT: + if unsigned { return sqltypes.Uint24 } return sqltypes.Int24 - case keywordStrings[INT], keywordStrings[INTEGER]: - if ct.Unsigned { + case INT, INTEGER: + if unsigned { return sqltypes.Uint32 } return sqltypes.Int32 - case keywordStrings[BIGINT]: - if ct.Unsigned { + case BIGINT: + if unsigned { return sqltypes.Uint64 } return sqltypes.Int64 - case keywordStrings[BOOL], keywordStrings[BOOLEAN]: + case BOOL, BOOLEAN: return sqltypes.Uint8 - case keywordStrings[TEXT]: + case TEXT: return sqltypes.Text - case keywordStrings[TINYTEXT]: + case TINYTEXT: return sqltypes.Text - case keywordStrings[MEDIUMTEXT]: + case MEDIUMTEXT: return sqltypes.Text - case keywordStrings[LONGTEXT]: + case LONGTEXT: return sqltypes.Text - case keywordStrings[BLOB]: + case BLOB: return sqltypes.Blob - case keywordStrings[TINYBLOB]: + case TINYBLOB: return sqltypes.Blob - case keywordStrings[MEDIUMBLOB]: + case MEDIUMBLOB: return sqltypes.Blob - case keywordStrings[LONGBLOB]: + case LONGBLOB: return sqltypes.Blob - case keywordStrings[CHAR]: + case CHAR: return sqltypes.Char - case keywordStrings[VARCHAR]: + case VARCHAR: return sqltypes.VarChar - case keywordStrings[BINARY]: + case BINARY: return sqltypes.Binary - case keywordStrings[VARBINARY]: + case VARBINARY: return sqltypes.VarBinary - case keywordStrings[DATE]: + case DATE: return sqltypes.Date - case keywordStrings[TIME]: + case TIME: return sqltypes.Time - case keywordStrings[DATETIME]: + case DATETIME: return sqltypes.Datetime - case keywordStrings[TIMESTAMP]: + case TIMESTAMP: return sqltypes.Timestamp - case keywordStrings[YEAR]: + case YEAR: return sqltypes.Year - case keywordStrings[FLOAT_TYPE]: + case FLOAT_TYPE: return sqltypes.Float32 - case keywordStrings[DOUBLE]: + case DOUBLE: return sqltypes.Float64 - case keywordStrings[DECIMAL]: + case DECIMAL, DECIMAL_TYPE: return sqltypes.Decimal - case keywordStrings[BIT]: + case BIT: return sqltypes.Bit - case keywordStrings[ENUM]: + case ENUM: return sqltypes.Enum - case keywordStrings[SET]: + case SET: return sqltypes.Set - case keywordStrings[JSON]: + case JSON: return sqltypes.TypeJSON - case keywordStrings[GEOMETRY]: + case GEOMETRY: return sqltypes.Geometry - case keywordStrings[POINT]: + case POINT: return sqltypes.Geometry - case keywordStrings[LINESTRING]: + case LINESTRING: return sqltypes.Geometry - case keywordStrings[POLYGON]: + case POLYGON: return sqltypes.Geometry - case keywordStrings[GEOMETRYCOLLECTION]: + case GEOMETRYCOLLECTION: return sqltypes.Geometry - case keywordStrings[MULTIPOINT]: + case MULTIPOINT: return sqltypes.Geometry - case keywordStrings[MULTILINESTRING]: + case MULTILINESTRING: return sqltypes.Geometry - case keywordStrings[MULTIPOLYGON]: + case MULTIPOLYGON: return sqltypes.Geometry } return sqltypes.Null @@ -987,10 +991,8 @@ func (node *Select) AddHaving(expr Expr) { } return } - node.Having.Expr = &AndExpr{ - Left: node.Having.Expr, - Right: expr, - } + exprs := SplitAndExpression(nil, node.Having.Expr) + node.Having.Expr = AndExpressions(append(exprs, expr)...) } // AddGroupBy adds a grouping expression, unless it's already present diff --git a/go/vt/sqlparser/ast_test.go b/go/vt/sqlparser/ast_test.go index 71c56594875..3c518ee7886 100644 --- a/go/vt/sqlparser/ast_test.go +++ b/go/vt/sqlparser/ast_test.go @@ -57,32 +57,22 @@ func TestSelect(t *testing.T) { sel.AddWhere(expr) buf := NewTrackedBuffer(nil) sel.Where.Format(buf) - want := " where a = 1" - if buf.String() != want { - t.Errorf("where: %q, want %s", buf.String(), want) - } + assert.Equal(t, " where a = 1", buf.String()) sel.AddWhere(expr) buf = NewTrackedBuffer(nil) sel.Where.Format(buf) - want = " where a = 1" - if buf.String() != want { - t.Errorf("where: %q, want %s", buf.String(), want) - } + assert.Equal(t, " where a = 1", buf.String()) + sel = &Select{} sel.AddHaving(expr) buf = NewTrackedBuffer(nil) sel.Having.Format(buf) - want = " having a = 1" - if buf.String() != want { - t.Errorf("having: %q, want %s", buf.String(), want) - } + assert.Equal(t, " having a = 1", buf.String()) + sel.AddHaving(expr) buf = NewTrackedBuffer(nil) sel.Having.Format(buf) - want = " having a = 1 and a = 1" - if buf.String() != want { - t.Errorf("having: %q, want %s", buf.String(), want) - } + assert.Equal(t, " having a = 1", buf.String()) tree, err = Parse("select * from t where a = 1 or b = 1") require.NoError(t, err) @@ -91,18 +81,14 @@ func TestSelect(t *testing.T) { sel.AddWhere(expr) buf = NewTrackedBuffer(nil) sel.Where.Format(buf) - want = " where a = 1 or b = 1" - if buf.String() != want { - t.Errorf("where: %q, want %s", buf.String(), want) - } + assert.Equal(t, " where a = 1 or b = 1", buf.String()) + sel = &Select{} sel.AddHaving(expr) buf = NewTrackedBuffer(nil) sel.Having.Format(buf) - want = " having a = 1 or b = 1" - if buf.String() != want { - t.Errorf("having: %q, want %s", buf.String(), want) - } + assert.Equal(t, " having a = 1 or b = 1", buf.String()) + } func TestUpdate(t *testing.T) { diff --git a/go/vt/sqlparser/keywords.go b/go/vt/sqlparser/keywords.go index ec980a05c65..d0a152f907c 100644 --- a/go/vt/sqlparser/keywords.go +++ b/go/vt/sqlparser/keywords.go @@ -687,6 +687,7 @@ var keywords = []keyword{ // keywordStrings contains the reverse mapping of token to keyword strings var keywordStrings = map[int]string{} +var keywordVals = map[string]int{} // keywordLookupTable is a perfect hash map that maps **case insensitive** keyword names to their ids var keywordLookupTable *caseInsensitiveTable @@ -735,6 +736,7 @@ func init() { panic(fmt.Sprintf("keyword %q must be lowercase in table", kw.name)) } keywordStrings[kw.id] = kw.name + keywordVals[kw.name] = kw.id } keywordLookupTable = buildCaseInsensitiveTable(keywords) diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index bb3ab071820..020aa2d6b80 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -850,6 +850,12 @@ var ( }, { input: "select /* TIMESTAMPDIFF */ TIMESTAMPDIFF(MINUTE, '2008-01-02', '2008-01-04') from t", output: "select /* TIMESTAMPDIFF */ timestampdiff(MINUTE, '2008-01-02', '2008-01-04') from t", + }, { + input: "select DATE_ADD(MIN(FROM_UNIXTIME(1673444922)),interval -DAYOFWEEK(MIN(FROM_UNIXTIME(1673444922)))+1 DAY)", + output: "select DATE_ADD(min(FROM_UNIXTIME(1673444922)), interval (-DAYOFWEEK(min(FROM_UNIXTIME(1673444922))) + 1) DAY) from dual", + }, { + input: "select '2020-01-01' + interval month(DATE_SUB(FROM_UNIXTIME(1234), interval 1 month))-1 month", + output: "select '2020-01-01' + interval (month(DATE_SUB(FROM_UNIXTIME(1234), interval 1 month)) - 1) month from dual", }, { input: "select /* dual */ 1 from dual", }, { diff --git a/go/vt/sqlparser/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 { diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 8fd76760a4d..54beb69d7c3 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -1365,19 +1365,19 @@ var yyExca = [...]int{ 135, 155, 176, 155, 339, 155, - -2, 505, + -2, 506, -1, 57, - 36, 751, - 238, 751, - 249, 751, - 284, 765, - 285, 765, - -2, 753, + 36, 752, + 238, 752, + 249, 752, + 284, 766, + 285, 766, + -2, 754, -1, 62, - 240, 782, - -2, 780, + 240, 783, + -2, 781, -1, 116, - 237, 1438, + 237, 1439, -2, 121, -1, 118, 1, 148, @@ -1386,42 +1386,42 @@ var yyExca = [...]int{ -1, 129, 136, 391, 243, 391, - -2, 494, + -2, 495, -1, 148, 135, 155, 176, 155, 339, 155, - -2, 514, + -2, 515, -1, 798, - 87, 1455, - -2, 1300, - -1, 799, 87, 1456, - 221, 1460, -2, 1301, + -1, 799, + 87, 1457, + 221, 1461, + -2, 1302, -1, 800, - 221, 1459, + 221, 1460, -2, 39, -1, 880, - 60, 851, - -2, 866, + 60, 852, + -2, 867, -1, 966, 248, 40, 253, 40, -2, 402, -1, 1051, - 1, 562, - 657, 562, + 1, 563, + 657, 563, -2, 155, -1, 1340, - 221, 1460, - -2, 1301, + 221, 1461, + -2, 1302, -1, 1488, - 60, 852, - -2, 871, - -1, 1489, 60, 853, -2, 872, + -1, 1489, + 60, 854, + -2, 873, -1, 1540, 135, 155, 176, 155, @@ -1430,17 +1430,17 @@ var yyExca = [...]int{ -1, 1619, 136, 391, 243, 391, - -2, 494, + -2, 495, -1, 1628, 248, 41, 253, 41, -2, 403, -1, 1982, - 221, 1464, - -2, 1458, + 221, 1465, + -2, 1459, -1, 1983, - 221, 1460, - -2, 1456, + 221, 1461, + -2, 1457, -1, 2083, 135, 155, 176, 155, @@ -1452,1039 +1452,967 @@ var yyExca = [...]int{ -1, 2451, 78, 95, 88, 95, - -2, 930, + -2, 931, -1, 2519, - 632, 678, - -2, 652, + 632, 679, + -2, 653, -1, 2686, - 50, 1397, - -2, 1391, + 50, 1398, + -2, 1392, -1, 3338, - 632, 678, - -2, 666, - -1, 3426, - 23, 1816, - 33, 1816, - 177, 1816, - 260, 1816, - 319, 1816, - 320, 1816, - 321, 1816, - 322, 1816, - 323, 1816, - 324, 1816, - 325, 1816, - 327, 1816, - 328, 1816, - 329, 1816, - 330, 1816, - 331, 1816, - 332, 1816, - 333, 1816, - 334, 1816, - 335, 1816, - 336, 1816, - 337, 1816, - 338, 1816, - 340, 1816, - 342, 1816, - 343, 1816, - 344, 1816, - 345, 1816, - 346, 1816, - 347, 1816, - 348, 1816, - 349, 1816, - 350, 1816, - 353, 1816, - 354, 1816, - 355, 1816, - 356, 1816, - 357, 1816, - 359, 1816, - 360, 1816, - 361, 1816, - 362, 1816, - 503, 1816, - -2, 610, + 632, 679, + -2, 667, + -1, 3427, + 23, 1817, + 33, 1817, + 177, 1817, + 260, 1817, + 319, 1817, + 320, 1817, + 321, 1817, + 322, 1817, + 323, 1817, + 324, 1817, + 325, 1817, + 327, 1817, + 328, 1817, + 329, 1817, + 330, 1817, + 331, 1817, + 332, 1817, + 333, 1817, + 334, 1817, + 335, 1817, + 336, 1817, + 337, 1817, + 338, 1817, + 340, 1817, + 342, 1817, + 343, 1817, + 344, 1817, + 345, 1817, + 346, 1817, + 347, 1817, + 348, 1817, + 349, 1817, + 350, 1817, + 353, 1817, + 354, 1817, + 355, 1817, + 356, 1817, + 357, 1817, + 359, 1817, + 360, 1817, + 361, 1817, + 362, 1817, + 503, 1817, + -2, 611, } const yyPrivate = 57344 -const yyLast = 47864 +const yyLast = 47193 var yyAct = [...]int{ - 1496, 3085, 3497, 3086, 3087, 3319, 3467, 3424, 3508, 3466, - 802, 672, 3403, 3056, 1543, 652, 2913, 3369, 809, 2031, - 801, 2835, 3392, 1849, 2738, 2745, 2011, 3303, 3251, 2795, - 2080, 2800, 2797, 2796, 2794, 2799, 2798, 5, 2786, 3301, - 2351, 3043, 1114, 2699, 3115, 873, 2703, 2702, 2645, 3291, - 2385, 2815, 2013, 2150, 654, 2814, 2700, 2952, 2424, 2580, - 3120, 764, 2946, 2051, 2753, 682, 2817, 1503, 2972, 2054, - 2697, 763, 762, 2687, 2035, 2411, 1973, 1063, 650, 928, - 2516, 2938, 769, 2113, 2484, 2841, 2564, 2138, 2118, 2485, - 1597, 2486, 2436, 768, 2181, 2068, 39, 2417, 2403, 157, - 1644, 2387, 38, 2056, 40, 1845, 2055, 1944, 1864, 1092, - 2556, 896, 897, 875, 1490, 2159, 2198, 143, 2043, 998, - 2137, 2120, 1803, 1626, 2478, 961, 956, 2453, 1532, 1970, - 1512, 2058, 1116, 1470, 664, 1352, 1822, 1868, 647, 1743, - 1280, 1633, 935, 1978, 2135, 932, 1725, 967, 936, 659, - 2109, 1531, 98, 99, 1517, 974, 962, 1747, 963, 887, - 1940, 1336, 884, 94, 1312, 79, 10, 93, 914, 9, - 916, 8, 1112, 877, 964, 881, 1106, 1752, 1592, 1618, - 1047, 885, 126, 127, 882, 100, 883, 909, 161, 658, - 121, 119, 120, 641, 899, 2036, 78, 1356, 3328, 92, - 2509, 3498, 1360, 101, 2152, 2153, 2154, 3354, 3044, 2783, - 2152, 87, 1943, 2507, 904, 908, 3164, 3166, 3165, 3183, - 3184, 3185, 3186, 3187, 3188, 3189, 704, 2539, 2538, 2196, - 128, 1710, 3036, 3355, 621, 3450, 1877, 2999, 122, 929, - 2572, 900, 2573, 89, 906, 906, 89, 3090, 1003, 3349, - 3350, 2239, 1810, 588, 1809, 1808, 627, 890, 89, 1281, - 923, 642, 891, 3090, 874, 1000, 818, 819, 820, 818, - 819, 820, 1807, 1979, 1806, 954, 876, 1825, 1017, 1018, - 1019, 1805, 1022, 1023, 1024, 1025, 978, 2, 1028, 1029, - 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, - 1040, 1041, 1042, 1043, 1044, 977, 924, 122, 1011, 952, - 951, 950, 898, 2805, 1783, 3404, 3445, 184, 953, 644, - 1497, 645, 2008, 2009, 1004, 1007, 1008, 2383, 2512, 105, - 106, 107, 2683, 110, 3089, 1281, 116, 1297, 2413, 185, - 2529, 123, 583, 145, 2185, 2805, 3518, 2649, 3350, 940, - 3089, 3454, 3452, 640, 166, 3465, 3488, 1020, 2802, 2918, - 2917, 2532, 869, 870, 871, 872, 1291, 945, 880, 2803, - 2183, 651, 922, 766, 767, 122, 3453, 3451, 3304, 2352, - 1466, 1815, 2129, 2860, 3247, 156, 3246, 89, 2184, 3049, - 3410, 144, 3050, 3410, 1002, 2809, 911, 912, 1001, 3479, - 80, 2803, 80, 80, 3257, 2123, 3448, 3256, 3068, 3057, - 163, 2248, 3393, 164, 621, 3400, 621, 2178, 80, 3067, - 1854, 82, 3470, 3429, 2427, 2880, 1607, 2809, 3333, 2546, - 2547, 2384, 1620, 1621, 155, 154, 183, 2734, 622, 922, - 766, 767, 1291, 2571, 3170, 2735, 2736, 2075, 2076, 2428, - 646, 3133, 2462, 2245, 2074, 2461, 2039, 1082, 2463, 3178, - 3179, 1533, 1313, 1534, 2555, 867, 866, 1287, 1070, 3320, - 1279, 2510, 1294, 1071, 1295, 1296, 2246, 2474, 89, 2949, - 89, 89, 635, 621, 2857, 1314, 1315, 1316, 1317, 1318, - 1319, 1320, 1322, 1321, 1323, 1324, 89, 2614, 2093, 2092, - 2420, 2421, 1070, 2868, 1050, 2866, 2806, 1071, 2240, 2241, - 2243, 2242, 1087, 1088, 1109, 1069, 1791, 1068, 639, 1530, - 621, 770, 633, 683, 774, 685, 771, 772, 2010, 681, - 684, 773, 2842, 2557, 1474, 149, 1622, 152, 2806, 1619, - 1083, 150, 151, 1287, 3279, 2160, 3280, 167, 2517, 1076, - 2837, 2122, 2542, 1046, 2199, 3500, 173, 702, 703, 3163, - 3167, 3168, 3169, 3180, 3181, 3182, 3190, 3192, 735, 3191, - 3193, 3194, 3195, 3198, 3199, 3200, 3201, 3196, 3197, 3202, - 3147, 3151, 3148, 3149, 3150, 3162, 3152, 3153, 3154, 3155, - 3156, 3157, 3158, 3159, 3160, 3161, 3203, 3204, 3205, 3206, - 3207, 3208, 3173, 3177, 3176, 3174, 3175, 3171, 3172, 1089, - 949, 3471, 1056, 1057, 621, 1726, 1700, 2830, 622, 1090, - 622, 775, 1108, 776, 1091, 2831, 780, 1084, 1085, 1086, - 782, 781, 3472, 783, 749, 748, 1077, 2838, 777, 778, - 3446, 779, 2037, 2038, 1059, 1103, 2219, 1052, 2220, 621, - 2221, 1731, 2559, 3038, 3037, 1021, 2615, 2222, 949, 1045, - 1701, 915, 1702, 1027, 1026, 2839, 2201, 1066, 947, 1072, - 1073, 1074, 1075, 2204, 2203, 158, 1330, 1331, 1332, 1333, - 3231, 2163, 925, 919, 917, 2648, 1344, 622, 3094, 1348, - 3034, 2039, 1110, 1111, 2052, 1477, 1286, 1283, 1284, 1285, - 1290, 1292, 1289, 958, 1288, 987, 3209, 3210, 3211, 3212, - 3213, 3214, 3215, 3216, 1282, 985, 2202, 3327, 1104, 2508, - 3434, 627, 944, 1049, 622, 946, 996, 995, 2205, 1338, - 955, 2211, 2207, 2209, 2210, 2208, 2212, 2213, 3432, 957, - 994, 1529, 993, 958, 992, 991, 990, 3438, 3439, 925, - 919, 917, 1611, 153, 989, 2755, 2756, 2511, 984, 2544, - 997, 2757, 3433, 933, 3406, 621, 3512, 3406, 970, 2950, - 3519, 2182, 1286, 1283, 1284, 1285, 1290, 1292, 1289, 1267, - 1288, 815, 3477, 933, 815, 1327, 1327, 1298, 948, 969, - 1282, 2476, 1268, 1269, 3405, 2246, 815, 3405, 2563, 1632, - 933, 1334, 1744, 3033, 931, 1006, 2136, 618, 2560, 2126, - 910, 969, 976, 2189, 146, 1005, 1353, 147, 622, 2188, - 1740, 1048, 949, 1272, 941, 1014, 2776, 2858, 2541, 1080, - 3088, 943, 942, 1605, 1604, 1603, 948, 1712, 1711, 1713, - 1714, 1715, 2527, 2997, 2998, 1741, 3088, 159, 3066, 2127, - 1601, 988, 83, 622, 171, 604, 2125, 587, 582, 976, - 2531, 986, 2754, 1734, 2180, 1732, 1733, 602, 1735, 1736, - 2576, 2260, 2388, 2390, 2757, 1328, 1329, 2037, 2038, 1358, - 947, 1359, 2554, 1498, 1500, 2553, 3316, 2986, 1362, 2968, - 2128, 2458, 918, 2247, 2423, 179, 88, 2360, 88, 88, - 2124, 1730, 2807, 2808, 2530, 1857, 1631, 599, 1464, 1521, - 1429, 1061, 2418, 975, 88, 2811, 613, 1465, 118, 969, - 972, 973, 1481, 933, 2081, 1327, 1324, 966, 970, 1067, - 2902, 609, 2733, 1055, 2807, 2808, 160, 165, 162, 168, - 169, 170, 172, 174, 175, 176, 177, 2811, 965, 893, - 1107, 1058, 178, 180, 181, 182, 1093, 1753, 2566, 918, - 975, 2566, 113, 2565, 3341, 999, 2565, 3029, 1480, 622, - 2962, 1065, 1484, 1435, 1436, 1437, 1438, 1439, 877, 1878, - 1099, 1465, 1101, 2200, 3510, 1478, 1800, 3511, 1737, 3509, - 1482, 1483, 1535, 1879, 98, 99, 2600, 1297, 1471, 1458, - 948, 976, 589, 1869, 591, 605, 1869, 624, 2277, 623, - 595, 2500, 593, 597, 606, 598, 2875, 592, 1297, 603, - 1098, 1100, 594, 607, 608, 611, 614, 615, 616, 612, - 610, 1079, 601, 625, 114, 1295, 1296, 1013, 2389, 1638, - 1513, 3480, 1081, 1296, 1624, 101, 3129, 3004, 1297, 1727, - 1499, 1728, 3003, 2167, 1729, 1817, 1819, 1820, 2179, 1468, - 1641, 2581, 874, 1640, 1630, 2177, 1673, 2172, 1502, 1676, - 2304, 1678, 2175, 1608, 1609, 1610, 987, 1599, 1617, 1818, - 976, 876, 1497, 1695, 985, 1646, 1479, 1647, 1677, 1649, - 1651, 2172, 3473, 1655, 1657, 1659, 1661, 1663, 1636, 1526, - 1527, 2987, 975, 1094, 1754, 1051, 2176, 979, 969, 889, - 1827, 3514, 981, 3371, 1064, 1635, 982, 980, 3520, 1096, - 1600, 976, 1876, 1097, 1828, 1325, 1326, 1826, 1634, 1634, - 2174, 3239, 1294, 1102, 1295, 1296, 3063, 983, 3064, 1614, - 1685, 1686, 1615, 1613, 2583, 1627, 1691, 1692, 976, 2252, - 2253, 2254, 3309, 1294, 1757, 1295, 1296, 1095, 3372, 1720, - 1718, 1761, 2602, 1763, 1764, 1765, 1766, 1485, 3238, 3229, - 1770, 3437, 1319, 1320, 1322, 1321, 1323, 1324, 1755, 1756, - 3079, 975, 1782, 1294, 1707, 1295, 1296, 969, 972, 973, - 3078, 933, 1760, 1918, 1749, 966, 970, 3310, 1745, 1767, - 1768, 1769, 3011, 3010, 1751, 3521, 818, 819, 820, 3000, - 1681, 2593, 2592, 2591, 2585, 3436, 2589, 1297, 2584, 2784, - 2582, 2772, 975, 1719, 1717, 2587, 1297, 979, 969, 2482, - 2481, 1497, 981, 1606, 2586, 2132, 982, 980, 1874, 2265, - 122, 626, 952, 951, 950, 1721, 1705, 1875, 1706, 975, - 1704, 1012, 2588, 2590, 1703, 1009, 1759, 1693, 1687, 1684, - 1297, 1683, 619, 1314, 1315, 1316, 1317, 1318, 1319, 1320, - 1322, 1321, 1323, 1324, 1682, 1780, 1653, 620, 2994, 627, - 1781, 1975, 1910, 1899, 1900, 1901, 1902, 1912, 1903, 1904, - 1905, 1917, 1913, 1906, 1907, 1914, 1915, 1916, 1908, 1909, - 1911, 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 1313, - 3484, 1497, 1309, 1796, 1310, 1315, 1316, 1317, 1318, 1319, - 1320, 1322, 1321, 1323, 1324, 2834, 1271, 1831, 1311, 1325, - 1326, 1308, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, - 1321, 1323, 1324, 627, 3482, 1497, 1530, 1852, 1852, 1850, - 1850, 3474, 1294, 1853, 1295, 1296, 95, 1313, 1872, 2575, - 3336, 1294, 1873, 1295, 1296, 2465, 627, 96, 1297, 39, - 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1299, 1313, 1821, - 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, - 1324, 1823, 2044, 2045, 3335, 1294, 1936, 1295, 1296, 1338, - 2316, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, - 1323, 1324, 2148, 2147, 104, 3313, 1870, 2146, 2145, 2144, - 2143, 3312, 1497, 1497, 1968, 103, 3311, 102, 1313, 3234, - 2259, 3218, 1811, 1812, 1813, 1814, 97, 1506, 79, 1788, - 1789, 1464, 1799, 1824, 3217, 1797, 3128, 1798, 3126, 1997, - 1465, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, - 1323, 1324, 95, 3075, 1975, 2314, 1498, 2004, 1972, 97, - 1463, 1297, 1980, 96, 1829, 1293, 1497, 1974, 2409, 3499, - 3329, 1858, 1859, 1507, 3461, 1497, 1861, 1462, 906, 906, - 1866, 813, 1293, 1497, 1871, 1497, 3265, 1971, 1461, 1856, - 2028, 2409, 3399, 1294, 3008, 1295, 1296, 1884, 1885, 1886, - 1887, 1888, 1889, 1890, 1891, 1892, 1893, 2409, 3379, 2409, - 3375, 1919, 1920, 1921, 1922, 1923, 1924, 1926, 1497, 1931, - 2993, 1933, 1934, 1935, 1297, 1937, 1938, 1939, 2843, 1945, - 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, - 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, - 1966, 1967, 1982, 1969, 1980, 1976, 1977, 906, 2840, 906, - 906, 906, 906, 906, 2090, 1985, 1986, 98, 99, 1989, - 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1981, 1998, 1999, - 2000, 2001, 2002, 2021, 2775, 2022, 2774, 98, 99, 104, - 2133, 1880, 1881, 1882, 1883, 2027, 1294, 2491, 1295, 1296, - 103, 2479, 102, 3362, 1497, 1894, 3047, 3326, 3416, 1497, - 2062, 2085, 1460, 1863, 1865, 2194, 906, 1297, 2193, 2099, - 2100, 2101, 2102, 2003, 2015, 3242, 1497, 2409, 3230, 2094, - 2084, 2095, 2096, 2097, 2098, 2034, 1297, 2016, 2040, 2041, - 2066, 3047, 1497, 3264, 1982, 2409, 3045, 2105, 2106, 2107, - 2108, 2029, 1784, 890, 2172, 1497, 3222, 2088, 1750, 1294, - 1716, 1295, 1296, 2047, 2079, 2115, 97, 2161, 923, 2049, - 1497, 2072, 1830, 2121, 1832, 1833, 1834, 1835, 1836, 1837, - 1838, 1839, 1840, 1841, 1842, 1843, 1844, 2071, 2087, 2070, - 2086, 2966, 1497, 2158, 1984, 1297, 2454, 1987, 1988, 2325, - 1497, 3414, 1497, 2765, 2764, 3221, 2131, 2761, 2762, 2761, - 2760, 2433, 1497, 2454, 924, 1297, 2246, 2540, 1596, 2521, - 3412, 1497, 1297, 2117, 184, 1497, 2312, 1708, 2116, 2111, - 2112, 2514, 2515, 2409, 2408, 2130, 1698, 2134, 2270, 1497, - 2425, 2142, 2405, 1694, 2166, 1690, 2186, 2169, 123, 2170, - 1689, 2026, 1294, 1932, 1295, 1296, 1297, 97, 1688, 2455, - 1930, 166, 2165, 2116, 2168, 2164, 1313, 1508, 978, 2457, - 1941, 1294, 1105, 1295, 1296, 3055, 2455, 2190, 1634, 3288, - 1497, 2191, 2192, 2187, 2518, 1297, 2246, 977, 2496, 1314, - 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, - 1497, 1297, 1855, 1497, 2467, 1297, 3286, 1497, 1596, 1595, - 1541, 1540, 2433, 2432, 2698, 2270, 2274, 163, 2089, 2728, - 164, 2961, 1293, 2232, 2233, 2961, 2425, 103, 2235, 2246, - 1294, 2963, 1295, 1296, 2257, 3367, 2197, 2236, 2005, 3340, - 3283, 1497, 2173, 183, 1941, 2409, 2433, 2263, 2922, 2763, - 1294, 2268, 1295, 1296, 2271, 2671, 2272, 1294, 2073, 1295, - 1296, 2279, 2270, 2325, 2301, 2281, 2282, 2283, 2433, 3269, - 1497, 2225, 2300, 2172, 2155, 2289, 2290, 2291, 2292, 2293, - 2294, 2295, 2296, 2297, 2298, 2937, 1497, 1297, 2042, 2273, - 2264, 1294, 1501, 1295, 1296, 2006, 1293, 1297, 2961, 1823, - 2172, 1855, 1801, 1739, 3012, 1528, 1297, 2262, 960, 959, - 879, 2305, 2306, 2307, 2308, 2309, 89, 2311, 1297, 3442, - 1294, 2313, 1295, 1296, 3382, 2318, 2319, 3253, 2320, 1297, - 1504, 2323, 2244, 2324, 1297, 3219, 1294, 2327, 1295, 1296, - 1294, 2331, 1295, 1296, 3140, 2336, 2337, 2338, 2339, 3028, - 3025, 1824, 1297, 2255, 167, 3013, 3014, 3015, 2350, 2787, - 2353, 2354, 3006, 173, 1669, 1297, 2885, 2884, 2356, 2358, - 2488, 2930, 1497, 1598, 1297, 2361, 2362, 2363, 2364, 2365, - 1982, 2927, 1497, 2114, 1297, 2832, 2372, 2373, 89, 2374, - 2925, 1497, 2377, 2379, 2028, 2276, 2381, 2789, 2278, 1297, - 2785, 1050, 2890, 1497, 1297, 1981, 2393, 2522, 1297, 2285, - 2286, 2287, 2288, 2873, 1497, 1670, 1671, 1672, 2380, 1497, - 2110, 1297, 1294, 2104, 1295, 1296, 1852, 2103, 1850, 1723, - 1297, 2394, 1294, 1629, 1295, 1296, 2378, 1497, 1625, 1510, - 1594, 1294, 115, 1295, 1296, 2836, 1297, 3016, 3494, 2357, - 1497, 2310, 3254, 1294, 1353, 1295, 1296, 2392, 2340, 1497, - 2973, 2974, 2487, 2129, 1294, 1297, 1295, 1296, 3260, 1294, - 2019, 1295, 1296, 2267, 3492, 3468, 1665, 1297, 1786, 2429, - 3348, 3344, 158, 2266, 2395, 1297, 2397, 1294, 2981, 1295, - 1296, 3274, 2332, 1497, 3017, 3018, 3019, 2976, 1297, 2410, - 1294, 2781, 1295, 1296, 2780, 1509, 2779, 2698, 1297, 1294, - 2488, 1295, 1296, 2501, 2226, 1497, 2979, 2978, 2717, 1294, - 2448, 1295, 1296, 1666, 1667, 1668, 2419, 2716, 1471, 3255, - 2382, 3475, 2406, 1297, 1294, 39, 1295, 1296, 2033, 1294, - 1787, 1295, 1296, 1294, 2447, 1295, 1296, 2449, 1505, 2025, - 3324, 2967, 2720, 1465, 1472, 2407, 1294, 2721, 1295, 1296, - 2475, 2477, 3226, 2422, 2676, 1294, 2513, 1295, 1296, 1297, - 3030, 1513, 2718, 2468, 3110, 1297, 3109, 2719, 2452, 2675, - 2402, 1294, 2932, 1295, 1296, 2456, 3308, 2954, 1297, 2256, - 3119, 2258, 2459, 2483, 3121, 2953, 2957, 2121, 894, 2466, - 1294, 2469, 1295, 1296, 1297, 2722, 895, 2442, 2443, 2685, - 585, 2537, 1294, 1738, 1295, 1296, 2759, 2928, 865, 2480, - 1294, 2472, 1295, 1296, 3108, 2688, 2690, 2492, 868, 1016, - 1297, 2489, 2490, 1294, 2691, 1295, 1296, 2493, 2494, 1015, - 2535, 2498, 2497, 1294, 95, 1295, 1296, 2851, 2284, 1297, - 2502, 2503, 2504, 2900, 159, 96, 2487, 2569, 2534, 2896, - 1878, 171, 1270, 1617, 2528, 2299, 2578, 2959, 1294, 934, - 1295, 1296, 2882, 95, 1879, 2604, 2605, 2606, 2607, 2608, - 97, 2523, 2524, 123, 96, 2044, 2045, 1297, 2881, 97, - 3506, 2777, 2533, 2229, 2613, 3421, 3325, 1297, 104, 3249, - 2758, 2446, 179, 2030, 1294, 1297, 1295, 1296, 2218, 103, - 1294, 102, 1295, 1296, 2878, 2217, 2594, 2939, 2558, 2674, - 97, 902, 903, 1294, 2216, 1295, 1296, 2673, 2577, 3296, - 2215, 2567, 2214, 2376, 2568, 2609, 2250, 102, 2561, 1294, - 3295, 1295, 1296, 160, 165, 162, 168, 169, 170, 172, - 174, 175, 176, 177, 3277, 3127, 3125, 3124, 3117, 178, - 180, 181, 182, 2595, 3026, 1294, 2958, 1295, 1296, 2597, - 2956, 2375, 2438, 2441, 2442, 2443, 2439, 104, 2440, 2444, - 2574, 2371, 2973, 2974, 1294, 2650, 1295, 1296, 103, 2370, - 102, 2790, 2156, 2655, 1612, 2652, 104, 901, 103, 906, - 3116, 2947, 2598, 2599, 3495, 2425, 2601, 103, 3098, 2603, - 2618, 3496, 3495, 3, 2405, 2616, 2302, 1971, 2017, 1971, - 1522, 2707, 1294, 2624, 1295, 1296, 1297, 1514, 3496, 2610, - 2611, 2612, 1294, 3314, 1295, 1296, 108, 109, 2992, 2725, - 1294, 2617, 1295, 1296, 2619, 2620, 2621, 892, 91, 1, - 2622, 2623, 2678, 2996, 1945, 2625, 2655, 3431, 2627, 600, - 2007, 2629, 2630, 2631, 2632, 2679, 2710, 1469, 2727, 2633, - 1945, 1945, 1945, 1945, 1945, 2651, 3469, 2653, 2666, 2701, - 3427, 3428, 2670, 1709, 2701, 1699, 3058, 1942, 906, 2062, - 3250, 2677, 2793, 2654, 2162, 2656, 2657, 2658, 2659, 2660, - 2661, 2704, 2692, 2693, 2662, 2663, 3024, 2664, 2119, 2665, - 2369, 2680, 968, 2729, 881, 148, 2730, 2062, 2062, 2062, - 2062, 2062, 2709, 882, 2082, 883, 2695, 2723, 2712, 2713, - 2711, 2715, 2813, 2714, 2667, 2668, 2669, 2062, 2083, 3395, - 2062, 112, 926, 2731, 2634, 2635, 2636, 2637, 2638, 111, - 98, 99, 971, 1078, 2696, 2157, 3048, 2737, 2473, 2091, - 1547, 1294, 1545, 1295, 1296, 2853, 2769, 2768, 2767, 2792, - 1546, 2438, 2441, 2442, 2443, 2439, 1297, 2440, 2444, 2726, - 1544, 1749, 2855, 1549, 2791, 2870, 2871, 2872, 1548, 2874, - 2876, 2820, 2821, 799, 2859, 1297, 2303, 2770, 2771, 2121, - 2812, 2901, 1790, 2883, 2827, 634, 2445, 628, 2887, 2888, - 2889, 2891, 2892, 2893, 2894, 186, 1536, 2895, 1297, 2897, - 2898, 2899, 1515, 2579, 2903, 2904, 2905, 2906, 2907, 2908, - 2909, 2910, 2911, 2912, 2844, 2849, 2850, 2847, 2846, 2788, - 2596, 2914, 2919, 1010, 2854, 2923, 189, 2924, 2926, 189, - 2929, 2931, 632, 2933, 2934, 2935, 2936, 638, 590, 2864, - 2368, 2942, 2861, 2862, 2766, 2863, 2195, 189, 2865, 596, - 2867, 1345, 2869, 1297, 1785, 2672, 2916, 2460, 1297, 2367, - 921, 913, 189, 2920, 1297, 2018, 2396, 920, 3227, 2706, - 2951, 1297, 2684, 2686, 2412, 2689, 2964, 2965, 2682, 2626, - 2969, 2628, 2366, 1297, 3307, 3118, 3380, 638, 189, 638, - 2470, 1294, 1511, 1295, 1296, 2921, 2275, 2639, 2640, 2641, - 2642, 1867, 1297, 1335, 2059, 3093, 2945, 1816, 656, 655, - 1294, 2877, 1295, 1296, 1297, 653, 2398, 1054, 2943, 1060, - 2940, 2941, 1062, 2426, 1300, 2886, 1297, 803, 2948, 2386, - 2955, 1523, 1297, 1294, 2437, 1295, 1296, 2355, 1297, 2970, - 2960, 2435, 2349, 2434, 1297, 2227, 2067, 2975, 2348, 2971, - 1297, 3423, 2061, 2977, 2057, 2347, 2404, 754, 2984, 2985, - 753, 2982, 2980, 665, 657, 649, 1297, 2346, 2983, 752, - 751, 1297, 2989, 2819, 3407, 1274, 1297, 2990, 2991, 3031, - 3032, 1297, 2543, 2820, 2821, 3046, 2345, 1297, 1294, 2833, - 1295, 1296, 2062, 1294, 2545, 1295, 1296, 2471, 2344, 1294, - 2829, 1295, 1296, 3052, 3053, 3007, 1294, 3009, 1295, 1296, - 2343, 1297, 1278, 1487, 643, 939, 2342, 2856, 1294, 3331, - 1295, 1296, 2341, 2249, 2879, 1486, 1897, 3065, 2335, 1898, - 3069, 1297, 3338, 2801, 2334, 3042, 2782, 1294, 2519, 1295, - 1296, 3001, 3002, 2149, 65, 43, 3302, 3368, 750, 1294, - 2333, 1295, 1296, 747, 3095, 2330, 3096, 3080, 3097, 1297, - 2329, 1294, 2646, 1295, 1296, 2328, 3054, 1294, 1297, 1295, - 1296, 2326, 3084, 1294, 2647, 1295, 1296, 3351, 3352, 1294, - 746, 1295, 1296, 3353, 3092, 1294, 1925, 1295, 1296, 1275, - 1297, 3444, 3099, 3035, 3027, 2322, 1792, 3039, 3040, 3041, - 90, 1294, 34, 1295, 1296, 33, 1294, 3070, 1295, 1296, - 32, 1294, 31, 1295, 1296, 2321, 1294, 30, 1295, 1296, - 25, 24, 1294, 23, 1295, 1296, 22, 3051, 21, 27, - 1297, 20, 3091, 19, 18, 2804, 3464, 3505, 117, 3113, - 52, 49, 47, 2317, 125, 124, 1294, 50, 1295, 1296, - 46, 1053, 2315, 44, 29, 28, 17, 16, 15, 14, - 13, 3074, 12, 11, 7, 6, 1294, 37, 1295, 1296, - 1852, 36, 1850, 3134, 2280, 3142, 35, 1795, 3114, 3123, - 3132, 3122, 3071, 26, 3072, 3136, 3138, 3073, 3130, 4, - 3076, 3077, 2506, 2701, 1294, 2151, 1295, 1296, 0, 3081, - 0, 0, 0, 1294, 0, 1295, 1296, 0, 0, 3083, - 0, 3143, 3144, 3241, 2269, 0, 2704, 3146, 3228, 0, - 2704, 0, 3248, 0, 0, 1294, 0, 1295, 1296, 39, - 0, 3100, 0, 0, 3101, 0, 3102, 3103, 0, 3104, - 0, 3105, 3258, 3259, 1525, 3261, 3106, 3262, 3263, 0, - 3225, 3224, 3266, 3267, 3268, 0, 3270, 3273, 3223, 3271, - 3272, 0, 1542, 0, 3240, 1294, 0, 1295, 1296, 3245, - 3252, 3131, 3282, 3284, 3285, 3287, 3289, 3290, 3292, 1852, - 3244, 1850, 3139, 0, 3275, 3141, 0, 3232, 0, 0, - 0, 0, 0, 0, 0, 1495, 1491, 3145, 0, 0, - 0, 0, 1495, 1491, 0, 0, 0, 0, 0, 3276, - 1492, 0, 0, 0, 3278, 3220, 3322, 1492, 3281, 0, - 0, 0, 0, 0, 0, 0, 3235, 3236, 3237, 3300, - 3318, 3297, 3298, 0, 3299, 2023, 2024, 1494, 0, 1493, - 0, 0, 1488, 1489, 1494, 1679, 1493, 0, 0, 0, - 0, 3315, 0, 0, 0, 0, 189, 0, 189, 3321, - 184, 189, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1724, 0, 0, 0, 123, 0, 2704, 0, 0, 0, - 0, 638, 0, 638, 638, 0, 0, 166, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2741, 0, 3323, - 0, 0, 1758, 638, 189, 0, 0, 0, 0, 1762, - 3317, 0, 0, 0, 0, 3305, 0, 0, 0, 0, - 1773, 1774, 1775, 1776, 1777, 1778, 1779, 0, 0, 0, - 0, 1340, 3347, 3342, 0, 0, 0, 3082, 0, 0, - 0, 0, 2742, 163, 3337, 0, 164, 3339, 3334, 0, + 1496, 3085, 3086, 809, 1849, 3087, 3500, 3319, 801, 802, + 3511, 672, 3404, 3468, 2080, 3469, 2913, 3425, 3056, 2031, + 1116, 1543, 3369, 2835, 1747, 3392, 2011, 2738, 651, 2745, + 3303, 3251, 2795, 2699, 2800, 2797, 2796, 2794, 1114, 2799, + 2786, 3301, 2798, 2351, 873, 3043, 896, 3115, 2814, 2815, + 2013, 2645, 3291, 2150, 2385, 764, 2702, 654, 2952, 2703, + 5, 2424, 2580, 2700, 2753, 2946, 682, 3120, 2051, 1503, + 2972, 763, 762, 2697, 769, 2817, 2687, 2411, 2938, 1063, + 650, 2484, 2516, 768, 2564, 652, 39, 2054, 2035, 2113, + 2485, 2841, 2138, 2118, 928, 998, 2486, 2181, 1597, 2068, + 897, 875, 2436, 1644, 1973, 40, 2403, 38, 1978, 2055, + 2417, 2387, 1943, 1944, 1970, 2056, 1864, 1490, 1845, 1092, + 2556, 2159, 143, 2137, 2043, 2198, 1803, 2120, 2478, 1532, + 961, 956, 2453, 664, 1512, 94, 157, 1868, 1626, 2058, + 98, 99, 1352, 1470, 1280, 1822, 1633, 935, 932, 2135, + 967, 936, 964, 1743, 1725, 2109, 962, 963, 914, 1531, + 1517, 916, 887, 877, 1940, 881, 1877, 1979, 1336, 974, + 1312, 659, 10, 1106, 161, 101, 2036, 884, 1112, 1752, + 79, 9, 8, 1592, 899, 1618, 121, 883, 119, 882, + 120, 93, 126, 127, 1047, 909, 87, 885, 658, 1360, + 3328, 78, 92, 2509, 1356, 3501, 2152, 2153, 2154, 3354, + 100, 3044, 2783, 2152, 2539, 2538, 2196, 2507, 3036, 89, + 1710, 1281, 904, 908, 122, 2999, 89, 89, 641, 890, + 3452, 818, 819, 820, 588, 3355, 128, 2572, 2573, 3090, + 3350, 1000, 1281, 627, 929, 1825, 818, 819, 820, 3349, + 1810, 2008, 2009, 3090, 1017, 1018, 1019, 2239, 1022, 1023, + 1024, 1025, 2805, 1809, 1028, 1029, 1030, 1031, 1032, 1033, + 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, + 1044, 876, 923, 977, 1808, 1003, 891, 924, 184, 874, + 2, 1807, 1806, 122, 621, 3405, 642, 898, 1805, 953, + 978, 1783, 1004, 1007, 1008, 952, 644, 951, 645, 950, + 1497, 3446, 123, 2383, 2683, 627, 2185, 184, 2803, 3472, + 1466, 945, 1011, 3521, 3467, 166, 3089, 3456, 1291, 922, + 766, 767, 105, 106, 107, 954, 110, 1297, 1020, 116, + 3089, 123, 185, 145, 2809, 583, 3491, 940, 3350, 1291, + 3454, 2649, 3455, 2918, 166, 3411, 640, 2413, 2917, 621, + 2184, 122, 2532, 3304, 2352, 869, 870, 871, 872, 2529, + 3411, 880, 2183, 621, 2805, 3453, 1815, 2860, 3247, 2129, + 3246, 163, 80, 3049, 164, 156, 3050, 2802, 1002, 1001, + 646, 144, 3482, 3257, 2248, 1313, 3450, 3068, 80, 911, + 912, 618, 2123, 3057, 3333, 80, 2427, 183, 82, 3393, + 163, 3401, 3256, 164, 2178, 3067, 89, 2857, 1314, 1315, + 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 1287, + 2803, 2428, 132, 133, 155, 154, 183, 1854, 3430, 621, + 2880, 1607, 2546, 2547, 1533, 2462, 1534, 3133, 2461, 604, + 1287, 2463, 2384, 1279, 80, 2806, 2809, 2010, 2074, 2246, + 89, 602, 2735, 2736, 2734, 922, 766, 767, 2075, 2076, + 2571, 2555, 1294, 2245, 1295, 1296, 89, 1109, 1082, 1050, + 867, 2039, 866, 89, 1087, 1088, 3320, 2474, 1070, 2093, + 2092, 1070, 949, 1071, 1056, 1057, 1071, 2510, 622, 1083, + 1076, 599, 2837, 621, 1069, 2949, 1068, 1046, 3473, 621, + 613, 2420, 2421, 621, 2240, 2241, 2243, 2242, 167, 2614, + 621, 635, 2868, 2866, 1791, 609, 1059, 173, 639, 3474, + 1530, 633, 89, 1474, 2557, 149, 130, 152, 137, 129, + 2842, 150, 151, 2517, 1700, 2039, 2160, 167, 2122, 2542, + 947, 915, 2199, 1099, 1021, 1101, 173, 138, 3279, 2204, + 3280, 2830, 2219, 622, 2220, 3503, 2221, 2806, 1103, 2831, + 1726, 141, 139, 134, 135, 136, 140, 622, 1085, 1086, + 1091, 1089, 1052, 131, 2559, 1108, 1084, 1077, 1701, 2838, + 1702, 1090, 142, 1098, 1100, 3038, 589, 2839, 591, 605, + 3037, 624, 2222, 623, 595, 1027, 593, 597, 606, 598, + 3231, 592, 1026, 603, 2205, 2201, 594, 607, 608, 611, + 614, 615, 616, 612, 610, 3034, 601, 625, 2163, 3094, + 2052, 958, 987, 949, 1045, 3447, 985, 996, 957, 925, + 919, 917, 958, 622, 1611, 995, 158, 2211, 2207, 2209, + 2210, 2208, 2212, 2213, 994, 993, 992, 2203, 1286, 1283, + 1284, 1285, 1290, 1292, 1289, 1472, 1288, 2037, 2038, 1066, + 948, 1072, 1073, 1074, 1075, 158, 1282, 991, 2615, 1286, + 1283, 1284, 1285, 1290, 1292, 1289, 647, 1288, 184, 2648, + 990, 989, 1096, 1477, 1110, 1111, 1097, 1282, 1049, 2202, + 984, 997, 1348, 1327, 2246, 2563, 1102, 622, 3522, 1327, + 2757, 3515, 123, 622, 933, 933, 3479, 622, 931, 3327, + 970, 585, 2508, 1338, 622, 166, 933, 3435, 1104, 3407, + 1095, 2037, 2038, 1632, 969, 1744, 2388, 2390, 3033, 868, + 2136, 910, 2560, 2189, 3407, 3433, 1330, 1331, 1332, 1333, + 2188, 1740, 1529, 153, 3439, 3440, 1344, 815, 1272, 3406, + 2858, 1014, 2755, 2756, 815, 815, 1267, 1080, 2467, 3434, + 2776, 2541, 2544, 2182, 3406, 925, 919, 917, 988, 976, + 934, 163, 986, 2511, 164, 1731, 1605, 1604, 2576, 900, + 955, 1006, 906, 906, 2260, 2950, 1048, 969, 1268, 1269, + 1334, 1005, 1603, 2527, 1741, 1601, 2126, 183, 587, 582, + 2554, 948, 3448, 2553, 146, 2180, 2476, 147, 159, 1328, + 1329, 3316, 3088, 2986, 2968, 171, 1712, 1711, 1713, 1714, + 1715, 2997, 2998, 2458, 2423, 626, 3088, 118, 2081, 83, + 1631, 1730, 2360, 1857, 3066, 1521, 2127, 159, 1429, 918, + 1061, 2807, 2808, 2125, 171, 1327, 619, 944, 2418, 1324, + 946, 2733, 893, 113, 2811, 1107, 179, 2566, 2566, 2754, + 3341, 620, 2565, 2565, 1093, 999, 2247, 3029, 88, 1878, + 975, 2757, 2600, 1498, 1500, 1362, 1358, 2128, 1359, 2531, + 1753, 2962, 1065, 1879, 88, 179, 2200, 2124, 1464, 1800, + 1737, 88, 2389, 976, 1535, 1058, 1869, 160, 165, 162, + 168, 169, 170, 172, 174, 175, 176, 177, 167, 3483, + 1478, 1481, 1465, 178, 180, 181, 182, 173, 2500, 3513, + 2902, 1055, 3514, 2530, 3512, 114, 160, 165, 162, 168, + 169, 170, 172, 174, 175, 176, 177, 1869, 1067, 2277, + 88, 2741, 178, 180, 181, 182, 1296, 949, 1480, 941, + 3129, 1013, 1484, 2807, 2808, 3004, 943, 942, 877, 1079, + 1435, 1436, 1437, 1438, 1439, 3003, 2811, 1297, 1482, 1483, + 1081, 2167, 98, 99, 1641, 918, 1465, 1295, 1296, 1727, + 1640, 1728, 1297, 1630, 1729, 2177, 2742, 1734, 2175, 1732, + 1733, 2172, 1735, 1736, 975, 2172, 1471, 987, 1458, 2179, + 969, 972, 973, 985, 933, 947, 3371, 101, 966, 970, + 2744, 1094, 1876, 3475, 1051, 976, 1319, 1320, 1322, 1321, + 1323, 1324, 889, 1638, 2987, 1064, 3517, 1754, 2739, 965, + 2176, 2252, 2253, 2254, 2174, 1297, 158, 1720, 3239, 1608, + 1609, 1610, 1827, 3238, 3229, 2755, 2756, 3523, 3079, 1624, + 1673, 3372, 2740, 1676, 2581, 1678, 1828, 1325, 1326, 1826, + 1297, 1479, 976, 3309, 1499, 1718, 3487, 1497, 1817, 1819, + 1820, 1695, 1749, 1617, 1502, 976, 876, 874, 1646, 3063, + 1647, 3064, 1649, 1651, 1468, 2746, 1655, 1657, 1659, 1661, + 1663, 3078, 1818, 1677, 3011, 3010, 1975, 1526, 1527, 3000, + 1972, 1719, 1294, 1636, 1295, 1296, 1685, 1686, 3310, 1974, + 1635, 2602, 1691, 1692, 1297, 2784, 975, 1294, 976, 1295, + 1296, 979, 969, 813, 1600, 948, 981, 1975, 2772, 1717, + 982, 980, 1634, 1634, 3524, 1614, 2482, 2583, 2044, 2045, + 1627, 2481, 1615, 1613, 3485, 1497, 1757, 818, 819, 820, + 1707, 983, 2754, 1761, 2132, 1763, 1764, 1765, 1766, 1497, + 1485, 1721, 1770, 975, 2757, 1012, 1874, 1705, 3438, 1009, + 1294, 1704, 1295, 1296, 1782, 1875, 975, 1703, 1755, 1756, + 1693, 1681, 969, 972, 973, 1687, 933, 1918, 1684, 3476, + 966, 970, 1760, 1683, 1682, 1294, 1653, 1295, 1296, 1767, + 1768, 1769, 1745, 2834, 2593, 2592, 2591, 2585, 159, 2589, + 627, 2584, 3437, 2582, 1706, 171, 122, 1271, 2587, 975, + 2994, 627, 2465, 627, 979, 969, 1606, 2586, 952, 981, + 951, 1530, 950, 982, 980, 2148, 2147, 3336, 1054, 3335, + 1060, 2146, 2145, 1062, 95, 2588, 2590, 3313, 1759, 1294, + 3312, 1295, 1296, 2144, 2143, 96, 179, 1315, 1316, 1317, + 1318, 1319, 1320, 1322, 1321, 1323, 1324, 1781, 1297, 2409, + 3502, 1780, 3463, 1497, 1497, 2743, 1910, 1899, 1900, 1901, + 1902, 1912, 1903, 1904, 1905, 1917, 1913, 1906, 1907, 1914, + 1915, 1916, 1908, 1909, 1911, 3311, 1274, 160, 165, 162, + 168, 169, 170, 172, 174, 175, 176, 177, 2314, 3234, + 1497, 97, 3218, 178, 180, 181, 182, 1506, 1293, 1497, + 1293, 1497, 1852, 1852, 1853, 1298, 1796, 1850, 1850, 1830, + 1297, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, + 1841, 1842, 1843, 1844, 2409, 3400, 2409, 3379, 1872, 39, + 2409, 3375, 1873, 1497, 1353, 1317, 1318, 1319, 1320, 1322, + 1321, 1323, 1324, 1507, 3217, 1313, 1297, 2575, 3362, 1497, + 1497, 1821, 3128, 1823, 1301, 1302, 1303, 1304, 1305, 1306, + 1307, 1299, 3126, 1338, 3075, 2875, 1936, 1831, 1314, 1315, + 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 3329, + 1870, 3047, 3326, 1294, 1463, 1295, 1296, 104, 3242, 1497, + 1932, 2409, 3230, 104, 1968, 3477, 2961, 1462, 103, 1461, + 102, 1464, 3047, 1497, 103, 1297, 102, 2409, 3045, 97, + 3008, 2993, 1824, 2843, 1297, 1788, 1789, 2840, 1799, 1997, + 1982, 2172, 1497, 79, 1981, 1465, 2775, 1797, 1798, 1313, + 2747, 1497, 2966, 1497, 2751, 2774, 1498, 2004, 1980, 2325, + 1497, 2750, 2491, 2765, 2764, 1294, 2479, 1295, 1296, 1460, + 1829, 2316, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, + 1321, 1323, 1324, 1297, 2761, 2762, 95, 1971, 1497, 3265, + 2028, 2405, 1297, 97, 1497, 2752, 1856, 96, 2761, 2760, + 2748, 1294, 2194, 1295, 1296, 2749, 97, 1863, 1865, 3417, + 1497, 1297, 2433, 1497, 1313, 1297, 2259, 2193, 2021, 3324, + 2022, 1880, 1881, 1882, 1883, 2034, 2274, 2016, 2246, 2540, + 1985, 1986, 1982, 1596, 2521, 1894, 2049, 1314, 1315, 1316, + 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 2090, 1784, + 1980, 2454, 1497, 2514, 2515, 98, 99, 2409, 2408, 2454, + 1294, 1750, 1295, 1296, 2270, 1525, 3264, 3415, 1497, 1294, + 1716, 1295, 1296, 2270, 1497, 98, 99, 3226, 1513, 1313, + 1855, 1497, 3222, 1542, 1708, 1698, 1694, 1690, 1984, 1689, + 2133, 1987, 1988, 1688, 1508, 3413, 1497, 3221, 2027, 2273, + 2062, 2425, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, + 1321, 1323, 1324, 1105, 2455, 1599, 1596, 1595, 1294, 3055, + 1295, 1296, 2455, 103, 2457, 890, 2085, 1294, 2015, 1295, + 1296, 2425, 2246, 2099, 2100, 2101, 2102, 2094, 1297, 2095, + 2096, 2097, 2098, 2432, 2066, 2026, 1294, 2003, 1295, 1296, + 1294, 2728, 1295, 1296, 2029, 2105, 2106, 2107, 2108, 2698, + 2304, 2246, 2088, 1541, 1540, 2161, 1679, 2084, 2518, 2047, + 2961, 2115, 2496, 2433, 2173, 2089, 1293, 2071, 2121, 2072, + 2070, 2963, 3367, 3340, 2409, 2433, 1297, 2922, 2087, 2086, + 923, 2763, 1293, 2671, 1313, 924, 1297, 1309, 2433, 1310, + 1930, 1724, 2073, 2961, 2270, 2325, 2301, 2300, 2158, 2172, + 1941, 2155, 2131, 1311, 1325, 1326, 1308, 1314, 1315, 1316, + 1317, 1318, 1319, 1320, 1322, 1321, 1323, 1324, 2042, 1501, + 2006, 2116, 2172, 1758, 2111, 2112, 1297, 1855, 2130, 1801, + 1762, 1739, 1751, 1528, 879, 2134, 2142, 960, 959, 89, + 3443, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1297, 2166, + 3012, 2186, 2169, 3382, 2170, 977, 2116, 2165, 2164, 2168, + 3288, 1497, 1297, 1294, 3253, 1295, 1296, 1504, 2005, 2787, + 3286, 1497, 978, 2312, 1941, 1297, 3219, 3140, 3028, 2187, + 2190, 3025, 1634, 3006, 2191, 2192, 1314, 1315, 1316, 1317, + 1318, 1319, 1320, 1322, 1321, 1323, 1324, 1669, 2885, 2884, + 2267, 3013, 3014, 3015, 1297, 2488, 1598, 2114, 1297, 1050, + 2266, 1294, 89, 1295, 1296, 2232, 2233, 2832, 1297, 2789, + 2235, 1294, 2785, 1295, 1296, 2522, 2110, 2104, 2103, 2236, + 2197, 3016, 3283, 1497, 1723, 1297, 2256, 2263, 2258, 1629, + 2265, 2268, 1625, 1594, 2271, 2836, 2272, 1497, 1670, 1671, + 1672, 2279, 3254, 115, 2129, 2281, 2282, 2283, 1982, 3269, + 1497, 1294, 1981, 1295, 1296, 2289, 2290, 2291, 2292, 2293, + 2294, 2295, 2296, 2297, 2298, 2225, 2264, 2979, 3017, 3018, + 3019, 1823, 2487, 1294, 2019, 1295, 1296, 1786, 2937, 1497, + 1297, 2262, 2930, 1497, 2257, 3497, 1297, 1294, 3495, 1295, + 1296, 2305, 2306, 2307, 2308, 2309, 3470, 2311, 2978, 3348, + 1294, 2313, 1295, 1296, 3274, 2318, 2319, 2976, 2320, 2927, + 1497, 2323, 2781, 2324, 2780, 1804, 2244, 2327, 2973, 2974, + 2488, 2331, 2779, 2698, 2501, 2336, 2337, 2338, 2339, 1294, + 1824, 1295, 1296, 1294, 2226, 1295, 1296, 2717, 2350, 1787, + 2353, 2354, 2255, 1294, 2716, 1295, 1296, 3344, 2356, 2358, + 1811, 1812, 1813, 1814, 3255, 2361, 2362, 2363, 2364, 2365, + 1294, 2033, 1295, 1296, 2925, 1497, 2372, 2373, 1505, 2374, + 2890, 1497, 2377, 2379, 2028, 2276, 2381, 2438, 2441, 2442, + 2443, 2439, 2967, 2440, 2444, 2720, 2393, 2973, 2974, 2718, + 2721, 1852, 2394, 2025, 2719, 2722, 1850, 2442, 2443, 1858, + 1859, 2676, 1297, 2675, 1861, 2954, 906, 906, 1866, 3308, + 2688, 2690, 1871, 2953, 3119, 1294, 3121, 1295, 1296, 2691, + 1510, 1294, 2957, 1295, 1296, 1884, 1885, 1886, 1887, 1888, + 1889, 1890, 1891, 1892, 1893, 2392, 2685, 1738, 2310, 1919, + 1920, 1921, 1922, 1923, 1924, 1926, 3110, 1931, 3109, 1933, + 1934, 1935, 865, 1937, 1938, 1939, 2759, 1945, 1946, 1947, + 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, + 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, + 1665, 1969, 2429, 1976, 1977, 906, 1509, 906, 906, 906, + 906, 906, 2395, 2410, 2397, 2472, 3108, 1989, 1990, 1991, + 1992, 1993, 1994, 1995, 1996, 39, 1998, 1999, 2000, 2001, + 2002, 2492, 1297, 894, 2447, 2406, 1471, 2449, 2448, 2419, + 2382, 895, 1878, 1016, 1015, 2851, 1297, 1666, 1667, 1668, + 2487, 1297, 2402, 2569, 2407, 1297, 1879, 1294, 1465, 1295, + 1296, 95, 95, 1270, 906, 2528, 2513, 2422, 97, 123, + 2046, 1297, 96, 96, 2475, 2477, 2959, 1297, 2050, 97, + 2053, 3509, 2452, 1804, 1495, 1491, 2040, 2041, 2284, 1297, + 2456, 2044, 2045, 2459, 3422, 2537, 104, 2777, 2229, 1492, + 3325, 3249, 2121, 2758, 2466, 2299, 2469, 103, 2490, 102, + 2468, 1297, 2079, 2493, 2494, 2446, 2873, 1497, 97, 1297, + 2030, 902, 903, 2480, 2023, 2024, 1494, 2218, 1493, 1297, + 2380, 1497, 2217, 1297, 2535, 2378, 1497, 2489, 2216, 2357, + 1497, 2674, 2215, 2214, 2939, 1297, 799, 2250, 2497, 2673, + 2498, 102, 104, 2502, 2503, 2504, 3030, 3296, 3295, 3277, + 2534, 2340, 1497, 103, 103, 102, 1297, 1294, 1617, 1295, + 1296, 2117, 3127, 2332, 1497, 2604, 2605, 2606, 2607, 2608, + 2579, 1294, 3116, 1295, 1296, 3125, 1294, 1297, 1295, 1296, + 1294, 3124, 1295, 1296, 2613, 3260, 2523, 2524, 2533, 189, + 1297, 3117, 189, 2981, 3026, 632, 1294, 2958, 1295, 1296, + 638, 2956, 1294, 2932, 1295, 1296, 1297, 2928, 2790, 2594, + 189, 2156, 1612, 901, 1294, 2947, 1295, 1296, 2558, 2900, + 2577, 2425, 104, 3098, 2609, 189, 2578, 2405, 3499, 3498, + 3498, 2567, 2561, 103, 2568, 2616, 1294, 2302, 1295, 1296, + 2896, 2017, 1297, 1522, 1294, 1514, 1295, 1296, 3499, 1297, + 638, 189, 638, 3314, 1294, 1297, 1295, 1296, 1294, 2992, + 1295, 1296, 2483, 108, 109, 892, 2595, 2597, 3, 1804, + 1294, 91, 1295, 1296, 2882, 1, 2206, 2996, 2650, 2655, + 1495, 1491, 3432, 600, 2007, 2223, 2224, 1469, 2652, 2228, + 2881, 1294, 3471, 1295, 1296, 1492, 3428, 1297, 2231, 3429, + 1709, 1699, 3058, 1942, 3250, 2234, 2793, 1971, 2162, 1971, + 3024, 2707, 1294, 2618, 1295, 1296, 2119, 968, 148, 2624, + 1488, 1489, 1494, 2082, 1493, 1294, 2878, 1295, 1296, 2725, + 1297, 2237, 2083, 2376, 2634, 2635, 2636, 2637, 2638, 2375, + 3395, 1294, 2655, 1295, 1296, 2678, 2710, 112, 2654, 926, + 2651, 2695, 2653, 111, 971, 1078, 2157, 3048, 2727, 1749, + 2473, 2091, 1547, 2701, 1545, 1546, 1544, 1549, 2701, 2062, + 1548, 2859, 2303, 2679, 2901, 2670, 1790, 1294, 2666, 1295, + 1296, 2371, 634, 2704, 1294, 2445, 1295, 1296, 628, 2677, + 1294, 186, 1295, 1296, 881, 1536, 1515, 2062, 2062, 2062, + 2062, 2062, 2914, 1010, 2680, 2692, 2693, 590, 2766, 2195, + 596, 1345, 1785, 2672, 2370, 2709, 883, 2062, 882, 2460, + 2062, 2729, 2813, 2711, 2730, 921, 2714, 2723, 98, 99, + 2712, 2713, 1294, 2715, 1295, 1296, 2278, 2731, 2667, 2668, + 2669, 913, 2018, 2396, 920, 3227, 2706, 2285, 2286, 2287, + 2288, 2951, 2684, 2792, 2686, 2853, 2412, 2769, 2689, 2682, + 3307, 2767, 2768, 2770, 2771, 1294, 3118, 1295, 1296, 1297, + 2596, 3380, 2470, 1511, 2921, 2870, 2871, 2872, 1297, 2874, + 2876, 2820, 2821, 1297, 2737, 2275, 1867, 1297, 1335, 2791, + 2059, 3093, 1353, 2883, 2121, 2812, 2827, 1297, 2887, 2888, + 2889, 2891, 2892, 2893, 2894, 1816, 656, 2895, 655, 2897, + 2898, 2899, 1297, 653, 2903, 2904, 2905, 2906, 2907, 2908, + 2909, 2910, 2911, 2912, 2847, 2398, 2846, 2849, 2850, 2626, + 2844, 2628, 2919, 2426, 1300, 2923, 2854, 2924, 2926, 803, + 2929, 2931, 2855, 2933, 2934, 2935, 2936, 2639, 2640, 2641, + 2642, 2942, 2386, 2369, 1523, 2864, 2437, 2435, 2434, 2227, + 2861, 2862, 2368, 2863, 1297, 2067, 2865, 2367, 2867, 2916, + 2869, 2366, 2975, 1297, 2971, 3424, 2920, 2061, 2057, 1297, + 2404, 2355, 754, 753, 665, 1297, 2964, 2965, 657, 649, + 2969, 752, 751, 2989, 2819, 1297, 2349, 3408, 2543, 2833, + 2545, 1297, 2471, 2829, 1294, 1278, 1295, 1296, 1487, 1513, + 643, 2451, 939, 1294, 2856, 1295, 1296, 3331, 1294, 2945, + 1295, 1296, 1294, 1297, 1295, 1296, 2249, 2940, 2941, 2879, + 1486, 1297, 1294, 1897, 1295, 1296, 1898, 3338, 2801, 3042, + 2948, 2782, 2519, 2955, 2149, 65, 43, 1294, 2348, 1295, + 1296, 1297, 2970, 2960, 3302, 3368, 2943, 2347, 1297, 750, + 747, 3095, 1297, 2346, 3096, 2977, 3097, 2646, 2647, 2345, + 3351, 2984, 2985, 3352, 2980, 1297, 2982, 746, 3353, 2344, + 1925, 2499, 1275, 3445, 1792, 2343, 1297, 90, 2990, 3031, + 3032, 1297, 2062, 2820, 2821, 3046, 2983, 2991, 34, 1294, + 33, 1295, 1296, 32, 31, 30, 25, 2342, 1294, 24, + 1295, 1296, 3052, 3053, 1294, 2341, 1295, 1296, 23, 189, + 1294, 189, 1295, 1296, 189, 1297, 22, 3001, 3002, 3007, + 1294, 3009, 1295, 1296, 21, 2335, 1294, 3065, 1295, 1296, + 3069, 27, 2334, 1297, 20, 19, 2333, 2548, 2549, 2550, + 2551, 2552, 18, 2804, 638, 3466, 638, 638, 1294, 2330, + 1295, 1296, 3508, 117, 52, 49, 1294, 3080, 1295, 1296, + 2329, 1804, 2562, 47, 125, 2328, 638, 189, 3054, 3035, + 124, 50, 3084, 3039, 3040, 3041, 1294, 46, 1295, 1296, + 1053, 44, 2570, 1294, 3092, 1295, 1296, 1294, 29, 1295, + 1296, 28, 3099, 17, 1340, 16, 3074, 15, 14, 2326, + 1294, 13, 1295, 1296, 12, 11, 7, 6, 2574, 37, + 36, 1294, 35, 1295, 1296, 1795, 1294, 2322, 1295, 1296, + 26, 3070, 2438, 2441, 2442, 2443, 2439, 906, 2440, 2444, + 2598, 2599, 4, 1297, 2601, 3091, 2506, 2603, 2151, 3113, + 0, 0, 0, 0, 0, 0, 1297, 0, 0, 0, + 1294, 0, 1295, 1296, 1297, 1852, 3142, 2610, 2611, 2612, + 1850, 0, 0, 0, 0, 0, 0, 0, 1294, 2617, + 1295, 1296, 2619, 2620, 2621, 0, 0, 0, 2622, 2623, + 3123, 3114, 1945, 2625, 0, 3138, 2627, 2701, 3122, 2629, + 2630, 2631, 2632, 3132, 3136, 3130, 3134, 2633, 1945, 1945, + 1945, 1945, 1945, 0, 1297, 0, 0, 0, 2704, 0, + 0, 0, 2704, 3241, 3143, 3144, 906, 2321, 3228, 39, + 3146, 0, 3248, 2656, 2657, 2658, 2659, 2660, 2661, 0, + 2317, 1297, 2662, 2663, 0, 2664, 1340, 2665, 2315, 0, + 0, 0, 3258, 3259, 3224, 3261, 0, 3262, 3263, 0, + 3225, 0, 3266, 3267, 3268, 0, 3270, 3273, 3271, 0, + 3223, 3272, 3240, 0, 1852, 3275, 3252, 3245, 1294, 1850, + 1295, 1296, 3282, 3284, 3285, 3287, 3289, 3290, 3292, 3232, + 3244, 1294, 2696, 1295, 1296, 0, 0, 0, 2280, 1294, + 0, 1295, 1296, 189, 0, 0, 0, 638, 638, 0, + 0, 0, 3235, 3236, 3237, 0, 0, 2726, 3276, 0, + 0, 0, 0, 189, 0, 2269, 3322, 3278, 0, 0, + 0, 3281, 0, 0, 0, 0, 0, 0, 0, 0, + 3318, 0, 3300, 638, 3297, 3298, 189, 2778, 3299, 1294, + 0, 1295, 1296, 0, 0, 0, 0, 0, 638, 0, + 0, 0, 0, 0, 189, 3317, 0, 0, 3321, 0, + 3315, 0, 0, 2816, 0, 0, 1294, 2788, 1295, 1296, + 0, 0, 0, 0, 0, 0, 0, 2828, 2704, 0, + 0, 0, 0, 0, 0, 0, 0, 3082, 0, 0, + 0, 638, 0, 0, 0, 0, 2845, 0, 0, 2848, + 0, 0, 0, 0, 1340, 0, 0, 0, 0, 3323, + 638, 638, 0, 638, 0, 638, 638, 0, 638, 638, + 638, 638, 638, 638, 0, 0, 0, 0, 0, 0, + 0, 1340, 0, 0, 1340, 638, 1340, 189, 0, 0, + 0, 0, 3347, 3342, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3334, 189, 3337, 2877, 0, 0, 3363, 0, 0, 0, 0, 0, 3364, 3365, - 0, 0, 0, 0, 0, 0, 2744, 0, 0, 183, - 0, 0, 0, 0, 3330, 0, 0, 0, 0, 3357, - 3376, 0, 3358, 0, 2739, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3366, 2755, 2756, 39, 0, 0, 3401, 3402, 2740, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3373, 0, - 3411, 3413, 3415, 3381, 3408, 3409, 0, 3383, 3386, 3394, - 3391, 3388, 3387, 3385, 3390, 3389, 2701, 0, 0, 0, - 0, 2746, 0, 3252, 3396, 3443, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3419, 0, 0, 0, 3345, - 0, 0, 0, 3422, 3440, 3430, 3435, 0, 0, 0, - 0, 0, 0, 1340, 0, 3408, 3409, 3449, 0, 39, - 167, 3447, 3359, 0, 3460, 3360, 1348, 3361, 0, 173, - 0, 0, 0, 3378, 0, 0, 0, 0, 3458, 0, - 3463, 0, 0, 0, 1804, 0, 0, 0, 2754, 0, - 0, 0, 0, 0, 0, 0, 3481, 3483, 3485, 0, - 2757, 3478, 3476, 0, 0, 0, 0, 0, 0, 3487, - 189, 0, 0, 3491, 638, 638, 3486, 3493, 0, 0, - 0, 0, 0, 1852, 0, 1850, 0, 3504, 3490, 0, - 189, 3408, 3409, 3501, 3489, 0, 3507, 0, 3306, 0, - 0, 0, 3515, 3516, 3517, 3513, 0, 0, 0, 0, - 638, 0, 0, 189, 0, 0, 0, 0, 0, 0, - 0, 3441, 0, 0, 3523, 638, 3524, 3525, 3272, 0, - 0, 189, 0, 0, 0, 0, 0, 1852, 0, 1850, - 0, 0, 3522, 0, 0, 0, 0, 0, 158, 0, - 0, 3455, 0, 3456, 0, 3457, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, - 0, 2743, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1340, 0, 0, 0, 0, 0, 638, 638, 0, - 638, 0, 638, 638, 0, 638, 638, 638, 638, 638, - 638, 0, 0, 0, 0, 0, 0, 0, 1340, 0, - 0, 1340, 638, 1340, 189, 0, 184, 0, 0, 0, - 0, 3502, 0, 3503, 0, 0, 0, 1616, 0, 0, - 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, - 123, 0, 145, 0, 0, 0, 0, 638, 0, 189, - 3346, 0, 0, 166, 0, 0, 0, 0, 3356, 0, - 0, 0, 0, 638, 0, 189, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2046, - 0, 189, 0, 0, 156, 0, 0, 2050, 189, 2053, - 144, 0, 1804, 0, 0, 0, 0, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 638, 0, 0, 163, - 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, - 159, 0, 0, 0, 0, 0, 0, 171, 0, 0, - 0, 1620, 1621, 155, 154, 183, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2747, 0, 0, 0, - 2751, 0, 0, 0, 0, 0, 0, 2750, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2752, 0, 0, 0, 0, 2748, 0, 0, 814, - 0, 2749, 81, 0, 0, 0, 0, 0, 0, 160, - 165, 162, 168, 169, 170, 172, 174, 175, 176, 177, - 0, 0, 0, 0, 0, 178, 180, 181, 182, 0, - 0, 0, 0, 0, 149, 1622, 152, 0, 1619, 0, - 150, 151, 0, 0, 0, 0, 167, 0, 0, 0, - 0, 0, 0, 0, 0, 173, 0, 0, 0, 3462, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1564, - 638, 638, 0, 0, 0, 0, 0, 0, 638, 878, - 0, 81, 0, 189, 0, 0, 0, 0, 1804, 0, - 0, 0, 0, 0, 0, 2206, 0, 0, 0, 0, - 878, 0, 0, 0, 2223, 2224, 0, 0, 2228, 0, - 0, 0, 0, 0, 0, 938, 0, 2231, 0, 0, - 0, 0, 0, 0, 2234, 0, 0, 0, 0, 0, - 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1340, 0, 0, 0, 0, 0, 0, 0, 0, - 2237, 0, 638, 0, 0, 0, 0, 0, 1340, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 158, 0, 0, 0, 0, 0, - 0, 0, 0, 638, 638, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 0, 189, 2886, 0, 0, 3330, 0, 0, 0, + 3339, 0, 0, 0, 0, 0, 638, 0, 189, 0, + 3376, 0, 3357, 0, 0, 3358, 0, 0, 0, 0, + 0, 0, 0, 39, 189, 0, 0, 0, 2944, 0, + 0, 189, 3366, 0, 0, 0, 3402, 3403, 3373, 0, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 638, + 3412, 3414, 3416, 3409, 0, 3410, 0, 0, 3378, 3383, + 2701, 3386, 3394, 3391, 3388, 3387, 3385, 0, 3390, 3252, + 3397, 3389, 0, 0, 0, 3444, 3381, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3420, 0, + 0, 0, 0, 3423, 0, 0, 0, 3441, 3431, 39, + 3436, 0, 0, 0, 0, 3409, 0, 3410, 3451, 0, + 0, 0, 0, 3005, 3449, 3462, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3306, 0, + 1348, 0, 3020, 0, 3460, 3021, 3022, 3023, 3465, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3484, 3486, + 3488, 0, 0, 3478, 0, 0, 0, 0, 3481, 1749, + 1852, 3493, 3027, 3480, 0, 1850, 0, 0, 3489, 0, + 3492, 3490, 0, 3496, 3494, 0, 0, 0, 0, 0, + 3507, 0, 0, 3409, 0, 3410, 3504, 0, 0, 0, + 0, 3510, 0, 0, 0, 3051, 3519, 3520, 0, 3518, + 3516, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 638, 1852, 3525, 3526, 3527, 3528, + 1850, 638, 3272, 0, 0, 0, 189, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3071, 0, 3072, 0, 0, 3073, 0, 0, 3076, 3077, + 0, 0, 0, 0, 0, 0, 0, 3081, 0, 0, + 0, 0, 0, 0, 638, 0, 0, 3083, 0, 0, + 3346, 0, 0, 0, 1340, 0, 0, 0, 3356, 0, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 3100, + 0, 1340, 3101, 0, 3102, 3103, 0, 3104, 0, 3105, + 0, 0, 0, 0, 3106, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 638, 638, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3131, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3139, 0, 0, 3141, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3145, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1983, 0, 0, 0, + 0, 0, 0, 3220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1983, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, - 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1565, 0, 0, 0, - 0, 0, 0, 0, 0, 189, 0, 0, 638, 0, - 0, 0, 0, 146, 0, 0, 147, 0, 189, 0, - 0, 0, 638, 0, 0, 1983, 189, 0, 189, 0, - 189, 189, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 638, 159, 0, 0, 0, - 0, 0, 0, 171, 0, 1578, 1581, 1582, 1583, 1584, - 1585, 1586, 0, 1587, 1588, 1589, 1590, 1591, 1566, 1567, - 1568, 1569, 1550, 1551, 1579, 0, 1553, 0, 1554, 1555, - 1556, 1557, 1558, 1559, 1560, 1561, 1562, 0, 0, 1563, - 1570, 1571, 1572, 1573, 179, 1574, 1575, 1576, 1577, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, - 2451, 0, 0, 638, 0, 160, 165, 162, 168, 169, - 170, 172, 174, 175, 176, 177, 0, 0, 0, 0, - 0, 178, 180, 181, 182, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 638, 0, 0, 0, 638, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, - 0, 0, 0, 0, 189, 0, 0, 0, 0, 1580, - 0, 0, 0, 189, 189, 0, 0, 189, 0, 189, - 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, - 0, 0, 0, 189, 0, 0, 2548, 2549, 2550, 2551, - 2552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, - 1804, 2562, 0, 0, 638, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2570, 0, 0, 0, 0, 0, 1113, 0, 1113, - 1113, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1340, - 0, 1983, 0, 0, 0, 0, 878, 1337, 1342, 1343, - 0, 1346, 0, 1347, 1349, 1350, 1351, 0, 1354, 1355, - 1357, 1357, 0, 1357, 1361, 1361, 1363, 1364, 1365, 1366, - 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, - 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, - 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, - 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, - 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, - 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, - 1427, 0, 0, 0, 0, 1428, 0, 1430, 1431, 1432, - 1433, 1434, 0, 0, 0, 0, 0, 0, 0, 0, - 1361, 1361, 1361, 1361, 1361, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1440, 1441, 1442, 1443, 1444, 1445, - 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 189, 0, 0, 0, 0, 1467, 0, 0, 189, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, - 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 123, 0, 145, - 0, 0, 0, 0, 189, 0, 2778, 0, 1473, 189, - 166, 0, 0, 0, 878, 0, 0, 0, 878, 0, - 0, 0, 0, 0, 878, 0, 0, 0, 0, 0, - 0, 0, 2816, 0, 0, 0, 0, 0, 0, 0, - 0, 156, 0, 0, 0, 0, 2828, 144, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2845, 163, 0, 2848, 164, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 189, - 0, 0, 0, 0, 0, 0, 189, 0, 132, 133, - 155, 154, 183, 0, 0, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 638, 0, 0, - 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1340, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 189, 189, 189, 189, 189, + 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, - 189, 0, 0, 0, 0, 0, 0, 2944, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 189, 149, 130, 152, 137, 129, 0, 150, 151, 0, - 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, - 0, 638, 173, 138, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1564, 141, 139, 134, - 135, 136, 140, 0, 0, 0, 0, 0, 0, 131, - 0, 0, 1113, 0, 0, 0, 0, 0, 142, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, + 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 189, 0, 0, 0, 638, 0, 0, 1983, 189, + 0, 189, 0, 189, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, - 0, 0, 3005, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3020, 0, 0, 3021, 3022, 3023, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, - 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, + 0, 0, 0, 3305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 158, 0, 0, 0, 638, 0, 0, 0, 0, - 798, 0, 0, 0, 0, 0, 0, 0, 0, 189, + 0, 0, 0, 0, 3164, 3166, 3165, 3183, 3184, 3185, + 3186, 3187, 3188, 3189, 704, 0, 0, 0, 798, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, - 1552, 1340, 0, 0, 638, 638, 1340, 189, 189, 189, - 189, 189, 0, 0, 0, 0, 0, 0, 0, 189, - 0, 0, 0, 0, 0, 189, 0, 189, 617, 0, - 189, 189, 189, 0, 637, 0, 1113, 1113, 0, 153, - 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, - 0, 0, 0, 1565, 637, 0, 637, 0, 638, 0, - 0, 1340, 0, 0, 0, 0, 638, 0, 0, 0, - 146, 189, 0, 147, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 159, 189, 0, 0, 189, 0, 0, - 171, 0, 1578, 1581, 1582, 1583, 1584, 1585, 1586, 0, - 1587, 1588, 1589, 1590, 1591, 1566, 1567, 1568, 1569, 1550, - 1551, 1579, 0, 1553, 0, 1554, 1555, 1556, 1557, 1558, - 1559, 1560, 1561, 1562, 0, 0, 1563, 1570, 1571, 1572, - 1573, 179, 1574, 1575, 1576, 1577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, - 0, 0, 160, 165, 162, 168, 169, 170, 172, 174, - 175, 176, 177, 0, 0, 0, 0, 0, 178, 180, - 181, 182, 80, 41, 42, 82, 189, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 617, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, + 3343, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 0, 0, 0, 0, 638, 0, + 0, 0, 638, 638, 0, 0, 0, 3345, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 0, 637, 0, 0, 0, 0, 0, + 3359, 0, 0, 3360, 0, 3361, 0, 0, 0, 0, + 189, 0, 0, 0, 0, 0, 0, 189, 0, 0, + 0, 0, 0, 0, 0, 0, 189, 189, 0, 0, + 189, 0, 189, 0, 0, 0, 0, 0, 0, 189, + 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 86, 0, 0, 0, 45, 71, 72, 0, - 69, 73, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2060, 0, 0, 0, - 0, 0, 189, 0, 0, 0, 0, 0, 58, 0, + 0, 0, 189, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 0, 0, 0, 0, 89, 1580, 0, 816, 0, - 0, 189, 804, 817, 818, 819, 820, 805, 0, 0, - 806, 807, 0, 808, 0, 0, 0, 0, 0, 0, - 189, 0, 0, 189, 189, 189, 0, 813, 821, 822, - 0, 0, 0, 638, 638, 0, 938, 0, 0, 0, + 0, 0, 3170, 0, 0, 0, 0, 0, 0, 3442, + 0, 0, 0, 0, 0, 0, 0, 3178, 3179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3343, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 938, - 0, 0, 0, 0, 2822, 2823, 0, 0, 0, 0, - 638, 638, 638, 638, 0, 0, 823, 824, 825, 826, - 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, - 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, - 857, 858, 859, 860, 861, 862, 863, 864, 48, 51, - 54, 53, 56, 0, 68, 0, 0, 77, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3457, 0, 3458, 0, 3459, 0, 0, 0, 0, 0, + 0, 0, 1340, 0, 1983, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 57, 85, 84, 0, 0, 66, 67, 55, 2824, 0, - 0, 0, 0, 75, 76, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 770, + 0, 683, 774, 685, 771, 772, 0, 681, 684, 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1340, 0, 0, 0, 0, - 638, 0, 638, 0, 59, 60, 0, 61, 62, 63, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2825, 2826, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2251, 0, 0, 637, 1266, - 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3505, 0, 3506, 702, 703, 3163, 3167, 3168, + 3169, 3180, 3181, 3182, 3190, 3192, 735, 3191, 3193, 3194, + 3195, 3198, 3199, 3200, 3201, 3196, 3197, 3202, 3147, 3151, + 3148, 3149, 3150, 3162, 3152, 3153, 3154, 3155, 3156, 3157, + 3158, 3159, 3160, 3161, 3203, 3204, 3205, 3206, 3207, 3208, + 3173, 3177, 3176, 3174, 3175, 3171, 3172, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 775, + 0, 776, 0, 0, 780, 816, 0, 1975, 782, 781, + 817, 783, 749, 748, 0, 3464, 777, 778, 0, 779, + 1851, 0, 0, 189, 0, 1564, 0, 0, 0, 0, + 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, - 637, 0, 0, 0, 0, 189, 0, 0, 638, 0, - 0, 0, 0, 0, 2261, 0, 0, 0, 0, 0, - 0, 638, 0, 0, 0, 0, 0, 0, 1339, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 770, 0, 0, 774, 0, 771, 772, 0, 0, - 0, 773, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, - 0, 638, 0, 0, 0, 638, 638, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, + 0, 0, 189, 0, 3209, 3210, 3211, 3212, 3213, 3214, + 3215, 3216, 0, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, + 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 638, 0, 0, 0, + 0, 2512, 189, 0, 0, 0, 0, 0, 0, 189, + 0, 0, 0, 0, 123, 0, 145, 0, 0, 1552, + 0, 0, 0, 638, 0, 0, 0, 166, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1340, 0, 0, 156, 0, + 0, 0, 0, 0, 144, 0, 0, 0, 189, 189, + 189, 189, 189, 0, 0, 0, 637, 1266, 637, 637, + 0, 0, 0, 163, 0, 0, 164, 0, 0, 0, + 0, 0, 189, 189, 0, 0, 0, 0, 637, 0, + 0, 0, 1565, 0, 0, 1620, 1621, 155, 154, 183, + 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1339, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2359, 0, 0, 0, 0, 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1578, 1581, 1582, 1583, 1584, 1585, 1586, 0, 1587, + 1588, 1589, 1590, 1591, 1566, 1567, 1568, 1569, 1550, 1551, + 1579, 638, 1553, 0, 1554, 1555, 1556, 1557, 1558, 1559, + 1560, 1561, 1562, 0, 0, 1563, 1570, 1571, 1572, 1573, + 0, 1574, 1575, 1576, 1577, 0, 0, 0, 149, 1622, + 152, 0, 1619, 0, 150, 151, 0, 0, 0, 638, + 167, 0, 0, 0, 0, 0, 0, 638, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1339, 0, 2391, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, - 878, 0, 0, 0, 0, 0, 0, 0, 0, 189, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 636, - 0, 2430, 2431, 0, 0, 0, 0, 638, 189, 0, - 2060, 0, 0, 878, 2450, 0, 0, 0, 0, 0, - 0, 637, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 930, - 0, 937, 0, 0, 0, 0, 0, 637, 638, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1340, 0, - 638, 0, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1593, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1602, 0, 638, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 638, 1628, 0, 0, - 0, 0, 0, 2526, 0, 1637, 0, 0, 1339, 1639, - 189, 638, 1642, 1643, 637, 637, 0, 637, 0, 637, - 637, 0, 637, 637, 637, 637, 637, 637, 0, 0, - 0, 0, 0, 0, 0, 1339, 1674, 1675, 1339, 637, - 1339, 0, 1680, 0, 0, 0, 0, 0, 89, 0, - 0, 816, 0, 0, 638, 804, 817, 818, 819, 820, - 805, 0, 0, 806, 807, 0, 808, 0, 0, 0, - 0, 0, 0, 0, 637, 0, 638, 0, 0, 0, - 813, 821, 822, 0, 0, 0, 0, 1742, 0, 0, - 637, 0, 0, 638, 0, 638, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2822, 2823, 0, - 0, 0, 0, 637, 0, 0, 0, 0, 0, 823, - 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, - 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 0, 2643, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 816, 0, - 1975, 2824, 0, 817, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1851, 0, 2060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2705, 0, - 81, 0, 0, 2060, 2060, 2060, 2060, 2060, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2060, 0, 0, 2060, 0, 0, 0, - 0, 0, 0, 2825, 2826, 0, 0, 637, 637, 0, - 0, 0, 0, 0, 0, 637, 823, 824, 825, 826, - 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, - 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, - 857, 858, 859, 860, 861, 862, 863, 864, 0, 2810, - 0, 0, 0, 0, 0, 0, 0, 0, 637, 2818, + 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1339, 0, - 0, 0, 0, 816, 0, 0, 0, 1860, 817, 637, - 0, 0, 0, 0, 0, 1339, 0, 0, 1851, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1115, 0, 1115, 1115, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1273, 0, 0, 0, 0, - 637, 823, 824, 825, 826, 827, 828, 829, 830, 831, - 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, - 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, - 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, - 862, 863, 864, 0, 0, 0, 0, 0, 637, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 0, 0, 637, 0, 0, 0, 0, 0, 2060, 0, + 0, 0, 189, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2988, 637, 0, 0, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 1340, 0, 0, 638, 638, 1340, + 189, 189, 189, 189, 189, 0, 0, 0, 0, 0, + 0, 0, 189, 0, 0, 0, 0, 0, 189, 0, + 189, 0, 0, 189, 189, 189, 0, 0, 0, 637, + 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1580, 0, 0, 158, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 637, 0, 0, 189, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 637, 638, 0, 0, 1340, 0, 0, 0, 0, 638, + 1593, 0, 0, 0, 189, 0, 0, 0, 0, 0, + 1602, 0, 0, 0, 0, 0, 0, 0, 189, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 637, 0, 1628, 153, 189, 0, 0, + 189, 0, 0, 1637, 0, 0, 1339, 1639, 0, 0, + 1642, 1643, 637, 637, 0, 637, 0, 637, 637, 0, + 637, 637, 637, 637, 637, 637, 0, 0, 0, 0, + 0, 0, 0, 1339, 1674, 1675, 1339, 637, 1339, 0, + 1680, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, + 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 1742, 0, 0, 637, 0, + 159, 0, 0, 0, 0, 0, 0, 171, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 637, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, - 0, 0, 0, 0, 2139, 2140, 2141, 0, 0, 0, + 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, + 165, 162, 168, 169, 170, 172, 174, 175, 176, 177, + 0, 0, 0, 0, 189, 178, 180, 181, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 189, 0, 0, 189, 189, 189, 0, + 1616, 0, 0, 0, 0, 0, 638, 638, 0, 0, + 0, 0, 0, 123, 814, 145, 0, 81, 0, 0, + 0, 0, 0, 0, 0, 0, 166, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 638, 638, 638, 156, 0, 0, + 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, + 0, 0, 1564, 0, 0, 637, 637, 0, 0, 0, + 0, 0, 163, 637, 0, 164, 0, 0, 0, 0, + 0, 0, 0, 0, 878, 0, 81, 0, 0, 0, + 0, 0, 0, 0, 1620, 1621, 155, 154, 183, 0, + 0, 0, 0, 0, 0, 878, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 938, 0, 0, 0, 0, 0, 637, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1339, 0, 0, 0, + 0, 0, 0, 0, 0, 1860, 0, 637, 0, 189, + 0, 0, 0, 1339, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1340, 0, + 0, 0, 0, 638, 0, 638, 0, 0, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, - 637, 1637, 0, 0, 1637, 0, 1637, 0, 0, 0, - 0, 0, 2171, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1475, 1476, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 149, 1622, 152, + 0, 1619, 0, 150, 151, 0, 1552, 0, 0, 167, + 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, + 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, + 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, - 0, 0, 637, 0, 0, 0, 637, 637, 0, 0, - 0, 0, 1519, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1537, 0, 0, + 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 638, 0, 0, 637, 638, 638, + 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 158, 0, 0, + 637, 0, 0, 0, 0, 0, 0, 638, 1578, 1581, + 1582, 1583, 1584, 1585, 1586, 0, 1587, 1588, 1589, 1590, + 1591, 1566, 1567, 1568, 1569, 1550, 1551, 1579, 0, 1553, + 0, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, + 0, 0, 1563, 1570, 1571, 1572, 1573, 0, 1574, 1575, + 1576, 1577, 0, 0, 0, 637, 0, 0, 0, 0, + 0, 0, 2139, 2140, 2141, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 638, 0, 637, 1637, + 0, 0, 1637, 0, 1637, 0, 0, 0, 0, 0, + 2171, 0, 189, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 189, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 637, 146, 0, 0, 147, + 637, 0, 0, 0, 637, 637, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, + 0, 638, 0, 0, 0, 0, 171, 0, 0, 0, + 0, 1340, 0, 638, 0, 0, 0, 0, 0, 0, + 0, 0, 1580, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 638, 1983, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 189, 638, 0, 0, 0, 0, 637, + 0, 0, 0, 0, 0, 0, 0, 0, 160, 165, + 162, 168, 169, 170, 172, 174, 175, 176, 177, 0, + 0, 0, 0, 0, 178, 180, 181, 182, 0, 0, + 0, 0, 1113, 0, 1113, 1113, 0, 0, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3107, 0, - 3111, 3112, 0, 0, 0, 0, 0, 0, 0, 0, - 930, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2705, 0, 81, 0, 2705, 0, 1645, - 1645, 0, 1645, 0, 1645, 1645, 0, 1654, 1645, 1645, - 1645, 1645, 1645, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 0, 0, 930, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 1339, 189, 637, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, + 638, 878, 1337, 1342, 1343, 0, 1346, 0, 1347, 1349, + 1350, 1351, 0, 1354, 1355, 1357, 1357, 0, 1357, 1361, + 1361, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, + 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, + 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, + 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, + 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, + 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, + 1422, 1423, 1424, 1425, 1426, 1427, 0, 0, 0, 0, + 1428, 0, 1430, 1431, 1432, 1433, 1434, 0, 0, 0, + 0, 0, 0, 0, 0, 1361, 1361, 1361, 1361, 1361, + 0, 0, 0, 0, 0, 80, 41, 42, 82, 1440, + 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, + 1451, 1452, 1453, 0, 0, 86, 0, 0, 0, 45, + 71, 72, 0, 69, 73, 0, 0, 0, 0, 0, + 1467, 0, 70, 0, 637, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1722, - 0, 0, 0, 0, 3233, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1746, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1339, 0, 637, 0, + 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 756, 89, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1473, 0, 0, 0, 0, 0, 878, + 2464, 0, 0, 878, 0, 0, 0, 0, 0, 878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1115, 0, + 0, 0, 0, 0, 0, 187, 0, 0, 586, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, + 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 888, 0, 0, 0, 637, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 1637, 1637, 907, 907, + 0, 637, 0, 0, 0, 0, 0, 586, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1339, 2536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 51, 54, 53, 56, 0, 68, 0, 0, + 77, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 85, 84, 0, 0, 66, 67, + 55, 0, 0, 0, 0, 0, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2705, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1363, 1364, 1365, - 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, - 1376, 1377, 1378, 1382, 1383, 1384, 1385, 1386, 1387, 1388, - 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, - 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, - 1409, 1410, 1411, 1413, 1414, 1415, 1416, 1417, 1418, 1419, - 1420, 1421, 1422, 1440, 1441, 1442, 1443, 1444, 1445, 1446, - 1447, 1448, 1449, 1450, 1451, 1452, 1453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, - 0, 3332, 0, 0, 0, 0, 0, 637, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, - 0, 0, 1115, 1115, 0, 0, 0, 0, 0, 0, - 1793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2464, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1846, 0, 0, 0, 0, 0, 0, - 3377, 0, 0, 0, 0, 81, 0, 0, 0, 756, - 637, 0, 0, 0, 1862, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, - 0, 0, 0, 0, 637, 1895, 1896, 0, 1637, 1637, + 0, 0, 0, 0, 0, 0, 0, 59, 60, 0, + 61, 62, 63, 64, 0, 0, 0, 0, 0, 755, + 0, 0, 0, 0, 0, 0, 0, 1113, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 187, 0, 0, 586, 0, 0, 0, 1339, - 2536, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1115, 0, 0, 888, 0, - 0, 3459, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 907, 907, 0, 0, 0, - 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2020, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1519, 0, 0, 1115, 0, 0, - 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 930, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, - 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 637, 0, 0, 0, 0, 0, 0, 0, 637, + 0, 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 937, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 930, - 637, 0, 0, 0, 0, 937, 0, 0, 0, 0, - 0, 0, 0, 0, 637, 0, 0, 0, 1339, 0, - 0, 637, 637, 1339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, + 0, 0, 0, 930, 0, 937, 0, 0, 0, 83, + 0, 0, 637, 0, 0, 0, 1339, 0, 0, 637, + 637, 1339, 89, 0, 0, 816, 0, 0, 0, 804, + 817, 818, 819, 820, 805, 0, 0, 806, 807, 0, + 808, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 813, 821, 822, 0, 0, 0, + 0, 1113, 1113, 0, 0, 0, 0, 0, 0, 0, + 81, 88, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 930, 0, 0, 0, 0, 1846, 0, 0, - 0, 1846, 1846, 0, 0, 0, 0, 0, 0, 0, + 0, 2822, 2823, 637, 0, 0, 1339, 0, 0, 0, + 0, 637, 0, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, + 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 0, 0, 0, 0, 0, + 0, 0, 2852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 0, 0, 1339, 0, - 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 586, 0, 586, 0, 0, + 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2852, 0, 2238, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2825, 2826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1341, 2060, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2995, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 770, 0, + 0, 774, 0, 771, 772, 0, 0, 0, 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 89, 0, 0, 816, 637, 637, + 0, 804, 817, 818, 819, 820, 805, 0, 0, 806, + 807, 938, 808, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 813, 821, 822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1115, 637, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 938, 637, 637, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2822, 2823, 0, 0, 0, 0, 0, + 0, 0, 1341, 0, 0, 823, 824, 825, 826, 827, + 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, + 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, + 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, + 858, 859, 860, 861, 862, 863, 864, 1115, 0, 1115, + 1115, 0, 0, 0, 0, 0, 0, 0, 0, 586, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1273, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 888, + 0, 0, 0, 0, 0, 0, 0, 2824, 0, 0, + 1339, 0, 0, 0, 0, 637, 0, 637, 0, 0, + 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2251, 0, 0, 0, 0, 0, 0, 637, 0, 2825, + 2826, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1341, 0, 0, 637, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 637, 0, 0, 2261, + 0, 0, 0, 0, 0, 0, 0, 1341, 0, 0, + 1341, 0, 1341, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 586, 0, 586, 0, 0, 586, 0, 0, + 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 637, 0, 586, 0, + 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1748, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, + 586, 0, 0, 0, 0, 0, 0, 586, 0, 0, + 0, 0, 0, 0, 0, 0, 1771, 1772, 586, 586, + 586, 586, 586, 586, 586, 0, 0, 0, 0, 0, + 1475, 1476, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1519, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2391, 637, 0, + 0, 1537, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2995, 0, 0, + 0, 0, 637, 0, 0, 0, 2430, 2431, 0, 0, + 0, 0, 0, 0, 930, 2060, 0, 0, 878, 2450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1645, 1645, 0, 1645, 0, 1645, 1645, + 0, 1654, 1645, 1645, 1645, 1645, 1645, 0, 0, 0, + 0, 0, 0, 637, 0, 0, 0, 0, 930, 0, + 0, 0, 0, 1339, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, + 637, 0, 586, 1722, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1746, + 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 637, 0, 2526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 637, 637, 0, 0, 0, 0, 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2399, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2414, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 637, 637, + 1341, 0, 1115, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 907, 907, 0, 0, 0, 1341, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 637, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 907, 1748, 907, 907, 907, 907, 907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2495, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1341, - 0, 0, 2032, 0, 0, 0, 0, 0, 0, 2520, - 0, 0, 0, 0, 0, 0, 0, 0, 2525, 0, - 0, 0, 1339, 0, 0, 0, 0, 637, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, + 907, 0, 0, 0, 0, 0, 0, 2643, 0, 0, + 0, 0, 0, 0, 888, 0, 1115, 1115, 0, 0, + 0, 0, 0, 0, 1793, 0, 0, 586, 0, 0, + 0, 0, 0, 0, 1748, 586, 0, 586, 0, 586, + 2069, 0, 0, 816, 0, 0, 0, 0, 817, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1851, 0, + 2060, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1846, 0, 0, + 0, 0, 0, 2705, 0, 81, 0, 0, 2060, 2060, + 2060, 2060, 2060, 0, 0, 0, 0, 0, 1862, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2060, 0, + 0, 2060, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1895, + 1896, 823, 824, 825, 826, 827, 828, 829, 830, 831, + 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, + 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, + 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, + 862, 863, 864, 0, 2810, 0, 0, 0, 0, 1115, + 0, 0, 0, 0, 2818, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 888, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, - 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, - 0, 0, 0, 1846, 0, 0, 0, 586, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2020, 0, 0, + 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, + 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, + 0, 0, 586, 586, 2032, 0, 586, 0, 2230, 0, + 0, 0, 0, 0, 0, 586, 0, 0, 1519, 0, + 0, 1115, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 930, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1846, 0, 0, 0, 0, 0, 0, 1341, 637, 0, - 0, 0, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1341, 0, 0, 1341, 2644, 1341, - 586, 637, 0, 0, 0, 0, 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 586, 0, 1645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1748, 0, 0, 0, 2681, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 586, 0, 1115, - 0, 0, 0, 0, 586, 0, 2708, 1645, 0, 0, - 637, 0, 0, 1771, 1772, 586, 586, 586, 586, 586, - 586, 586, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1341, 0, + 1748, 0, 0, 930, 0, 0, 0, 0, 0, 937, + 0, 0, 0, 2060, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 930, 0, 0, 0, + 0, 1846, 0, 0, 0, 1846, 1846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 930, 0, 0, 0, 0, 637, 0, 0, 2032, 0, - 0, 0, 0, 0, 0, 1339, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, + 0, 0, 0, 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 0, 0, 0, 0, 0, 0, 0, 2915, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 637, 0, 637, 0, 0, 0, 0, 1341, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 907, - 907, 0, 0, 0, 1341, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 586, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3107, 0, 3111, 3112, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1115, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2705, 0, + 81, 0, 2705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 907, 1748, - 907, 907, 907, 907, 907, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2032, 2032, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, + 0, 0, 0, 0, 0, 2505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 907, 0, 0, - 0, 0, 3059, 3060, 3061, 3062, 0, 0, 0, 0, - 0, 888, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, - 0, 1748, 586, 0, 586, 0, 586, 2069, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 586, 586, 586, 586, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 586, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2399, 0, 0, 0, 0, + 0, 0, 0, 907, 0, 0, 2414, 0, 2705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, + 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1382, 1383, + 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, + 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, + 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1413, 1414, + 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1440, 1441, + 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, + 1452, 1453, 907, 0, 0, 0, 0, 0, 0, 2495, + 0, 0, 0, 0, 0, 0, 3332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 0, 2032, 0, 0, 0, + 0, 0, 0, 2520, 0, 0, 0, 0, 586, 0, + 0, 0, 2525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1341, 0, 0, 0, 0, 1341, 586, 586, 586, 586, + 586, 0, 0, 0, 0, 0, 0, 0, 2724, 0, + 0, 0, 0, 0, 1696, 0, 586, 0, 0, 586, + 2732, 1748, 0, 0, 0, 3377, 0, 0, 0, 0, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3135, 0, 3137, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 586, 0, 0, 1846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1846, 0, 0, 0, 0, 0, + 0, 0, 0, 586, 0, 0, 586, 3461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2644, 0, 0, 0, 0, 0, 0, 0, + 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2032, 0, 0, 0, 0, 0, + 0, 1645, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1115, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, - 586, 0, 0, 0, 0, 0, 0, 0, 0, 586, - 586, 0, 0, 586, 0, 2230, 0, 0, 0, 0, - 0, 0, 586, 0, 0, 0, 0, 0, 0, 586, - 0, 0, 0, 3293, 0, 0, 0, 3293, 3293, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2032, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1341, 0, 1748, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2032, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3370, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3374, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1115, 1115, 0, 0, - 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, - 0, 0, 0, 0, 1696, 0, 0, 0, 3417, 0, + 2708, 1645, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 586, 0, 0, 0, 0, 586, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3370, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2032, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2915, 0, 3425, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, - 0, 0, 2505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1341, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 586, 586, 586, 586, 586, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 586, 586, 0, 0, 0, + 0, 0, 0, 0, 930, 0, 0, 0, 0, 0, + 586, 0, 2032, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, + 0, 0, 586, 586, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1341, 0, 0, - 0, 0, 1341, 586, 586, 586, 586, 586, 0, 0, - 0, 0, 0, 0, 0, 2724, 0, 0, 0, 0, - 0, 1696, 0, 586, 0, 0, 586, 2732, 1748, 0, + 0, 0, 0, 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1341, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2032, + 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 586, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3059, 3060, 3061, 3062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2494,333 +2422,142 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3135, 0, 3137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 586, 0, 0, 586, - 586, 586, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3243, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3396, 0, 0, 3293, 0, 0, + 0, 3293, 3293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1696, + 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1748, 0, 0, 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3370, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1115, 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3418, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 380, 2915, 0, 3426, 1249, 1234, 496, 0, 1177, 1252, + 1146, 1165, 1262, 1168, 1171, 1213, 1125, 1191, 399, 1162, + 1118, 1150, 1120, 1157, 1121, 1148, 1179, 257, 1145, 1236, + 1195, 1251, 350, 254, 1127, 1151, 413, 1167, 196, 1215, + 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, + 369, 411, 486, 405, 1258, 354, 1201, 0, 476, 384, + 0, 0, 0, 1181, 1240, 1189, 1227, 1176, 1214, 1135, + 1200, 1253, 1163, 1210, 1254, 309, 237, 311, 195, 396, + 477, 273, 0, 0, 0, 0, 3398, 800, 0, 0, + 0, 0, 3399, 0, 0, 0, 0, 228, 0, 0, + 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, + 329, 334, 341, 347, 1159, 1207, 1248, 1160, 1209, 252, + 307, 259, 251, 501, 1259, 1239, 1124, 1188, 1247, 0, + 0, 219, 1250, 1183, 0, 1212, 0, 1265, 1119, 1203, + 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, 0, + 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, 0, + 0, 0, 0, 0, 0, 0, 1152, 0, 1199, 0, + 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 380, 0, 0, 0, 1249, 1234, 496, 0, 1177, - 1252, 1146, 1165, 1262, 1168, 1171, 1213, 1125, 1191, 399, - 1162, 1118, 1150, 1120, 1157, 1121, 1148, 1179, 257, 1145, - 1236, 1195, 1251, 350, 254, 1127, 1151, 413, 1167, 196, - 1215, 466, 241, 361, 358, 504, 269, 260, 256, 239, - 303, 369, 411, 486, 405, 1258, 354, 1201, 0, 476, - 384, 0, 0, 0, 1181, 1240, 1189, 1227, 1176, 1214, - 1135, 1200, 1253, 1163, 1210, 1254, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 1696, 0, 3397, 627, 0, - 0, 0, 0, 3398, 0, 0, 0, 0, 228, 0, - 0, 235, 0, 0, 586, 335, 344, 343, 324, 325, - 327, 329, 334, 341, 347, 1159, 1207, 1248, 1160, 1209, - 252, 307, 259, 251, 501, 1259, 1239, 1124, 1188, 1247, - 0, 0, 219, 1250, 1183, 0, 1212, 0, 1265, 1119, - 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, - 0, 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, - 0, 0, 0, 0, 1341, 0, 0, 1152, 0, 1199, - 0, 0, 0, 1131, 1123, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1178, 0, 0, - 0, 0, 1134, 0, 1153, 1225, 1696, 1117, 284, 1128, - 385, 244, 0, 1232, 1242, 1175, 541, 1246, 1173, 1172, - 1219, 1132, 1238, 1166, 349, 1130, 316, 191, 215, 0, - 1164, 395, 441, 453, 1237, 1149, 1158, 242, 1156, 451, - 409, 520, 223, 271, 438, 415, 449, 422, 274, 1198, - 1217, 450, 356, 506, 432, 517, 542, 543, 250, 389, - 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, - 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, - 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, - 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, - 312, 313, 204, 0, 437, 255, 280, 245, 398, 510, - 511, 243, 561, 218, 536, 210, 1129, 535, 391, 505, - 514, 378, 367, 209, 512, 376, 366, 320, 339, 340, - 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, - 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, - 227, 1144, 266, 270, 278, 281, 289, 290, 299, 351, - 402, 428, 424, 433, 1233, 500, 518, 530, 540, 546, - 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, - 474, 319, 357, 1222, 1264, 408, 452, 230, 522, 475, - 1139, 1143, 1137, 1204, 1138, 1193, 1194, 1140, 1255, 1256, - 1257, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 575, 576, 577, 578, 579, 580, 0, - 1226, 1133, 0, 1141, 1142, 1235, 1244, 1245, 581, 368, - 465, 519, 321, 333, 336, 326, 345, 0, 346, 322, - 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, - 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, - 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, - 528, 295, 448, 447, 317, 318, 363, 431, 1197, 190, - 211, 352, 1260, 434, 275, 559, 532, 527, 197, 213, - 1136, 249, 1147, 1155, 0, 1161, 1169, 1170, 1182, 1184, - 1185, 1186, 1187, 1205, 1206, 1208, 1216, 1218, 1221, 1223, - 1230, 1241, 1263, 192, 193, 200, 212, 222, 226, 233, - 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, - 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, - 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, - 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, - 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, - 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, - 301, 556, 557, 286, 516, 545, 0, 0, 362, 1196, - 1202, 365, 268, 291, 306, 1211, 531, 481, 217, 446, - 277, 240, 1229, 1231, 202, 236, 220, 246, 261, 264, - 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, - 464, 487, 488, 489, 491, 379, 253, 416, 1192, 1220, - 360, 497, 498, 302, 380, 0, 0, 0, 1249, 1234, - 496, 0, 1177, 1252, 1146, 1165, 1262, 1168, 1171, 1213, - 1125, 1191, 399, 1162, 1118, 1150, 1120, 1157, 1121, 1148, - 1179, 257, 1145, 1236, 1195, 1251, 350, 254, 1127, 1151, - 413, 1167, 196, 1215, 466, 241, 361, 358, 504, 269, - 260, 256, 239, 303, 369, 411, 486, 405, 1258, 354, - 1201, 0, 476, 384, 0, 0, 0, 1181, 1240, 1189, - 1227, 1176, 1214, 1135, 1200, 1253, 1163, 1210, 1254, 309, - 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, - 343, 324, 325, 327, 329, 334, 341, 347, 1159, 1207, - 1248, 1160, 1209, 252, 307, 259, 251, 501, 1259, 1239, - 1124, 1188, 1247, 0, 0, 219, 1250, 1183, 0, 1212, - 0, 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, 1154, - 262, 0, 0, 0, 0, 0, 0, 0, 1180, 1190, - 1224, 1228, 1174, 0, 0, 0, 0, 0, 2733, 0, - 1152, 0, 1199, 0, 0, 0, 1131, 1123, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1178, 0, 0, 0, 0, 1134, 0, 1153, 1225, 0, - 1117, 284, 1128, 385, 244, 0, 1232, 1242, 1175, 541, - 1246, 1173, 1172, 1219, 1132, 1238, 1166, 349, 1130, 316, - 191, 215, 0, 1164, 395, 441, 453, 1237, 1149, 1158, - 242, 1156, 451, 409, 520, 223, 271, 438, 415, 449, - 422, 274, 1198, 1217, 450, 356, 506, 432, 517, 542, - 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, - 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, - 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, - 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, - 513, 482, 377, 312, 313, 204, 0, 437, 255, 280, - 245, 398, 510, 511, 243, 561, 218, 536, 210, 1129, - 535, 391, 505, 514, 378, 367, 209, 512, 376, 366, - 320, 339, 340, 267, 293, 429, 359, 430, 292, 294, - 387, 386, 388, 198, 524, 0, 199, 0, 478, 525, - 562, 224, 225, 227, 1144, 266, 270, 278, 281, 289, - 290, 299, 351, 402, 428, 424, 433, 1233, 500, 518, - 530, 540, 546, 547, 549, 550, 551, 552, 553, 555, - 554, 390, 297, 474, 319, 357, 1222, 1264, 408, 452, - 230, 522, 475, 1139, 1143, 1137, 1204, 1138, 1193, 1194, - 1140, 1255, 1256, 1257, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, - 579, 580, 0, 1226, 1133, 0, 1141, 1142, 1235, 1244, - 1245, 581, 368, 465, 519, 321, 333, 336, 326, 345, - 0, 346, 322, 323, 328, 330, 331, 332, 337, 338, - 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, - 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, - 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, - 431, 1197, 190, 211, 352, 1260, 434, 275, 559, 532, - 527, 197, 213, 1136, 249, 1147, 1155, 0, 1161, 1169, - 1170, 1182, 1184, 1185, 1186, 1187, 1205, 1206, 1208, 1216, - 1218, 1221, 1223, 1230, 1241, 1263, 192, 193, 200, 212, - 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, - 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, - 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, - 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, - 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, - 480, 484, 507, 509, 521, 539, 544, 460, 287, 288, - 426, 427, 300, 301, 556, 557, 286, 516, 545, 0, - 0, 362, 1196, 1202, 365, 268, 291, 306, 1211, 531, - 481, 217, 446, 277, 240, 1229, 1231, 202, 236, 220, - 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, - 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, - 416, 1192, 1220, 360, 497, 498, 302, 380, 0, 0, - 0, 1249, 1234, 496, 0, 1177, 1252, 1146, 1165, 1262, - 1168, 1171, 1213, 1125, 1191, 399, 1162, 1118, 1150, 1120, - 1157, 1121, 1148, 1179, 257, 1145, 1236, 1195, 1251, 350, - 254, 1127, 1151, 413, 1167, 196, 1215, 466, 241, 361, - 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, - 405, 1258, 354, 1201, 0, 476, 384, 0, 0, 0, - 1181, 1240, 1189, 1227, 1176, 1214, 1135, 1200, 1253, 1163, - 1210, 1254, 309, 237, 311, 195, 396, 477, 273, 0, - 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, - 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, - 347, 1159, 1207, 1248, 1160, 1209, 252, 307, 259, 251, - 501, 1259, 1239, 1124, 1188, 1247, 0, 0, 219, 1250, - 1183, 0, 1212, 0, 1265, 1119, 1203, 0, 1122, 1126, - 1261, 1243, 1154, 262, 0, 0, 0, 0, 0, 0, - 0, 1180, 1190, 1224, 1228, 1174, 0, 0, 0, 0, - 0, 2694, 0, 1152, 0, 1199, 0, 0, 0, 1131, - 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1178, 0, 0, 0, 0, 1134, 0, - 1153, 1225, 0, 1117, 284, 1128, 385, 244, 0, 1232, - 1242, 1175, 541, 1246, 1173, 1172, 1219, 1132, 1238, 1166, - 349, 1130, 316, 191, 215, 0, 1164, 395, 441, 453, - 1237, 1149, 1158, 242, 1156, 451, 409, 520, 223, 271, - 438, 415, 449, 422, 274, 1198, 1217, 450, 356, 506, - 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, - 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, - 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, - 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, - 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, - 437, 255, 280, 245, 398, 510, 511, 243, 561, 218, - 536, 210, 1129, 535, 391, 505, 514, 378, 367, 209, - 512, 376, 366, 320, 339, 340, 267, 293, 429, 359, - 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, - 0, 478, 525, 562, 224, 225, 227, 1144, 266, 270, - 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, - 1233, 500, 518, 530, 540, 546, 547, 549, 550, 551, - 552, 553, 555, 554, 390, 297, 474, 319, 357, 1222, - 1264, 408, 452, 230, 522, 475, 1139, 1143, 1137, 1204, - 1138, 1193, 1194, 1140, 1255, 1256, 1257, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 0, 1226, 1133, 0, 1141, - 1142, 1235, 1244, 1245, 581, 368, 465, 519, 321, 333, - 336, 326, 345, 0, 346, 322, 323, 328, 330, 331, - 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, - 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, - 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, - 317, 318, 363, 431, 1197, 190, 211, 352, 1260, 434, - 275, 559, 532, 527, 197, 213, 1136, 249, 1147, 1155, - 0, 1161, 1169, 1170, 1182, 1184, 1185, 1186, 1187, 1205, - 1206, 1208, 1216, 1218, 1221, 1223, 1230, 1241, 1263, 192, - 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, - 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, - 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, - 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, - 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, - 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, - 460, 287, 288, 426, 427, 300, 301, 556, 557, 286, - 516, 545, 0, 0, 362, 1196, 1202, 365, 268, 291, - 306, 1211, 531, 481, 217, 446, 277, 240, 1229, 1231, - 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, - 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, - 491, 379, 253, 416, 1192, 1220, 360, 497, 498, 302, - 380, 0, 0, 0, 1249, 1234, 496, 0, 1177, 1252, - 1146, 1165, 1262, 1168, 1171, 1213, 1125, 1191, 399, 1162, - 1118, 1150, 1120, 1157, 1121, 1148, 1179, 257, 1145, 1236, - 1195, 1251, 350, 254, 1127, 1151, 413, 1167, 196, 1215, - 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, - 369, 411, 486, 405, 1258, 354, 1201, 0, 476, 384, - 0, 0, 0, 1181, 1240, 1189, 1227, 1176, 1214, 1135, - 1200, 1253, 1163, 1210, 1254, 309, 237, 311, 195, 396, - 477, 273, 0, 0, 0, 0, 0, 800, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, - 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, - 329, 334, 341, 347, 1159, 1207, 1248, 1160, 1209, 252, - 307, 259, 251, 501, 1259, 1239, 1124, 1188, 1247, 0, - 0, 219, 1250, 1183, 0, 1212, 0, 1265, 1119, 1203, - 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, 0, - 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, 0, - 0, 0, 0, 0, 2048, 0, 1152, 0, 1199, 0, - 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1178, 0, 0, 0, - 0, 1134, 0, 1153, 1225, 0, 1117, 284, 1128, 385, - 244, 0, 1232, 1242, 1175, 541, 1246, 1173, 1172, 1219, - 1132, 1238, 1166, 349, 1130, 316, 191, 215, 0, 1164, - 395, 441, 453, 1237, 1149, 1158, 242, 1156, 451, 409, - 520, 223, 271, 438, 415, 449, 422, 274, 1198, 1217, - 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, - 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, - 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, - 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, - 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, - 313, 204, 0, 437, 255, 280, 245, 398, 510, 511, - 243, 561, 218, 536, 210, 1129, 535, 391, 505, 514, - 378, 367, 209, 512, 376, 366, 320, 339, 340, 267, - 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, - 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, - 1144, 266, 270, 278, 281, 289, 290, 299, 351, 402, - 428, 424, 433, 1233, 500, 518, 530, 540, 546, 547, - 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, - 319, 357, 1222, 1264, 408, 452, 230, 522, 475, 1139, - 1143, 1137, 1204, 1138, 1193, 1194, 1140, 1255, 1256, 1257, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 0, 1226, - 1133, 0, 1141, 1142, 1235, 1244, 1245, 581, 368, 465, - 519, 321, 333, 336, 326, 345, 0, 346, 322, 323, - 328, 330, 331, 332, 337, 338, 342, 348, 238, 201, - 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, - 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, - 295, 448, 447, 317, 318, 363, 431, 1197, 190, 211, - 352, 1260, 434, 275, 559, 532, 527, 197, 213, 1136, - 249, 1147, 1155, 0, 1161, 1169, 1170, 1182, 1184, 1185, - 1186, 1187, 1205, 1206, 1208, 1216, 1218, 1221, 1223, 1230, - 1241, 1263, 192, 193, 200, 212, 222, 226, 233, 248, - 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, - 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, - 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, - 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, - 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, - 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, - 556, 557, 286, 516, 545, 0, 0, 362, 1196, 1202, - 365, 268, 291, 306, 1211, 531, 481, 217, 446, 277, - 240, 1229, 1231, 202, 236, 220, 246, 261, 264, 310, - 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, - 487, 488, 489, 491, 379, 253, 416, 1192, 1220, 360, - 497, 498, 302, 380, 0, 0, 0, 1249, 1234, 496, - 0, 1177, 1252, 1146, 1165, 1262, 1168, 1171, 1213, 1125, - 1191, 399, 1162, 1118, 1150, 1120, 1157, 1121, 1148, 1179, - 257, 1145, 1236, 1195, 1251, 350, 254, 1127, 1151, 413, - 1167, 196, 1215, 466, 241, 361, 358, 504, 269, 260, - 256, 239, 303, 369, 411, 486, 405, 1258, 354, 1201, - 0, 476, 384, 0, 0, 0, 1181, 1240, 1189, 1227, - 1176, 1214, 1135, 1200, 1253, 1163, 1210, 1254, 309, 237, - 311, 195, 396, 477, 273, 0, 89, 0, 0, 0, - 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, - 324, 325, 327, 329, 334, 341, 347, 1159, 1207, 1248, - 1160, 1209, 252, 307, 259, 251, 501, 1259, 1239, 1124, - 1188, 1247, 0, 0, 219, 1250, 1183, 0, 1212, 0, - 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, - 0, 0, 0, 0, 0, 0, 0, 1180, 1190, 1224, - 1228, 1174, 0, 0, 0, 0, 0, 0, 0, 1152, - 0, 1199, 0, 0, 0, 1131, 1123, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1178, 0, 0, 0, + 0, 1134, 0, 1153, 1225, 0, 1117, 284, 1128, 385, + 244, 0, 1232, 1242, 1175, 541, 1246, 1173, 1172, 1219, + 1132, 1238, 1166, 349, 1130, 316, 191, 215, 0, 1164, + 395, 441, 453, 1237, 1149, 1158, 242, 1156, 451, 409, + 520, 223, 271, 438, 415, 449, 422, 274, 1198, 1217, + 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, + 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, + 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, + 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, + 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, + 313, 204, 0, 437, 255, 280, 245, 398, 510, 511, + 243, 561, 218, 536, 210, 1129, 535, 391, 505, 514, + 378, 367, 209, 512, 376, 366, 320, 339, 340, 267, + 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, + 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, + 1144, 266, 270, 278, 281, 289, 290, 299, 351, 402, + 428, 424, 433, 1233, 500, 518, 530, 540, 546, 547, + 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, + 319, 357, 1222, 1264, 408, 452, 230, 522, 475, 1139, + 1143, 1137, 1204, 1138, 1193, 1194, 1140, 1255, 1256, 1257, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 0, 1226, + 1133, 0, 1141, 1142, 1235, 1244, 1245, 581, 368, 465, + 519, 321, 333, 336, 326, 345, 0, 346, 322, 323, + 328, 330, 331, 332, 337, 338, 342, 348, 238, 201, + 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, + 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, + 295, 448, 447, 317, 318, 363, 431, 1197, 190, 211, + 352, 1260, 434, 275, 559, 532, 527, 197, 213, 1136, + 249, 1147, 1155, 0, 1161, 1169, 1170, 1182, 1184, 1185, + 1186, 1187, 1205, 1206, 1208, 1216, 1218, 1221, 1223, 1230, + 1241, 1263, 192, 193, 200, 212, 222, 226, 233, 248, + 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, + 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, + 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, + 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, + 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, + 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, + 556, 557, 286, 516, 545, 0, 0, 362, 1196, 1202, + 365, 268, 291, 306, 1211, 531, 481, 217, 446, 277, + 240, 1229, 1231, 202, 236, 220, 246, 261, 264, 310, + 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, + 487, 488, 489, 491, 379, 253, 416, 1192, 1220, 360, + 497, 498, 302, 380, 0, 0, 0, 1249, 1234, 496, + 0, 1177, 1252, 1146, 1165, 1262, 1168, 1171, 1213, 1125, + 1191, 399, 1162, 1118, 1150, 1120, 1157, 1121, 1148, 1179, + 257, 1145, 1236, 1195, 1251, 350, 254, 1127, 1151, 413, + 1167, 196, 1215, 466, 241, 361, 358, 504, 269, 260, + 256, 239, 303, 369, 411, 486, 405, 1258, 354, 1201, + 0, 476, 384, 0, 0, 0, 1181, 1240, 1189, 1227, + 1176, 1214, 1135, 1200, 1253, 1163, 1210, 1254, 309, 237, + 311, 195, 396, 477, 273, 0, 0, 0, 0, 0, + 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, + 324, 325, 327, 329, 334, 341, 347, 1159, 1207, 1248, + 1160, 1209, 252, 307, 259, 251, 501, 1259, 1239, 1124, + 1188, 1247, 0, 0, 219, 1250, 1183, 0, 1212, 0, + 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, + 0, 0, 0, 0, 0, 0, 0, 1180, 1190, 1224, + 1228, 1174, 0, 0, 0, 0, 0, 2733, 0, 1152, + 0, 1199, 0, 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2885,7 +2622,7 @@ var yyAct = [...]int{ 0, 1212, 0, 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, 0, 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, 0, 0, 0, 0, 0, - 0, 0, 1152, 0, 1199, 0, 0, 0, 1131, 1123, + 2694, 0, 1152, 0, 1199, 0, 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2950,7 +2687,7 @@ var yyAct = [...]int{ 219, 1250, 1183, 0, 1212, 0, 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, 0, 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, 0, 0, - 0, 0, 0, 0, 0, 1152, 0, 1199, 0, 0, + 0, 0, 0, 2048, 0, 1152, 0, 1199, 0, 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3007,7 +2744,7 @@ var yyAct = [...]int{ 239, 303, 369, 411, 486, 405, 1258, 354, 1201, 0, 476, 384, 0, 0, 0, 1181, 1240, 1189, 1227, 1176, 1214, 1135, 1200, 1253, 1163, 1210, 1254, 309, 237, 311, - 195, 396, 477, 273, 0, 0, 0, 0, 0, 188, + 195, 396, 477, 273, 0, 89, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 1159, 1207, 1248, 1160, @@ -3064,266 +2801,203 @@ var yyAct = [...]int{ 446, 277, 240, 1229, 1231, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 1192, - 1220, 360, 497, 498, 302, 380, 0, 0, 0, 0, - 0, 496, 0, 679, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 399, 0, 0, 0, 0, 666, 0, - 0, 0, 257, 671, 0, 0, 0, 350, 254, 0, - 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, - 269, 260, 256, 239, 303, 369, 411, 486, 405, 678, - 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, - 674, 675, 0, 0, 0, 0, 0, 0, 0, 0, - 309, 237, 311, 195, 396, 477, 273, 0, 89, 0, - 0, 816, 800, 766, 767, 804, 817, 818, 819, 820, - 805, 0, 228, 806, 807, 235, 808, 0, 765, 706, - 708, 707, 725, 726, 727, 728, 729, 730, 731, 704, - 813, 821, 822, 0, 252, 307, 259, 251, 501, 0, - 0, 1927, 1928, 1929, 0, 0, 219, 0, 0, 0, - 0, 0, 0, 0, 648, 663, 0, 677, 0, 0, - 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 660, 661, 0, - 0, 0, 0, 760, 0, 662, 0, 0, 670, 823, - 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, - 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 673, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 284, 0, 385, 244, 0, 759, 0, 0, - 541, 0, 0, 757, 0, 0, 0, 0, 349, 0, - 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, - 0, 810, 0, 451, 409, 520, 223, 271, 438, 415, - 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, + 1220, 360, 497, 498, 302, 380, 0, 0, 0, 1249, + 1234, 496, 0, 1177, 1252, 1146, 1165, 1262, 1168, 1171, + 1213, 1125, 1191, 399, 1162, 1118, 1150, 1120, 1157, 1121, + 1148, 1179, 257, 1145, 1236, 1195, 1251, 350, 254, 1127, + 1151, 413, 1167, 196, 1215, 466, 241, 361, 358, 504, + 269, 260, 256, 239, 303, 369, 411, 486, 405, 1258, + 354, 1201, 0, 476, 384, 0, 0, 0, 1181, 1240, + 1189, 1227, 1176, 1214, 1135, 1200, 1253, 1163, 1210, 1254, + 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, + 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, + 344, 343, 324, 325, 327, 329, 334, 341, 347, 1159, + 1207, 1248, 1160, 1209, 252, 307, 259, 251, 501, 1259, + 1239, 1124, 1188, 1247, 0, 0, 219, 1250, 1183, 0, + 1212, 0, 1265, 1119, 1203, 0, 1122, 1126, 1261, 1243, + 1154, 262, 0, 0, 0, 0, 0, 0, 0, 1180, + 1190, 1224, 1228, 1174, 0, 0, 0, 0, 0, 0, + 0, 1152, 0, 1199, 0, 0, 0, 1131, 1123, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1178, 0, 0, 0, 0, 1134, 0, 1153, 1225, + 0, 1117, 284, 1128, 385, 244, 0, 1232, 1242, 1175, + 541, 1246, 1173, 1172, 1219, 1132, 1238, 1166, 349, 1130, + 316, 191, 215, 0, 1164, 395, 441, 453, 1237, 1149, + 1158, 242, 1156, 451, 409, 520, 223, 271, 438, 415, + 449, 422, 274, 1198, 1217, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, 437, 255, - 280, 245, 398, 811, 812, 243, 561, 712, 536, 210, - 0, 535, 391, 505, 514, 378, 367, 209, 512, 376, - 366, 320, 720, 721, 267, 293, 429, 359, 430, 292, + 280, 245, 398, 510, 511, 243, 561, 218, 536, 210, + 1129, 535, 391, 505, 514, 378, 367, 209, 512, 376, + 366, 320, 339, 340, 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, 0, 478, - 525, 562, 224, 225, 227, 0, 266, 270, 278, 281, - 289, 290, 299, 351, 402, 428, 424, 433, 0, 500, + 525, 562, 224, 225, 227, 1144, 266, 270, 278, 281, + 289, 290, 299, 351, 402, 428, 424, 433, 1233, 500, 518, 530, 540, 546, 547, 549, 550, 551, 552, 553, - 555, 554, 390, 297, 474, 319, 357, 0, 0, 408, - 452, 230, 522, 475, 770, 758, 683, 774, 685, 771, - 772, 680, 681, 684, 773, 563, 564, 565, 566, 567, + 555, 554, 390, 297, 474, 319, 357, 1222, 1264, 408, + 452, 230, 522, 475, 1139, 1143, 1137, 1204, 1138, 1193, + 1194, 1140, 1255, 1256, 1257, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 0, 761, 669, 668, 0, 676, 0, - 702, 703, 705, 709, 710, 711, 722, 723, 724, 732, - 734, 735, 733, 736, 737, 738, 741, 742, 743, 744, - 739, 740, 745, 686, 690, 687, 688, 689, 701, 691, - 692, 693, 694, 695, 696, 697, 698, 699, 700, 784, - 785, 786, 787, 788, 789, 715, 719, 718, 716, 717, - 713, 714, 667, 190, 211, 352, 0, 434, 275, 559, - 532, 527, 197, 213, 775, 249, 776, 0, 0, 780, - 0, 0, 0, 782, 781, 0, 783, 749, 748, 0, - 0, 777, 778, 0, 779, 0, 0, 192, 193, 200, + 578, 579, 580, 0, 1226, 1133, 0, 1141, 1142, 1235, + 1244, 1245, 581, 368, 465, 519, 321, 333, 336, 326, + 345, 0, 346, 322, 323, 328, 330, 331, 332, 337, + 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, + 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, + 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, + 363, 431, 1197, 190, 211, 352, 1260, 434, 275, 559, + 532, 527, 197, 213, 1136, 249, 1147, 1155, 0, 1161, + 1169, 1170, 1182, 1184, 1185, 1186, 1187, 1205, 1206, 1208, + 1216, 1218, 1221, 1223, 1230, 1241, 1263, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, - 479, 480, 484, 507, 509, 521, 539, 544, 460, 790, - 791, 792, 793, 794, 795, 796, 797, 286, 516, 545, - 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, - 531, 481, 217, 446, 277, 240, 815, 0, 202, 236, + 479, 480, 484, 507, 509, 521, 539, 544, 460, 287, + 288, 426, 427, 300, 301, 556, 557, 286, 516, 545, + 0, 0, 362, 1196, 1202, 365, 268, 291, 306, 1211, + 531, 481, 217, 446, 277, 240, 1229, 1231, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, - 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, - 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 399, 0, 0, 0, 0, 666, 0, 0, 0, 257, - 671, 0, 0, 0, 350, 254, 0, 0, 413, 0, - 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, - 239, 303, 369, 411, 486, 405, 678, 354, 0, 0, - 476, 384, 0, 0, 0, 0, 0, 674, 675, 0, - 0, 0, 0, 0, 0, 2077, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 89, 0, 0, 816, 800, - 766, 767, 804, 817, 818, 819, 820, 805, 0, 228, - 806, 807, 235, 808, 0, 765, 706, 708, 707, 725, - 726, 727, 728, 729, 730, 731, 704, 813, 821, 822, - 2078, 252, 307, 259, 251, 501, 0, 0, 0, 0, - 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, - 0, 648, 663, 0, 677, 0, 0, 0, 262, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 660, 661, 0, 0, 0, 0, - 760, 0, 662, 0, 0, 670, 823, 824, 825, 826, - 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, - 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, - 857, 858, 859, 860, 861, 862, 863, 864, 673, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, - 0, 385, 244, 0, 759, 0, 0, 541, 0, 0, - 757, 0, 0, 0, 0, 349, 0, 316, 191, 215, - 0, 0, 395, 441, 453, 0, 0, 0, 810, 0, - 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, - 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, - 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, - 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, - 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, - 485, 515, 229, 463, 0, 0, 560, 205, 513, 482, - 377, 312, 313, 204, 0, 437, 255, 280, 245, 398, - 811, 812, 243, 561, 712, 536, 210, 0, 535, 391, - 505, 514, 378, 367, 209, 512, 376, 366, 320, 720, - 721, 267, 293, 429, 359, 430, 292, 294, 387, 386, - 388, 198, 524, 0, 199, 0, 478, 525, 562, 224, - 225, 227, 0, 266, 270, 278, 281, 289, 290, 299, - 351, 402, 428, 424, 433, 0, 500, 518, 530, 540, - 546, 547, 549, 550, 551, 552, 553, 555, 554, 390, - 297, 474, 319, 357, 0, 0, 408, 452, 230, 522, - 475, 770, 758, 683, 774, 685, 771, 772, 680, 681, - 684, 773, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, - 0, 761, 669, 668, 0, 676, 0, 702, 703, 705, - 709, 710, 711, 722, 723, 724, 732, 734, 735, 733, - 736, 737, 738, 741, 742, 743, 744, 739, 740, 745, - 686, 690, 687, 688, 689, 701, 691, 692, 693, 694, - 695, 696, 697, 698, 699, 700, 784, 785, 786, 787, - 788, 789, 715, 719, 718, 716, 717, 713, 714, 667, - 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, - 213, 775, 249, 776, 0, 0, 780, 0, 0, 0, - 782, 781, 0, 783, 749, 748, 0, 0, 777, 778, - 0, 779, 0, 0, 192, 193, 200, 212, 222, 226, - 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, - 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, - 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, - 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, - 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, - 507, 509, 521, 539, 544, 460, 790, 791, 792, 793, - 794, 795, 796, 797, 286, 516, 545, 0, 0, 362, - 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, - 446, 277, 240, 815, 0, 202, 236, 220, 246, 261, - 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, - 231, 464, 487, 488, 489, 491, 379, 253, 416, 0, - 380, 360, 497, 498, 302, 80, 496, 0, 679, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, - 0, 0, 0, 666, 0, 0, 0, 257, 671, 0, - 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, - 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, - 369, 411, 486, 405, 678, 354, 0, 0, 476, 384, - 0, 0, 0, 0, 0, 674, 675, 0, 0, 0, - 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, - 477, 273, 0, 89, 0, 0, 816, 800, 766, 767, - 804, 817, 818, 819, 820, 805, 0, 228, 806, 807, - 235, 808, 0, 765, 706, 708, 707, 725, 726, 727, - 728, 729, 730, 731, 704, 813, 821, 822, 0, 252, - 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, - 0, 219, 0, 0, 0, 0, 0, 0, 0, 648, - 663, 0, 677, 0, 0, 0, 262, 0, 0, 0, + 253, 416, 1192, 1220, 360, 497, 498, 302, 380, 0, + 0, 0, 1249, 1234, 496, 0, 1177, 1252, 1146, 1165, + 1262, 1168, 1171, 1213, 1125, 1191, 399, 1162, 1118, 1150, + 1120, 1157, 1121, 1148, 1179, 257, 1145, 1236, 1195, 1251, + 350, 254, 1127, 1151, 413, 1167, 196, 1215, 466, 241, + 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, + 486, 405, 1258, 354, 1201, 0, 476, 384, 0, 0, + 0, 1181, 1240, 1189, 1227, 1176, 1214, 1135, 1200, 1253, + 1163, 1210, 1254, 309, 237, 311, 195, 396, 477, 273, + 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, + 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, + 341, 347, 1159, 1207, 1248, 1160, 1209, 252, 307, 259, + 251, 501, 1259, 1239, 1124, 1188, 1247, 0, 0, 219, + 1250, 1183, 0, 1212, 0, 1265, 1119, 1203, 0, 1122, + 1126, 1261, 1243, 1154, 262, 0, 0, 0, 0, 0, + 0, 0, 1180, 1190, 1224, 1228, 1174, 0, 0, 0, + 0, 0, 0, 0, 1152, 0, 1199, 0, 0, 0, + 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1178, 0, 0, 0, 0, 1134, + 0, 1153, 1225, 0, 1117, 284, 1128, 385, 244, 0, + 1232, 1242, 1175, 541, 1246, 1173, 1172, 1219, 1132, 1238, + 1166, 349, 1130, 316, 191, 215, 0, 1164, 395, 441, + 453, 1237, 1149, 1158, 242, 1156, 451, 409, 520, 223, + 271, 438, 415, 449, 422, 274, 1198, 1217, 450, 356, + 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, + 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, + 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, + 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, + 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, + 0, 437, 255, 280, 245, 398, 510, 511, 243, 561, + 218, 536, 210, 1129, 535, 391, 505, 514, 378, 367, + 209, 512, 376, 366, 320, 339, 340, 267, 293, 429, + 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, + 199, 0, 478, 525, 562, 224, 225, 227, 1144, 266, + 270, 278, 281, 289, 290, 299, 351, 402, 428, 424, + 433, 1233, 500, 518, 530, 540, 546, 547, 549, 550, + 551, 552, 553, 555, 554, 390, 297, 474, 319, 357, + 1222, 1264, 408, 452, 230, 522, 475, 1139, 1143, 1137, + 1204, 1138, 1193, 1194, 1140, 1255, 1256, 1257, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 0, 1226, 1133, 0, + 1141, 1142, 1235, 1244, 1245, 581, 368, 465, 519, 321, + 333, 336, 326, 345, 0, 346, 322, 323, 328, 330, + 331, 332, 337, 338, 342, 348, 238, 201, 374, 382, + 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, + 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, + 447, 317, 318, 363, 431, 1197, 190, 211, 352, 1260, + 434, 275, 559, 532, 527, 197, 213, 1136, 249, 1147, + 1155, 0, 1161, 1169, 1170, 1182, 1184, 1185, 1186, 1187, + 1205, 1206, 1208, 1216, 1218, 1221, 1223, 1230, 1241, 1263, + 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, + 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, + 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, + 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, + 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, + 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, + 544, 460, 287, 288, 426, 427, 300, 301, 556, 557, + 286, 516, 545, 0, 0, 362, 1196, 1202, 365, 268, + 291, 306, 1211, 531, 481, 217, 446, 277, 240, 1229, + 1231, 202, 236, 220, 246, 261, 264, 310, 375, 383, + 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, + 489, 491, 379, 253, 416, 1192, 1220, 360, 497, 498, + 302, 380, 0, 0, 0, 1249, 1234, 496, 0, 1177, + 1252, 1146, 1165, 1262, 1168, 1171, 1213, 1125, 1191, 399, + 1162, 1118, 1150, 1120, 1157, 1121, 1148, 1179, 257, 1145, + 1236, 1195, 1251, 350, 254, 1127, 1151, 413, 1167, 196, + 1215, 466, 241, 361, 358, 504, 269, 260, 256, 239, + 303, 369, 411, 486, 405, 1258, 354, 1201, 0, 476, + 384, 0, 0, 0, 1181, 1240, 1189, 1227, 1176, 1214, + 1135, 1200, 1253, 1163, 1210, 1254, 309, 237, 311, 195, + 396, 477, 273, 0, 0, 0, 0, 0, 800, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, + 327, 329, 334, 341, 347, 1159, 1207, 1248, 1160, 1209, + 252, 307, 259, 251, 501, 1259, 1239, 1124, 1188, 1247, + 0, 0, 219, 1250, 1183, 0, 1212, 0, 1265, 1119, + 1203, 0, 1122, 1126, 1261, 1243, 1154, 262, 0, 0, + 0, 0, 0, 0, 0, 1180, 1190, 1224, 1228, 1174, + 0, 0, 0, 0, 0, 0, 0, 1152, 0, 1199, + 0, 0, 0, 1131, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 660, 661, 0, 0, 0, 0, 760, 0, - 662, 0, 0, 670, 823, 824, 825, 826, 827, 828, - 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, - 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, - 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 673, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, - 244, 0, 759, 0, 0, 541, 0, 0, 757, 0, - 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, - 395, 441, 453, 0, 0, 0, 810, 0, 451, 409, - 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, - 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, - 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, - 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, - 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, - 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, - 313, 204, 0, 437, 255, 280, 245, 398, 811, 812, - 243, 561, 712, 536, 210, 0, 535, 391, 505, 514, - 378, 367, 209, 512, 376, 366, 320, 720, 721, 267, - 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, - 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, - 0, 266, 270, 278, 281, 289, 290, 299, 351, 402, - 428, 424, 433, 0, 500, 518, 530, 540, 546, 547, - 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, - 319, 357, 0, 0, 408, 452, 230, 522, 475, 770, - 758, 683, 774, 685, 771, 772, 680, 681, 684, 773, - 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 579, 580, 0, 761, - 669, 668, 0, 676, 0, 702, 703, 705, 709, 710, - 711, 722, 723, 724, 732, 734, 735, 733, 736, 737, - 738, 741, 742, 743, 744, 739, 740, 745, 686, 690, - 687, 688, 689, 701, 691, 692, 693, 694, 695, 696, - 697, 698, 699, 700, 784, 785, 786, 787, 788, 789, - 715, 719, 718, 716, 717, 713, 714, 667, 190, 211, - 352, 88, 434, 275, 559, 532, 527, 197, 213, 775, - 249, 776, 0, 0, 780, 0, 0, 0, 782, 781, - 0, 783, 749, 748, 0, 0, 777, 778, 0, 779, - 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, - 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, - 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, - 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, - 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, - 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, - 521, 539, 544, 460, 790, 791, 792, 793, 794, 795, - 796, 797, 286, 516, 545, 0, 0, 362, 0, 0, - 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, - 240, 815, 0, 202, 236, 220, 246, 261, 264, 310, - 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, - 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, - 497, 498, 302, 496, 0, 679, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, - 666, 0, 0, 0, 257, 671, 0, 0, 0, 350, - 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, - 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, - 405, 678, 354, 0, 0, 476, 384, 0, 0, 0, - 0, 0, 674, 675, 0, 0, 0, 0, 0, 0, - 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 89, 0, 0, 816, 800, 766, 767, 804, 817, 818, - 819, 820, 805, 0, 228, 806, 807, 235, 808, 0, - 765, 706, 708, 707, 725, 726, 727, 728, 729, 730, - 731, 704, 813, 821, 822, 0, 252, 307, 259, 251, - 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, - 0, 0, 0, 0, 0, 0, 648, 663, 0, 677, - 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, - 661, 0, 0, 0, 0, 760, 0, 662, 0, 0, - 670, 823, 824, 825, 826, 827, 828, 829, 830, 831, - 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, - 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, - 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, - 862, 863, 864, 673, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 0, 385, 244, 0, 759, - 0, 0, 541, 0, 0, 757, 0, 0, 0, 0, - 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, - 0, 0, 0, 810, 0, 451, 409, 520, 223, 271, - 438, 415, 449, 422, 274, 3384, 0, 450, 356, 506, - 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, - 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, - 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, - 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, - 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, - 437, 255, 280, 245, 398, 811, 812, 243, 561, 712, - 536, 210, 0, 535, 391, 505, 514, 378, 367, 209, - 512, 376, 366, 320, 720, 721, 267, 293, 429, 359, - 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, - 0, 478, 525, 562, 224, 225, 227, 0, 266, 270, - 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, - 0, 500, 518, 530, 540, 546, 547, 549, 550, 551, - 552, 553, 555, 554, 390, 297, 474, 319, 357, 0, - 0, 408, 452, 230, 522, 475, 770, 758, 683, 774, - 685, 771, 772, 680, 681, 684, 773, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 0, 761, 669, 668, 0, - 676, 0, 702, 703, 705, 709, 710, 711, 722, 723, - 724, 732, 734, 735, 733, 736, 737, 738, 741, 742, - 743, 744, 739, 740, 745, 686, 690, 687, 688, 689, - 701, 691, 692, 693, 694, 695, 696, 697, 698, 699, - 700, 784, 785, 786, 787, 788, 789, 715, 719, 718, - 716, 717, 713, 714, 667, 190, 211, 352, 0, 434, - 275, 559, 532, 527, 197, 213, 775, 249, 776, 0, - 0, 780, 0, 0, 0, 782, 781, 0, 783, 749, - 748, 0, 0, 777, 778, 0, 779, 0, 0, 192, - 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, - 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, - 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, - 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, - 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, - 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, - 460, 790, 791, 792, 793, 794, 795, 796, 797, 286, - 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, - 306, 0, 531, 481, 217, 446, 277, 240, 815, 0, - 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, - 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, - 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1178, 0, 0, + 0, 0, 1134, 0, 1153, 1225, 0, 1117, 284, 1128, + 385, 244, 0, 1232, 1242, 1175, 541, 1246, 1173, 1172, + 1219, 1132, 1238, 1166, 349, 1130, 316, 191, 215, 0, + 1164, 395, 441, 453, 1237, 1149, 1158, 242, 1156, 451, + 409, 520, 223, 271, 438, 415, 449, 422, 274, 1198, + 1217, 450, 356, 506, 432, 517, 542, 543, 250, 389, + 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, + 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, + 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, + 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, + 312, 313, 204, 0, 437, 255, 280, 245, 398, 510, + 511, 243, 561, 218, 536, 210, 1129, 535, 391, 505, + 514, 378, 367, 209, 512, 376, 366, 320, 339, 340, + 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, + 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, + 227, 1144, 266, 270, 278, 281, 289, 290, 299, 351, + 402, 428, 424, 433, 1233, 500, 518, 530, 540, 546, + 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, + 474, 319, 357, 1222, 1264, 408, 452, 230, 522, 475, + 1139, 1143, 1137, 1204, 1138, 1193, 1194, 1140, 1255, 1256, + 1257, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 0, + 1226, 1133, 0, 1141, 1142, 1235, 1244, 1245, 581, 368, + 465, 519, 321, 333, 336, 326, 345, 0, 346, 322, + 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, + 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, + 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, + 528, 295, 448, 447, 317, 318, 363, 431, 1197, 190, + 211, 352, 1260, 434, 275, 559, 532, 527, 197, 213, + 1136, 249, 1147, 1155, 0, 1161, 1169, 1170, 1182, 1184, + 1185, 1186, 1187, 1205, 1206, 1208, 1216, 1218, 1221, 1223, + 1230, 1241, 1263, 192, 193, 200, 212, 222, 226, 233, + 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, + 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, + 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, + 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, + 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, + 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, + 301, 556, 557, 286, 516, 545, 0, 0, 362, 1196, + 1202, 365, 268, 291, 306, 1211, 531, 481, 217, 446, + 277, 240, 1229, 1231, 202, 236, 220, 246, 261, 264, + 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, + 464, 487, 488, 489, 491, 379, 253, 416, 1192, 1220, + 360, 497, 498, 302, 380, 0, 0, 0, 0, 0, 496, 0, 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 666, 0, 0, 0, 257, 671, 0, 0, 0, 350, 254, 0, 0, @@ -3331,12 +3005,12 @@ var yyAct = [...]int{ 260, 256, 239, 303, 369, 411, 486, 405, 678, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 674, 675, 0, 0, 0, 0, 0, 0, 0, 0, 309, - 237, 311, 195, 396, 477, 273, 0, 89, 0, 1497, + 237, 311, 195, 396, 477, 273, 0, 89, 0, 0, 816, 800, 766, 767, 804, 817, 818, 819, 820, 805, 0, 228, 806, 807, 235, 808, 0, 765, 706, 708, 707, 725, 726, 727, 728, 729, 730, 731, 704, 813, 821, 822, 0, 252, 307, 259, 251, 501, 0, 0, - 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, + 1927, 1928, 1929, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 648, 663, 0, 677, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, 661, 0, 0, @@ -3395,16 +3069,16 @@ var yyAct = [...]int{ 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 678, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 674, 675, 0, 0, - 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, + 0, 0, 0, 0, 2077, 0, 309, 237, 311, 195, 396, 477, 273, 0, 89, 0, 0, 816, 800, 766, 767, 804, 817, 818, 819, 820, 805, 0, 228, 806, 807, 235, 808, 0, 765, 706, 708, 707, 725, 726, - 727, 728, 729, 730, 731, 704, 813, 821, 822, 0, + 727, 728, 729, 730, 731, 704, 813, 821, 822, 2078, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 648, 663, 0, 677, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 660, 661, 905, 0, 0, 0, 760, + 0, 0, 0, 660, 661, 0, 0, 0, 0, 760, 0, 662, 0, 0, 670, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, @@ -3452,151 +3126,604 @@ var yyAct = [...]int{ 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, 240, 815, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, - 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, - 360, 497, 498, 302, 496, 0, 679, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, - 0, 666, 0, 0, 0, 257, 671, 0, 0, 0, - 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, - 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, - 486, 405, 678, 354, 0, 0, 476, 384, 0, 0, - 0, 0, 0, 674, 675, 0, 0, 0, 0, 0, - 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, - 0, 89, 0, 0, 816, 800, 766, 767, 804, 817, - 818, 819, 820, 805, 0, 228, 806, 807, 235, 808, - 0, 765, 706, 708, 707, 725, 726, 727, 728, 729, - 730, 731, 704, 813, 821, 822, 0, 252, 307, 259, - 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, - 0, 0, 0, 0, 0, 0, 0, 648, 663, 0, - 677, 0, 0, 0, 262, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 660, 661, 0, 0, 0, 0, 760, 0, 662, 0, - 0, 670, 823, 824, 825, 826, 827, 828, 829, 830, - 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, - 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, - 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, - 861, 862, 863, 864, 673, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, - 759, 0, 0, 541, 0, 0, 757, 0, 0, 0, - 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, - 453, 0, 0, 0, 810, 0, 451, 409, 520, 223, - 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, - 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, - 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, - 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, - 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, - 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, - 0, 437, 255, 280, 245, 398, 811, 812, 243, 561, - 712, 536, 210, 0, 535, 391, 505, 514, 378, 367, - 209, 512, 376, 366, 320, 720, 721, 267, 293, 429, - 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, - 199, 0, 478, 525, 562, 224, 225, 227, 0, 266, - 270, 278, 281, 289, 290, 299, 351, 402, 428, 424, - 433, 0, 500, 518, 530, 540, 546, 547, 549, 550, - 551, 552, 553, 555, 554, 390, 297, 474, 319, 357, - 0, 0, 408, 452, 230, 522, 475, 770, 758, 683, - 774, 685, 771, 772, 680, 681, 684, 773, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 579, 580, 0, 761, 669, 668, - 0, 676, 0, 702, 703, 705, 709, 710, 711, 722, - 723, 724, 732, 734, 735, 733, 736, 737, 738, 741, - 742, 743, 744, 739, 740, 745, 686, 690, 687, 688, - 689, 701, 691, 692, 693, 694, 695, 696, 697, 698, - 699, 700, 784, 785, 786, 787, 788, 789, 715, 719, - 718, 716, 717, 713, 714, 667, 190, 211, 352, 0, - 434, 275, 559, 532, 527, 197, 213, 775, 249, 776, - 0, 0, 780, 0, 0, 0, 782, 781, 0, 783, - 749, 748, 0, 0, 777, 778, 0, 779, 0, 0, - 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, - 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, - 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, - 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, - 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, - 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, - 544, 460, 790, 791, 792, 793, 794, 795, 796, 797, - 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, - 291, 306, 0, 531, 481, 217, 446, 277, 240, 815, - 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, - 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, - 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, - 302, 496, 0, 679, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 399, 0, 0, 0, 0, 666, 0, - 0, 0, 257, 671, 0, 0, 0, 350, 254, 0, - 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, - 269, 260, 256, 239, 303, 369, 411, 486, 405, 678, - 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, - 674, 675, 0, 0, 0, 0, 0, 0, 0, 0, - 309, 237, 311, 195, 396, 477, 273, 0, 89, 0, - 0, 816, 800, 766, 767, 804, 817, 818, 819, 820, - 805, 0, 228, 806, 807, 235, 808, 0, 765, 706, - 708, 707, 725, 726, 727, 728, 729, 730, 731, 704, - 813, 821, 822, 0, 252, 307, 259, 251, 501, 0, - 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, - 0, 0, 0, 0, 0, 663, 0, 677, 0, 0, - 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 660, 661, 0, - 0, 0, 0, 760, 0, 662, 0, 0, 670, 823, - 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, - 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 673, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 284, 0, 385, 244, 0, 759, 0, 0, - 541, 0, 0, 757, 0, 0, 0, 0, 349, 0, - 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, - 0, 810, 0, 451, 409, 520, 223, 271, 438, 415, - 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, - 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, - 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, - 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, - 276, 436, 203, 485, 515, 229, 463, 0, 0, 560, - 205, 513, 482, 377, 312, 313, 204, 0, 437, 255, - 280, 245, 398, 811, 812, 243, 561, 712, 536, 210, - 0, 535, 391, 505, 514, 378, 367, 209, 512, 376, - 366, 320, 720, 721, 267, 293, 429, 359, 430, 292, - 294, 387, 386, 388, 198, 524, 0, 199, 0, 478, - 525, 562, 224, 225, 227, 0, 266, 270, 278, 281, - 289, 290, 299, 351, 402, 428, 424, 433, 0, 500, - 518, 530, 540, 546, 547, 549, 550, 551, 552, 553, - 555, 554, 390, 297, 474, 319, 357, 0, 0, 408, - 452, 230, 522, 475, 770, 758, 683, 774, 685, 771, - 772, 680, 681, 684, 773, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 0, 761, 669, 668, 0, 676, 0, - 702, 703, 705, 709, 710, 711, 722, 723, 724, 732, - 734, 735, 733, 736, 737, 738, 741, 742, 743, 744, - 739, 740, 745, 686, 690, 687, 688, 689, 701, 691, - 692, 693, 694, 695, 696, 697, 698, 699, 700, 784, - 785, 786, 787, 788, 789, 715, 719, 718, 716, 717, - 713, 714, 667, 190, 211, 352, 0, 434, 275, 559, - 532, 527, 197, 213, 775, 249, 776, 0, 0, 780, - 0, 0, 0, 782, 781, 0, 783, 749, 748, 0, - 0, 777, 778, 0, 779, 0, 0, 192, 193, 200, - 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, - 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, - 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, - 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, - 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, - 479, 480, 484, 507, 509, 521, 539, 544, 460, 790, - 791, 792, 793, 794, 795, 796, 797, 286, 516, 545, + 464, 487, 488, 489, 491, 379, 253, 416, 0, 380, + 360, 497, 498, 302, 80, 496, 0, 679, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, + 0, 0, 666, 0, 0, 0, 257, 671, 0, 0, + 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, + 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, + 411, 486, 405, 678, 354, 0, 0, 476, 384, 0, + 0, 0, 0, 0, 674, 675, 0, 0, 0, 0, + 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, + 273, 0, 89, 0, 0, 816, 800, 766, 767, 804, + 817, 818, 819, 820, 805, 0, 228, 806, 807, 235, + 808, 0, 765, 706, 708, 707, 725, 726, 727, 728, + 729, 730, 731, 704, 813, 821, 822, 0, 252, 307, + 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, + 219, 0, 0, 0, 0, 0, 0, 0, 648, 663, + 0, 677, 0, 0, 0, 262, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 660, 661, 0, 0, 0, 0, 760, 0, 662, + 0, 0, 670, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, + 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 673, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, + 0, 759, 0, 0, 541, 0, 0, 757, 0, 0, + 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, + 441, 453, 0, 0, 0, 810, 0, 451, 409, 520, + 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, + 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, + 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, + 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, + 232, 221, 508, 526, 276, 436, 203, 485, 515, 229, + 463, 0, 0, 560, 205, 513, 482, 377, 312, 313, + 204, 0, 437, 255, 280, 245, 398, 811, 812, 243, + 561, 712, 536, 210, 0, 535, 391, 505, 514, 378, + 367, 209, 512, 376, 366, 320, 720, 721, 267, 293, + 429, 359, 430, 292, 294, 387, 386, 388, 198, 524, + 0, 199, 0, 478, 525, 562, 224, 225, 227, 0, + 266, 270, 278, 281, 289, 290, 299, 351, 402, 428, + 424, 433, 0, 500, 518, 530, 540, 546, 547, 549, + 550, 551, 552, 553, 555, 554, 390, 297, 474, 319, + 357, 0, 0, 408, 452, 230, 522, 475, 770, 758, + 683, 774, 685, 771, 772, 680, 681, 684, 773, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 0, 761, 669, + 668, 0, 676, 0, 702, 703, 705, 709, 710, 711, + 722, 723, 724, 732, 734, 735, 733, 736, 737, 738, + 741, 742, 743, 744, 739, 740, 745, 686, 690, 687, + 688, 689, 701, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 784, 785, 786, 787, 788, 789, 715, + 719, 718, 716, 717, 713, 714, 667, 190, 211, 352, + 88, 434, 275, 559, 532, 527, 197, 213, 775, 249, + 776, 0, 0, 780, 0, 0, 0, 782, 781, 0, + 783, 749, 748, 0, 0, 777, 778, 0, 779, 0, + 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, + 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, + 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, + 406, 407, 410, 414, 418, 419, 420, 421, 423, 425, + 435, 440, 454, 455, 456, 457, 458, 461, 462, 467, + 468, 469, 470, 471, 479, 480, 484, 507, 509, 521, + 539, 544, 460, 790, 791, 792, 793, 794, 795, 796, + 797, 286, 516, 545, 0, 0, 362, 0, 0, 365, + 268, 291, 306, 0, 531, 481, 217, 446, 277, 240, + 815, 0, 202, 236, 220, 246, 261, 264, 310, 375, + 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, + 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, + 498, 302, 496, 0, 679, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 399, 0, 0, 0, 0, 666, + 0, 0, 0, 257, 671, 0, 0, 0, 350, 254, + 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, + 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, + 678, 354, 0, 0, 476, 384, 0, 0, 0, 0, + 0, 674, 675, 0, 0, 0, 0, 0, 0, 0, + 0, 309, 237, 311, 195, 396, 477, 273, 0, 89, + 0, 0, 816, 800, 766, 767, 804, 817, 818, 819, + 820, 805, 0, 228, 806, 807, 235, 808, 0, 765, + 706, 708, 707, 725, 726, 727, 728, 729, 730, 731, + 704, 813, 821, 822, 0, 252, 307, 259, 251, 501, + 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, + 0, 0, 0, 0, 0, 648, 663, 0, 677, 0, + 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 661, + 0, 0, 0, 0, 760, 0, 662, 0, 0, 670, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, + 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, + 863, 864, 673, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 284, 0, 385, 244, 0, 759, 0, + 0, 541, 0, 0, 757, 0, 0, 0, 0, 349, + 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, + 0, 0, 810, 0, 451, 409, 520, 223, 271, 438, + 415, 449, 422, 274, 3384, 0, 450, 356, 506, 432, + 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, + 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, + 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, + 526, 276, 436, 203, 485, 515, 229, 463, 0, 0, + 560, 205, 513, 482, 377, 312, 313, 204, 0, 437, + 255, 280, 245, 398, 811, 812, 243, 561, 712, 536, + 210, 0, 535, 391, 505, 514, 378, 367, 209, 512, + 376, 366, 320, 720, 721, 267, 293, 429, 359, 430, + 292, 294, 387, 386, 388, 198, 524, 0, 199, 0, + 478, 525, 562, 224, 225, 227, 0, 266, 270, 278, + 281, 289, 290, 299, 351, 402, 428, 424, 433, 0, + 500, 518, 530, 540, 546, 547, 549, 550, 551, 552, + 553, 555, 554, 390, 297, 474, 319, 357, 0, 0, + 408, 452, 230, 522, 475, 770, 758, 683, 774, 685, + 771, 772, 680, 681, 684, 773, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 0, 761, 669, 668, 0, 676, + 0, 702, 703, 705, 709, 710, 711, 722, 723, 724, + 732, 734, 735, 733, 736, 737, 738, 741, 742, 743, + 744, 739, 740, 745, 686, 690, 687, 688, 689, 701, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 784, 785, 786, 787, 788, 789, 715, 719, 718, 716, + 717, 713, 714, 667, 190, 211, 352, 0, 434, 275, + 559, 532, 527, 197, 213, 775, 249, 776, 0, 0, + 780, 0, 0, 0, 782, 781, 0, 783, 749, 748, + 0, 0, 777, 778, 0, 779, 0, 0, 192, 193, + 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, + 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, + 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, + 414, 418, 419, 420, 421, 423, 425, 435, 440, 454, + 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, + 471, 479, 480, 484, 507, 509, 521, 539, 544, 460, + 790, 791, 792, 793, 794, 795, 796, 797, 286, 516, + 545, 0, 0, 362, 0, 0, 365, 268, 291, 306, + 0, 531, 481, 217, 446, 277, 240, 815, 0, 202, + 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, + 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, + 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, + 0, 679, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 399, 0, 0, 0, 0, 666, 0, 0, 0, + 257, 671, 0, 0, 0, 350, 254, 0, 0, 413, + 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, + 256, 239, 303, 369, 411, 486, 405, 678, 354, 0, + 0, 476, 384, 0, 0, 0, 0, 0, 674, 675, + 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, + 311, 195, 396, 477, 273, 0, 89, 0, 1497, 816, + 800, 766, 767, 804, 817, 818, 819, 820, 805, 0, + 228, 806, 807, 235, 808, 0, 765, 706, 708, 707, + 725, 726, 727, 728, 729, 730, 731, 704, 813, 821, + 822, 0, 252, 307, 259, 251, 501, 0, 0, 0, + 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, + 0, 0, 648, 663, 0, 677, 0, 0, 0, 262, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 660, 661, 0, 0, 0, + 0, 760, 0, 662, 0, 0, 670, 823, 824, 825, + 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, + 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, + 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, + 856, 857, 858, 859, 860, 861, 862, 863, 864, 673, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 284, 0, 385, 244, 0, 759, 0, 0, 541, 0, + 0, 757, 0, 0, 0, 0, 349, 0, 316, 191, + 215, 0, 0, 395, 441, 453, 0, 0, 0, 810, + 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, + 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, + 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, + 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, + 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, + 203, 485, 515, 229, 463, 0, 0, 560, 205, 513, + 482, 377, 312, 313, 204, 0, 437, 255, 280, 245, + 398, 811, 812, 243, 561, 712, 536, 210, 0, 535, + 391, 505, 514, 378, 367, 209, 512, 376, 366, 320, + 720, 721, 267, 293, 429, 359, 430, 292, 294, 387, + 386, 388, 198, 524, 0, 199, 0, 478, 525, 562, + 224, 225, 227, 0, 266, 270, 278, 281, 289, 290, + 299, 351, 402, 428, 424, 433, 0, 500, 518, 530, + 540, 546, 547, 549, 550, 551, 552, 553, 555, 554, + 390, 297, 474, 319, 357, 0, 0, 408, 452, 230, + 522, 475, 770, 758, 683, 774, 685, 771, 772, 680, + 681, 684, 773, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 0, 761, 669, 668, 0, 676, 0, 702, 703, + 705, 709, 710, 711, 722, 723, 724, 732, 734, 735, + 733, 736, 737, 738, 741, 742, 743, 744, 739, 740, + 745, 686, 690, 687, 688, 689, 701, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 784, 785, 786, + 787, 788, 789, 715, 719, 718, 716, 717, 713, 714, + 667, 190, 211, 352, 0, 434, 275, 559, 532, 527, + 197, 213, 775, 249, 776, 0, 0, 780, 0, 0, + 0, 782, 781, 0, 783, 749, 748, 0, 0, 777, + 778, 0, 779, 0, 0, 192, 193, 200, 212, 222, + 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, + 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, + 397, 400, 401, 404, 406, 407, 410, 414, 418, 419, + 420, 421, 423, 425, 435, 440, 454, 455, 456, 457, + 458, 461, 462, 467, 468, 469, 470, 471, 479, 480, + 484, 507, 509, 521, 539, 544, 460, 790, 791, 792, + 793, 794, 795, 796, 797, 286, 516, 545, 0, 0, + 362, 0, 0, 365, 268, 291, 306, 0, 531, 481, + 217, 446, 277, 240, 815, 0, 202, 236, 220, 246, + 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, + 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, + 380, 0, 360, 497, 498, 302, 496, 0, 679, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, + 0, 0, 0, 666, 0, 0, 0, 257, 671, 0, + 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, + 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, + 369, 411, 486, 405, 678, 354, 0, 0, 476, 384, + 0, 0, 0, 0, 0, 674, 675, 0, 0, 0, + 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, + 477, 273, 0, 89, 0, 0, 816, 800, 766, 767, + 804, 817, 818, 819, 820, 805, 0, 228, 806, 807, + 235, 808, 0, 765, 706, 708, 707, 725, 726, 727, + 728, 729, 730, 731, 704, 813, 821, 822, 0, 252, + 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, + 0, 219, 0, 0, 0, 0, 0, 0, 0, 648, + 663, 0, 677, 0, 0, 0, 262, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 661, 905, 0, 0, 0, 760, 0, + 662, 0, 0, 670, 823, 824, 825, 826, 827, 828, + 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, + 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, + 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 673, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, + 244, 0, 759, 0, 0, 541, 0, 0, 757, 0, + 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, + 395, 441, 453, 0, 0, 0, 810, 0, 451, 409, + 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, + 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, + 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, + 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, + 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, + 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, + 313, 204, 0, 437, 255, 280, 245, 398, 811, 812, + 243, 561, 712, 536, 210, 0, 535, 391, 505, 514, + 378, 367, 209, 512, 376, 366, 320, 720, 721, 267, + 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, + 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, + 0, 266, 270, 278, 281, 289, 290, 299, 351, 402, + 428, 424, 433, 0, 500, 518, 530, 540, 546, 547, + 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, + 319, 357, 0, 0, 408, 452, 230, 522, 475, 770, + 758, 683, 774, 685, 771, 772, 680, 681, 684, 773, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 0, 761, + 669, 668, 0, 676, 0, 702, 703, 705, 709, 710, + 711, 722, 723, 724, 732, 734, 735, 733, 736, 737, + 738, 741, 742, 743, 744, 739, 740, 745, 686, 690, + 687, 688, 689, 701, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 784, 785, 786, 787, 788, 789, + 715, 719, 718, 716, 717, 713, 714, 667, 190, 211, + 352, 0, 434, 275, 559, 532, 527, 197, 213, 775, + 249, 776, 0, 0, 780, 0, 0, 0, 782, 781, + 0, 783, 749, 748, 0, 0, 777, 778, 0, 779, + 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, + 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, + 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, + 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, + 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, + 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, + 521, 539, 544, 460, 790, 791, 792, 793, 794, 795, + 796, 797, 286, 516, 545, 0, 0, 362, 0, 0, + 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, + 240, 815, 0, 202, 236, 220, 246, 261, 264, 310, + 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, + 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, + 497, 498, 302, 496, 0, 679, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, + 666, 0, 0, 0, 257, 671, 0, 0, 0, 350, + 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, + 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, + 405, 678, 354, 0, 0, 476, 384, 0, 0, 0, + 0, 0, 674, 675, 0, 0, 0, 0, 0, 0, + 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, + 89, 0, 0, 816, 800, 766, 767, 804, 817, 818, + 819, 820, 805, 0, 228, 806, 807, 235, 808, 0, + 765, 706, 708, 707, 725, 726, 727, 728, 729, 730, + 731, 704, 813, 821, 822, 0, 252, 307, 259, 251, + 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, + 0, 0, 0, 0, 0, 0, 648, 663, 0, 677, + 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, + 661, 0, 0, 0, 0, 760, 0, 662, 0, 0, + 670, 823, 824, 825, 826, 827, 828, 829, 830, 831, + 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, + 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, + 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, + 862, 863, 864, 673, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 284, 0, 385, 244, 0, 759, + 0, 0, 541, 0, 0, 757, 0, 0, 0, 0, + 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, + 0, 0, 0, 810, 0, 451, 409, 520, 223, 271, + 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, + 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, + 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, + 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, + 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, + 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, + 437, 255, 280, 245, 398, 811, 812, 243, 561, 712, + 536, 210, 0, 535, 391, 505, 514, 378, 367, 209, + 512, 376, 366, 320, 720, 721, 267, 293, 429, 359, + 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, + 0, 478, 525, 562, 224, 225, 227, 0, 266, 270, + 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, + 0, 500, 518, 530, 540, 546, 547, 549, 550, 551, + 552, 553, 555, 554, 390, 297, 474, 319, 357, 0, + 0, 408, 452, 230, 522, 475, 770, 758, 683, 774, + 685, 771, 772, 680, 681, 684, 773, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 0, 761, 669, 668, 0, + 676, 0, 702, 703, 705, 709, 710, 711, 722, 723, + 724, 732, 734, 735, 733, 736, 737, 738, 741, 742, + 743, 744, 739, 740, 745, 686, 690, 687, 688, 689, + 701, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 784, 785, 786, 787, 788, 789, 715, 719, 718, + 716, 717, 713, 714, 667, 190, 211, 352, 0, 434, + 275, 559, 532, 527, 197, 213, 775, 249, 776, 0, + 0, 780, 0, 0, 0, 782, 781, 0, 783, 749, + 748, 0, 0, 777, 778, 0, 779, 0, 0, 192, + 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, + 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, + 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, + 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, + 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, + 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, + 460, 790, 791, 792, 793, 794, 795, 796, 797, 286, + 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, + 306, 0, 531, 481, 217, 446, 277, 240, 815, 0, + 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, + 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, + 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, + 496, 0, 679, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 399, 0, 0, 0, 0, 666, 0, 0, + 0, 257, 671, 0, 0, 0, 350, 254, 0, 0, + 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, + 260, 256, 239, 303, 369, 411, 486, 405, 678, 354, + 0, 0, 476, 384, 0, 0, 0, 0, 0, 674, + 675, 0, 0, 0, 0, 0, 0, 0, 0, 309, + 237, 311, 195, 396, 477, 273, 0, 89, 0, 0, + 816, 800, 766, 767, 804, 817, 818, 819, 820, 805, + 0, 228, 806, 807, 235, 808, 0, 765, 706, 708, + 707, 725, 726, 727, 728, 729, 730, 731, 704, 813, + 821, 822, 0, 252, 307, 259, 251, 501, 0, 0, + 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, + 0, 0, 0, 0, 663, 0, 677, 0, 0, 0, + 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 661, 0, 0, + 0, 0, 760, 0, 662, 0, 0, 670, 823, 824, + 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, + 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, + 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, + 673, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 284, 0, 385, 244, 0, 759, 0, 0, 541, + 0, 0, 757, 0, 0, 0, 0, 349, 0, 316, + 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, + 810, 0, 451, 409, 520, 223, 271, 438, 415, 449, + 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, + 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, + 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, + 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, + 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, + 513, 482, 377, 312, 313, 204, 0, 437, 255, 280, + 245, 398, 811, 812, 243, 561, 712, 536, 210, 0, + 535, 391, 505, 514, 378, 367, 209, 512, 376, 366, + 320, 720, 721, 267, 293, 429, 359, 430, 292, 294, + 387, 386, 388, 198, 524, 0, 199, 0, 478, 525, + 562, 224, 225, 227, 0, 266, 270, 278, 281, 289, + 290, 299, 351, 402, 428, 424, 433, 0, 500, 518, + 530, 540, 546, 547, 549, 550, 551, 552, 553, 555, + 554, 390, 297, 474, 319, 357, 0, 0, 408, 452, + 230, 522, 475, 770, 758, 683, 774, 685, 771, 772, + 680, 681, 684, 773, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 0, 761, 669, 668, 0, 676, 0, 702, + 703, 705, 709, 710, 711, 722, 723, 724, 732, 734, + 735, 733, 736, 737, 738, 741, 742, 743, 744, 739, + 740, 745, 686, 690, 687, 688, 689, 701, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 784, 785, + 786, 787, 788, 789, 715, 719, 718, 716, 717, 713, + 714, 667, 190, 211, 352, 0, 434, 275, 559, 532, + 527, 197, 213, 775, 249, 776, 0, 0, 780, 0, + 0, 0, 782, 781, 0, 783, 749, 748, 0, 0, + 777, 778, 0, 779, 0, 0, 192, 193, 200, 212, + 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, + 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, + 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, + 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, + 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, + 480, 484, 507, 509, 521, 539, 544, 460, 790, 791, + 792, 793, 794, 795, 796, 797, 286, 516, 545, 0, + 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, + 481, 217, 446, 277, 240, 815, 0, 202, 236, 220, + 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, + 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, + 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, + 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, + 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, + 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, + 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, + 396, 477, 273, 0, 0, 0, 0, 0, 627, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, + 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, + 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, + 0, 0, 219, 0, 0, 0, 0, 1313, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1322, 1321, 1323, + 1324, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, + 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, + 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, + 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, + 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, + 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, + 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, + 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, + 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, + 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, + 312, 313, 204, 0, 437, 255, 280, 245, 398, 510, + 511, 243, 561, 218, 536, 210, 0, 535, 391, 505, + 514, 378, 367, 209, 512, 376, 366, 320, 339, 340, + 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, + 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, + 227, 0, 266, 270, 278, 281, 289, 290, 299, 351, + 402, 428, 424, 433, 0, 500, 518, 530, 540, 546, + 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, + 474, 319, 357, 0, 0, 408, 452, 230, 522, 475, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 581, 368, + 465, 519, 321, 333, 336, 326, 345, 0, 346, 322, + 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, + 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, + 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, + 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, + 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, + 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, + 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, + 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, + 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, + 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, + 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, + 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, + 301, 556, 557, 286, 516, 545, 0, 0, 362, 0, + 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, + 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, + 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, + 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, + 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, + 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, + 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, + 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, + 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, + 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, + 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, + 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, + 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, + 0, 976, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, + 0, 0, 975, 541, 0, 0, 0, 0, 0, 972, + 973, 349, 933, 316, 191, 215, 966, 970, 395, 441, + 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, + 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, + 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, + 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, + 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, + 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, + 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, + 0, 437, 255, 280, 245, 398, 510, 511, 243, 561, + 218, 536, 210, 0, 535, 391, 505, 514, 378, 367, + 209, 512, 376, 366, 320, 339, 340, 267, 293, 429, + 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, + 199, 0, 478, 525, 562, 224, 225, 227, 0, 266, + 270, 278, 281, 289, 290, 299, 351, 402, 428, 424, + 433, 0, 500, 518, 530, 540, 546, 547, 549, 550, + 551, 552, 553, 555, 554, 390, 297, 474, 319, 357, + 0, 0, 408, 452, 230, 522, 475, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 581, 368, 465, 519, 321, + 333, 336, 326, 345, 0, 346, 322, 323, 328, 330, + 331, 332, 337, 338, 342, 348, 238, 201, 374, 382, + 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, + 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, + 447, 317, 318, 363, 431, 0, 190, 211, 352, 0, + 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, + 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, + 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, + 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, + 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, + 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, + 544, 460, 287, 288, 426, 427, 300, 301, 556, 557, + 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, + 291, 306, 0, 531, 481, 217, 446, 277, 240, 0, + 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, + 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, + 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, + 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, + 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, + 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, + 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, + 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, + 0, 1460, 800, 0, 0, 1457, 0, 0, 0, 0, + 1455, 0, 228, 1456, 1454, 235, 1459, 0, 765, 335, + 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, + 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, + 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, + 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, + 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, + 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, + 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, + 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, + 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, + 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, + 276, 436, 203, 485, 515, 229, 463, 0, 0, 560, + 205, 513, 482, 377, 312, 313, 204, 0, 437, 255, + 280, 245, 398, 510, 511, 243, 561, 218, 536, 210, + 0, 535, 391, 505, 514, 378, 367, 209, 512, 376, + 366, 320, 339, 340, 267, 293, 429, 359, 430, 292, + 294, 387, 386, 388, 198, 524, 0, 199, 0, 478, + 525, 562, 224, 225, 227, 0, 266, 270, 278, 281, + 289, 290, 299, 351, 402, 428, 424, 433, 0, 500, + 518, 530, 540, 546, 547, 549, 550, 551, 552, 553, + 555, 554, 390, 297, 474, 319, 357, 0, 0, 408, + 452, 230, 522, 475, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 581, 368, 465, 519, 321, 333, 336, 326, + 345, 0, 346, 322, 323, 328, 330, 331, 332, 337, + 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, + 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, + 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, + 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, + 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, + 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, + 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, + 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, + 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, + 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, + 479, 480, 484, 507, 509, 521, 539, 544, 460, 287, + 288, 426, 427, 300, 301, 556, 557, 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, - 531, 481, 217, 446, 277, 240, 815, 0, 202, 236, + 531, 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, - 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, + 253, 416, 0, 380, 360, 497, 498, 302, 80, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, - 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, - 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, - 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, - 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 0, 0, 0, 0, 627, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, - 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, - 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, - 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, - 0, 0, 0, 219, 0, 976, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, + 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, + 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, + 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, + 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, + 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, + 311, 195, 396, 477, 273, 0, 89, 0, 0, 0, + 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, + 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, + 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, + 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3604,64 +3731,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, 0, 0, 0, 0, 284, - 0, 385, 244, 0, 0, 0, 975, 541, 0, 0, - 0, 0, 0, 972, 973, 349, 933, 316, 191, 215, - 966, 970, 395, 441, 453, 0, 0, 0, 242, 0, - 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, - 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, - 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, - 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, - 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, - 485, 515, 229, 463, 0, 0, 560, 205, 513, 482, - 377, 312, 313, 204, 0, 437, 255, 280, 245, 398, - 510, 511, 243, 561, 218, 536, 210, 0, 535, 391, - 505, 514, 378, 367, 209, 512, 376, 366, 320, 339, - 340, 267, 293, 429, 359, 430, 292, 294, 387, 386, - 388, 198, 524, 0, 199, 0, 478, 525, 562, 224, - 225, 227, 0, 266, 270, 278, 281, 289, 290, 299, - 351, 402, 428, 424, 433, 0, 500, 518, 530, 540, - 546, 547, 549, 550, 551, 552, 553, 555, 554, 390, - 297, 474, 319, 357, 0, 0, 408, 452, 230, 522, - 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 581, - 368, 465, 519, 321, 333, 336, 326, 345, 0, 346, - 322, 323, 328, 330, 331, 332, 337, 338, 342, 348, - 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, - 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, - 279, 528, 295, 448, 447, 317, 318, 363, 431, 0, - 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, - 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, - 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, - 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, - 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, - 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, - 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, - 507, 509, 521, 539, 544, 460, 287, 288, 426, 427, - 300, 301, 556, 557, 286, 516, 545, 0, 0, 362, - 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, - 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, - 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, - 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, - 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, - 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, - 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, - 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, - 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, + 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, + 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, + 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, + 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, + 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, + 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, + 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, + 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, + 203, 485, 515, 229, 463, 0, 0, 560, 205, 513, + 482, 377, 312, 313, 204, 0, 437, 255, 280, 245, + 398, 510, 511, 243, 561, 218, 536, 210, 0, 535, + 391, 505, 514, 378, 367, 209, 512, 376, 366, 320, + 339, 340, 267, 293, 429, 359, 430, 292, 294, 387, + 386, 388, 198, 524, 0, 199, 0, 478, 525, 562, + 224, 225, 227, 0, 266, 270, 278, 281, 289, 290, + 299, 351, 402, 428, 424, 433, 0, 500, 518, 530, + 540, 546, 547, 549, 550, 551, 552, 553, 555, 554, + 390, 297, 474, 319, 357, 0, 0, 408, 452, 230, + 522, 475, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 581, 368, 465, 519, 321, 333, 336, 326, 345, 0, + 346, 322, 323, 328, 330, 331, 332, 337, 338, 342, + 348, 238, 201, 374, 382, 499, 298, 206, 207, 208, + 492, 493, 494, 495, 533, 534, 538, 442, 443, 444, + 445, 279, 528, 295, 448, 447, 317, 318, 363, 431, + 0, 190, 211, 352, 88, 434, 275, 559, 532, 527, + 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, + 2064, 0, 0, 2063, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, + 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, + 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, + 397, 400, 401, 404, 406, 407, 410, 414, 418, 419, + 420, 421, 423, 425, 435, 440, 454, 455, 456, 457, + 458, 461, 462, 467, 468, 469, 470, 471, 479, 480, + 484, 507, 509, 521, 539, 544, 460, 287, 288, 426, + 427, 300, 301, 556, 557, 286, 516, 545, 0, 0, + 362, 0, 0, 365, 268, 291, 306, 0, 531, 481, + 217, 446, 277, 240, 0, 0, 202, 236, 220, 246, + 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, + 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, + 1516, 0, 360, 497, 498, 302, 496, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, + 0, 0, 1518, 0, 0, 0, 0, 257, 0, 0, + 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, + 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, + 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, - 273, 0, 0, 0, 0, 1460, 800, 0, 0, 1457, - 0, 0, 0, 0, 1455, 0, 228, 1456, 1454, 235, - 1459, 0, 765, 335, 344, 343, 324, 325, 327, 329, - 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, - 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, - 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, + 477, 273, 0, 0, 0, 0, 1520, 627, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, + 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, + 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, + 0, 219, 0, 0, 0, 1294, 0, 1295, 1296, 0, + 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3669,187 +3796,187 @@ 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, 284, 0, 385, 244, - 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, - 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, - 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, - 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, - 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, - 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, - 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, - 232, 221, 508, 526, 276, 436, 203, 485, 515, 229, - 463, 0, 0, 560, 205, 513, 482, 377, 312, 313, - 204, 0, 437, 255, 280, 245, 398, 510, 511, 243, - 561, 218, 536, 210, 0, 535, 391, 505, 514, 378, - 367, 209, 512, 376, 366, 320, 339, 340, 267, 293, - 429, 359, 430, 292, 294, 387, 386, 388, 198, 524, - 0, 199, 0, 478, 525, 562, 224, 225, 227, 0, - 266, 270, 278, 281, 289, 290, 299, 351, 402, 428, - 424, 433, 0, 500, 518, 530, 540, 546, 547, 549, - 550, 551, 552, 553, 555, 554, 390, 297, 474, 319, - 357, 0, 0, 408, 452, 230, 522, 475, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 563, - 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, - 574, 575, 576, 577, 578, 579, 580, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 581, 368, 465, 519, - 321, 333, 336, 326, 345, 0, 346, 322, 323, 328, - 330, 331, 332, 337, 338, 342, 348, 238, 201, 374, - 382, 499, 298, 206, 207, 208, 492, 493, 494, 495, - 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, - 448, 447, 317, 318, 363, 431, 0, 190, 211, 352, - 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, + 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, + 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, + 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, + 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, + 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, + 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, + 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, + 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, + 355, 232, 221, 508, 526, 276, 436, 203, 485, 515, + 229, 463, 0, 0, 560, 205, 513, 482, 377, 312, + 313, 204, 0, 437, 255, 280, 245, 398, 510, 511, + 243, 561, 218, 536, 210, 0, 535, 391, 505, 514, + 378, 367, 209, 512, 376, 366, 320, 339, 340, 267, + 293, 429, 359, 430, 292, 294, 387, 386, 388, 198, + 524, 0, 199, 0, 478, 525, 562, 224, 225, 227, + 0, 266, 270, 278, 281, 289, 290, 299, 351, 402, + 428, 424, 433, 0, 500, 518, 530, 540, 546, 547, + 549, 550, 551, 552, 553, 555, 554, 390, 297, 474, + 319, 357, 0, 0, 408, 452, 230, 522, 475, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 581, 368, 465, + 519, 321, 333, 336, 326, 345, 0, 346, 322, 323, + 328, 330, 331, 332, 337, 338, 342, 348, 238, 201, + 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, + 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, + 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, + 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, + 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, + 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, + 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, + 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, + 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, + 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, + 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, + 556, 557, 286, 516, 545, 0, 0, 362, 0, 0, + 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, + 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, + 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, + 487, 488, 489, 491, 379, 253, 416, 0, 380, 360, + 497, 498, 302, 80, 496, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, + 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, + 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, + 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, + 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, - 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, - 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, - 406, 407, 410, 414, 418, 419, 420, 421, 423, 425, - 435, 440, 454, 455, 456, 457, 458, 461, 462, 467, - 468, 469, 470, 471, 479, 480, 484, 507, 509, 521, - 539, 544, 460, 287, 288, 426, 427, 300, 301, 556, - 557, 286, 516, 545, 0, 0, 362, 0, 0, 365, - 268, 291, 306, 0, 531, 481, 217, 446, 277, 240, - 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, - 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, - 488, 489, 491, 379, 253, 416, 0, 380, 360, 497, - 498, 302, 80, 496, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, - 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, - 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, - 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, - 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, + 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, + 0, 89, 0, 1497, 0, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, + 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, + 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, + 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 89, 0, 0, 0, 188, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, - 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, - 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, - 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, + 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, + 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, + 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, + 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, + 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, + 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, + 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, + 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, + 221, 508, 526, 276, 436, 203, 485, 515, 229, 463, + 0, 0, 560, 205, 513, 482, 377, 312, 313, 204, + 0, 437, 255, 280, 245, 398, 510, 511, 243, 561, + 218, 536, 210, 0, 535, 391, 505, 514, 378, 367, + 209, 512, 376, 366, 320, 339, 340, 267, 293, 429, + 359, 430, 292, 294, 387, 386, 388, 198, 524, 0, + 199, 0, 478, 525, 562, 224, 225, 227, 0, 266, + 270, 278, 281, 289, 290, 299, 351, 402, 428, 424, + 433, 0, 500, 518, 530, 540, 546, 547, 549, 550, + 551, 552, 553, 555, 554, 390, 297, 474, 319, 357, + 0, 0, 408, 452, 230, 522, 475, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 581, 368, 465, 519, 321, + 333, 336, 326, 345, 0, 346, 322, 323, 328, 330, + 331, 332, 337, 338, 342, 348, 238, 201, 374, 382, + 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, + 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, + 447, 317, 318, 363, 431, 0, 190, 211, 352, 88, + 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, - 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, - 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, - 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, - 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, - 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, - 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, - 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, - 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, - 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, - 437, 255, 280, 245, 398, 510, 511, 243, 561, 218, - 536, 210, 0, 535, 391, 505, 514, 378, 367, 209, - 512, 376, 366, 320, 339, 340, 267, 293, 429, 359, - 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, - 0, 478, 525, 562, 224, 225, 227, 0, 266, 270, - 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, - 0, 500, 518, 530, 540, 546, 547, 549, 550, 551, - 552, 553, 555, 554, 390, 297, 474, 319, 357, 0, - 0, 408, 452, 230, 522, 475, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 581, 368, 465, 519, 321, 333, - 336, 326, 345, 0, 346, 322, 323, 328, 330, 331, - 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, - 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, - 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, - 317, 318, 363, 431, 0, 190, 211, 352, 88, 434, - 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, - 0, 0, 0, 0, 2064, 0, 0, 2063, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, - 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, - 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, - 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, - 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, - 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, - 460, 287, 288, 426, 427, 300, 301, 556, 557, 286, - 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, - 306, 0, 531, 481, 217, 446, 277, 240, 0, 0, - 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, - 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, - 491, 379, 253, 416, 1516, 0, 360, 497, 498, 302, - 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 399, 0, 0, 0, 1518, 0, 0, 0, - 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, - 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, - 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, - 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, - 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 1520, 627, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, - 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, - 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, - 0, 0, 0, 0, 0, 219, 0, 0, 0, 1294, - 0, 1295, 1296, 0, 0, 0, 0, 0, 0, 0, - 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, + 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, + 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, + 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, + 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, + 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, + 544, 460, 287, 288, 426, 427, 300, 301, 556, 557, + 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, + 291, 306, 0, 531, 481, 217, 446, 277, 240, 0, + 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, + 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, + 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, + 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, + 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, + 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, + 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, + 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 309, 237, 311, 195, 396, 477, 273, 0, 89, 0, + 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, + 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, + 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, + 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, - 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, - 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, - 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, - 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, - 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, - 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, - 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, - 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, - 513, 482, 377, 312, 313, 204, 0, 437, 255, 280, - 245, 398, 510, 511, 243, 561, 218, 536, 210, 0, - 535, 391, 505, 514, 378, 367, 209, 512, 376, 366, - 320, 339, 340, 267, 293, 429, 359, 430, 292, 294, - 387, 386, 388, 198, 524, 0, 199, 0, 478, 525, - 562, 224, 225, 227, 0, 266, 270, 278, 281, 289, - 290, 299, 351, 402, 428, 424, 433, 0, 500, 518, - 530, 540, 546, 547, 549, 550, 551, 552, 553, 555, - 554, 390, 297, 474, 319, 357, 0, 0, 408, 452, - 230, 522, 475, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, - 579, 580, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 581, 368, 465, 519, 321, 333, 336, 326, 345, - 0, 346, 322, 323, 328, 330, 331, 332, 337, 338, - 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, - 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, - 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, - 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, - 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, - 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, - 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, - 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, - 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, - 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, - 480, 484, 507, 509, 521, 539, 544, 460, 287, 288, - 426, 427, 300, 301, 556, 557, 286, 516, 545, 0, - 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, - 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, - 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, - 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, - 416, 0, 380, 360, 497, 498, 302, 80, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, + 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, + 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, + 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, + 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, + 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, + 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, + 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, + 276, 436, 203, 485, 515, 229, 463, 0, 0, 560, + 205, 513, 482, 377, 312, 313, 204, 0, 437, 255, + 280, 245, 398, 510, 511, 243, 561, 218, 536, 210, + 0, 535, 391, 505, 514, 378, 367, 209, 512, 376, + 366, 320, 339, 340, 267, 293, 429, 359, 430, 292, + 294, 387, 386, 388, 198, 524, 0, 199, 0, 478, + 525, 562, 224, 225, 227, 0, 266, 270, 278, 281, + 289, 290, 299, 351, 402, 428, 424, 433, 0, 500, + 518, 530, 540, 546, 547, 549, 550, 551, 552, 553, + 555, 554, 390, 297, 474, 319, 357, 0, 0, 408, + 452, 230, 522, 475, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 581, 368, 465, 519, 321, 333, 336, 326, + 345, 0, 346, 322, 323, 328, 330, 331, 332, 337, + 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, + 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, + 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, + 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, + 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, + 0, 0, 2064, 0, 0, 2063, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, + 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, + 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, + 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, + 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, + 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, + 479, 480, 484, 507, 509, 521, 539, 544, 460, 287, + 288, 426, 427, 300, 301, 556, 557, 286, 516, 545, + 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, + 531, 481, 217, 446, 277, 240, 0, 0, 202, 236, + 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, + 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, + 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 399, 0, 0, 0, 2014, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 89, 0, 1497, 0, 627, + 195, 396, 477, 273, 0, 0, 0, 0, 1697, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, @@ -3868,7 +3995,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, - 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, + 0, 2012, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, 436, 203, @@ -3891,7 +4018,7 @@ var yyAct = [...]int{ 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, 431, 0, - 190, 211, 352, 88, 434, 275, 559, 532, 527, 197, + 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, @@ -3914,14 +4041,14 @@ var yyAct = [...]int{ 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, - 273, 0, 89, 0, 0, 0, 188, 0, 0, 0, + 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3930,7 +4057,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, - 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, + 0, 0, 349, 933, 316, 191, 215, 931, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, @@ -3957,7 +4084,7 @@ var yyAct = [...]int{ 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, - 0, 0, 0, 0, 0, 0, 2064, 0, 0, 2063, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, @@ -3997,7 +4124,7 @@ var yyAct = [...]int{ 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, - 415, 449, 422, 274, 0, 2012, 450, 356, 506, 432, + 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, 508, @@ -4043,14 +4170,14 @@ var yyAct = [...]int{ 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, - 311, 195, 396, 477, 273, 0, 0, 0, 0, 0, + 311, 195, 396, 477, 273, 0, 0, 0, 1497, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, - 0, 0, 0, 0, 0, 0, 0, 0, 927, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4059,8 +4186,8 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, - 0, 0, 0, 0, 0, 0, 349, 933, 316, 191, - 215, 931, 0, 395, 441, 453, 0, 0, 0, 242, + 0, 0, 3294, 0, 0, 0, 349, 0, 316, 191, + 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, 483, @@ -4102,13 +4229,13 @@ var yyAct = [...]int{ 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, - 0, 0, 2014, 0, 0, 0, 0, 257, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, - 477, 273, 0, 0, 0, 0, 1697, 188, 0, 0, + 477, 273, 0, 0, 0, 0, 1847, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, @@ -4117,7 +4244,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4173,7 +4300,7 @@ var yyAct = [...]int{ 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 0, 0, 1497, 0, 627, 0, 0, 0, 0, 0, + 0, 0, 0, 2415, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, @@ -4182,13 +4309,13 @@ var yyAct = [...]int{ 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, - 0, 0, 541, 0, 0, 0, 3294, 0, 0, 0, + 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, @@ -4238,15 +4365,15 @@ var yyAct = [...]int{ 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 1847, 627, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, + 0, 627, 0, 0, 0, 0, 2400, 0, 0, 0, + 0, 228, 0, 0, 235, 2401, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1848, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4296,13 +4423,13 @@ var yyAct = [...]int{ 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 257, 1539, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 0, 0, 2415, 627, 0, + 396, 477, 273, 0, 0, 0, 0, 1538, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, @@ -4311,7 +4438,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2416, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4367,8 +4494,8 @@ var yyAct = [...]int{ 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, - 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, - 2400, 0, 0, 0, 0, 228, 0, 0, 235, 2401, + 0, 0, 0, 0, 0, 629, 630, 631, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, 0, 0, 219, @@ -4426,13 +4553,13 @@ var yyAct = [...]int{ 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, - 0, 0, 257, 1539, 0, 0, 0, 350, 254, 0, + 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, - 0, 1538, 627, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, @@ -4447,7 +4574,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, - 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, + 541, 0, 0, 0, 3419, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, @@ -4496,8 +4623,8 @@ var yyAct = [...]int{ 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 0, 0, 0, 0, 629, - 630, 631, 0, 0, 0, 0, 0, 0, 0, 228, + 195, 396, 477, 273, 0, 0, 0, 0, 1697, 188, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, 0, @@ -4576,7 +4703,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, - 0, 0, 0, 0, 541, 0, 0, 0, 3418, 0, + 0, 0, 0, 0, 541, 0, 0, 0, 3294, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, @@ -4625,8 +4752,8 @@ var yyAct = [...]int{ 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, - 0, 0, 1697, 188, 0, 0, 0, 0, 0, 0, + 0, 309, 237, 311, 195, 396, 477, 273, 0, 89, + 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, @@ -4683,7 +4810,7 @@ var yyAct = [...]int{ 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2065, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, @@ -4691,7 +4818,7 @@ var yyAct = [...]int{ 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, 0, - 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, @@ -4706,7 +4833,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, - 0, 0, 3294, 0, 0, 0, 349, 0, 316, 191, + 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, 543, @@ -4755,7 +4882,7 @@ var yyAct = [...]int{ 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, - 477, 273, 0, 89, 0, 0, 0, 627, 0, 0, + 477, 273, 0, 0, 0, 0, 1520, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, @@ -4812,7 +4939,7 @@ var yyAct = [...]int{ 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, - 497, 498, 302, 496, 0, 0, 0, 0, 2065, 0, + 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, @@ -4861,7 +4988,7 @@ var yyAct = [...]int{ 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, - 317, 318, 363, 431, 0, 190, 211, 352, 0, 434, + 317, 318, 363, 431, 0, 190, 211, 352, 1802, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, @@ -4885,7 +5012,7 @@ var yyAct = [...]int{ 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 1520, 627, 0, 0, 0, 0, 0, 0, 0, 0, + 1794, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, @@ -4943,7 +5070,7 @@ var yyAct = [...]int{ 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 1664, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, @@ -4958,7 +5085,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1327, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5007,14 +5134,14 @@ var yyAct = [...]int{ 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 399, 0, 1662, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, - 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, @@ -5055,7 +5182,7 @@ var yyAct = [...]int{ 331, 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, 295, 448, - 447, 317, 318, 363, 431, 0, 190, 211, 352, 1802, + 447, 317, 318, 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5072,14 +5199,14 @@ var yyAct = [...]int{ 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 399, 0, 1660, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, - 0, 1794, 627, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, @@ -5137,7 +5264,7 @@ var yyAct = [...]int{ 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 399, 0, 1664, 0, 0, 0, 0, 0, 0, 257, + 399, 0, 1658, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, @@ -5201,7 +5328,7 @@ var yyAct = [...]int{ 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 399, 0, 1662, + 0, 0, 0, 0, 0, 0, 0, 399, 0, 1656, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, @@ -5266,7 +5393,7 @@ var yyAct = [...]int{ 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 399, 0, 1660, 0, 0, 0, + 0, 0, 0, 0, 399, 0, 1652, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, @@ -5331,7 +5458,7 @@ var yyAct = [...]int{ 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 399, 0, 1658, 0, 0, 0, 0, 0, 0, + 0, 399, 0, 1650, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, @@ -5396,7 +5523,7 @@ var yyAct = [...]int{ 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, - 1656, 0, 0, 0, 0, 0, 0, 257, 0, 0, + 1648, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, @@ -5460,14 +5587,14 @@ var yyAct = [...]int{ 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 399, 0, 1652, 0, 0, + 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, + 1623, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, @@ -5525,14 +5652,14 @@ var yyAct = [...]int{ 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 399, 0, 1650, 0, 0, 0, 0, 0, - 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, + 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, + 1524, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, @@ -5590,13 +5717,13 @@ var yyAct = [...]int{ 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 1648, 0, 0, 0, 0, 0, 0, 257, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 0, 0, 0, 627, 0, + 396, 477, 273, 0, 89, 0, 0, 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, @@ -5661,7 +5788,7 @@ var yyAct = [...]int{ 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, - 0, 1623, 0, 0, 0, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, @@ -5675,7 +5802,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, + 0, 0, 0, 1277, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, @@ -5713,14 +5840,14 @@ var yyAct = [...]int{ 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, 556, 557, - 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, + 1276, 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, - 0, 1524, 257, 0, 0, 0, 0, 350, 254, 0, + 0, 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, @@ -5770,7 +5897,7 @@ var yyAct = [...]int{ 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, + 0, 0, 0, 886, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, @@ -5790,7 +5917,7 @@ var yyAct = [...]int{ 239, 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, - 195, 396, 477, 273, 0, 89, 0, 0, 0, 800, + 195, 396, 477, 273, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, @@ -5805,7 +5932,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, - 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, + 0, 385, 244, 0, 0, 584, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, 274, @@ -5855,7 +5982,7 @@ var yyAct = [...]int{ 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, - 273, 0, 0, 0, 0, 0, 188, 0, 0, 0, + 273, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, @@ -5869,7 +5996,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1277, 0, 284, 0, 385, 244, + 0, 0, 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, @@ -5902,12 +6029,12 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, - 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, + 371, 372, 373, 3427, 393, 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, 556, - 557, 1276, 516, 545, 0, 0, 362, 0, 0, 365, + 557, 286, 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, 487, @@ -5920,7 +6047,7 @@ var yyAct = [...]int{ 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, - 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, @@ -5964,7 +6091,7 @@ var yyAct = [...]int{ 318, 363, 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 886, 0, 0, 0, 192, 193, + 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, 410, @@ -5985,7 +6112,7 @@ var yyAct = [...]int{ 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, 0, - 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, 0, @@ -5999,7 +6126,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 284, 0, 385, 244, 0, 0, 584, 0, 541, 0, + 284, 0, 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, 422, @@ -6049,7 +6176,7 @@ var yyAct = [...]int{ 369, 411, 486, 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, 396, - 477, 273, 0, 0, 0, 0, 0, 627, 0, 0, + 477, 273, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, 252, @@ -6089,240 +6216,46 @@ var yyAct = [...]int{ 519, 321, 333, 336, 326, 345, 0, 346, 322, 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, 494, - 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, - 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, - 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, - 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, - 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, - 370, 371, 372, 373, 3426, 393, 394, 397, 400, 401, - 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, - 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, - 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, - 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, - 556, 557, 286, 516, 545, 0, 0, 362, 0, 0, - 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, - 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, - 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, - 487, 488, 489, 491, 379, 253, 416, 380, 0, 360, - 497, 498, 302, 496, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, - 0, 0, 0, 0, 257, 0, 0, 0, 0, 350, - 254, 0, 0, 413, 0, 196, 0, 466, 241, 361, - 358, 504, 269, 260, 256, 239, 303, 369, 411, 486, - 405, 0, 354, 0, 0, 476, 384, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 309, 237, 311, 195, 396, 477, 273, 0, - 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 235, 0, 0, - 0, 335, 344, 343, 324, 325, 327, 329, 334, 341, - 347, 0, 0, 0, 0, 0, 252, 307, 259, 251, - 501, 0, 0, 0, 0, 0, 0, 0, 219, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 0, 385, 244, 0, 0, - 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, - 349, 0, 316, 191, 215, 0, 0, 395, 441, 453, - 0, 0, 0, 242, 0, 451, 409, 520, 223, 271, - 438, 415, 449, 422, 274, 0, 0, 450, 356, 506, - 432, 517, 542, 543, 250, 389, 529, 490, 537, 558, - 216, 247, 403, 483, 523, 473, 381, 502, 503, 315, - 472, 282, 194, 353, 548, 214, 459, 355, 232, 221, - 508, 526, 276, 436, 203, 485, 515, 229, 463, 0, - 0, 560, 205, 513, 482, 377, 312, 313, 204, 0, - 437, 255, 280, 245, 398, 510, 511, 243, 561, 218, - 536, 210, 0, 535, 391, 505, 514, 378, 367, 209, - 512, 376, 366, 320, 339, 340, 267, 293, 429, 359, - 430, 292, 294, 387, 386, 388, 198, 524, 0, 199, - 0, 478, 525, 562, 224, 225, 227, 0, 266, 270, - 278, 281, 289, 290, 299, 351, 402, 428, 424, 433, - 0, 500, 518, 530, 540, 546, 547, 549, 550, 551, - 552, 553, 555, 554, 390, 297, 474, 319, 357, 0, - 0, 408, 452, 230, 522, 475, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 563, 564, 565, - 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 579, 580, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 581, 368, 465, 519, 321, 333, - 336, 326, 345, 0, 346, 322, 323, 328, 330, 331, - 332, 337, 338, 342, 348, 238, 201, 374, 382, 499, - 298, 206, 207, 208, 492, 493, 494, 495, 533, 534, - 538, 442, 443, 444, 445, 279, 528, 295, 448, 447, - 317, 318, 363, 431, 0, 190, 211, 352, 0, 434, - 275, 559, 532, 527, 197, 213, 0, 249, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 193, 200, 212, 222, 226, 233, 248, 263, 265, 272, - 285, 296, 304, 305, 308, 314, 364, 370, 371, 372, - 373, 392, 393, 394, 397, 400, 401, 404, 406, 407, - 410, 414, 418, 419, 420, 421, 423, 425, 435, 440, - 454, 455, 456, 457, 458, 461, 462, 467, 468, 469, - 470, 471, 479, 480, 484, 507, 509, 521, 539, 544, - 460, 287, 288, 426, 427, 300, 301, 556, 557, 286, - 516, 545, 0, 0, 362, 0, 0, 365, 268, 291, - 306, 0, 531, 481, 217, 446, 277, 240, 0, 0, - 202, 236, 220, 246, 261, 264, 310, 375, 383, 412, - 417, 283, 258, 234, 439, 231, 464, 487, 488, 489, - 491, 379, 253, 416, 380, 0, 360, 497, 498, 302, - 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, - 0, 257, 0, 0, 0, 0, 350, 254, 0, 0, - 413, 0, 196, 0, 466, 241, 361, 358, 504, 269, - 260, 256, 239, 303, 369, 411, 486, 405, 0, 354, - 0, 0, 476, 384, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, - 237, 311, 195, 396, 477, 273, 0, 0, 0, 0, - 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 235, 0, 0, 0, 335, 344, - 343, 324, 325, 327, 329, 334, 341, 347, 0, 0, - 0, 0, 0, 252, 307, 259, 251, 501, 0, 0, - 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 284, 0, 385, 244, 0, 0, 0, 0, 541, - 0, 0, 0, 0, 0, 0, 0, 349, 0, 316, - 191, 215, 0, 0, 395, 441, 453, 0, 0, 0, - 242, 0, 451, 409, 520, 223, 271, 438, 415, 449, - 422, 274, 0, 0, 450, 356, 506, 432, 517, 542, - 543, 250, 389, 529, 490, 537, 558, 216, 247, 403, - 483, 523, 473, 381, 502, 503, 315, 472, 282, 194, - 353, 548, 214, 459, 355, 232, 221, 508, 526, 276, - 436, 203, 485, 515, 229, 463, 0, 0, 560, 205, - 513, 482, 377, 312, 313, 204, 0, 437, 255, 280, - 245, 398, 510, 511, 243, 561, 218, 536, 210, 0, - 535, 391, 505, 514, 378, 367, 209, 512, 376, 366, - 320, 339, 340, 267, 293, 429, 359, 430, 292, 294, - 387, 386, 388, 198, 524, 0, 199, 0, 478, 525, - 562, 224, 225, 227, 0, 266, 270, 278, 281, 289, - 290, 299, 351, 402, 428, 424, 433, 0, 500, 518, - 530, 540, 546, 547, 549, 550, 551, 552, 553, 555, - 554, 390, 297, 474, 319, 357, 0, 0, 408, 452, - 230, 522, 475, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 563, 564, 565, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, - 579, 580, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 581, 368, 465, 519, 321, 333, 336, 326, 345, - 0, 346, 322, 323, 328, 330, 331, 332, 337, 338, - 342, 348, 238, 201, 374, 382, 499, 298, 206, 207, - 208, 492, 493, 494, 495, 533, 534, 538, 442, 443, - 444, 445, 279, 528, 295, 448, 447, 317, 318, 363, - 431, 0, 190, 211, 352, 0, 434, 275, 559, 532, - 527, 197, 213, 0, 249, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 193, 200, 212, - 222, 226, 233, 248, 263, 265, 272, 285, 296, 304, - 305, 308, 314, 364, 370, 371, 372, 373, 392, 393, - 394, 397, 400, 401, 404, 406, 407, 410, 414, 418, - 419, 420, 421, 423, 425, 435, 440, 454, 455, 456, - 457, 458, 461, 462, 467, 468, 469, 470, 471, 479, - 480, 484, 507, 509, 521, 539, 544, 460, 287, 288, - 426, 427, 300, 301, 556, 557, 286, 516, 545, 0, - 0, 362, 0, 0, 365, 268, 291, 306, 0, 531, - 481, 217, 446, 277, 240, 0, 0, 202, 236, 220, - 246, 261, 264, 310, 375, 383, 412, 417, 283, 258, - 234, 439, 231, 464, 487, 488, 489, 491, 379, 253, - 416, 380, 0, 360, 497, 498, 302, 496, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, - 0, 0, 0, 350, 254, 0, 0, 413, 0, 196, - 0, 466, 241, 361, 358, 504, 269, 260, 256, 239, - 303, 369, 411, 486, 405, 0, 354, 0, 0, 476, - 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 309, 237, 311, 195, - 396, 477, 273, 0, 0, 0, 0, 0, 188, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, - 0, 235, 0, 0, 0, 335, 344, 343, 324, 325, - 327, 329, 334, 341, 347, 0, 0, 0, 0, 0, - 252, 307, 259, 251, 501, 0, 0, 0, 0, 0, - 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, - 385, 244, 0, 0, 0, 0, 541, 0, 0, 0, - 0, 0, 0, 0, 349, 0, 316, 191, 215, 0, - 0, 395, 441, 453, 0, 0, 0, 242, 0, 451, - 409, 520, 223, 271, 438, 415, 449, 422, 274, 0, - 0, 450, 356, 506, 432, 517, 542, 543, 250, 389, - 529, 490, 537, 558, 216, 247, 403, 483, 523, 473, - 381, 502, 503, 315, 472, 282, 194, 353, 548, 214, - 459, 355, 232, 221, 508, 526, 276, 436, 203, 485, - 515, 229, 463, 0, 0, 560, 205, 513, 482, 377, - 312, 313, 204, 0, 437, 255, 280, 245, 398, 510, - 511, 243, 561, 218, 536, 210, 0, 535, 391, 505, - 514, 378, 367, 209, 512, 376, 366, 320, 339, 340, - 267, 293, 429, 359, 430, 292, 294, 387, 386, 388, - 198, 524, 0, 199, 0, 478, 525, 562, 224, 225, - 227, 0, 266, 270, 278, 281, 289, 290, 299, 351, - 402, 428, 424, 433, 0, 500, 518, 530, 540, 546, - 547, 549, 550, 551, 552, 553, 555, 554, 390, 297, - 474, 319, 357, 0, 0, 408, 452, 230, 522, 475, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 563, 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 575, 576, 577, 578, 579, 580, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 581, 368, - 465, 519, 321, 333, 336, 326, 345, 0, 346, 322, - 323, 328, 330, 331, 332, 337, 338, 342, 348, 238, - 201, 374, 382, 499, 298, 206, 207, 208, 492, 493, - 494, 495, 533, 534, 538, 442, 443, 444, 445, 279, - 528, 295, 448, 447, 317, 318, 363, 431, 0, 190, - 211, 352, 0, 434, 275, 559, 532, 527, 197, 213, - 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 192, 193, 200, 212, 222, 226, 233, - 248, 263, 265, 272, 285, 296, 304, 305, 308, 314, - 364, 370, 371, 372, 373, 392, 393, 394, 397, 400, - 401, 404, 406, 407, 410, 414, 418, 419, 420, 421, - 423, 425, 435, 440, 454, 455, 456, 457, 458, 461, - 462, 467, 468, 469, 470, 471, 479, 480, 484, 507, - 509, 521, 539, 544, 460, 287, 288, 426, 427, 300, - 301, 556, 557, 286, 516, 545, 0, 0, 362, 0, - 0, 365, 268, 291, 306, 0, 531, 481, 217, 446, - 277, 240, 0, 0, 202, 236, 220, 246, 261, 264, - 310, 375, 383, 412, 417, 283, 258, 234, 439, 231, - 464, 487, 488, 489, 491, 379, 253, 416, 0, 0, - 360, 497, 498, 302, + 495, 533, 534, 538, 442, 443, 444, 445, 279, 528, + 295, 448, 447, 317, 318, 363, 431, 0, 190, 211, + 352, 0, 434, 275, 559, 532, 527, 197, 213, 0, + 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 192, 193, 200, 212, 222, 226, 233, 248, + 263, 265, 272, 285, 296, 304, 305, 308, 314, 364, + 370, 371, 372, 373, 392, 393, 394, 397, 400, 401, + 404, 406, 407, 410, 414, 418, 419, 420, 421, 423, + 425, 435, 440, 454, 455, 456, 457, 458, 461, 462, + 467, 468, 469, 470, 471, 479, 480, 484, 507, 509, + 521, 539, 544, 460, 287, 288, 426, 427, 300, 301, + 556, 557, 286, 516, 545, 0, 0, 362, 0, 0, + 365, 268, 291, 306, 0, 531, 481, 217, 446, 277, + 240, 0, 0, 202, 236, 220, 246, 261, 264, 310, + 375, 383, 412, 417, 283, 258, 234, 439, 231, 464, + 487, 488, 489, 491, 379, 253, 416, 0, 0, 360, + 497, 498, 302, } var yyPact = [...]int{ - -1000, -1000, 5263, -1000, -458, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 5826, -1000, -455, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2260, 2300, - -1000, -1000, -1000, -1000, 2433, -1000, 875, 1965, -1000, 2261, - 4625, -1000, 47207, 621, -1000, 44619, 620, 630, 29738, -1000, - 209, -1000, 164, 45913, 202, -1000, -1000, -1000, -292, 19384, - 2183, 78, 77, 47207, -1000, -1000, -1000, -1000, 2398, 1911, - -1000, 394, -1000, -1000, -1000, -1000, -1000, -1000, 43972, -1000, - 1009, -1000, -1000, 2269, 2231, 2444, 787, 2165, -1000, 2326, - 1911, -1000, 19384, 2387, 2307, 18737, 18737, 569, -1000, -1000, - 348, -1000, -1000, 25209, 47207, 32326, 586, -1000, 2261, -1000, - -1000, -1000, 99, -1000, 470, 1831, -1000, 1830, -1000, 675, - 864, 485, 588, 578, 481, 473, 472, 471, 469, 467, - 454, 453, 492, -1000, 814, 814, -111, -115, 3182, 567, - 545, 545, 1011, 585, 2213, 2203, -1000, -1000, 814, 814, - 814, 479, 814, 814, 814, 814, 383, 382, 814, 814, - 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, - 814, 814, 814, 814, 814, 422, 2261, 364, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2148, 2198, + -1000, -1000, -1000, -1000, 2370, -1000, 776, 1786, -1000, 2147, + 309, -1000, 46536, 572, -1000, 43948, 571, 224, 29714, -1000, + 218, -1000, 203, 45242, 212, -1000, -1000, -1000, -305, 18713, + 2037, 94, 92, 46536, -1000, -1000, -1000, -1000, 2334, 1745, + -1000, 445, -1000, -1000, -1000, -1000, -1000, -1000, 43301, -1000, + 932, -1000, -1000, 2159, 2149, 2372, 700, 2100, -1000, 2240, + 1745, -1000, 18713, 2313, 2207, 18066, 18066, 500, -1000, -1000, + 238, -1000, -1000, 25185, 46536, 32302, 721, -1000, 2147, -1000, + -1000, -1000, 159, -1000, 369, 1670, -1000, 1669, -1000, 766, + 888, 427, 509, 505, 418, 417, 404, 383, 382, 381, + 372, 364, 433, -1000, 724, 724, -120, -121, 280, 553, + 490, 490, 935, 521, 2118, 2117, -1000, -1000, 724, 724, + 724, 378, 724, 724, 724, 724, 331, 324, 724, 724, + 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, + 724, 724, 724, 724, 724, 397, 2147, 299, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -6362,59 +6295,59 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 47207, 374, 47207, -1000, 690, 47207, 955, 955, - 129, 955, 955, 955, 955, 265, 793, 69, -1000, 256, - 344, 228, 340, 941, 743, -1000, -1000, 360, 941, 1692, - -1000, 791, 234, -1000, 955, 955, -1000, 12889, 165, 12889, - 12889, -1000, 2239, -1000, -1000, -1000, -1000, -1000, 1234, -1000, - -1000, -1000, -1000, -1000, 583, -1000, -1000, -1000, -1000, 45913, - 43325, -1000, -1000, 82, -1000, -1000, 1744, 1467, 19384, 1219, - -1000, 1169, 749, -1000, -1000, -1000, -1000, -1000, 652, -1000, - 20031, 20031, 20031, 20031, -1000, -1000, 1839, 42678, 1839, 1839, - 20031, 1839, -1000, 20031, 1839, 1839, 1839, 19384, 1839, 1839, - 1839, 1839, -1000, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, -1000, -1000, -1000, -1000, 1839, 689, 1839, 1839, 1839, - 1839, 1839, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1839, 1839, 1839, 1839, 1839, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21325, - 1408, 1397, 1380, -1000, 16796, 1839, -1000, -1000, -1000, -1000, + -1000, -1000, 46536, 256, 46536, -1000, 629, 46536, 876, 876, + 118, 876, 876, 876, 876, 216, 731, 90, -1000, 215, + 294, 200, 296, 859, 316, -1000, -1000, 283, 859, 1533, + -1000, 706, 197, -1000, 876, 876, -1000, 12218, 152, 12218, + 12218, -1000, 2140, -1000, -1000, -1000, -1000, -1000, 1135, -1000, + -1000, -1000, -1000, -1000, 518, -1000, -1000, -1000, -1000, 45242, + 42654, -1000, -1000, 65, -1000, -1000, 1598, 1041, 18713, 1233, + -1000, 1564, 679, -1000, -1000, -1000, -1000, -1000, 596, -1000, + 19360, 19360, 19360, 19360, -1000, -1000, 1672, 42007, 1672, 1672, + 19360, 1672, -1000, 19360, 1672, 1672, 1672, 18713, 1672, 1672, + 1672, 1672, -1000, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, -1000, -1000, -1000, -1000, 1672, 627, 1672, 1672, 1672, + 1672, 1672, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1672, 1672, 1672, 1672, 1672, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21301, + 1339, 1337, 1324, -1000, 16125, 1672, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 47207, -1000, 1839, 233, - 45913, 45913, 425, 2326, 1911, -1000, 2398, 2379, 394, -1000, - 3108, 1406, 1439, 1334, 1911, 1814, 47207, -1000, 1853, -1000, - -1000, -1000, -1000, 2096, 1393, 1687, -1000, -1000, -1000, -1000, - 2027, 19384, -1000, -1000, 2422, -1000, 22620, 688, 2415, 42031, - -1000, 569, 569, 1827, 428, 57, -1000, -1000, -1000, -1000, - 841, 29091, -1000, -1000, -1000, -1000, 1732, 47207, -1000, -1000, - 4853, 1252, -1000, 1963, -1000, 1730, -1000, 1896, 19384, 1929, - 613, 1252, 597, 596, 595, -1000, -17, -1000, -1000, -1000, - -1000, -1000, -1000, 814, 814, 814, -1000, 484, 2384, 4625, - 3608, -1000, -1000, -1000, 41384, 1961, 1252, -1000, 1956, -1000, - 927, 663, 722, 722, 1252, -1000, -1000, 46560, 1252, 926, - 923, 1252, 1252, 45913, 45913, -1000, 40737, -1000, 40090, 39443, - 1180, 45913, 38796, 38149, 37502, 36855, 36208, -1000, 2054, -1000, - 1942, -1000, -1000, -1000, 46560, 1252, 1252, 46560, 45913, 46560, - 47207, 1252, -1000, -1000, 385, -1000, -1000, 1178, 1165, 1163, - 814, 814, 1162, 1678, 1670, 1665, 814, 814, 1161, 1663, - 31032, 1656, 362, 1158, 1154, 1150, 1152, 1647, 199, 1580, - 1128, 1127, 1149, 45913, 1952, 47207, -1000, 327, 824, 561, - 837, 2261, 2178, 1825, 580, 608, 1252, 560, 560, 45913, - -1000, 14848, -1000, -1000, 1578, 19384, -1000, 942, 941, 941, - -1000, -1000, -1000, -1000, -1000, -1000, 955, 47207, 942, -1000, - -1000, -1000, 941, 955, 47207, 955, 955, 955, 955, 941, - 941, 941, 955, 47207, 47207, 47207, 47207, 47207, 47207, 47207, - 47207, 47207, 12889, 791, 955, -300, -1000, 1572, -1000, 2073, + -1000, -1000, -1000, -1000, -1000, -1000, 46536, -1000, 1672, 232, + 45242, 45242, 423, 2240, 1745, -1000, 2334, 2254, 445, -1000, + 2376, 1409, 1473, 1195, 1745, 1651, 46536, -1000, 1700, -1000, + -1000, -1000, -1000, 1936, 1283, 1514, -1000, -1000, -1000, -1000, + 2028, 18713, -1000, -1000, 2350, -1000, 22596, 624, 2348, 41360, + -1000, 500, 500, 1665, 439, 40, -1000, -1000, -1000, -1000, + 753, 29067, -1000, -1000, -1000, -1000, 1585, 46536, -1000, -1000, + 5079, 1129, -1000, 1776, -1000, 1538, -1000, 1739, 18713, 1747, + 568, 1129, 564, 549, 548, -1000, -2, -1000, -1000, -1000, + -1000, -1000, -1000, 724, 724, 724, -1000, 376, 2312, 309, + 5021, -1000, -1000, -1000, 40713, 1775, 1129, -1000, 1772, -1000, + 856, 597, 642, 642, 1129, -1000, -1000, 45889, 1129, 853, + 847, 1129, 1129, 45242, 45242, -1000, 40066, -1000, 39419, 38772, + 1110, 45242, 38125, 37478, 36831, 36184, 35537, -1000, 2078, -1000, + 1785, -1000, -1000, -1000, 45889, 1129, 1129, 45889, 45242, 45889, + 46536, 1129, -1000, -1000, 385, -1000, -1000, 1108, 1107, 1102, + 724, 724, 1099, 1513, 1509, 1507, 724, 724, 1094, 1506, + 31008, 1505, 290, 1091, 1085, 1081, 1128, 1504, 188, 1490, + 1043, 1015, 1075, 45242, 1767, 46536, -1000, 282, 764, 695, + 749, 2147, 2022, 1663, 511, 567, 1129, 493, 493, 45242, + -1000, 12871, -1000, -1000, 1481, 18713, -1000, 875, 859, 859, + -1000, -1000, -1000, -1000, -1000, -1000, 876, 46536, 875, -1000, + -1000, -1000, 859, 876, 46536, 876, 876, 876, 876, 859, + 859, 859, 876, 46536, 46536, 46536, 46536, 46536, 46536, 46536, + 46536, 46536, 12218, 706, 876, -313, -1000, 1469, -1000, 1892, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -6430,281 +6363,281 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 12889, 12889, -1000, -1000, - -1000, -1000, 200, -1000, 35561, 409, 835, -1000, 1824, 34914, - -1000, -333, -340, -342, -359, -1000, -1000, -1000, -360, -362, - -1000, -1000, -1000, 19384, 19384, 19384, 19384, -147, -1000, 936, - 20031, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 171, 965, - 20031, 20031, 20031, 20031, 20031, 20031, 20031, 20031, 20031, 20031, - 20031, 20031, 20031, 20031, 20031, -1000, -1000, 27150, 6253, 6253, - 749, 749, 749, 749, -1000, -82, 1823, 46560, -1000, -1000, - -1000, 684, 19384, 19384, 749, -1000, 1252, 16796, 34267, 18737, - 18737, 19384, 856, 1467, 46560, 19384, -1000, 1334, -1000, -1000, - -1000, 1142, -1000, 954, 2245, 2245, 2245, 2245, 19384, 19384, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 2245, 45913, - 45913, 858, 19384, 19384, 19384, 19384, 19384, 19384, 15501, 19384, - 19384, 20031, 19384, 19384, 19384, 1334, 19384, 19384, 19384, 19384, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, - 19384, 19384, 19384, 1334, 19384, 1372, 19384, 19384, 18737, 14195, - 18737, 18737, 18737, 18737, 18737, -1000, -1000, -1000, -1000, -1000, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 1334, 19384, - 19384, 19384, 19384, 19384, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1591, 1333, 1404, 19384, -1000, 1817, - -1000, -84, 24562, 19384, 1557, 2413, 2002, 45913, -1000, -1000, - -1000, 2326, -1000, 2326, 1591, 3101, 2099, 18737, -1000, -1000, - 3101, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1646, - -1000, 47207, 1814, 2287, 45913, 2085, 1555, 514, -1000, 19384, - 19384, 1810, -1000, 1364, 47207, -1000, -147, -1000, 33620, -1000, - -1000, 12236, 47207, 421, 47207, -1000, 23915, 32973, 281, 57, - -1000, 1780, -1000, 49, 40, 16148, 748, -1000, -1000, -1000, - 3182, 20678, 1739, 748, 130, -1000, -1000, -1000, 1896, -1000, - 1896, 1896, 1896, 1896, 514, 514, 514, 514, -1000, -1000, - -1000, -1000, -1000, 1950, 1946, -1000, 1896, 1896, 1896, 1896, + -1000, -1000, -1000, -1000, -1000, -1000, 12218, 12218, -1000, -1000, + -1000, -1000, 208, -1000, 34890, 396, 748, -1000, 1661, 34243, + -1000, -316, -322, -323, -330, -1000, -1000, -1000, -351, -364, + -1000, -1000, -1000, 18713, 18713, 18713, 18713, -152, -1000, 959, + 19360, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 139, 907, + 19360, 19360, 19360, 19360, 19360, 19360, 19360, 19360, 19360, 19360, + 19360, 19360, 19360, 19360, 19360, -1000, -1000, 27126, 7353, 7353, + 679, 679, 679, 679, -1000, -65, 1659, 45889, -1000, -1000, + -1000, 622, 18713, 18713, 679, -1000, 1129, 16125, 20007, 18066, + 18066, 18713, 759, 1041, 45889, 18713, -1000, 1195, -1000, -1000, + -1000, 1080, -1000, 854, 2127, 2127, 2127, 2127, 18713, 18713, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 2127, 45242, + 45242, 862, 18713, 18713, 18713, 18713, 18713, 18713, 14830, 18713, + 18713, 19360, 18713, 18713, 18713, 1195, 18713, 18713, 18713, 18713, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, + 18713, 18713, 18713, 1195, 18713, 1014, 18713, 18713, 18066, 14177, + 18066, 18066, 18066, 18066, 18066, -1000, -1000, -1000, -1000, -1000, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 1195, 18713, + 18713, 18713, 18713, 18713, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1415, 1231, 1242, 18713, -1000, 1652, + -1000, -155, 24538, 18713, 1447, 2346, 1826, 45242, -1000, -1000, + -1000, 2240, -1000, 2240, 1415, 2170, 1963, 18066, -1000, -1000, + 2170, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1291, + -1000, 46536, 1651, 2204, 45242, 1928, 1445, 368, -1000, 18713, + 18713, 1650, -1000, 1120, 46536, -1000, -152, -1000, 33596, -1000, + -1000, 11565, 46536, 357, 46536, -1000, 23891, 32949, 374, 40, + -1000, 1624, -1000, 53, 61, 15477, 662, -1000, -1000, -1000, + 280, 20654, 1596, 662, 121, -1000, -1000, -1000, 1739, -1000, + 1739, 1739, 1739, 1739, 368, 368, 368, 368, -1000, -1000, + -1000, -1000, -1000, 1761, 1760, -1000, 1739, 1739, 1739, 1739, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1943, 1943, 1943, - 1906, 1906, 535, -1000, 19384, 304, 32326, 2267, 1139, 2036, - 327, 564, 1995, 1252, 1252, 1252, 564, -1000, 1329, 1327, - 1322, -1000, -447, 1796, -1000, -1000, 2382, -1000, -1000, 943, - 957, 949, 984, 45913, 247, 408, -1000, 515, -1000, 32326, - 1252, 916, 722, 1252, -1000, 1252, -1000, -1000, -1000, -1000, - -1000, 1252, -1000, -1000, 1795, -1000, 1822, 1003, 945, 979, - 938, 1795, -1000, -1000, -88, 1795, -1000, 1795, -1000, 1795, - -1000, 1795, -1000, 1795, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 831, 227, -208, 45913, 247, 579, -1000, - 573, 27150, -1000, -1000, -1000, 27150, 27150, -1000, -1000, -1000, - -1000, 1538, 1535, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1759, 1759, 1759, + 1740, 1740, 478, -1000, 18713, 301, 32302, 2173, 1068, 1274, + 282, 498, 1796, 1129, 1129, 1129, 498, -1000, 1173, 1161, + 1155, -1000, -445, 1633, -1000, -1000, 2311, -1000, -1000, 948, + 886, 880, 991, 45242, 248, 355, -1000, 467, -1000, 32302, + 1129, 844, 642, 1129, -1000, 1129, -1000, -1000, -1000, -1000, + -1000, 1129, -1000, -1000, 1631, -1000, 1654, 917, 871, 913, + 868, 1631, -1000, -1000, -91, 1631, -1000, 1631, -1000, 1631, + -1000, 1631, -1000, 1631, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 782, 229, -236, 45242, 248, 510, -1000, + 503, 27126, -1000, -1000, -1000, 27126, 27126, -1000, -1000, -1000, + -1000, 1437, 1422, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -418, 47207, -1000, 264, 832, 387, 437, 436, - 47207, 429, 2318, 2316, 2310, 2301, 2294, 355, 376, 47207, - 47207, 560, 2047, 47207, 2276, 47207, -1000, -1000, -1000, -1000, - -1000, 1467, 47207, -1000, -1000, 955, 955, -1000, -1000, 47207, - 955, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 955, + -1000, -1000, -431, 46536, -1000, 262, 745, 336, 420, 322, + 46536, 345, 2229, 2228, 2224, 2218, 2213, 271, 321, 46536, + 46536, 493, 1887, 46536, 2181, 46536, -1000, -1000, -1000, -1000, + -1000, 1041, 46536, -1000, -1000, 876, 876, -1000, -1000, 46536, + 876, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 876, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 47207, -1000, -1000, -1000, -1000, - 45913, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -99, 158, 47, 388, -1000, -1000, -1000, -1000, -1000, 2323, - -1000, 1467, 894, 901, -1000, 1839, -1000, -1000, 1030, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 171, 20031, 20031, 20031, - 1288, 610, 1636, 1100, 1151, 1135, 1135, 1004, 1004, 753, - 753, 753, 753, 753, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1532, -1000, 1839, 46560, 1724, 14195, 1213, 2005, - 1334, 2956, -1000, 1660, -1000, 1660, 1811, 859, -1000, 19384, - 1334, 2916, -1000, -1000, 1334, 1334, 1334, 19384, -1000, -1000, - 19384, 19384, 19384, 19384, 2036, 2036, 2036, 2036, 2036, 2036, - 2036, 2036, 2036, 2036, 19384, 1794, 1786, 2411, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 46536, -1000, -1000, -1000, -1000, + 45242, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -93, 44, 67, 371, -1000, -1000, -1000, -1000, -1000, 2234, + -1000, 1041, 846, 814, -1000, 1672, -1000, -1000, 922, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 139, 19360, 19360, 19360, + 1384, 533, 1449, 1643, 1103, 1199, 1199, 858, 858, 686, + 686, 686, 686, 686, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1389, -1000, 1672, 45889, 1502, 14177, 1834, 1742, + 1195, 3057, -1000, 1495, -1000, 1495, 1521, 800, -1000, 18713, + 1195, 3030, -1000, -1000, 1195, 1195, 1195, 18713, -1000, -1000, + 18713, 18713, 18713, 18713, 1274, 1274, 1274, 1274, 1274, 1274, + 1274, 1274, 1274, 1274, 18713, 1629, 1628, 2342, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1044, - 2036, 2036, 2036, 2036, 2036, 19384, 1721, -1000, -1000, -1000, - 1387, 2894, 1238, 2885, 2036, 2036, -1000, 2036, 2857, 2837, - 1334, 1744, 1334, 1785, -1000, 2813, 2036, 2807, 2802, 2797, - 2014, 2792, 2776, 2770, 2036, 2036, 2036, 1980, 2764, 2758, - 2752, 2740, 2728, 2709, 2697, 2690, 2684, 2036, -150, 2036, - 1334, -1000, -1000, -1000, -1000, -1000, 2679, 1971, 1334, 1784, - 1839, 676, -1000, -1000, 1660, 1334, 1334, 1660, 1660, 2624, - 2601, 2582, 2432, 2311, 2303, 2036, 2036, -1000, 2036, 2293, - 2255, 1958, 1940, 1334, -1000, 1404, 47207, -1000, -284, -1000, - 24, 797, 1839, -1000, 31032, 1334, -1000, 6098, -1000, 1189, - -1000, -1000, -1000, -1000, -1000, 28444, 1737, 3101, -1000, -1000, - 1839, 1655, -1000, -1000, 514, 95, 27797, 735, 735, 137, - 1467, 1467, 19384, -1000, -1000, -1000, -1000, -1000, -1000, 673, - 2399, 391, 1839, -1000, 1790, 2514, -1000, -1000, -1000, 2285, - 21973, -1000, -1000, 1839, 1839, 47207, 1708, 1691, -1000, 670, - -1000, 1255, 1780, 57, 46, -1000, -1000, -1000, -1000, 1467, - -1000, 1275, 430, 1726, -1000, 552, -1000, -1000, -1000, -1000, - 2190, 107, -1000, -1000, -1000, 279, 514, -1000, -1000, -1000, - -1000, -1000, -1000, 1521, 1521, -1000, -1000, -1000, -1000, -1000, - 1134, -1000, -1000, -1000, 1133, -1000, -1000, 2114, 2038, 304, - -1000, -1000, 814, 1517, -1000, -1000, 2197, 814, 814, 45913, - -1000, -1000, 1709, 2267, 264, 47207, 868, 2046, -1000, 1995, - 1995, 1995, 47207, -1000, -1000, -1000, -1000, -1000, -1000, -437, - 63, 384, -1000, -1000, -1000, 309, 45913, 1653, -1000, 249, - -1000, 1705, -1000, 45913, -1000, 1640, 1930, 1252, 1252, -1000, - -1000, -1000, 45913, 1839, -1000, -1000, -1000, -1000, 605, 2242, - 308, -1000, -1000, -183, -1000, -1000, 247, 249, 46560, 1252, - 748, -1000, -1000, -1000, -1000, -1000, -421, 1638, 589, 255, - 339, 47207, 47207, 47207, 47207, 47207, 655, -1000, -1000, 68, - -1000, -1000, 224, -1000, -1000, -1000, -1000, 224, -1000, -1000, - -1000, -1000, 370, 568, -1000, 47207, 47207, 710, -1000, -1000, - -1000, 941, -1000, -1000, 941, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 2233, 47207, 37, -383, -1000, - -379, 19384, -1000, -1000, -1000, -1000, 1217, 609, 1636, 20031, - 20031, 20031, -1000, -1000, -1000, 884, 884, 27150, -1000, 19384, - 18737, -1000, -1000, 19384, 19384, 846, -1000, 19384, 1014, -1000, - 19384, -1000, -1000, -1000, 1404, 2036, 2036, 2036, 2036, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1818, - 19384, 19384, 19384, 1334, 320, -1000, -1000, -1000, -1000, -1000, - 2410, -1000, 19384, -1000, 27150, 19384, 19384, 19384, -1000, -1000, - -1000, 19384, 19384, -1000, -1000, 19384, 19384, -1000, 19384, 19384, - 19384, -1000, 19384, 19384, 19384, 19384, -1000, -1000, -1000, -1000, - 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, 19384, - -1000, -1000, 32326, 106, -150, 1372, 106, 1372, -1000, 18737, - 13542, -1000, -1000, -1000, -1000, -1000, 19384, 19384, 19384, 19384, - 19384, 19384, -1000, -1000, -1000, 19384, 19384, -1000, 19384, -1000, - 19384, -1000, -1000, -1000, -1000, -1000, 797, -1000, 722, 722, - 722, 45913, -1000, -1000, -1000, -1000, 1777, -1000, 2314, -1000, - 2131, 2116, 2409, 2399, -1000, 23915, 3101, -1000, -1000, 45913, - -274, -1000, 2172, 2187, 735, 735, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 11583, 2326, 19384, 2040, 46560, 159, -1000, - 23268, 45913, 46560, 23915, 23915, 23915, 23915, 23915, -1000, 2070, - 2061, -1000, 2115, 2095, 2148, 47207, -1000, 1591, 1633, -1000, - 19384, 25856, 1751, 23915, -1000, -1000, 23915, 47207, 10930, -1000, - -1000, 31, 35, -1000, -1000, -1000, -1000, 3182, -1000, -1000, - 3205, 2284, 2184, -1000, -1000, -1000, -1000, -1000, 1631, -1000, - 1629, 1771, 1625, 227, -1000, 1898, 2232, 814, 814, -1000, - 1125, -1000, 1252, 1506, 1504, -1000, -1000, -1000, 587, -1000, - 2274, 47207, 2039, 2037, 2034, -1000, -445, 1123, 1923, 1887, - 19384, 1920, 2381, 1767, 45913, -1000, -1000, 46560, -1000, 300, - -1000, 304, 45913, -1000, -1000, -1000, 408, 47207, -1000, 5931, - -1000, -1000, -1000, 249, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 47207, 329, -1000, 1908, 1233, -1000, -1000, 1977, -1000, - -1000, -1000, -1000, 271, 386, 1478, 222, 1448, 222, -1000, - 47207, 707, 2038, 47207, -1000, -1000, -1000, 955, 955, -1000, - -1000, 2223, -1000, 1252, 2036, 20031, 20031, -1000, 749, 322, - -128, 1896, 1896, -1000, 1896, 1906, -1000, 1896, 181, 1896, - 179, 1896, -1000, -1000, 1334, 1334, 1404, -1000, 1935, 993, - -1000, 1467, 19384, 2236, -1000, -1000, -1000, -1000, -1000, -23, - 2210, 2194, 2036, -1000, 1890, 1889, 19384, 2036, 1334, 1924, - 2036, 2036, 2036, 2036, -1000, 1467, 1404, 2181, 1404, 2036, - 2036, 2175, 333, 2036, 1621, 1621, 1621, 1621, 1621, 1404, - 1404, 1404, 1404, 45913, -1000, -150, -1000, -1000, -201, -202, - -1000, 1334, -150, 1770, 1334, -1000, 1912, 1903, 2139, 1893, - 2036, 2104, 2036, 2036, 2036, 1807, -1000, 2304, 2304, 2304, - 1576, 1189, 47207, -1000, -1000, -1000, -1000, 2399, 2394, 1768, - -1000, -1000, 95, 427, -1000, 2149, 2187, -1000, 2360, 2156, - 2356, -1000, -1000, -1000, -1000, -1000, 1467, -1000, 2246, 1747, - -1000, 819, 1753, -1000, -1000, 18090, 1613, 2103, 668, 1576, - 1820, 2514, 1993, 2030, 2315, -1000, -1000, -1000, -1000, 2060, - -1000, 2059, -1000, -1000, 1853, -1000, 2010, 421, 23915, 1734, - 1734, -1000, 666, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 982, 5268, 2435, -1000, 1440, -1000, 1188, 205, 1113, -1000, - -1000, 814, 814, -1000, 915, 910, -1000, 47207, 1885, -1000, - 514, 1414, 514, 1107, -1000, 1106, -1000, -1000, -1000, -1000, - 1882, 2025, -1000, -1000, -1000, -1000, 47207, -1000, -1000, 47207, - 47207, 47207, 1873, 2354, -1000, 19384, 1872, 816, 2091, 45913, - 45913, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 528, 814, -400, 373, 372, 814, 814, 814, - -446, -1000, -1000, 1567, 1563, -1000, -116, -1000, 19384, -1000, - -1000, -1000, 1110, 1110, 1408, 1397, 1380, -1000, 1853, -1000, - -1000, -1000, 1696, -1000, -1000, -96, 45913, 45913, 45913, 45913, - -1000, -1000, 1040, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 749, 1334, 345, -98, 1334, - -1000, -1000, 514, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 19384, -1000, 19384, -1000, 1467, 19384, 2326, - 1373, 19384, 19384, -1000, 1094, 1084, 2036, -1000, -1000, -1000, - 19384, -1000, -1000, -1000, -1000, -1000, 19384, -1000, -1000, -1000, - 19384, 231, 884, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 1334, 415, -1000, -1000, -1000, -1000, 2403, - -1000, 1334, 19384, -1000, -1000, 19384, -1000, 19384, 19384, -1000, - 19384, -1000, 19384, -1000, -1000, -1000, -1000, 19384, 1839, 2167, - 1839, 1839, 25856, -1000, -1000, 2394, 2392, 2348, 2146, 2151, - 2151, 2149, -1000, 2347, 2346, -1000, 1358, 2345, 1356, 909, - -1000, 46560, 19384, 159, -1000, 393, 45913, 159, 45913, -1000, - 2389, -1000, -1000, 19384, 1867, -1000, 19384, -1000, -1000, -1000, - -1000, 6253, 2399, 1734, -1000, -1000, 764, -1000, 19384, -1000, - -1000, -1000, 108, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1354, 1341, -1000, -1000, 1858, 19384, -1000, -1000, -1000, - 1626, 1577, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1853, -1000, -1000, -1000, -1000, 408, -441, 2083, 45913, 1073, - -1000, 1549, 1767, 404, 159, 1339, 814, 814, 814, 1072, - 1035, 31032, 1547, -1000, 45913, 506, -1000, 408, -1000, -123, - -125, 2036, -1000, -1000, 2283, -1000, -1000, 13542, -1000, -1000, - 1850, 1984, -1000, -1000, -1000, -1000, 2076, -97, -103, -1000, - -1000, 2036, 2036, 1990, 1334, -1000, 2036, 2036, 1564, 1407, - -1000, 2036, 1404, 1791, -1000, 231, 1334, 2024, -1000, -1000, - 6253, -1000, -1000, 2389, 2344, 106, -1000, -1000, 246, 106, - 1467, 1762, 2036, 1728, 1701, 2036, 2036, 26503, -1000, 2330, - 2319, 31679, 31679, 797, 2392, -157, 19384, 19384, 2141, 1075, - -1000, -1000, -1000, -1000, 1336, 1331, -1000, 1325, -1000, 2430, - -1000, 1467, -1000, 159, -1000, 665, 1753, -1000, 2326, 1467, - 45913, 1467, 96, 2389, -1000, 2036, -1000, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, -1000, -1000, 45913, - 2071, -1000, -1000, 2280, 1528, 61, -1000, 1391, 1767, -1000, - -1000, 156, -1000, 19384, -1000, 31032, 1304, 1270, -1000, -1000, - -1000, -1000, -446, -1000, -1000, -1000, -1000, -1000, -1000, 394, - 1761, -1000, 813, 45913, 47207, -1000, 2028, -1000, -1000, -1000, - 19384, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 19384, - -1000, 1334, 2013, -1000, -267, -1000, -419, 19384, -150, -1000, - -1000, -150, -1000, 19384, -1000, -1000, 19384, -1000, 19384, -1000, - -1000, 1525, -1000, -1000, -1000, -1000, -1000, 1525, 1525, -1000, - -157, -1000, 1757, -1000, 45913, 1467, 1744, -1000, 1036, -1000, - -1000, -1000, -1000, -1000, 46560, 1753, 45913, -1000, 1431, 1334, - 1839, 2326, -1000, 1429, -1000, 394, -1000, 1847, 1887, -1000, - -1000, -1000, 17443, -1000, -1000, -1000, -1000, -1000, 268, -93, - 13542, 10277, 1413, -1000, -90, 2036, 1404, -1000, -365, -1000, - -1000, -1000, -1000, 170, -1000, -1000, 1744, -1000, -1000, 1642, - 1623, 1530, 30385, -1000, -1000, -1000, -1000, -157, -1000, -1000, - 2279, -1000, -1000, 1743, -1000, -1000, 25856, 45266, -1000, -78, - 619, -93, 19384, 1842, 1334, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 29, -1000, -1000, -1000, -1000, -1000, 1977, - -100, -1000, -1000, -1000, 173, -390, -195, -196, -1000, -1000, - 20031, -1000, 19384, -1000, 19384, -1000, 19384, -1000, -1000, -1000, - 45913, 1839, -1000, 1396, -1000, 3836, -214, 2008, -1000, 43, - -1000, -1000, -1000, 973, 1261, -1000, -1000, -1000, -1000, -1000, - -1000, 2052, 45913, -1000, 534, -1000, -1000, -96, -108, 899, - -1000, -1000, -1000, -1000, -1000, 1256, 1222, 2036, -1000, 45913, - -1000, 45266, -209, 748, 6253, -1000, 2007, 1981, 2408, -1000, - -1000, -1000, -1000, -1000, -1000, -454, 1390, 266, -1000, -1000, - 173, -1000, 19384, -1000, 19384, -1000, 1334, -1000, -1000, 2273, - 96, -1000, 2425, -1000, 2400, 733, 733, -1000, 1015, -454, - -1000, -1000, 2036, 2036, -1000, -223, -1000, -1000, -1000, -1000, - -1000, 520, 1086, -1000, -1000, -1000, -1000, -1000, 6253, -1000, - -1000, -1000, 215, 215, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1644, + 1274, 1274, 1274, 1274, 1274, 18713, 1778, -1000, -1000, -1000, + 1240, 2980, 1319, 2972, 1274, 1274, -1000, 1274, 2959, 2859, + 1195, 1598, 1195, 1627, -1000, 2841, 1274, 2807, 2802, 2791, + 2195, 2778, 2774, 2767, 1274, 1274, 1274, 2183, 2747, 2739, + 2717, 2711, 2701, 2695, 2689, 2680, 2628, 1274, -165, 1274, + 1195, -1000, -1000, -1000, -1000, -1000, 2613, 2161, 1195, 1626, + 1672, 621, -1000, -1000, 1495, 1195, 1195, 1495, 1495, 2603, + 2599, 2594, 2585, 2446, 2413, 1274, 1274, -1000, 1274, 2371, + 2365, 2157, 2152, 1195, -1000, 1242, 46536, -1000, -298, -1000, + 45, 661, 1672, -1000, 31008, 1195, -1000, 4155, -1000, 1045, + -1000, -1000, -1000, -1000, -1000, 28420, 1486, 2170, -1000, -1000, + 1672, 1479, -1000, -1000, 368, 115, 27773, 681, 681, 148, + 1041, 1041, 18713, -1000, -1000, -1000, -1000, -1000, -1000, 613, + 2325, 373, 1672, -1000, 1620, 2885, -1000, -1000, -1000, 2199, + 21949, -1000, -1000, 1672, 1672, 46536, 1554, 1546, -1000, 612, + -1000, 1150, 1624, 40, 39, -1000, -1000, -1000, -1000, 1041, + -1000, 1142, 358, 680, -1000, 466, -1000, -1000, -1000, -1000, + 2084, 117, -1000, -1000, -1000, 304, 368, -1000, -1000, -1000, + -1000, -1000, -1000, 1386, 1386, -1000, -1000, -1000, -1000, -1000, + 1055, -1000, -1000, -1000, 1050, -1000, -1000, 2293, 1868, 301, + -1000, -1000, 724, 1382, -1000, -1000, 2101, 724, 724, 45242, + -1000, -1000, 1593, 2173, 262, 46536, 785, 1877, -1000, 1796, + 1796, 1796, 46536, -1000, -1000, -1000, -1000, -1000, -1000, -433, + 66, 410, -1000, -1000, -1000, 4372, 45242, 1475, -1000, 244, + -1000, 1589, -1000, 45242, -1000, 1455, 1758, 1129, 1129, -1000, + -1000, -1000, 45242, 1672, -1000, -1000, -1000, -1000, 566, 2143, + 337, -1000, -1000, -182, -1000, -1000, 248, 244, 45889, 1129, + 662, -1000, -1000, -1000, -1000, -1000, -434, 1450, 532, 252, + 352, 46536, 46536, 46536, 46536, 46536, 583, -1000, -1000, 75, + -1000, -1000, 225, -1000, -1000, -1000, -1000, 225, -1000, -1000, + -1000, -1000, 302, 502, -1000, 46536, 46536, 617, -1000, -1000, + -1000, 859, -1000, -1000, 859, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 2129, 46536, 64, -386, -1000, + -383, 18713, -1000, -1000, -1000, -1000, 1235, 527, 1449, 19360, + 19360, 19360, -1000, -1000, -1000, 887, 887, 27126, -1000, 18713, + 18066, -1000, -1000, 18713, 18713, 732, -1000, 18713, 973, -1000, + 18713, -1000, -1000, -1000, 1242, 1274, 1274, 1274, 1274, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1614, + 18713, 18713, 18713, 1195, 342, -1000, -1000, -1000, -1000, -1000, + 2340, -1000, 18713, -1000, 27126, 18713, 18713, 18713, -1000, -1000, + -1000, 18713, 18713, -1000, -1000, 18713, 18713, -1000, 18713, 18713, + 18713, -1000, 18713, 18713, 18713, 18713, -1000, -1000, -1000, -1000, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, + -1000, -1000, 32302, 110, -165, 1014, 110, 1014, -1000, 18066, + 13524, -1000, -1000, -1000, -1000, -1000, 18713, 18713, 18713, 18713, + 18713, 18713, -1000, -1000, -1000, 18713, 18713, -1000, 18713, -1000, + 18713, -1000, -1000, -1000, -1000, -1000, 661, -1000, 642, 642, + 642, 45242, -1000, -1000, -1000, -1000, 1615, -1000, 2236, -1000, + 1975, 1973, 2332, 2325, -1000, 23891, 2170, -1000, -1000, 45242, + -292, -1000, 2019, 1992, 681, 681, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 10912, 2240, 18713, 1876, 45889, 140, -1000, + 23244, 45242, 45889, 23891, 23891, 23891, 23891, 23891, -1000, 1907, + 1900, -1000, 1952, 1948, 1958, 46536, -1000, 1415, 1434, -1000, + 18713, 25832, 1583, 23891, -1000, -1000, 23891, 46536, 10259, -1000, + -1000, 58, 52, -1000, -1000, -1000, -1000, 280, -1000, -1000, + 919, 2187, 2044, -1000, -1000, -1000, -1000, -1000, 1420, -1000, + 1406, 1613, 1385, 229, -1000, 1743, 2126, 724, 724, -1000, + 1042, -1000, 1129, 1375, 1366, -1000, -1000, -1000, 531, -1000, + 2180, 46536, 1875, 1867, 1865, -1000, -442, 1029, 1755, 1707, + 18713, 1752, 2308, 1606, 45242, -1000, -1000, 45889, -1000, 329, + -1000, 301, 45242, -1000, -1000, -1000, 355, 46536, -1000, 6547, + -1000, -1000, -1000, 244, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 46536, 273, -1000, 1750, 1121, -1000, -1000, 1787, -1000, + -1000, -1000, -1000, 223, 318, 1357, 230, 1353, 230, -1000, + 46536, 616, 1868, 46536, -1000, -1000, -1000, 876, 876, -1000, + -1000, 2121, -1000, 1129, 1274, 19360, 19360, -1000, 679, 255, + -134, 1739, 1739, -1000, 1739, 1740, -1000, 1739, 199, 1739, + 198, 1739, -1000, -1000, 1195, 1195, 1242, -1000, 2138, 1372, + -1000, 1041, 18713, 2358, -1000, -1000, -1000, -1000, -1000, -8, + 2322, 2306, 1274, -1000, 1732, 1731, 18713, 1274, 1195, 1912, + 1274, 1274, 1274, 1274, -1000, 1041, 1242, 2272, 1242, 1274, + 1274, 2251, 333, 1274, 1381, 1381, 1381, 1381, 1381, 1242, + 1242, 1242, 1242, 45242, -1000, -165, -1000, -1000, -203, -208, + -1000, 1195, -165, 1609, 1195, -1000, 1906, 1851, 2239, 1824, + 1274, 2235, 1274, 1274, 1274, 1820, -1000, 2231, 2231, 2231, + 1363, 1045, 46536, -1000, -1000, -1000, -1000, 2325, 2318, 1607, + -1000, -1000, 115, 453, -1000, 1987, 1992, -1000, 2301, 2002, + 2297, -1000, -1000, -1000, -1000, -1000, 1041, -1000, 2155, 1592, + -1000, 740, 1603, -1000, -1000, 17419, 1374, 1954, 603, 1363, + 1625, 2885, 1871, 1860, 1940, -1000, -1000, -1000, -1000, 1861, + -1000, 1830, -1000, -1000, 1700, -1000, 2225, 357, 23891, 1595, + 1595, -1000, 602, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 915, 6195, 2366, -1000, 1351, -1000, 1140, 193, 1013, -1000, + -1000, 724, 724, -1000, 838, 828, -1000, 46536, 1716, -1000, + 368, 1350, 368, 1009, -1000, 1008, -1000, -1000, -1000, -1000, + 1738, 1819, -1000, -1000, -1000, -1000, 46536, -1000, -1000, 46536, + 46536, 46536, 1714, 2294, -1000, 18713, 1711, 726, 2177, 45242, + 45242, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 463, 724, -414, 319, 314, 724, 724, 724, + -443, -1000, -1000, 1349, 1344, -1000, -122, -1000, 18713, -1000, + -1000, -1000, 1061, 1061, 1339, 1337, 1324, -1000, 1700, -1000, + -1000, -1000, 1540, -1000, -1000, -102, 45242, 45242, 45242, 45242, + -1000, -1000, 993, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 679, 1195, 341, -109, 1195, + -1000, -1000, 368, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 18713, -1000, 18713, -1000, 1041, 18713, 2240, + 1304, 18713, 18713, -1000, 1005, 962, 1274, -1000, -1000, -1000, + 18713, -1000, -1000, -1000, -1000, -1000, 18713, -1000, -1000, -1000, + 18713, 221, 887, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1195, 356, -1000, -1000, -1000, -1000, 2328, + -1000, 1195, 18713, -1000, -1000, 18713, -1000, 18713, 18713, -1000, + 18713, -1000, 18713, -1000, -1000, -1000, -1000, 18713, 1672, 2059, + 1672, 1672, 25832, -1000, -1000, 2318, 2274, 2291, 1990, 1993, + 1993, 1987, -1000, 2281, 2275, -1000, 1302, 2262, 1292, 823, + -1000, 45889, 18713, 140, -1000, 389, 45242, 140, 45242, -1000, + 2255, -1000, -1000, 18713, 1710, -1000, 18713, -1000, -1000, -1000, + -1000, 7353, 2325, 1595, -1000, -1000, 693, -1000, 18713, -1000, + -1000, -1000, 3726, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1284, 1232, -1000, -1000, 1709, 18713, -1000, -1000, -1000, + 1518, 1503, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1700, -1000, -1000, -1000, -1000, 355, -438, 1498, 45242, 958, + -1000, 1333, 1606, 334, 140, 1229, 724, 724, 724, 957, + 952, 31008, 1330, -1000, 45242, 455, -1000, 355, -1000, -129, + -131, 1274, -1000, -1000, 2185, -1000, -1000, 13524, -1000, -1000, + 1697, 1794, -1000, -1000, -1000, -1000, 1921, -92, -114, -1000, + -1000, 1274, 1274, 2217, 1195, -1000, 1274, 1274, 1487, 1410, + -1000, 1274, 1242, 1791, -1000, 221, 1195, 1857, -1000, -1000, + 7353, -1000, -1000, 2255, 2249, 110, -1000, -1000, 260, 110, + 1041, 1764, 1274, 1702, 1692, 1274, 1274, 26479, -1000, 2248, + 2247, 31655, 31655, 661, 2274, -172, 18713, 18713, 1984, 996, + -1000, -1000, -1000, -1000, 1215, 1170, -1000, 1167, -1000, 2360, + -1000, 1041, -1000, 140, -1000, 600, 1603, -1000, 2240, 1041, + 45242, 1041, 113, 2255, -1000, 1274, -1000, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, + 1672, 1672, 1672, 1672, 1672, 1672, 1672, -1000, -1000, 45242, + 1440, -1000, -1000, 2184, 1323, 63, -1000, 1320, 1606, -1000, + -1000, 132, -1000, 18713, -1000, 31008, 1159, 1157, -1000, -1000, + -1000, -1000, -443, -1000, -1000, -1000, -1000, -1000, -1000, 445, + 1605, -1000, 719, 45242, 46536, -1000, 1914, -1000, -1000, -1000, + 18713, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 18713, + -1000, 1195, 1852, -1000, -267, -1000, -417, 18713, -165, -1000, + -1000, -165, -1000, 18713, -1000, -1000, 18713, -1000, 18713, -1000, + -1000, 1290, -1000, -1000, -1000, -1000, -1000, 1290, 1290, -1000, + -172, -1000, 1604, -1000, 45242, 1041, 1598, -1000, 939, -1000, + -1000, -1000, -1000, -1000, 45889, 1603, 45242, -1000, 1272, 1195, + 1672, 2240, -1000, 1268, -1000, 445, -1000, 1686, 1707, -1000, + -1000, -1000, 16772, -1000, -1000, -1000, -1000, -1000, 217, -96, + 13524, 9606, 1266, -1000, -94, 1274, 1242, -1000, -375, -1000, + -1000, -1000, -1000, 150, -1000, -1000, 1598, -1000, -1000, 1517, + 1489, 1431, 30361, -1000, -1000, -1000, -1000, -172, -1000, -1000, + 2178, -1000, -1000, 1338, -1000, -1000, 25832, 44595, -1000, -63, + 626, -96, 18713, 1673, 1195, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 24, -1000, -1000, 591, -1000, -1000, -1000, + 1787, -110, -1000, -1000, -1000, 135, -395, -197, -220, -1000, + -1000, 19360, -1000, 18713, -1000, 18713, -1000, 18713, -1000, -1000, + -1000, 45242, 1672, -1000, 1194, -1000, 4232, -245, 1849, -1000, + -60, -1000, -1000, -1000, 904, 1109, -1000, -1000, -1000, -1000, + -1000, -1000, 1336, 45242, -1000, 468, -1000, -1000, 12871, -102, + -115, 777, -1000, -1000, -1000, -1000, -1000, 1066, 988, 1274, + -1000, 45242, -1000, 44595, -219, 662, 7353, -1000, 1841, 1838, + 2335, -1000, -1000, -1000, -1000, -1000, -1000, -450, 1191, 276, + -1000, -1000, -1000, 135, -1000, 18713, -1000, 18713, -1000, 1195, + -1000, -1000, 2164, 113, -1000, 2355, -1000, 2336, 678, 678, + -1000, 940, -450, -1000, -1000, 1274, 1274, -1000, -246, -1000, + -1000, -1000, -1000, -1000, 458, 1025, -1000, -1000, -1000, -1000, + -1000, 7353, -1000, -1000, -1000, 207, 207, -1000, -1000, } var yyPgo = [...]int{ - 0, 3025, 3022, 38, 2, 36, 35, 3019, 93, 102, - 196, 37, 211, 104, 3013, 3007, 3006, 3001, 2997, 2995, - 2994, 171, 169, 166, 2993, 2992, 2990, 2989, 2988, 2987, - 2986, 2985, 2984, 2983, 162, 159, 181, 2981, 2980, 2977, - 117, 179, 89, 91, 183, 2975, 2974, 84, 2972, 2971, - 2970, 192, 191, 190, 918, 2968, 188, 115, 53, 2967, - 2966, 2965, 2964, 2963, 2961, 2959, 2958, 2956, 2953, 2951, - 2950, 2947, 2942, 2940, 2935, 2932, 287, 2930, 2926, 22, - 2921, 86, 2919, 2916, 2913, 2910, 12, 2908, 2907, 16, - 40, 2904, 2892, 48, 2888, 2886, 2884, 2883, 2878, 17, - 2877, 27, 2876, 39, 2875, 2874, 126, 2873, 2868, 2866, - 41, 2865, 2863, 2862, 2859, 2856, 2855, 2854, 140, 2853, - 2849, 2847, 236, 185, 2845, 2844, 273, 143, 108, 2843, - 2842, 114, 180, 2830, 116, 2827, 2824, 2819, 146, 2812, - 138, 2804, 2803, 66, 71, 2802, 371, 2800, 2799, 11, - 15, 72, 10, 20, 23, 2795, 2794, 65, 78, 2793, - 129, 2790, 2787, 98, 69, 2786, 106, 103, 2784, 2782, - 7, 5, 2781, 3, 1, 4, 68, 2779, 2777, 122, - 2776, 2775, 2773, 92, 2771, 2764, 2164, 2761, 95, 131, - 101, 81, 2759, 50, 58, 2757, 2754, 2753, 2746, 2745, - 54, 2739, 2738, 2737, 136, 380, 160, 2735, 47, 82, - 46, 134, 2734, 61, 80, 189, 161, 2733, 2731, 137, - 135, 2726, 2725, 62, 44, 45, 2722, 113, 130, 118, - 111, 112, 163, 2720, 2716, 60, 75, 2715, 2714, 2708, - 2705, 164, 2704, 2703, 73, 2702, 57, 2700, 167, 2699, - 19, 67, 2698, 49, 149, 2697, 76, 2696, 2695, 63, - 100, 70, 43, 2691, 195, 2690, 56, 170, 128, 151, - 2687, 2685, 2684, 2681, 187, 338, 2679, 2676, 77, 176, - 139, 144, 94, 2674, 349, 2668, 2653, 132, 2603, 5785, - 2651, 42, 154, 2632, 2626, 7129, 157, 52, 26, 2625, - 109, 2617, 2616, 2615, 2612, 193, 172, 105, 168, 59, - 2611, 2606, 2604, 14, 2598, 2593, 2590, 2580, 2572, 2570, - 90, 34, 33, 32, 202, 74, 30, 97, 150, 83, - 2569, 2568, 2566, 124, 79, 2565, 158, 156, 125, 155, - 2563, 177, 141, 123, 2562, 119, 31, 2559, 2552, 2551, - 2549, 99, 2548, 2534, 2525, 2522, 148, 142, 121, 87, - 2518, 88, 120, 147, 145, 55, 2516, 51, 2504, 2502, - 29, 182, 28, 2500, 13, 107, 212, 2497, 5000, 178, - 2496, 21, 367, 174, 2495, 2493, 8, 9, 6, 2491, - 2490, 2486, 2477, 133, 2470, 2469, 2467, 2463, 25, 64, - 24, 18, 110, 85, 2459, 2458, 3799, 0, 127, 2423, - 197, + 0, 2968, 2966, 40, 6, 42, 39, 2962, 83, 107, + 201, 60, 196, 105, 2950, 2945, 2942, 2940, 2939, 2937, + 2936, 182, 181, 172, 2935, 2934, 2931, 2928, 2927, 2925, + 2923, 2921, 2918, 2911, 177, 162, 197, 2910, 2907, 2901, + 122, 185, 90, 96, 193, 2900, 2894, 81, 2893, 2885, + 2884, 190, 188, 186, 837, 2883, 174, 121, 53, 2882, + 2875, 2873, 2872, 2865, 2864, 2861, 2854, 2846, 2838, 2829, + 2826, 2825, 2824, 2823, 2820, 2818, 290, 2807, 2804, 25, + 2803, 84, 2802, 2800, 2798, 2797, 12, 2793, 2790, 16, + 43, 2788, 2787, 51, 2786, 2784, 2781, 2780, 2779, 22, + 2775, 30, 2774, 41, 2766, 2765, 131, 2764, 2762, 2761, + 45, 2759, 2758, 2757, 2756, 2753, 2750, 2749, 144, 2746, + 2737, 2734, 166, 210, 2732, 2730, 167, 108, 116, 2728, + 2725, 117, 194, 2723, 125, 2722, 2720, 2719, 154, 2718, + 686, 2717, 2714, 75, 71, 2713, 28, 2712, 2711, 11, + 85, 72, 9, 8, 4, 2709, 2708, 66, 80, 2704, + 114, 2703, 2702, 106, 87, 2700, 109, 115, 2698, 2697, + 17, 7, 2695, 2, 1, 5, 70, 2694, 2692, 126, + 2685, 2679, 2678, 102, 2677, 2676, 665, 2674, 99, 139, + 111, 78, 2672, 54, 61, 2659, 2654, 2653, 2645, 2633, + 57, 2628, 2626, 2625, 145, 320, 164, 2611, 56, 74, + 59, 133, 2610, 55, 82, 198, 168, 2608, 2606, 137, + 142, 2605, 2594, 65, 47, 44, 2593, 101, 134, 124, + 46, 100, 135, 2592, 2591, 67, 77, 2586, 2580, 2579, + 2578, 170, 2576, 2574, 76, 2572, 58, 2571, 191, 2566, + 19, 69, 2565, 52, 171, 2564, 104, 2563, 2562, 68, + 103, 73, 33, 2561, 176, 2545, 63, 161, 129, 159, + 2539, 2533, 2532, 2531, 195, 357, 2530, 2529, 79, 173, + 153, 149, 97, 2528, 347, 2527, 2523, 20, 2256, 6149, + 2522, 38, 160, 2516, 2515, 5912, 24, 50, 26, 2511, + 119, 2508, 2505, 2502, 2496, 228, 178, 118, 158, 62, + 2494, 2492, 2491, 21, 2490, 2487, 2486, 2485, 2484, 2482, + 98, 37, 36, 35, 199, 88, 14, 110, 155, 89, + 2481, 2480, 2477, 128, 94, 2476, 157, 156, 130, 169, + 2475, 179, 146, 138, 2474, 95, 34, 2473, 2469, 2467, + 2460, 136, 2452, 2443, 2438, 2437, 151, 147, 127, 92, + 2436, 93, 123, 150, 148, 48, 2430, 49, 2428, 2426, + 32, 192, 31, 2424, 18, 113, 112, 2423, 3848, 183, + 2422, 23, 321, 152, 2421, 2420, 10, 13, 15, 2419, + 2416, 2412, 2407, 143, 2404, 2403, 2402, 2397, 29, 64, + 27, 3, 120, 91, 2395, 2391, 5054, 0, 132, 2388, + 204, } -//line sql.y:7884 +//line sql.y:7888 type yySymType struct { union any empty struct{} @@ -7433,68 +7366,68 @@ var yyR1 = [...]int{ 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 277, 277, 277, 385, 385, 385, 385, 385, 385, 384, 384, - 384, 350, 350, 350, 383, 383, 57, 57, 214, 214, - 402, 402, 403, 403, 403, 45, 45, 45, 45, 45, - 45, 44, 44, 44, 40, 40, 40, 40, 40, 40, + 384, 350, 350, 350, 350, 383, 383, 57, 57, 214, + 214, 402, 402, 403, 403, 403, 45, 45, 45, 45, + 45, 45, 44, 44, 44, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 46, 46, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 27, 27, 27, + 40, 40, 40, 40, 40, 40, 46, 46, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 106, 106, 107, 107, 107, - 107, 109, 109, 109, 366, 366, 58, 58, 3, 3, - 169, 171, 172, 172, 170, 170, 170, 170, 170, 170, - 60, 60, 59, 59, 174, 173, 175, 175, 175, 1, - 1, 2, 2, 4, 4, 371, 371, 371, 371, 371, + 27, 27, 27, 27, 27, 27, 106, 106, 107, 107, + 107, 107, 109, 109, 109, 366, 366, 58, 58, 3, + 3, 169, 171, 172, 172, 170, 170, 170, 170, 170, + 170, 60, 60, 59, 59, 174, 173, 175, 175, 175, + 1, 1, 2, 2, 4, 4, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, - 371, 371, 371, 371, 371, 371, 371, 332, 332, 332, - 365, 365, 367, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 112, 111, 111, 110, 113, 113, 113, - 113, 113, 113, 113, 113, 369, 369, 369, 61, 61, - 370, 321, 322, 323, 5, 6, 346, 368, 120, 120, - 28, 37, 37, 29, 29, 29, 29, 30, 30, 62, + 371, 371, 371, 371, 371, 371, 371, 371, 332, 332, + 332, 365, 365, 367, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 112, 111, 111, 110, 113, 113, + 113, 113, 113, 113, 113, 113, 369, 369, 369, 61, + 61, 370, 321, 322, 323, 5, 6, 346, 368, 120, + 120, 28, 37, 37, 29, 29, 29, 29, 30, 30, + 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 276, 276, 285, 285, 275, 275, 300, 300, 300, - 278, 278, 278, 279, 279, 395, 395, 395, 272, 272, - 64, 64, 64, 301, 301, 301, 301, 66, 66, 67, - 68, 68, 303, 303, 304, 304, 69, 70, 82, 82, - 82, 82, 82, 82, 82, 105, 105, 105, 15, 15, - 15, 15, 78, 78, 78, 14, 14, 65, 65, 72, - 392, 392, 393, 394, 394, 394, 394, 73, 75, 31, - 31, 31, 31, 31, 31, 130, 130, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 125, - 125, 125, 119, 119, 409, 76, 77, 77, 123, 123, - 123, 116, 116, 116, 122, 122, 122, 16, 16, 17, - 258, 258, 18, 18, 127, 127, 129, 129, 129, 129, - 129, 131, 131, 131, 131, 131, 131, 131, 126, 126, - 128, 128, 128, 128, 293, 293, 293, 292, 292, 163, - 163, 165, 164, 164, 166, 166, 167, 167, 167, 167, - 212, 212, 189, 189, 251, 251, 252, 252, 250, 250, - 257, 257, 253, 253, 253, 253, 260, 260, 168, 168, - 168, 168, 176, 176, 177, 177, 178, 178, 302, 302, - 298, 298, 298, 297, 297, 182, 182, 182, 184, 183, - 183, 183, 183, 185, 185, 187, 187, 186, 186, 188, - 193, 193, 192, 192, 190, 190, 190, 190, 191, 191, - 191, 191, 194, 194, 140, 140, 140, 140, 140, 140, - 140, 155, 155, 155, 155, 158, 158, 158, 158, 158, - 158, 158, 158, 158, 158, 158, 241, 241, 146, 146, + 63, 63, 276, 276, 285, 285, 275, 275, 300, 300, + 300, 278, 278, 278, 279, 279, 395, 395, 395, 272, + 272, 64, 64, 64, 301, 301, 301, 301, 66, 66, + 67, 68, 68, 303, 303, 304, 304, 69, 70, 82, + 82, 82, 82, 82, 82, 82, 105, 105, 105, 15, + 15, 15, 15, 78, 78, 78, 14, 14, 65, 65, + 72, 392, 392, 393, 394, 394, 394, 394, 73, 75, + 31, 31, 31, 31, 31, 31, 130, 130, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 125, 125, 125, 119, 119, 409, 76, 77, 77, 123, + 123, 123, 116, 116, 116, 122, 122, 122, 16, 16, + 17, 258, 258, 18, 18, 127, 127, 129, 129, 129, + 129, 129, 131, 131, 131, 131, 131, 131, 131, 126, + 126, 128, 128, 128, 128, 293, 293, 293, 292, 292, + 163, 163, 165, 164, 164, 166, 166, 167, 167, 167, + 167, 212, 212, 189, 189, 251, 251, 252, 252, 250, + 250, 257, 257, 253, 253, 253, 253, 260, 260, 168, + 168, 168, 168, 176, 176, 177, 177, 178, 178, 302, + 302, 298, 298, 298, 297, 297, 182, 182, 182, 184, + 183, 183, 183, 183, 185, 185, 187, 187, 186, 186, + 188, 193, 193, 192, 192, 190, 190, 190, 190, 191, + 191, 191, 191, 194, 194, 140, 140, 140, 140, 140, + 140, 140, 155, 155, 155, 155, 158, 158, 158, 158, + 158, 158, 158, 158, 158, 158, 158, 241, 241, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 146, 146, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 149, 217, 217, 216, - 216, 83, 83, 83, 84, 84, 85, 85, 85, 85, - 85, 86, 86, 86, 86, 86, 141, 141, 88, 88, - 87, 87, 207, 207, 290, 290, 89, 90, 90, 93, - 93, 92, 91, 91, 97, 97, 94, 94, 96, 96, - 95, 98, 98, 99, 100, 100, 273, 273, 195, 195, - 203, 203, 203, 203, 196, 196, 196, 196, 196, 196, - 196, 204, 204, 204, 211, 205, 205, 201, 201, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 200, + 150, 150, 150, 150, 150, 150, 150, 149, 217, 217, + 216, 216, 83, 83, 83, 84, 84, 85, 85, 85, + 85, 85, 86, 86, 86, 86, 86, 141, 141, 88, + 88, 87, 87, 207, 207, 290, 290, 89, 90, 90, + 93, 93, 92, 91, 91, 97, 97, 94, 94, 96, + 96, 95, 98, 98, 99, 100, 100, 273, 273, 195, + 195, 203, 203, 203, 203, 196, 196, 196, 196, 196, + 196, 196, 204, 204, 204, 211, 205, 205, 201, 201, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, @@ -7503,34 +7436,34 @@ var yyR1 = [...]int{ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 160, 160, 160, 160, 222, - 222, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 147, 148, 148, 161, 161, - 161, 161, 162, 162, 162, 162, 162, 162, 162, 310, - 310, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 410, 410, 324, 324, 324, 324, 202, 202, - 202, 202, 202, 121, 121, 121, 121, 121, 307, 307, - 307, 311, 311, 311, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 312, - 312, 220, 220, 117, 117, 218, 218, 219, 221, 221, - 213, 213, 213, 213, 215, 215, 198, 198, 198, 223, - 223, 224, 224, 101, 102, 102, 103, 103, 225, 225, - 227, 226, 226, 228, 229, 229, 229, 230, 230, 231, - 231, 231, 47, 47, 47, 47, 47, 42, 42, 42, - 42, 43, 43, 43, 43, 132, 132, 132, 132, 134, - 134, 133, 133, 79, 79, 80, 80, 80, 138, 138, - 139, 139, 139, 136, 136, 137, 137, 248, 248, 232, - 232, 232, 239, 239, 239, 235, 235, 237, 237, 237, - 238, 238, 238, 236, 245, 245, 247, 247, 246, 246, - 242, 242, 243, 243, 244, 244, 244, 240, 240, 197, - 197, 197, 197, 197, 249, 249, 249, 249, 261, 261, - 208, 208, 210, 210, 209, 209, 159, 262, 262, 266, - 263, 263, 267, 267, 267, 267, 255, 255, 255, 264, - 264, 265, 265, 294, 294, 294, 271, 271, 284, 284, - 280, 280, 281, 281, 274, 274, 286, 286, 286, 74, - 206, 206, 362, 362, 359, 289, 289, 291, 291, 295, - 295, 299, 299, 296, 296, 287, 287, 287, 287, 287, + 200, 200, 200, 200, 200, 200, 160, 160, 160, 160, + 222, 222, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 148, 148, 161, + 161, 161, 161, 162, 162, 162, 162, 162, 162, 162, + 310, 310, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 410, 410, 324, 324, 324, 324, 202, + 202, 202, 202, 202, 121, 121, 121, 121, 121, 307, + 307, 307, 311, 311, 311, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 312, 312, 220, 220, 117, 117, 218, 218, 219, 221, + 221, 213, 213, 213, 213, 215, 215, 198, 198, 198, + 223, 223, 224, 224, 101, 102, 102, 103, 103, 225, + 225, 227, 226, 226, 228, 229, 229, 229, 230, 230, + 231, 231, 231, 47, 47, 47, 47, 47, 42, 42, + 42, 42, 43, 43, 43, 43, 132, 132, 132, 132, + 134, 134, 133, 133, 79, 79, 80, 80, 80, 138, + 138, 139, 139, 139, 136, 136, 137, 137, 248, 248, + 232, 232, 232, 239, 239, 239, 235, 235, 237, 237, + 237, 238, 238, 238, 236, 245, 245, 247, 247, 246, + 246, 242, 242, 243, 243, 244, 244, 244, 240, 240, + 197, 197, 197, 197, 197, 249, 249, 249, 249, 261, + 261, 208, 208, 210, 210, 209, 209, 159, 262, 262, + 266, 263, 263, 267, 267, 267, 267, 255, 255, 255, + 264, 264, 265, 265, 294, 294, 294, 271, 271, 284, + 284, 280, 280, 281, 281, 274, 274, 286, 286, 286, + 74, 206, 206, 362, 362, 359, 289, 289, 291, 291, + 295, 295, 299, 299, 296, 296, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, @@ -7545,7 +7478,7 @@ var yyR1 = [...]int{ 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 287, 287, 287, 287, 288, 288, 288, 288, 288, 288, + 287, 287, 287, 287, 287, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, @@ -7584,8 +7517,8 @@ var yyR1 = [...]int{ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, - 288, 288, 288, 288, 288, 288, 406, 407, 305, 306, - 306, 306, + 288, 288, 288, 288, 288, 288, 288, 406, 407, 305, + 306, 306, 306, } var yyR2 = [...]int{ @@ -7638,104 +7571,104 @@ var yyR2 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 0, 1, 0, 2, - 0, 2, 0, 2, 2, 0, 1, 5, 1, 3, - 7, 1, 3, 3, 1, 2, 2, 2, 5, 5, - 5, 6, 8, 5, 5, 4, 4, 4, 6, 5, - 5, 5, 2, 2, 2, 2, 3, 3, 3, 4, - 3, 3, 1, 3, 5, 1, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 2, 3, 4, 4, - 2, 11, 3, 6, 8, 6, 6, 6, 13, 8, - 6, 10, 5, 5, 5, 7, 5, 5, 5, 5, - 5, 7, 7, 5, 5, 0, 6, 5, 6, 4, - 5, 0, 8, 9, 0, 3, 0, 1, 0, 3, - 8, 4, 1, 3, 3, 6, 7, 7, 8, 4, - 0, 1, 0, 1, 3, 3, 1, 1, 2, 1, - 1, 0, 2, 0, 2, 5, 3, 7, 4, 4, - 4, 4, 3, 3, 3, 7, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 2, 0, 2, 2, - 1, 3, 2, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 3, 1, 3, 3, 0, 2, 2, - 2, 2, 2, 2, 2, 4, 4, 3, 0, 1, - 4, 3, 4, 4, 3, 3, 3, 2, 1, 3, - 3, 3, 5, 7, 7, 6, 5, 3, 2, 3, - 3, 3, 7, 3, 3, 3, 3, 4, 7, 5, - 2, 4, 4, 4, 4, 4, 5, 5, 4, 4, - 4, 4, 4, 4, 4, 4, 2, 2, 4, 4, - 4, 4, 4, 2, 3, 3, 3, 5, 2, 3, - 3, 2, 3, 4, 4, 4, 3, 4, 4, 5, - 3, 0, 1, 0, 1, 1, 1, 0, 2, 2, - 0, 2, 2, 0, 2, 0, 1, 1, 1, 1, - 2, 1, 3, 1, 1, 1, 1, 1, 2, 1, - 1, 5, 0, 1, 0, 1, 2, 3, 0, 3, - 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 4, 4, 2, 2, 3, - 1, 3, 2, 1, 2, 1, 2, 2, 4, 3, - 3, 6, 4, 7, 6, 1, 3, 2, 2, 2, - 2, 1, 1, 1, 3, 2, 1, 1, 1, 0, - 1, 1, 0, 3, 0, 2, 0, 2, 1, 2, - 2, 0, 1, 1, 0, 1, 1, 5, 5, 4, - 0, 2, 4, 4, 0, 1, 0, 1, 2, 3, - 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 1, 2, 3, 5, 0, 1, 2, 1, 1, 0, - 1, 2, 1, 3, 1, 1, 1, 4, 3, 1, - 1, 2, 3, 7, 0, 3, 0, 1, 1, 3, - 1, 3, 1, 1, 3, 3, 1, 3, 4, 4, - 4, 3, 2, 4, 0, 1, 0, 2, 0, 1, - 0, 1, 2, 1, 1, 1, 2, 2, 1, 2, - 3, 2, 3, 2, 2, 2, 1, 1, 3, 3, - 0, 1, 1, 2, 6, 5, 6, 6, 0, 2, - 3, 3, 0, 2, 3, 3, 3, 2, 3, 1, - 6, 3, 4, 3, 1, 3, 4, 5, 6, 3, - 4, 5, 6, 3, 4, 1, 1, 1, 3, 3, + 1, 3, 1, 1, 1, 0, 1, 0, 1, 0, + 2, 0, 2, 0, 2, 2, 0, 1, 5, 1, + 3, 7, 1, 3, 3, 1, 2, 2, 2, 5, + 5, 5, 6, 8, 5, 5, 4, 4, 4, 6, + 5, 5, 5, 2, 2, 2, 2, 3, 3, 3, + 4, 3, 3, 1, 3, 5, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 2, 3, 4, + 4, 2, 11, 3, 6, 8, 6, 6, 6, 13, + 8, 6, 10, 5, 5, 5, 7, 5, 5, 5, + 5, 5, 7, 7, 5, 5, 0, 6, 5, 6, + 4, 5, 0, 8, 9, 0, 3, 0, 1, 0, + 3, 8, 4, 1, 3, 3, 6, 7, 7, 8, + 4, 0, 1, 0, 1, 3, 3, 1, 1, 2, + 1, 1, 0, 2, 0, 2, 5, 3, 7, 4, + 4, 4, 4, 3, 3, 3, 7, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 2, 0, 2, + 2, 1, 3, 2, 0, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 1, 3, 3, 0, 2, + 2, 2, 2, 2, 2, 2, 4, 4, 3, 0, + 1, 4, 3, 4, 4, 3, 3, 3, 2, 1, + 3, 3, 3, 5, 7, 7, 6, 5, 3, 2, + 3, 3, 3, 7, 3, 3, 3, 3, 4, 7, + 5, 2, 4, 4, 4, 4, 4, 5, 5, 4, + 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, + 4, 4, 4, 4, 2, 3, 3, 3, 5, 2, + 3, 3, 2, 3, 4, 4, 4, 3, 4, 4, + 5, 3, 0, 1, 0, 1, 1, 1, 0, 2, + 2, 0, 2, 2, 0, 2, 0, 1, 1, 1, + 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, + 1, 1, 5, 0, 1, 0, 1, 2, 3, 0, + 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 4, 4, 2, 2, + 3, 1, 3, 2, 1, 2, 1, 2, 2, 4, + 3, 3, 6, 4, 7, 6, 1, 3, 2, 2, + 2, 2, 1, 1, 1, 3, 2, 1, 1, 1, + 0, 1, 1, 0, 3, 0, 2, 0, 2, 1, + 2, 2, 0, 1, 1, 0, 1, 1, 5, 5, + 4, 0, 2, 4, 4, 0, 1, 0, 1, 2, + 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 2, 3, 5, 0, 1, 2, 1, 1, + 0, 1, 2, 1, 3, 1, 1, 1, 4, 3, + 1, 1, 2, 3, 7, 0, 3, 0, 1, 1, + 3, 1, 3, 1, 1, 3, 3, 1, 3, 4, + 4, 4, 3, 2, 4, 0, 1, 0, 2, 0, + 1, 0, 1, 2, 1, 1, 1, 2, 2, 1, + 2, 3, 2, 3, 2, 2, 2, 1, 1, 3, + 3, 0, 1, 1, 2, 6, 5, 6, 6, 0, + 2, 3, 3, 0, 2, 3, 3, 3, 2, 3, + 1, 6, 3, 4, 3, 1, 3, 4, 5, 6, + 3, 4, 5, 6, 3, 4, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, - 2, 2, 2, 1, 1, 2, 7, 7, 6, 6, - 2, 2, 1, 6, 3, 3, 3, 1, 3, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 2, 1, 1, 0, 1, - 2, 5, 0, 3, 0, 1, 4, 4, 2, 0, - 1, 1, 2, 2, 1, 1, 2, 2, 0, 1, - 1, 1, 1, 5, 1, 3, 0, 3, 1, 1, - 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 4, 6, 4, - 4, 8, 6, 8, 6, 5, 4, 10, 2, 2, - 1, 2, 2, 2, 4, 5, 5, 5, 5, 5, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 8, 8, 8, 6, 5, 4, 4, 4, 4, 4, - 7, 4, 4, 6, 6, 6, 8, 6, 6, 4, - 4, 3, 4, 6, 6, 4, 4, 4, 6, 8, - 6, 4, 6, 6, 8, 10, 7, 8, 8, 9, - 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 4, 4, 6, 5, 9, 6, - 9, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 2, 6, 8, 10, 12, 14, 6, 8, 8, 10, - 12, 14, 6, 8, 10, 12, 6, 8, 4, 4, - 3, 4, 6, 6, 4, 6, 4, 6, 8, 0, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 2, 2, 2, 2, 1, 1, 2, 7, 7, 6, + 6, 2, 2, 1, 6, 3, 3, 3, 1, 3, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 1, 1, 0, + 1, 2, 5, 0, 3, 0, 1, 4, 4, 2, + 0, 1, 1, 2, 2, 1, 1, 2, 2, 0, + 1, 1, 1, 1, 5, 1, 3, 0, 3, 1, + 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 4, 6, + 4, 4, 8, 6, 8, 6, 5, 4, 10, 2, + 2, 1, 2, 2, 2, 4, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 8, 8, 8, 6, 5, 4, 4, 4, 4, + 4, 7, 4, 4, 6, 6, 6, 8, 6, 6, + 4, 4, 3, 4, 6, 6, 4, 4, 4, 6, + 8, 6, 4, 6, 6, 8, 10, 7, 8, 8, + 9, 4, 4, 4, 4, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 4, 4, 6, 5, 9, + 6, 9, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 6, 8, 10, 12, 14, 6, 8, 8, + 10, 12, 14, 6, 8, 10, 12, 6, 8, 4, + 4, 3, 4, 6, 6, 4, 6, 4, 6, 8, + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 2, 0, 2, 3, 3, 4, 4, - 4, 4, 4, 0, 3, 4, 7, 3, 1, 1, - 1, 0, 5, 5, 2, 3, 1, 2, 2, 1, - 2, 1, 2, 2, 1, 2, 2, 1, 1, 0, - 1, 0, 1, 0, 2, 1, 2, 4, 0, 2, - 1, 1, 3, 5, 1, 1, 1, 2, 2, 0, - 3, 0, 2, 2, 1, 3, 0, 1, 0, 1, - 3, 1, 3, 2, 0, 1, 1, 0, 1, 2, - 4, 4, 0, 2, 2, 1, 1, 3, 3, 3, - 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, - 3, 1, 1, 0, 4, 0, 1, 1, 0, 3, - 1, 3, 2, 1, 1, 0, 1, 2, 4, 9, - 3, 5, 0, 3, 3, 0, 1, 0, 2, 2, - 0, 2, 2, 2, 0, 2, 1, 2, 3, 3, - 0, 2, 1, 2, 3, 4, 3, 0, 1, 2, - 1, 5, 4, 4, 1, 3, 3, 5, 0, 5, - 1, 3, 1, 2, 3, 4, 1, 1, 3, 3, - 1, 3, 3, 3, 3, 3, 1, 1, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 0, 2, 0, 3, 0, 1, 0, 1, 1, 5, - 0, 1, 0, 1, 2, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 2, 0, 2, 3, 3, 4, + 4, 4, 4, 4, 0, 3, 4, 7, 3, 1, + 1, 1, 0, 5, 5, 2, 3, 1, 2, 2, + 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, + 0, 1, 0, 1, 0, 2, 1, 2, 4, 0, + 2, 1, 1, 3, 5, 1, 1, 1, 2, 2, + 0, 3, 0, 2, 2, 1, 3, 0, 1, 0, + 1, 3, 1, 3, 2, 0, 1, 1, 0, 1, + 2, 4, 4, 0, 2, 2, 1, 1, 3, 3, + 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, + 0, 3, 1, 1, 0, 4, 0, 1, 1, 0, + 3, 1, 3, 2, 1, 1, 0, 1, 2, 4, + 9, 3, 5, 0, 3, 3, 0, 1, 0, 2, + 2, 0, 2, 2, 2, 0, 2, 1, 2, 3, + 3, 0, 2, 1, 2, 3, 4, 3, 0, 1, + 2, 1, 5, 4, 4, 1, 3, 3, 5, 0, + 5, 1, 3, 1, 2, 3, 4, 1, 1, 3, + 3, 1, 3, 3, 3, 3, 3, 1, 1, 2, + 1, 2, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 2, 0, 3, 0, 1, 0, 1, 1, + 5, 0, 1, 0, 1, 2, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -7789,8 +7722,8 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, } var yyChk = [...]int{ @@ -7928,7 +7861,7 @@ var yyChk = [...]int{ 145, 159, -241, 140, 163, 164, 165, 166, 167, 168, 169, 171, 170, 172, 173, 160, 161, 176, 223, 224, -150, -150, -150, -150, -211, -217, -216, -406, -213, -378, - -288, -295, -406, -406, -150, -273, -406, -406, -150, -406, + -288, -295, -406, -406, -150, -273, -406, -406, -146, -406, -406, -406, -220, -140, -406, -406, -410, -406, -410, -410, -324, -406, -324, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, -406, @@ -8133,338 +8066,338 @@ var yyChk = [...]int{ -140, -140, 88, -407, -407, -407, -103, 88, -100, -99, -289, 77, 122, -262, -289, 89, -407, -406, -230, 89, -234, -11, 87, -3, 272, -321, -370, -322, -323, -5, - -6, -346, -79, 505, -372, -350, -291, 90, 96, 89, - 505, -407, -407, -86, 145, 624, 594, -141, -152, -149, - 220, -407, 88, -407, 88, -407, 88, -289, 243, -101, - 88, 26, -298, -172, -170, -289, 558, -390, -389, 501, - -400, -396, 119, 143, 101, -398, 596, 552, 128, 129, - -79, -140, 87, -407, -80, 287, 611, -381, 506, -86, - 625, 572, 547, 572, 547, -140, -140, -140, -99, -406, - -407, 88, 23, -313, -60, 569, -387, -388, 77, -391, - 379, 568, 589, 119, 90, 89, -250, 248, -374, 507, - 142, -407, 88, -407, 88, -407, -89, -170, 565, -326, - -154, -388, 77, -387, 77, 14, 13, -4, 655, 89, - 289, -86, -140, -140, -407, -59, 27, -171, -386, 256, - 251, 254, 33, -386, 96, -4, -407, -407, 569, 250, - 32, 119, -154, -174, -173, -173, + -6, -346, -79, 505, -372, -350, -295, -291, 90, 96, + 89, 505, -407, -407, -86, 145, 624, 594, -141, -152, + -149, 220, -407, 88, -407, 88, -407, 88, -289, 243, + -101, 88, 26, -298, -172, -170, -289, 558, -390, -389, + 501, -400, -396, 119, 143, 101, -398, 596, 552, 128, + 129, -79, -140, 87, -407, -80, 287, 611, 221, -381, + 506, -86, 625, 572, 547, 572, 547, -140, -140, -140, + -99, -406, -407, 88, 23, -313, -60, 569, -387, -388, + 77, -391, 379, 568, 589, 119, 90, 89, -250, 248, + -296, -374, 507, 142, -407, 88, -407, 88, -407, -89, + -170, 565, -326, -154, -388, 77, -387, 77, 14, 13, + -4, 655, 89, 289, -86, -140, -140, -407, -59, 27, + -171, -386, 256, 251, 254, 33, -386, 96, -4, -407, + -407, 569, 250, 32, 119, -154, -174, -173, -173, } var yyDef = [...]int{ - 844, -2, -2, 846, 2, 4, 5, 6, 7, 8, + 845, -2, -2, 847, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 69, 71, - 72, 844, 844, 844, 0, 844, 0, 0, 844, -2, - -2, 844, 1461, 0, 844, 0, 0, -2, 771, 777, - 0, 779, -2, 0, 0, 844, 2008, 2008, 839, 0, - 0, 0, 0, 0, 844, 844, 844, 844, 1318, 49, - 844, 0, 84, 85, 795, 796, 797, 64, 0, 2006, - 845, 1, 3, 70, 74, 0, 0, 0, 57, 1327, - 0, 77, 0, 0, 848, 0, 0, 1444, 844, 844, + 72, 845, 845, 845, 0, 845, 0, 0, 845, -2, + -2, 845, 1462, 0, 845, 0, 0, -2, 772, 778, + 0, 780, -2, 0, 0, 845, 2009, 2009, 840, 0, + 0, 0, 0, 0, 845, 845, 845, 845, 1319, 49, + 845, 0, 84, 85, 796, 797, 798, 64, 0, 2007, + 846, 1, 3, 70, 74, 0, 0, 0, 57, 1328, + 0, 77, 0, 0, 849, 0, 0, 1445, 845, 845, 0, 116, 117, 0, 0, 0, -2, 120, -2, 149, - 150, 151, 0, 156, 585, 508, 560, 506, 545, -2, - 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 511, 384, 384, 0, 0, -2, 494, - 494, 494, 1446, 0, 0, 0, 542, 446, 384, 384, + 150, 151, 0, 156, 586, 509, 561, 507, 546, -2, + 495, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 512, 384, 384, 0, 0, -2, 495, + 495, 495, 1447, 0, 0, 0, 543, 446, 384, 384, 384, 0, 384, 384, 384, 384, 0, 0, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, - 384, 384, 384, 384, 384, 1345, 155, 1462, 1459, 1460, - 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, - 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, - 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, - 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, - 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, - 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, - 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, - 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, - 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, - 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, - 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, - 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, - 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, - 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, - 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, - 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, - 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, - 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, - 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, - 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, - 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, - 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, - 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, - 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, - 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, - 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, - 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, - 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, - 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, - 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, - 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, - 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, - 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, - 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, - 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, - 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, - 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, - 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, - 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 0, 1438, 0, 698, 947, 0, 760, 760, - 0, 760, 760, 760, 760, 0, 0, 0, 710, 0, - 0, 0, 0, 757, 0, 726, 727, 0, 757, 0, - 733, 763, 0, 738, 760, 760, 741, 2009, 0, 2009, - 2009, 1429, 0, 754, 752, 766, 767, 39, 770, 773, - 774, 775, 776, 778, 0, 783, 786, 1455, 1456, 0, - 788, 807, 808, 0, 840, 841, 44, 1095, 0, 969, - 974, 985, 1000, 1001, 1002, 1003, 1004, 1006, 1007, 1008, - 0, 0, 0, 0, 1013, 1014, 0, 0, 0, 0, - 0, 1076, 1022, 0, 0, 0, 0, 1291, 0, 0, - 1252, 1252, 1110, 1252, 1254, 1254, 1662, 1798, 1806, 1923, - 1625, 1630, 1631, 1632, 1916, 1917, 1918, 1919, 1957, 1958, - 1962, 1722, 0, 0, 0, 2005, 1759, 1767, 1768, 1792, - 1889, 1943, 1642, 1787, 1855, 1719, 1741, 1742, 1871, 1872, - 1763, 1764, 1745, 1757, 1760, 1748, 1749, 1751, 1753, 1758, - 1765, 1771, 1750, 1770, 1769, 0, 1746, 1747, 1752, 1762, - 1766, 1754, 1755, 1756, 1761, 1772, 0, 0, 0, 0, - 0, 1191, 1192, 1193, 1194, 0, 0, 0, 0, 0, - 0, 0, 280, 281, 1304, 1305, 42, 43, 1094, 1416, - 1254, 1254, 1254, 1254, 1254, 1036, 1037, 1038, 1039, 1040, - 1064, 1065, 1071, 1072, 1866, 1867, 1868, 1869, 1703, 1952, - 1711, 1712, 1850, 1851, 1724, 1725, 1980, 1981, -2, -2, + 384, 384, 384, 384, 384, 1346, 155, 1463, 1460, 1461, + 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, + 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, + 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, + 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, + 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, + 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, + 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, + 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, + 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, + 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, + 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, + 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, + 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, + 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, + 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, + 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, + 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, + 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, + 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, + 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, + 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, + 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, + 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, + 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, + 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, + 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, + 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, + 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, + 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, + 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, + 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, + 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, + 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, + 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, + 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, + 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, + 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, + 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006, 0, 1439, 0, 699, 948, 0, 761, 761, + 0, 761, 761, 761, 761, 0, 0, 0, 711, 0, + 0, 0, 0, 758, 0, 727, 728, 0, 758, 0, + 734, 764, 0, 739, 761, 761, 742, 2010, 0, 2010, + 2010, 1430, 0, 755, 753, 767, 768, 39, 771, 774, + 775, 776, 777, 779, 0, 784, 787, 1456, 1457, 0, + 789, 808, 809, 0, 841, 842, 44, 1096, 0, 970, + 975, 986, 1001, 1002, 1003, 1004, 1005, 1007, 1008, 1009, + 0, 0, 0, 0, 1014, 1015, 0, 0, 0, 0, + 0, 1077, 1023, 0, 0, 0, 0, 1292, 0, 0, + 1253, 1253, 1111, 1253, 1255, 1255, 1663, 1799, 1807, 1924, + 1626, 1631, 1632, 1633, 1917, 1918, 1919, 1920, 1958, 1959, + 1963, 1723, 0, 0, 0, 2006, 1760, 1768, 1769, 1793, + 1890, 1944, 1643, 1788, 1856, 1720, 1742, 1743, 1872, 1873, + 1764, 1765, 1746, 1758, 1761, 1749, 1750, 1752, 1754, 1759, + 1766, 1772, 1751, 1771, 1770, 0, 1747, 1748, 1753, 1763, + 1767, 1755, 1756, 1757, 1762, 1773, 0, 0, 0, 0, + 0, 1192, 1193, 1194, 1195, 0, 0, 0, 0, 0, + 0, 0, 280, 281, 1305, 1306, 42, 43, 1095, 1417, + 1255, 1255, 1255, 1255, 1255, 1037, 1038, 1039, 1040, 1041, + 1065, 1066, 1072, 1073, 1867, 1868, 1869, 1870, 1704, 1953, + 1712, 1713, 1851, 1852, 1725, 1726, 1981, 1982, -2, -2, -2, 221, 222, 223, 224, 225, 226, 227, 228, 0, - 1666, 1934, 1935, 217, 0, 0, 285, 286, 282, 283, - 284, 1078, 1079, 238, 239, 240, 241, 242, 243, 244, + 1667, 1935, 1936, 217, 0, 0, 285, 286, 282, 283, + 284, 1079, 1080, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 2008, 0, 817, 0, 0, - 0, 0, 0, 1327, 0, 1319, 1318, 62, 0, 844, - -2, 0, 0, 0, 0, 46, 0, 51, 904, 847, - 76, 75, 1367, 0, 0, 0, 58, 1328, 66, 68, - 1329, 0, 849, 850, 0, 880, 884, 0, 0, 0, - 1445, 1444, 1444, 101, 0, 0, 1420, 113, 114, 115, - 0, 0, 1426, 1427, 1431, 1432, 0, 0, 167, 168, - 0, 40, 411, 0, 163, 0, 404, 345, 0, 1345, - 0, 0, 0, 0, 0, 844, 0, 1439, 144, 145, - 152, 153, 154, 384, 384, 384, 557, 0, 0, 155, - 155, 515, 516, 517, 0, 0, -2, 409, 0, 495, + 275, 276, 277, 278, 279, 2009, 0, 818, 0, 0, + 0, 0, 0, 1328, 0, 1320, 1319, 62, 0, 845, + -2, 0, 0, 0, 0, 46, 0, 51, 905, 848, + 76, 75, 1368, 0, 0, 0, 58, 1329, 66, 68, + 1330, 0, 850, 851, 0, 881, 885, 0, 0, 0, + 1446, 1445, 1445, 101, 0, 0, 1421, 113, 114, 115, + 0, 0, 1427, 1428, 1432, 1433, 0, 0, 167, 168, + 0, 40, 411, 0, 163, 0, 404, 345, 0, 1346, + 0, 0, 0, 0, 0, 845, 0, 1440, 144, 145, + 152, 153, 154, 384, 384, 384, 558, 0, 0, 155, + 155, 516, 517, 518, 0, 0, -2, 409, 0, 496, 0, 0, 398, 398, 402, 400, 401, 0, 0, 0, - 0, 0, 0, 0, 0, 534, 0, 535, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 646, 0, 385, - 0, 555, 556, 447, 0, 0, 0, 0, 0, 0, - 0, 0, 1447, 1448, 0, 532, 533, 0, 0, 0, + 0, 0, 0, 0, 0, 535, 0, 536, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 647, 0, 385, + 0, 556, 557, 447, 0, 0, 0, 0, 0, 0, + 0, 0, 1448, 1449, 0, 533, 534, 0, 0, 0, 384, 384, 0, 0, 0, 0, 384, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 143, 1358, 0, 0, - 0, -2, 0, 690, 0, 0, 0, 1440, 1440, 0, - 697, 0, 699, 700, 0, 0, 701, 0, 757, 757, - 755, 756, 703, 704, 705, 706, 760, 0, 0, 393, - 394, 395, 757, 760, 0, 760, 760, 760, 760, 757, - 757, 757, 760, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2009, 763, 760, 0, 734, 0, 735, 736, - 739, 740, 742, 2010, 2011, 1457, 1458, 1465, 1466, 1467, - 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, - 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, - 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, - 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, - 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, - 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, - 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, - 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, - 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, - 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, - 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, - 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, - 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, - 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, - 1608, 1609, 1610, 1611, 1612, 1613, 2009, 2009, 746, 750, - 1430, 772, 784, 787, 802, 48, 1710, 794, 819, 820, - 825, 0, 0, 0, 0, 831, 832, 833, 0, 0, - 836, 837, 838, 0, 0, 0, 0, 0, 967, 0, - 0, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 986, 987, 0, 0, 0, - 1009, 1010, 1011, 1012, 1015, 0, 1027, 0, 1029, 1300, - -2, 0, 0, 0, 1020, 1021, 0, 0, 0, 0, - 0, 0, 0, 1292, 0, 0, 1108, 0, 1109, 1111, - 1112, 0, 1113, 854, 854, 854, 854, 854, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 854, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1450, + 0, 0, 0, 0, 0, 0, 143, 1359, 0, 0, + 0, -2, 0, 691, 0, 0, 0, 1441, 1441, 0, + 698, 0, 700, 701, 0, 0, 702, 0, 758, 758, + 756, 757, 704, 705, 706, 707, 761, 0, 0, 393, + 394, 395, 758, 761, 0, 761, 761, 761, 761, 758, + 758, 758, 761, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2010, 764, 761, 0, 735, 0, 736, 737, + 740, 741, 743, 2011, 2012, 1458, 1459, 1466, 1467, 1468, + 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, + 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, + 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, + 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, + 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, + 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, + 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, + 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, + 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, + 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, + 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, + 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, + 1609, 1610, 1611, 1612, 1613, 1614, 2010, 2010, 747, 751, + 1431, 773, 785, 788, 803, 48, 1711, 795, 820, 821, + 826, 0, 0, 0, 0, 832, 833, 834, 0, 0, + 837, 838, 839, 0, 0, 0, 0, 0, 968, 0, + 0, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 987, 988, 0, 0, 0, + 1010, 1011, 1012, 1013, 1016, 0, 1028, 0, 1030, 1301, + -2, 0, 0, 0, 1021, 1022, 0, 0, 0, 0, + 0, 0, 0, 1293, 0, 0, 1109, 0, 1110, 1112, + 1113, 0, 1114, 855, 855, 855, 855, 855, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 855, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1451, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 864, 0, - 0, 864, 864, 0, 0, 210, 211, 212, 213, 214, + 0, 0, 0, 0, 0, 0, 0, 0, 865, 0, + 0, 865, 865, 0, 0, 210, 211, 212, 213, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 230, 231, 232, 233, 234, - 287, 235, 236, 237, 1094, 0, 0, 0, 45, 809, - 810, 0, 930, 1450, 0, 0, 860, 0, 56, 65, - 67, 1327, 60, 1327, 0, 866, 0, 0, -2, -2, - 867, 873, 874, 875, 876, 877, 53, 2007, 54, 0, - 73, 0, 47, 0, 0, 0, 0, 357, 1370, 0, - 0, 1320, 1321, 1324, 0, 881, 1804, 885, 0, 887, - 888, 0, 0, 99, 0, 946, 0, 0, 0, 0, - 1428, 103, 104, 0, 0, 0, 368, 1433, 1434, 1435, + 287, 235, 236, 237, 1095, 0, 0, 0, 45, 810, + 811, 0, 931, 1451, 0, 0, 861, 0, 56, 65, + 67, 1328, 60, 1328, 0, 867, 0, 0, -2, -2, + 868, 874, 875, 876, 877, 878, 53, 2008, 54, 0, + 73, 0, 47, 0, 0, 0, 0, 357, 1371, 0, + 0, 1321, 1322, 1325, 0, 882, 1805, 886, 0, 888, + 889, 0, 0, 99, 0, 947, 0, 0, 0, 0, + 1429, 103, 104, 0, 0, 0, 368, 1434, 1435, 1436, -2, 391, 0, 368, 352, 295, 296, 297, 345, 299, 345, 345, 345, 345, 357, 357, 357, 357, 328, 329, 330, 331, 332, 0, 0, 314, 345, 345, 345, 345, 335, 336, 337, 338, 339, 340, 341, 342, 300, 301, 302, 303, 304, 305, 306, 307, 308, 347, 347, 347, - 349, 349, 0, 41, 0, 372, 0, 1324, 0, 0, - 1358, 1442, 1452, 0, 0, 0, 1442, 122, 0, 0, - 0, 558, 596, 509, 546, 559, 0, 512, 513, -2, - 0, 0, 494, 0, 496, 0, 392, 0, -2, 0, - 402, 0, 398, 402, 399, 402, 390, 403, 536, 537, - 538, 0, 540, 541, 626, 916, 0, 0, 0, 0, - 0, 632, 633, 634, 0, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 547, 548, 549, 550, 551, - 552, 553, 554, 0, 0, 0, 0, 496, 0, 543, + 349, 349, 0, 41, 0, 372, 0, 1325, 0, 0, + 1359, 1443, 1453, 0, 0, 0, 1443, 122, 0, 0, + 0, 559, 597, 510, 547, 560, 0, 513, 514, -2, + 0, 0, 495, 0, 497, 0, 392, 0, -2, 0, + 402, 0, 398, 402, 399, 402, 390, 403, 537, 538, + 539, 0, 541, 542, 627, 917, 0, 0, 0, 0, + 0, 633, 634, 635, 0, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 548, 549, 550, 551, 552, + 553, 554, 555, 0, 0, 0, 0, 497, 0, 544, 0, 0, 448, 449, 450, 0, 0, 453, 454, 455, - 456, 0, 0, 459, 460, 461, 933, 934, 462, 463, + 456, 0, 0, 459, 460, 461, 934, 935, 462, 463, 488, 489, 490, 464, 465, 466, 467, 468, 469, 470, 482, 483, 484, 485, 486, 487, 471, 472, 473, 474, - 475, 476, 479, 0, 137, 1349, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1440, 0, 0, 0, 0, 863, 948, 1463, 1464, - 761, 762, 0, 396, 397, 760, 760, 707, 747, 0, - 760, 711, 748, 712, 714, 713, 715, 728, 729, 760, - 718, 758, 759, 719, 720, 721, 722, 723, 724, 725, - 743, 730, 731, 732, 764, 0, 768, 769, 744, 745, - 0, 785, 805, 803, 804, 806, 798, 799, 800, 801, - 0, 0, 0, 822, 95, 827, 828, 829, 830, 842, - 835, 1096, 964, 965, 966, 0, 968, 971, 0, 1080, - 1082, 973, 975, 1091, 1092, 1093, 0, 0, 0, 0, - 0, 979, 983, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1005, 1268, 1269, 1270, 1024, - 288, 289, 0, 1025, 0, 0, 0, 0, 0, 0, - 0, 1095, 1026, 0, 878, 0, 0, 1298, 1295, 0, - 0, 0, 1253, 1255, 0, 0, 0, 0, 855, 856, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1231, 1232, - 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, - 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1271, - 0, 0, 0, 0, 0, 1291, 0, 1031, 1032, 1033, - 0, 0, 0, 0, 0, 0, 1151, 0, 0, 0, - 0, 1451, 0, 132, 133, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1195, 1196, 1197, 1198, 38, 0, 0, 0, 865, - 1302, 0, -2, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1220, 0, 0, - 0, 0, 0, 0, 1414, 0, 0, 812, 813, 815, - 0, 950, 0, 931, 0, 0, 818, 0, 859, 0, - 862, 59, 61, 871, 872, 0, 889, 868, 55, 50, - 0, 0, 908, 1368, 357, 1390, 0, 366, 366, 363, - 1330, 1331, 0, 1323, 1325, 1326, 78, 886, 882, 0, - 962, 0, 0, 945, 0, 892, 894, 895, 896, 928, - 0, 899, 900, 0, 0, 0, 0, 0, 97, 947, - 1421, 0, 102, 0, 0, 107, 108, 1422, 1423, 1424, - 1425, 0, 585, -2, 443, 169, 171, 172, 173, 164, + 475, 476, 479, 0, 137, 1350, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1441, 0, 0, 0, 0, 864, 949, 1464, 1465, + 762, 763, 0, 396, 397, 761, 761, 708, 748, 0, + 761, 712, 749, 713, 715, 714, 716, 729, 730, 761, + 719, 759, 760, 720, 721, 722, 723, 724, 725, 726, + 744, 731, 732, 733, 765, 0, 769, 770, 745, 746, + 0, 786, 806, 804, 805, 807, 799, 800, 801, 802, + 0, 0, 0, 823, 95, 828, 829, 830, 831, 843, + 836, 1097, 965, 966, 967, 0, 969, 972, 0, 1081, + 1083, 974, 976, 1092, 1093, 1094, 0, 0, 0, 0, + 0, 980, 984, 989, 990, 991, 992, 993, 994, 995, + 996, 997, 998, 999, 1000, 1006, 1269, 1270, 1271, 1025, + 288, 289, 0, 1026, 0, 0, 0, 0, 0, 0, + 0, 1096, 1027, 0, 879, 0, 0, 1299, 1296, 0, + 0, 0, 1254, 1256, 0, 0, 0, 0, 856, 857, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1232, 1233, + 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, + 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1272, + 0, 0, 0, 0, 0, 1292, 0, 1032, 1033, 1034, + 0, 0, 0, 0, 0, 0, 1152, 0, 0, 0, + 0, 1452, 0, 132, 133, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1196, 1197, 1198, 1199, 38, 0, 0, 0, 866, + 1303, 0, -2, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1221, 0, 0, + 0, 0, 0, 0, 1415, 0, 0, 813, 814, 816, + 0, 951, 0, 932, 0, 0, 819, 0, 860, 0, + 863, 59, 61, 872, 873, 0, 890, 869, 55, 50, + 0, 0, 909, 1369, 357, 1391, 0, 366, 366, 363, + 1331, 1332, 0, 1324, 1326, 1327, 78, 887, 883, 0, + 963, 0, 0, 946, 0, 893, 895, 896, 897, 929, + 0, 900, 901, 0, 0, 0, 0, 0, 97, 948, + 1422, 0, 102, 0, 0, 107, 108, 1423, 1424, 1425, + 1426, 0, 586, -2, 443, 169, 171, 172, 173, 164, -2, 355, 353, 354, 298, 357, 357, 322, 323, 324, 325, 326, 327, 0, 0, 315, 316, 317, 318, 309, - 0, 310, 311, 312, 0, 313, 410, 0, 1332, 373, + 0, 310, 311, 312, 0, 313, 410, 0, 1333, 373, 374, 376, 384, 0, 379, 380, 0, 384, 384, 0, - 405, 406, 0, 1324, 1349, 0, 0, 0, 1453, 1452, - 1452, 1452, 0, 157, 158, 159, 160, 161, 162, 621, - 0, 0, 597, 619, 620, 155, 0, 0, 165, 498, - 497, 0, 653, 0, 408, 0, 0, 402, 402, 387, - 388, 539, 0, 0, 628, 629, 630, 631, 0, 0, - 0, 525, 437, 0, 526, 527, 496, 498, 0, 0, + 405, 406, 0, 1325, 1350, 0, 0, 0, 1454, 1453, + 1453, 1453, 0, 157, 158, 159, 160, 161, 162, 622, + 0, 0, 598, 620, 621, 155, 0, 0, 165, 499, + 498, 0, 654, 0, 408, 0, 0, 402, 402, 387, + 388, 540, 0, 0, 629, 630, 631, 632, 0, 0, + 0, 526, 437, 0, 527, 528, 497, 499, 0, 0, 368, 451, 452, 457, 458, 477, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 572, 573, 574, - 577, 579, 500, 583, 576, 578, 580, 500, 584, 1346, - 1347, 1348, 0, 0, 691, 0, 0, 434, 93, 1441, - 696, 757, 717, 749, 757, 709, 716, 737, 781, 789, - 790, 791, 792, 793, 826, 0, 0, 0, 0, 834, - 0, 0, 972, 1081, 1083, 976, 0, 980, 984, 0, - 0, 0, 1030, 1028, 1302, 0, 0, 0, 1077, 0, - 0, 1099, 1100, 0, 0, 0, 1296, 0, 0, 1106, - 0, 1256, 1257, 1114, 0, 0, 0, 0, 0, 1120, - 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1318, - 0, 0, 0, 0, 0, 1135, 1136, 1137, 1138, 1139, - 0, 1141, 0, 1142, 0, 0, 0, 0, 1149, 1150, - 1152, 0, 0, 1155, 1156, 0, 0, 1157, 0, 0, - 0, 1161, 0, 0, 0, 0, 1170, 1171, 1172, 1173, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1184, 1185, 0, 1059, 0, 0, 1059, 0, 1097, 864, - 0, 1258, 1259, 1260, 1261, 1262, 0, 0, 0, 0, - 0, 0, 1218, 1219, 1221, 0, 0, 1224, 0, 1226, - 0, 1415, 811, 814, 816, 902, 951, 952, 0, 0, - 0, 0, 932, 1449, 857, 858, 861, 910, 0, 1306, - 0, 0, 889, 962, 890, 0, 869, 52, 905, 0, - 1372, 1371, 1384, 1397, 366, 366, 360, 361, 367, 362, - 364, 365, 1322, 0, 1327, 0, 1408, 0, 0, 1400, - 0, 0, 0, 0, 0, 0, 0, 0, 935, 0, - 0, 938, 0, 0, 0, 0, 929, 900, 0, 901, + 0, 0, 0, 0, 0, 0, 0, 573, 574, 575, + 578, 580, 501, 584, 577, 579, 581, 501, 585, 1347, + 1348, 1349, 0, 0, 692, 0, 0, 434, 93, 1442, + 697, 758, 718, 750, 758, 710, 717, 738, 782, 790, + 791, 792, 793, 794, 827, 0, 0, 0, 0, 835, + 0, 0, 973, 1082, 1084, 977, 0, 981, 985, 0, + 0, 0, 1031, 1029, 1303, 0, 0, 0, 1078, 0, + 0, 1100, 1101, 0, 0, 0, 1297, 0, 0, 1107, + 0, 1257, 1258, 1115, 0, 0, 0, 0, 0, 1121, + 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1319, + 0, 0, 0, 0, 0, 1136, 1137, 1138, 1139, 1140, + 0, 1142, 0, 1143, 0, 0, 0, 0, 1150, 1151, + 1153, 0, 0, 1156, 1157, 0, 0, 1158, 0, 0, + 0, 1162, 0, 0, 0, 0, 1171, 1172, 1173, 1174, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1185, 1186, 0, 1060, 0, 0, 1060, 0, 1098, 865, + 0, 1259, 1260, 1261, 1262, 1263, 0, 0, 0, 0, + 0, 0, 1219, 1220, 1222, 0, 0, 1225, 0, 1227, + 0, 1416, 812, 815, 817, 903, 952, 953, 0, 0, + 0, 0, 933, 1450, 858, 859, 862, 911, 0, 1307, + 0, 0, 890, 963, 891, 0, 870, 52, 906, 0, + 1373, 1372, 1385, 1398, 366, 366, 360, 361, 367, 362, + 364, 365, 1323, 0, 1328, 0, 1409, 0, 0, 1401, + 0, 0, 0, 0, 0, 0, 0, 0, 936, 0, + 0, 939, 0, 0, 0, 0, 930, 901, 0, 902, 0, -2, 0, 0, 91, 92, 0, 0, 0, 105, 106, 0, 0, 112, 369, 370, 146, 155, 445, 170, 418, 0, 0, 294, 356, 319, 320, 321, 0, 343, - 0, 0, 0, 439, 118, 1336, 1335, 384, 384, 375, - 0, 378, 0, 0, 0, 1454, 346, 407, 0, 136, - 0, 0, 0, 0, 0, 142, 591, 0, 0, 598, - 0, 0, 0, 507, 0, 518, 519, 0, 625, -2, - 687, 372, 0, 386, 389, 917, 0, 0, 520, 0, - 523, 524, 438, 498, 529, 530, 544, 531, 480, 481, - 478, 0, 0, 1359, 1360, 1365, 1363, 1364, 123, 565, - 567, 566, 570, 0, 0, 0, 502, 0, 502, 563, - 0, 434, 1332, 0, 695, 435, 436, 760, 760, 821, - 96, 0, 824, 0, 0, 0, 0, 977, 981, 1263, - 1289, 345, 345, 1276, 345, 349, 1279, 345, 1281, 345, - 1284, 345, 1287, 1288, 0, 0, 0, 879, 0, 0, - 1105, 1299, 0, 0, 1115, 1116, 1117, 1118, 1119, 1293, - 0, 0, 0, 1134, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 439, 118, 1337, 1336, 384, 384, 375, + 0, 378, 0, 0, 0, 1455, 346, 407, 0, 136, + 0, 0, 0, 0, 0, 142, 592, 0, 0, 599, + 0, 0, 0, 508, 0, 519, 520, 0, 626, -2, + 688, 372, 0, 386, 389, 918, 0, 0, 521, 0, + 524, 525, 438, 499, 530, 531, 545, 532, 480, 481, + 478, 0, 0, 1360, 1361, 1366, 1364, 1365, 123, 566, + 568, 567, 571, 0, 0, 0, 503, 0, 503, 564, + 0, 434, 1333, 0, 696, 435, 436, 761, 761, 822, + 96, 0, 825, 0, 0, 0, 0, 978, 982, 1264, + 1290, 345, 345, 1277, 345, 349, 1280, 345, 1282, 345, + 1285, 345, 1288, 1289, 0, 0, 0, 880, 0, 0, + 1106, 1300, 0, 0, 1116, 1117, 1118, 1119, 1120, 1294, + 0, 0, 0, 1135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 0, 0, 0, 0, - 0, 0, 1229, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1054, 1058, 0, 1060, 1061, 0, 0, - 1187, 0, 0, 1199, 0, 1303, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 953, 958, 958, 958, - 0, 0, 0, 1436, 1437, 1307, 1308, 962, 1309, 891, - 870, 909, 1390, 0, 1383, 0, -2, 1392, 0, 0, - 0, 1398, 358, 359, 883, 79, 963, 82, 0, 1408, - 1417, 0, 1399, 1410, 1412, 0, 0, 0, 1404, 0, - 962, 893, 924, 926, 0, 921, 936, 937, 939, 0, - 941, 0, 943, 944, 904, 898, 0, 99, 0, 962, - 962, 98, 0, 949, 109, 110, 111, 444, 174, 179, + 0, 0, 1230, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1055, 1059, 0, 1061, 1062, 0, 0, + 1188, 0, 0, 1200, 0, 1304, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 954, 959, 959, 959, + 0, 0, 0, 1437, 1438, 1308, 1309, 963, 1310, 892, + 871, 910, 1391, 0, 1384, 0, -2, 1393, 0, 0, + 0, 1399, 358, 359, 884, 79, 964, 82, 0, 1409, + 1418, 0, 1400, 1411, 1413, 0, 0, 0, 1405, 0, + 963, 894, 925, 927, 0, 922, 937, 938, 940, 0, + 942, 0, 944, 945, 905, 899, 0, 99, 0, 963, + 963, 98, 0, 950, 109, 110, 111, 444, 174, 179, 0, 0, 0, 184, 0, 186, 0, 0, 0, 191, 192, 384, 384, 419, 0, 291, 293, 0, 0, 177, - 357, 0, 357, 0, 350, 0, 420, 440, 1333, 1334, - 0, 0, 377, 381, 382, 383, 0, 1443, 138, 0, - 0, 0, 594, 0, 622, 0, 0, 0, 0, 0, - 0, 166, 499, 654, 655, 656, 657, 658, 659, 660, - 661, 662, 0, 384, 0, 0, 0, 384, 384, 384, - 0, 679, 371, 0, 0, 650, 647, 521, 0, 215, - 216, 218, 0, 0, 0, 0, 0, 528, 904, 1350, - 1351, 1352, 0, 1362, 1366, 126, 0, 0, 0, 0, - 575, 581, 0, 501, 582, 692, 693, 694, 94, 702, - 708, 823, 843, 970, 978, 982, 0, 0, 0, 0, - 1290, 1274, 357, 1277, 1278, 1280, 1282, 1283, 1285, 1286, - 1018, 1019, 1023, 0, 1102, 0, 1104, 1297, 0, 1327, - 0, 0, 0, 1133, 0, 0, 0, 1144, 1143, 1145, - 0, 1147, 1148, 1153, 1154, 1158, 0, 1160, 1162, 1163, - 0, 0, 0, 1174, 1175, 1176, 1177, 1178, 1179, 1180, - 1181, 1182, 1183, 0, 1052, 1055, 1186, 1062, 1063, 1068, - 1189, 0, 0, 1098, 1201, 0, 1206, 0, 0, 1212, - 0, 1216, 0, 1222, 1223, 1225, 1227, 0, 0, 0, - 0, 0, 930, 911, 63, 1309, 1311, 0, 1377, 1375, - 1375, 1385, 1386, 0, 0, 1393, 0, 0, 0, 0, - 83, 0, 0, 0, 1413, 0, 0, 0, 0, 100, - 1318, 918, 925, 0, 0, 919, 0, 920, 940, 942, - 897, 0, 962, 962, 89, 90, 0, 180, 0, 182, + 357, 0, 357, 0, 350, 0, 420, 440, 1334, 1335, + 0, 0, 377, 381, 382, 383, 0, 1444, 138, 0, + 0, 0, 595, 0, 623, 0, 0, 0, 0, 0, + 0, 166, 500, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 0, 384, 0, 0, 0, 384, 384, 384, + 0, 680, 371, 0, 0, 651, 648, 522, 0, 215, + 216, 218, 0, 0, 0, 0, 0, 529, 905, 1351, + 1352, 1353, 0, 1363, 1367, 126, 0, 0, 0, 0, + 576, 582, 0, 502, 583, 693, 694, 695, 94, 703, + 709, 824, 844, 971, 979, 983, 0, 0, 0, 0, + 1291, 1275, 357, 1278, 1279, 1281, 1283, 1284, 1286, 1287, + 1019, 1020, 1024, 0, 1103, 0, 1105, 1298, 0, 1328, + 0, 0, 0, 1134, 0, 0, 0, 1145, 1144, 1146, + 0, 1148, 1149, 1154, 1155, 1159, 0, 1161, 1163, 1164, + 0, 0, 0, 1175, 1176, 1177, 1178, 1179, 1180, 1181, + 1182, 1183, 1184, 0, 1053, 1056, 1187, 1063, 1064, 1069, + 1190, 0, 0, 1099, 1202, 0, 1207, 0, 0, 1213, + 0, 1217, 0, 1223, 1224, 1226, 1228, 0, 0, 0, + 0, 0, 931, 912, 63, 1310, 1312, 0, 1378, 1376, + 1376, 1386, 1387, 0, 0, 1394, 0, 0, 0, 0, + 83, 0, 0, 0, 1414, 0, 0, 0, 0, 100, + 1319, 919, 926, 0, 0, 920, 0, 921, 941, 943, + 898, 0, 963, 963, 89, 90, 0, 180, 0, 182, 208, 209, 0, 185, 187, 188, 189, 195, 196, 197, 190, 0, 0, 290, 292, 0, 0, 333, 344, 334, - 0, 0, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, - 904, 139, 140, 141, 586, 0, 596, 0, 906, 0, - 589, 0, 510, 0, 0, 0, 384, 384, 384, 0, - 0, 0, 0, 664, 0, 0, 627, 0, 635, 0, - 0, 0, 219, 220, 0, 1361, 564, 0, 124, 125, - 0, 0, 569, 503, 504, 1016, 0, 0, 0, 1017, - 1275, 0, 0, 0, 0, 1294, 0, 0, 0, 0, - 1140, 0, 0, 0, 1166, 0, 0, 0, 616, 617, - 0, 1230, 1057, 1318, 0, 1059, 1069, 1070, 0, 1059, - 1200, 0, 0, 0, 0, 0, 0, 0, 959, 0, - 0, 0, 0, 950, 1311, 1316, 0, 0, 1380, 0, - 1373, 1376, 1374, 1387, 0, 0, 1394, 0, 1396, 0, - 1418, 1419, 1411, 0, 1403, 1406, 1402, 1405, 1327, 922, - 0, 927, 0, 1318, 88, 0, 183, 0, 0, 0, + 0, 0, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, + 905, 139, 140, 141, 587, 0, 597, 0, 907, 0, + 590, 0, 511, 0, 0, 0, 384, 384, 384, 0, + 0, 0, 0, 665, 0, 0, 628, 0, 636, 0, + 0, 0, 219, 220, 0, 1362, 565, 0, 124, 125, + 0, 0, 570, 504, 505, 1017, 0, 0, 0, 1018, + 1276, 0, 0, 0, 0, 1295, 0, 0, 0, 0, + 1141, 0, 0, 0, 1167, 0, 0, 0, 617, 618, + 0, 1231, 1058, 1319, 0, 1060, 1070, 1071, 0, 1060, + 1201, 0, 0, 0, 0, 0, 0, 0, 960, 0, + 0, 0, 0, 951, 1312, 1317, 0, 0, 1381, 0, + 1374, 1377, 1375, 1388, 0, 0, 1395, 0, 1397, 0, + 1419, 1420, 1412, 0, 1404, 1407, 1403, 1406, 1328, 923, + 0, 928, 0, 1319, 88, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -8472,37 +8405,37 @@ var yyDef = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 194, 0, - 0, 348, 351, 0, 0, 0, 587, 0, 907, 599, - 590, 0, 677, 0, 681, 0, 0, 0, 684, 685, - 686, 663, 0, 667, 412, 651, 648, 649, 522, 0, - 127, 128, 0, 0, 0, 1264, 0, 1267, 1101, 1103, - 0, 1130, 1131, 1132, 1272, 1273, 1146, 1159, 1164, 0, - 1167, 0, 0, 1168, 0, 618, 1048, 0, 0, 1066, - 1067, 0, 1202, 0, 1207, 1208, 0, 1213, 0, 1217, - 1228, 0, 955, 912, 913, 960, 961, 0, 0, 903, - 1316, 81, 1317, 1314, 0, 1312, 1310, 1369, 0, 1378, - 1379, 1388, 1389, 1395, 0, 1401, 0, 86, 0, 0, - 0, 1327, 181, 0, 200, 0, 595, 0, 598, 588, - 675, 676, 0, 688, 680, 682, 683, 665, -2, 1353, - 0, 0, 0, 571, 1265, 0, 0, 1169, 0, 614, - 615, 1056, 1049, 0, 1034, 1035, 1053, 1188, 1190, 0, - 0, 0, 0, 954, 956, 957, 80, 0, 1313, 1074, - 0, 1381, 1382, 1409, 1407, 923, 930, 0, 87, 425, - 418, 1353, 0, 0, 0, 668, 669, 670, 671, 672, - 673, 674, 561, 1355, 129, 130, 491, 492, 493, 123, - 0, 1107, 1165, 1050, 0, 0, 0, 0, 1046, 1047, - 0, 1203, 0, 1209, 0, 1214, 0, 914, 915, 1315, - 0, 0, 600, 0, 602, 0, -2, 413, 426, 0, - 175, 201, 202, 0, 0, 205, 206, 207, 198, 199, - 119, 0, 0, 689, 0, 1356, 1357, 126, 0, 0, - 1041, 1042, 1043, 1044, 1045, 0, 0, 0, 1075, 1054, - 601, 0, 0, 368, 0, 611, 414, 415, 0, 421, - 422, 423, 424, 203, 204, 623, 0, 0, 568, 1266, - 0, 1204, 0, 1210, 0, 1215, 0, 603, 604, 612, - 0, 416, 0, 417, 0, 0, 0, 592, 0, 623, - 1354, 1051, 0, 0, 1073, 0, 613, 609, 427, 429, - 430, 0, 0, 428, 624, 593, 1205, 1211, 0, 431, - 432, 433, 605, 606, 607, 608, + 0, 348, 351, 0, 0, 0, 588, 0, 908, 600, + 591, 0, 678, 0, 682, 0, 0, 0, 685, 686, + 687, 664, 0, 668, 412, 652, 649, 650, 523, 0, + 127, 128, 0, 0, 0, 1265, 0, 1268, 1102, 1104, + 0, 1131, 1132, 1133, 1273, 1274, 1147, 1160, 1165, 0, + 1168, 0, 0, 1169, 0, 619, 1049, 0, 0, 1067, + 1068, 0, 1203, 0, 1208, 1209, 0, 1214, 0, 1218, + 1229, 0, 956, 913, 914, 961, 962, 0, 0, 904, + 1317, 81, 1318, 1315, 0, 1313, 1311, 1370, 0, 1379, + 1380, 1389, 1390, 1396, 0, 1402, 0, 86, 0, 0, + 0, 1328, 181, 0, 200, 0, 596, 0, 599, 589, + 676, 677, 0, 689, 681, 683, 684, 666, -2, 1354, + 0, 0, 0, 572, 1266, 0, 0, 1170, 0, 615, + 616, 1057, 1050, 0, 1035, 1036, 1054, 1189, 1191, 0, + 0, 0, 0, 955, 957, 958, 80, 0, 1314, 1075, + 0, 1382, 1383, 1410, 1408, 924, 931, 0, 87, 425, + 418, 1354, 0, 0, 0, 669, 670, 671, 672, 673, + 674, 675, 562, 1356, 129, 130, 0, 492, 493, 494, + 123, 0, 1108, 1166, 1051, 0, 0, 0, 0, 1047, + 1048, 0, 1204, 0, 1210, 0, 1215, 0, 915, 916, + 1316, 0, 0, 601, 0, 603, 0, -2, 413, 426, + 0, 175, 201, 202, 0, 0, 205, 206, 207, 198, + 199, 119, 0, 0, 690, 0, 1357, 1358, 0, 126, + 0, 0, 1042, 1043, 1044, 1045, 1046, 0, 0, 0, + 1076, 1055, 602, 0, 0, 368, 0, 612, 414, 415, + 0, 421, 422, 423, 424, 203, 204, 624, 0, 0, + 491, 569, 1267, 0, 1205, 0, 1211, 0, 1216, 0, + 604, 605, 613, 0, 416, 0, 417, 0, 0, 0, + 593, 0, 624, 1355, 1052, 0, 0, 1074, 0, 614, + 610, 427, 429, 430, 0, 0, 428, 625, 594, 1206, + 1212, 0, 431, 432, 433, 606, 607, 608, 609, } var yyTok1 = [...]int{ @@ -12279,158 +12212,157 @@ yydefault: yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 491: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2792 { - yyVAL.str = yyDollar[1].identifierCI.String() + yyVAL.str = String(TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}) } case 492: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:2796 { - yyVAL.str = encodeSQLString(yyDollar[1].str) + yyVAL.str = yyDollar[1].identifierCI.String() } case 493: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:2800 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = encodeSQLString(yyDollar[1].str) } case 494: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:2804 + { + yyVAL.str = string(yyDollar[1].str) + } + case 495: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2805 +//line sql.y:2809 { yyVAL.str = "" } - case 496: + case 497: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2811 +//line sql.y:2815 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 497: + case 498: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2815 +//line sql.y:2819 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 498: + case 499: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColName -//line sql.y:2820 +//line sql.y:2824 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 499: + case 500: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColName -//line sql.y:2824 +//line sql.y:2828 { yyLOCAL = yyDollar[2].colNameUnion() } yyVAL.union = yyLOCAL - case 500: + case 501: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2829 +//line sql.y:2833 { yyVAL.str = "" } - case 501: + case 502: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2833 +//line sql.y:2837 { yyVAL.str = string(yyDollar[2].str) } - case 502: + case 503: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Literal -//line sql.y:2838 +//line sql.y:2842 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 503: + case 504: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2842 +//line sql.y:2846 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 504: + case 505: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2846 +//line sql.y:2850 { yyLOCAL = NewDecimalLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 505: + case 506: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2851 +//line sql.y:2855 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 506: + case 507: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2855 +//line sql.y:2859 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL - case 507: + case 508: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2859 +//line sql.y:2863 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &OrderByOption{Cols: yyDollar[5].columnsUnion()}) } - case 508: + case 509: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2863 +//line sql.y:2867 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL - case 509: + case 510: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2867 +//line sql.y:2871 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionsUnion()...) } - case 510: + case 511: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2871 +//line sql.y:2875 { yyLOCAL = append(append(yyDollar[1].alterOptionsUnion(), yyDollar[3].alterOptionsUnion()...), &OrderByOption{Cols: yyDollar[7].columnsUnion()}) } yyVAL.union = yyLOCAL - case 511: + case 512: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2877 +//line sql.y:2881 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 512: - yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2881 - { - yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) - *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) - } case 513: yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2885 @@ -12439,19 +12371,18 @@ yydefault: *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } case 514: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL AlterOption -//line sql.y:2891 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:2889 { - yyLOCAL = yyDollar[1].tableOptionsUnion() + yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) + *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - yyVAL.union = yyLOCAL case 515: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption //line sql.y:2895 { - yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} + yyLOCAL = yyDollar[1].tableOptionsUnion() } yyVAL.union = yyLOCAL case 516: @@ -12467,15 +12398,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2903 { - yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} + yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } yyVAL.union = yyLOCAL case 518: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption //line sql.y:2907 { - yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} + yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} } yyVAL.union = yyLOCAL case 519: @@ -12483,7 +12414,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2911 { - yyLOCAL = &AddColumns{Columns: []*ColumnDefinition{yyDollar[3].columnDefinitionUnion()}, First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} + yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} } yyVAL.union = yyLOCAL case 520: @@ -12491,49 +12422,49 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2915 { - yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} + yyLOCAL = &AddColumns{Columns: []*ColumnDefinition{yyDollar[3].columnDefinitionUnion()}, First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL case 521: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption //line sql.y:2919 { - yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion()} + yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} } yyVAL.union = yyLOCAL case 522: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption //line sql.y:2923 { - yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[7].exprUnion()} + yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL case 523: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL AlterOption //line sql.y:2927 { - val := false - yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: &val} + yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 524: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2932 +//line sql.y:2931 { - val := true + val := false yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: &val} } yyVAL.union = yyLOCAL case 525: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2937 +//line sql.y:2936 { - yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} + val := true + yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: &val} } yyVAL.union = yyLOCAL case 526: @@ -12541,7 +12472,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2941 { - yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} + yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL case 527: @@ -12549,23 +12480,23 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2945 { - yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: true} + yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} } yyVAL.union = yyLOCAL case 528: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption //line sql.y:2949 { - yyLOCAL = &ChangeColumn{OldColumn: yyDollar[3].colNameUnion(), NewColDefinition: yyDollar[4].columnDefinitionUnion(), First: yyDollar[5].booleanUnion(), After: yyDollar[6].colNameUnion()} + yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: true} } yyVAL.union = yyLOCAL case 529: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption //line sql.y:2953 { - yyLOCAL = &ModifyColumn{NewColDefinition: yyDollar[3].columnDefinitionUnion(), First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} + yyLOCAL = &ChangeColumn{OldColumn: yyDollar[3].colNameUnion(), NewColDefinition: yyDollar[4].columnDefinitionUnion(), First: yyDollar[5].booleanUnion(), After: yyDollar[6].colNameUnion()} } yyVAL.union = yyLOCAL case 530: @@ -12573,7 +12504,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2957 { - yyLOCAL = &RenameColumn{OldName: yyDollar[3].colNameUnion(), NewName: yyDollar[5].colNameUnion()} + yyLOCAL = &ModifyColumn{NewColDefinition: yyDollar[3].columnDefinitionUnion(), First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL case 531: @@ -12581,15 +12512,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2961 { - yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} + yyLOCAL = &RenameColumn{OldName: yyDollar[3].colNameUnion(), NewName: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL case 532: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption //line sql.y:2965 { - yyLOCAL = &KeyState{Enable: false} + yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} } yyVAL.union = yyLOCAL case 533: @@ -12597,7 +12528,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2969 { - yyLOCAL = &KeyState{Enable: true} + yyLOCAL = &KeyState{Enable: false} } yyVAL.union = yyLOCAL case 534: @@ -12605,7 +12536,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2973 { - yyLOCAL = &TablespaceOperation{Import: false} + yyLOCAL = &KeyState{Enable: true} } yyVAL.union = yyLOCAL case 535: @@ -12613,15 +12544,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2977 { - yyLOCAL = &TablespaceOperation{Import: true} + yyLOCAL = &TablespaceOperation{Import: false} } yyVAL.union = yyLOCAL case 536: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption //line sql.y:2981 { - yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} + yyLOCAL = &TablespaceOperation{Import: true} } yyVAL.union = yyLOCAL case 537: @@ -12629,7 +12560,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2985 { - yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} + yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL case 538: @@ -12637,23 +12568,23 @@ yydefault: var yyLOCAL AlterOption //line sql.y:2989 { - yyLOCAL = &DropKey{Type: PrimaryKeyType} + yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL case 539: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:2993 { - yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} + yyLOCAL = &DropKey{Type: PrimaryKeyType} } yyVAL.union = yyLOCAL case 540: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption //line sql.y:2997 { - yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} + yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL case 541: @@ -12665,52 +12596,52 @@ yydefault: } yyVAL.union = yyLOCAL case 542: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:3005 { - yyLOCAL = &Force{} + yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL case 543: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption //line sql.y:3009 { - yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} + yyLOCAL = &Force{} } yyVAL.union = yyLOCAL case 544: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:3013 { - yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} + yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL case 545: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL []AlterOption -//line sql.y:3019 + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL AlterOption +//line sql.y:3017 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} + yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL case 546: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL []AlterOption //line sql.y:3023 { - yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) - *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } + yyVAL.union = yyLOCAL case 547: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL AlterOption -//line sql.y:3029 +//line sql.y:3027 { - yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) + yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) + *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - yyVAL.union = yyLOCAL case 548: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption @@ -12740,7 +12671,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3045 { - yyLOCAL = &LockOption{Type: DefaultType} + yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL case 552: @@ -12748,7 +12679,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3049 { - yyLOCAL = &LockOption{Type: NoneType} + yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL case 553: @@ -12756,7 +12687,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3053 { - yyLOCAL = &LockOption{Type: SharedType} + yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL case 554: @@ -12764,15 +12695,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3057 { - yyLOCAL = &LockOption{Type: ExclusiveType} + yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL case 555: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption //line sql.y:3061 { - yyLOCAL = &Validation{With: true} + yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL case 556: @@ -12780,13 +12711,21 @@ yydefault: var yyLOCAL AlterOption //line sql.y:3065 { - yyLOCAL = &Validation{With: false} + yyLOCAL = &Validation{With: true} } yyVAL.union = yyLOCAL case 557: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL AlterOption +//line sql.y:3069 + { + yyLOCAL = &Validation{With: false} + } + yyVAL.union = yyLOCAL + case 558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3071 +//line sql.y:3075 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12794,10 +12733,10 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 558: + case 559: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3078 +//line sql.y:3082 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12805,10 +12744,10 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 559: + case 560: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3085 +//line sql.y:3089 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -12816,28 +12755,28 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 560: + case 561: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3092 +//line sql.y:3096 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().PartitionSpec = yyDollar[2].partSpecUnion() yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 561: + case 562: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:3098 +//line sql.y:3102 { yyLOCAL = &AlterView{ViewName: yyDollar[7].tableName.ToViewName(), Comments: Comments(yyDollar[2].strs).Parsed(), Algorithm: yyDollar[3].str, Definer: yyDollar[4].definerUnion(), Security: yyDollar[5].str, Columns: yyDollar[8].columnsUnion(), Select: yyDollar[10].selStmtUnion(), CheckOption: yyDollar[11].str} } yyVAL.union = yyLOCAL - case 562: + case 563: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3108 +//line sql.y:3112 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -12845,10 +12784,10 @@ yydefault: yyLOCAL = yyDollar[1].alterDatabaseUnion() } yyVAL.union = yyLOCAL - case 563: + case 564: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3115 +//line sql.y:3119 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -12856,10 +12795,10 @@ yydefault: yyLOCAL = yyDollar[1].alterDatabaseUnion() } yyVAL.union = yyLOCAL - case 564: + case 565: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3122 +//line sql.y:3126 { yyLOCAL = &AlterVschema{ Action: CreateVindexDDLAction, @@ -12872,10 +12811,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 565: + case 566: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3134 +//line sql.y:3138 { yyLOCAL = &AlterVschema{ Action: DropVindexDDLAction, @@ -12886,26 +12825,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 566: + case 567: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3144 +//line sql.y:3148 { yyLOCAL = &AlterVschema{Action: AddVschemaTableDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 567: + case 568: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3148 +//line sql.y:3152 { yyLOCAL = &AlterVschema{Action: DropVschemaTableDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 568: + case 569: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL Statement -//line sql.y:3152 +//line sql.y:3156 { yyLOCAL = &AlterVschema{ Action: AddColVindexDDLAction, @@ -12919,10 +12858,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 569: + case 570: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3165 +//line sql.y:3169 { yyLOCAL = &AlterVschema{ Action: DropColVindexDDLAction, @@ -12933,18 +12872,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 570: + case 571: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3175 +//line sql.y:3179 { yyLOCAL = &AlterVschema{Action: AddSequenceDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 571: + case 572: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:3179 +//line sql.y:3183 { yyLOCAL = &AlterVschema{ Action: AddAutoIncDDLAction, @@ -12956,10 +12895,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 572: + case 573: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3190 +//line sql.y:3194 { yyLOCAL = &AlterMigration{ Type: RetryMigrationType, @@ -12967,10 +12906,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 573: + case 574: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3197 +//line sql.y:3201 { yyLOCAL = &AlterMigration{ Type: CleanupMigrationType, @@ -12978,10 +12917,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 574: + case 575: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3204 +//line sql.y:3208 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -12989,10 +12928,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 575: + case 576: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3211 +//line sql.y:3215 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -13001,20 +12940,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 576: + case 577: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3219 +//line sql.y:3223 { yyLOCAL = &AlterMigration{ Type: LaunchAllMigrationType, } } yyVAL.union = yyLOCAL - case 577: + case 578: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3225 +//line sql.y:3229 { yyLOCAL = &AlterMigration{ Type: CompleteMigrationType, @@ -13022,20 +12961,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 578: + case 579: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3232 +//line sql.y:3236 { yyLOCAL = &AlterMigration{ Type: CompleteAllMigrationType, } } yyVAL.union = yyLOCAL - case 579: + case 580: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3238 +//line sql.y:3242 { yyLOCAL = &AlterMigration{ Type: CancelMigrationType, @@ -13043,20 +12982,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 580: + case 581: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3245 +//line sql.y:3249 { yyLOCAL = &AlterMigration{ Type: CancelAllMigrationType, } } yyVAL.union = yyLOCAL - case 581: + case 582: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3251 +//line sql.y:3255 { yyLOCAL = &AlterMigration{ Type: ThrottleMigrationType, @@ -13066,10 +13005,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 582: + case 583: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3260 +//line sql.y:3264 { yyLOCAL = &AlterMigration{ Type: ThrottleAllMigrationType, @@ -13078,10 +13017,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 583: + case 584: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3268 +//line sql.y:3272 { yyLOCAL = &AlterMigration{ Type: UnthrottleMigrationType, @@ -13089,28 +13028,28 @@ yydefault: } } yyVAL.union = yyLOCAL - case 584: + case 585: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3275 +//line sql.y:3279 { yyLOCAL = &AlterMigration{ Type: UnthrottleAllMigrationType, } } yyVAL.union = yyLOCAL - case 585: + case 586: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3282 +//line sql.y:3286 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 586: + case 587: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3286 +//line sql.y:3290 { yyDollar[3].partitionOptionUnion().Partitions = yyDollar[4].integerUnion() yyDollar[3].partitionOptionUnion().SubPartition = yyDollar[5].subPartitionUnion() @@ -13118,10 +13057,10 @@ yydefault: yyLOCAL = yyDollar[3].partitionOptionUnion() } yyVAL.union = yyLOCAL - case 587: + case 588: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3295 +//line sql.y:3299 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -13130,10 +13069,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 588: + case 589: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3303 +//line sql.y:3307 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -13143,10 +13082,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 589: + case 590: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3312 +//line sql.y:3316 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -13154,10 +13093,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 590: + case 591: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3319 +//line sql.y:3323 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -13165,18 +13104,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 591: + case 592: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3327 +//line sql.y:3331 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 592: + case 593: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3331 +//line sql.y:3335 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -13186,10 +13125,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 593: + case 594: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3340 +//line sql.y:3344 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -13200,292 +13139,284 @@ yydefault: } } yyVAL.union = yyLOCAL - case 594: + case 595: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3351 +//line sql.y:3355 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 595: + case 596: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3355 +//line sql.y:3359 { yyLOCAL = yyDollar[2].partDefsUnion() } yyVAL.union = yyLOCAL - case 596: + case 597: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3360 +//line sql.y:3364 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 597: + case 598: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3364 +//line sql.y:3368 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 598: + case 599: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3369 +//line sql.y:3373 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 599: + case 600: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3373 +//line sql.y:3377 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 600: + case 601: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL TableExpr -//line sql.y:3379 +//line sql.y:3383 { yyLOCAL = &JSONTableExpr{Expr: yyDollar[3].exprUnion(), Filter: yyDollar[5].exprUnion(), Columns: yyDollar[6].jtColumnListUnion(), Alias: yyDollar[8].identifierCS} } yyVAL.union = yyLOCAL - case 601: + case 602: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3385 +//line sql.y:3389 { yyLOCAL = yyDollar[3].jtColumnListUnion() } yyVAL.union = yyLOCAL - case 602: + case 603: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3391 +//line sql.y:3395 { yyLOCAL = []*JtColumnDefinition{yyDollar[1].jtColumnDefinitionUnion()} } yyVAL.union = yyLOCAL - case 603: + case 604: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3395 +//line sql.y:3399 { yySLICE := (*[]*JtColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jtColumnDefinitionUnion()) } - case 604: + case 605: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3401 +//line sql.y:3405 { yyLOCAL = &JtColumnDefinition{JtOrdinal: &JtOrdinalColDef{Name: yyDollar[1].identifierCI}} } yyVAL.union = yyLOCAL - case 605: + case 606: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3405 +//line sql.y:3409 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 606: + case 607: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3411 +//line sql.y:3415 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 607: + case 608: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3417 +//line sql.y:3421 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 608: + case 609: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3423 +//line sql.y:3427 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 609: + case 610: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3429 +//line sql.y:3433 { jtNestedPath := &JtNestedPathColDef{Path: yyDollar[3].exprUnion(), Columns: yyDollar[4].jtColumnListUnion()} yyLOCAL = &JtColumnDefinition{JtNestedPath: jtNestedPath} } yyVAL.union = yyLOCAL - case 610: + case 611: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3435 +//line sql.y:3439 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 611: + case 612: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3439 +//line sql.y:3443 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 612: + case 613: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3443 +//line sql.y:3447 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 613: + case 614: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3447 +//line sql.y:3451 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 614: + case 615: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3453 +//line sql.y:3457 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 615: + case 616: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3459 +//line sql.y:3463 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 616: + case 617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3465 +//line sql.y:3469 { yyLOCAL = &JtOnResponse{ResponseType: ErrorJSONType} } yyVAL.union = yyLOCAL - case 617: + case 618: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3469 +//line sql.y:3473 { yyLOCAL = &JtOnResponse{ResponseType: NullJSONType} } yyVAL.union = yyLOCAL - case 618: + case 619: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3473 +//line sql.y:3477 { yyLOCAL = &JtOnResponse{ResponseType: DefaultJSONType, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 619: + case 620: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3479 +//line sql.y:3483 { yyLOCAL = RangeType } yyVAL.union = yyLOCAL - case 620: + case 621: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3483 +//line sql.y:3487 { yyLOCAL = ListType } yyVAL.union = yyLOCAL - case 621: + case 622: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3488 +//line sql.y:3492 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 622: + case 623: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3492 +//line sql.y:3496 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 623: + case 624: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3497 +//line sql.y:3501 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 624: + case 625: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3501 +//line sql.y:3505 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 625: - yyDollar = yyS[yypt-5 : yypt+1] - var yyLOCAL *PartitionSpec -//line sql.y:3507 - { - yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} - } - yyVAL.union = yyLOCAL case 626: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3511 { - yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} } yyVAL.union = yyLOCAL case 627: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3515 { - yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} + yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 628: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3519 { - yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} } yyVAL.union = yyLOCAL case 629: @@ -13493,7 +13424,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3523 { - yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 630: @@ -13501,7 +13432,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3527 { - yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} } yyVAL.union = yyLOCAL case 631: @@ -13509,15 +13440,15 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3531 { - yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 632: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3535 { - yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} } yyVAL.union = yyLOCAL case 633: @@ -13525,7 +13456,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3539 { - yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 634: @@ -13533,23 +13464,23 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3543 { - yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} + yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} } yyVAL.union = yyLOCAL case 635: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3547 { - yyLOCAL = &PartitionSpec{Action: ExchangeAction, Names: Partitions{yyDollar[3].identifierCI}, TableName: yyDollar[6].tableName, WithoutValidation: yyDollar[7].booleanUnion()} + yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL case 636: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3551 { - yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: ExchangeAction, Names: Partitions{yyDollar[3].identifierCI}, TableName: yyDollar[6].tableName, WithoutValidation: yyDollar[7].booleanUnion()} } yyVAL.union = yyLOCAL case 637: @@ -13557,7 +13488,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3555 { - yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 638: @@ -13565,7 +13496,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3559 { - yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} } yyVAL.union = yyLOCAL case 639: @@ -13573,7 +13504,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3563 { - yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 640: @@ -13581,7 +13512,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3567 { - yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} } yyVAL.union = yyLOCAL case 641: @@ -13589,7 +13520,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3571 { - yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 642: @@ -13597,7 +13528,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3575 { - yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} } yyVAL.union = yyLOCAL case 643: @@ -13605,7 +13536,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3579 { - yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 644: @@ -13613,7 +13544,7 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3583 { - yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} + yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} } yyVAL.union = yyLOCAL case 645: @@ -13621,27 +13552,27 @@ yydefault: var yyLOCAL *PartitionSpec //line sql.y:3587 { - yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} + yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL case 646: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec //line sql.y:3591 { - yyLOCAL = &PartitionSpec{Action: UpgradeAction} + yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} } yyVAL.union = yyLOCAL case 647: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL bool -//line sql.y:3596 + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionSpec +//line sql.y:3595 { - yyLOCAL = false + yyLOCAL = &PartitionSpec{Action: UpgradeAction} } yyVAL.union = yyLOCAL case 648: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool //line sql.y:3600 { @@ -13653,229 +13584,237 @@ yydefault: var yyLOCAL bool //line sql.y:3604 { - yyLOCAL = true + yyLOCAL = false } yyVAL.union = yyLOCAL case 650: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL bool +//line sql.y:3608 + { + yyLOCAL = true + } + yyVAL.union = yyLOCAL + case 651: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3610 +//line sql.y:3614 { yyLOCAL = []*PartitionDefinition{yyDollar[1].partDefUnion()} } yyVAL.union = yyLOCAL - case 651: + case 652: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3614 +//line sql.y:3618 { yySLICE := (*[]*PartitionDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].partDefUnion()) } - case 652: + case 653: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3620 +//line sql.y:3624 { yyVAL.partDefUnion().Options = yyDollar[2].partitionDefinitionOptionsUnion() } - case 653: + case 654: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3625 +//line sql.y:3629 { yyLOCAL = &PartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 654: + case 655: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3629 +//line sql.y:3633 { yyDollar[1].partitionDefinitionOptionsUnion().ValueRange = yyDollar[2].partitionValueRangeUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 655: + case 656: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3634 +//line sql.y:3638 { yyDollar[1].partitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 656: + case 657: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3639 +//line sql.y:3643 { yyDollar[1].partitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 657: + case 658: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3644 +//line sql.y:3648 { yyDollar[1].partitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 658: + case 659: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3649 +//line sql.y:3653 { yyDollar[1].partitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 659: + case 660: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3654 +//line sql.y:3658 { val := yyDollar[2].integerUnion() yyDollar[1].partitionDefinitionOptionsUnion().MaxRows = &val yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 660: + case 661: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3660 +//line sql.y:3664 { val := yyDollar[2].integerUnion() yyDollar[1].partitionDefinitionOptionsUnion().MinRows = &val yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 661: + case 662: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3666 +//line sql.y:3670 { yyDollar[1].partitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 662: + case 663: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3671 +//line sql.y:3675 { yyDollar[1].partitionDefinitionOptionsUnion().SubPartitionDefinitions = yyDollar[2].subPartitionDefinitionsUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 663: + case 664: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3677 +//line sql.y:3681 { yyLOCAL = yyDollar[2].subPartitionDefinitionsUnion() } yyVAL.union = yyLOCAL - case 664: + case 665: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3683 +//line sql.y:3687 { yyLOCAL = SubPartitionDefinitions{yyDollar[1].subPartitionDefinitionUnion()} } yyVAL.union = yyLOCAL - case 665: + case 666: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3687 +//line sql.y:3691 { yySLICE := (*SubPartitionDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].subPartitionDefinitionUnion()) } - case 666: + case 667: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SubPartitionDefinition -//line sql.y:3693 +//line sql.y:3697 { yyLOCAL = &SubPartitionDefinition{Name: yyDollar[2].identifierCI, Options: yyDollar[3].subPartitionDefinitionOptionsUnion()} } yyVAL.union = yyLOCAL - case 667: + case 668: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3698 +//line sql.y:3702 { yyLOCAL = &SubPartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 668: + case 669: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3702 +//line sql.y:3706 { yyDollar[1].subPartitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 669: + case 670: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3707 +//line sql.y:3711 { yyDollar[1].subPartitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 670: + case 671: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3712 +//line sql.y:3716 { yyDollar[1].subPartitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 671: + case 672: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3717 +//line sql.y:3721 { yyDollar[1].subPartitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 672: + case 673: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3722 +//line sql.y:3726 { val := yyDollar[2].integerUnion() yyDollar[1].subPartitionDefinitionOptionsUnion().MaxRows = &val yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 673: + case 674: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3728 +//line sql.y:3732 { val := yyDollar[2].integerUnion() yyDollar[1].subPartitionDefinitionOptionsUnion().MinRows = &val yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 674: + case 675: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3734 +//line sql.y:3738 { yyDollar[1].subPartitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 675: + case 676: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3741 +//line sql.y:3745 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -13883,10 +13822,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 676: + case 677: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3748 +//line sql.y:3752 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -13894,10 +13833,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 677: + case 678: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3755 +//line sql.y:3759 { yyLOCAL = &PartitionValueRange{ Type: InType, @@ -13905,131 +13844,131 @@ yydefault: } } yyVAL.union = yyLOCAL - case 678: + case 679: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3763 +//line sql.y:3767 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 679: + case 680: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3767 +//line sql.y:3771 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 680: + case 681: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionEngine -//line sql.y:3773 +//line sql.y:3777 { yyLOCAL = &PartitionEngine{Storage: yyDollar[1].booleanUnion(), Name: yyDollar[4].identifierCS.String()} } yyVAL.union = yyLOCAL - case 681: + case 682: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Literal -//line sql.y:3779 +//line sql.y:3783 { yyLOCAL = NewStrLiteral(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 682: + case 683: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3785 +//line sql.y:3789 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 683: + case 684: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3791 +//line sql.y:3795 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 684: + case 685: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3797 +//line sql.y:3801 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 685: + case 686: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3803 +//line sql.y:3807 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 686: + case 687: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3809 +//line sql.y:3813 { yyVAL.str = yyDollar[3].identifierCS.String() } - case 687: + case 688: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinition -//line sql.y:3815 +//line sql.y:3819 { yyLOCAL = &PartitionDefinition{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 688: + case 689: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3821 +//line sql.y:3825 { yyVAL.str = "" } - case 689: + case 690: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3825 +//line sql.y:3829 { yyVAL.str = "" } - case 690: + case 691: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3831 +//line sql.y:3835 { yyLOCAL = &RenameTable{TablePairs: yyDollar[3].renameTablePairsUnion()} } yyVAL.union = yyLOCAL - case 691: + case 692: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*RenameTablePair -//line sql.y:3837 +//line sql.y:3841 { yyLOCAL = []*RenameTablePair{{FromTable: yyDollar[1].tableName, ToTable: yyDollar[3].tableName}} } yyVAL.union = yyLOCAL - case 692: + case 693: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3841 +//line sql.y:3845 { yySLICE := (*[]*RenameTablePair)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &RenameTablePair{FromTable: yyDollar[3].tableName, ToTable: yyDollar[5].tableName}) } - case 693: + case 694: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3847 +//line sql.y:3851 { yyLOCAL = &DropTable{FromTables: yyDollar[6].tableNamesUnion(), IfExists: yyDollar[5].booleanUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Temp: yyDollar[3].booleanUnion()} } yyVAL.union = yyLOCAL - case 694: + case 695: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3851 +//line sql.y:3855 { // Change this to an alter statement if yyDollar[4].identifierCI.Lowered() == "primary" { @@ -14039,52 +13978,44 @@ yydefault: } } yyVAL.union = yyLOCAL - case 695: + case 696: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3860 +//line sql.y:3864 { yyLOCAL = &DropView{FromTables: yyDollar[5].tableNamesUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 696: + case 697: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3864 +//line sql.y:3868 { yyLOCAL = &DropDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 697: + case 698: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3870 +//line sql.y:3874 { yyLOCAL = &TruncateTable{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 698: + case 699: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3874 +//line sql.y:3878 { yyLOCAL = &TruncateTable{Table: yyDollar[2].tableName} } yyVAL.union = yyLOCAL - case 699: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL Statement -//line sql.y:3880 - { - yyLOCAL = &OtherRead{} - } - yyVAL.union = yyLOCAL case 700: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3886 +//line sql.y:3884 { - yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &OtherRead{} } yyVAL.union = yyLOCAL case 701: @@ -14092,23 +14023,23 @@ yydefault: var yyLOCAL Statement //line sql.y:3890 { - yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 702: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:3894 { - yyLOCAL = &Show{&ShowBasic{Full: yyDollar[2].booleanUnion(), Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 703: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement //line sql.y:3898 { - yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Full: yyDollar[2].booleanUnion(), Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL case 704: @@ -14124,7 +14055,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3906 { - yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 706: @@ -14136,43 +14067,43 @@ yydefault: } yyVAL.union = yyLOCAL case 707: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:3914 { - yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 708: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:3918 { - yyLOCAL = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 709: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement //line sql.y:3922 { - yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL case 710: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:3926 { - yyLOCAL = &Show{&ShowBasic{Command: Privilege}} + yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL case 711: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:3930 { - yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Privilege}} } yyVAL.union = yyLOCAL case 712: @@ -14180,7 +14111,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3934 { - yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 713: @@ -14188,7 +14119,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3938 { - yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 714: @@ -14196,7 +14127,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3942 { - yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 715: @@ -14204,15 +14135,15 @@ yydefault: var yyLOCAL Statement //line sql.y:3946 { - yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 716: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:3950 { - yyLOCAL = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 717: @@ -14220,15 +14151,15 @@ yydefault: var yyLOCAL Statement //line sql.y:3954 { - yyLOCAL = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].booleanUnion(), DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL case 718: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:3958 { - yyLOCAL = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].identifierCS, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].booleanUnion(), DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL case 719: @@ -14236,7 +14167,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3962 { - yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].identifierCS, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 720: @@ -14244,7 +14175,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3966 { - yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 721: @@ -14252,7 +14183,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3970 { - yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 722: @@ -14260,7 +14191,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3974 { - yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 723: @@ -14268,7 +14199,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3978 { - yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 724: @@ -14276,7 +14207,7 @@ yydefault: var yyLOCAL Statement //line sql.y:3982 { - yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 725: @@ -14284,15 +14215,15 @@ yydefault: var yyLOCAL Statement //line sql.y:3986 { - yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} + yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 726: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:3990 { - yyLOCAL = &Show{&ShowBasic{Command: Engines}} + yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL case 727: @@ -14300,15 +14231,15 @@ yydefault: var yyLOCAL Statement //line sql.y:3994 { - yyLOCAL = &Show{&ShowBasic{Command: Plugins}} + yyLOCAL = &Show{&ShowBasic{Command: Engines}} } yyVAL.union = yyLOCAL case 728: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:3998 { - yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} + yyLOCAL = &Show{&ShowBasic{Command: Plugins}} } yyVAL.union = yyLOCAL case 729: @@ -14316,7 +14247,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4002 { - yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} + yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL case 730: @@ -14324,7 +14255,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4006 { - yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL case 731: @@ -14332,7 +14263,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4010 { - yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].identifierCS}} + yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL case 732: @@ -14340,23 +14271,23 @@ yydefault: var yyLOCAL Statement //line sql.y:4014 { - yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} + yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL case 733: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4018 { - yyLOCAL = &ShowThrottledApps{} + yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL case 734: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:4022 { - yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &ShowThrottledApps{} } yyVAL.union = yyLOCAL case 735: @@ -14364,7 +14295,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4026 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} + yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 736: @@ -14372,31 +14303,31 @@ yydefault: var yyLOCAL Statement //line sql.y:4030 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} } yyVAL.union = yyLOCAL case 737: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4034 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} } yyVAL.union = yyLOCAL case 738: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:4038 { - yyLOCAL = &Show{&ShowBasic{Command: Warnings}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} } yyVAL.union = yyLOCAL case 739: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:4042 { - yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Warnings}} } yyVAL.union = yyLOCAL case 740: @@ -14404,31 +14335,31 @@ yydefault: var yyLOCAL Statement //line sql.y:4046 { - yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 741: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4050 { - yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} + yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 742: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4057 +//line sql.y:4054 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} + yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} } yyVAL.union = yyLOCAL case 743: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4061 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} } yyVAL.union = yyLOCAL case 744: @@ -14436,7 +14367,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4065 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 745: @@ -14444,23 +14375,23 @@ yydefault: var yyLOCAL Statement //line sql.y:4069 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} } yyVAL.union = yyLOCAL case 746: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4073 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 747: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4077 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL case 748: @@ -14472,127 +14403,129 @@ yydefault: } yyVAL.union = yyLOCAL case 749: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4085 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL case 750: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:4089 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 751: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL Statement +//line sql.y:4093 + { + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + } + yyVAL.union = yyLOCAL + case 752: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4095 +//line sql.y:4099 { yyVAL.str = "" } - case 752: + case 753: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4099 +//line sql.y:4103 { yyVAL.str = "extended " } - case 753: + case 754: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4105 +//line sql.y:4109 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 754: + case 755: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4109 +//line sql.y:4113 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 755: + case 756: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4115 +//line sql.y:4119 { yyVAL.str = string(yyDollar[1].str) } - case 756: + case 757: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4119 +//line sql.y:4123 { yyVAL.str = string(yyDollar[1].str) } - case 757: + case 758: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4125 +//line sql.y:4129 { yyVAL.identifierCS = NewIdentifierCS("") } - case 758: + case 759: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4129 +//line sql.y:4133 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 759: + case 760: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4133 +//line sql.y:4137 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 760: + case 761: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4139 +//line sql.y:4143 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 761: + case 762: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4143 +//line sql.y:4147 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 762: + case 763: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4147 +//line sql.y:4151 { yyLOCAL = &ShowFilter{Filter: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 763: + case 764: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4153 +//line sql.y:4157 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 764: + case 765: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4157 +//line sql.y:4161 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 765: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4163 - { - yyVAL.empty = struct{}{} - } case 766: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:4167 { yyVAL.empty = struct{}{} @@ -14605,9 +14538,9 @@ yydefault: } case 768: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4177 +//line sql.y:4175 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.empty = struct{}{} } case 769: yyDollar = yyS[yypt-1 : yypt+1] @@ -14616,147 +14549,145 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 770: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4185 + { + yyVAL.str = string(yyDollar[1].str) + } + case 771: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4187 +//line sql.y:4191 { yyLOCAL = &Use{DBName: yyDollar[2].identifierCS} } yyVAL.union = yyLOCAL - case 771: + case 772: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4191 +//line sql.y:4195 { yyLOCAL = &Use{DBName: IdentifierCS{v: ""}} } yyVAL.union = yyLOCAL - case 772: + case 773: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4195 +//line sql.y:4199 { yyLOCAL = &Use{DBName: NewIdentifierCS(yyDollar[2].identifierCS.String() + "@" + string(yyDollar[3].str))} } yyVAL.union = yyLOCAL - case 773: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4202 - { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) - } case 774: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4206 { - yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 775: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4210 { - yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) } case 776: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4214 { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) } case 777: yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4218 + { + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + } + case 778: + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4221 +//line sql.y:4225 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 778: + case 779: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4225 +//line sql.y:4229 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 779: + case 780: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4231 +//line sql.y:4235 { yyLOCAL = &Commit{} } yyVAL.union = yyLOCAL - case 780: + case 781: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4237 +//line sql.y:4241 { yyLOCAL = &Rollback{} } yyVAL.union = yyLOCAL - case 781: + case 782: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4241 +//line sql.y:4245 { yyLOCAL = &SRollback{Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 782: + case 783: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4246 +//line sql.y:4250 { yyVAL.empty = struct{}{} } - case 783: + case 784: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4248 +//line sql.y:4252 { yyVAL.empty = struct{}{} } - case 784: + case 785: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4251 +//line sql.y:4255 { yyVAL.empty = struct{}{} } - case 785: + case 786: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4253 +//line sql.y:4257 { yyVAL.empty = struct{}{} } - case 786: + case 787: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4257 +//line sql.y:4261 { yyLOCAL = &Savepoint{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 787: + case 788: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4263 +//line sql.y:4267 { yyLOCAL = &Release{Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 788: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL ExplainType -//line sql.y:4268 - { - yyLOCAL = EmptyType - } - yyVAL.union = yyLOCAL case 789: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL ExplainType //line sql.y:4272 { - yyLOCAL = JSONType + yyLOCAL = EmptyType } yyVAL.union = yyLOCAL case 790: @@ -14764,7 +14695,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4276 { - yyLOCAL = TreeType + yyLOCAL = JSONType } yyVAL.union = yyLOCAL case 791: @@ -14772,7 +14703,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4280 { - yyLOCAL = VitessType + yyLOCAL = TreeType } yyVAL.union = yyLOCAL case 792: @@ -14780,7 +14711,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4284 { - yyLOCAL = VTExplainType + yyLOCAL = VitessType } yyVAL.union = yyLOCAL case 793: @@ -14788,23 +14719,25 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4288 { - yyLOCAL = TraditionalType + yyLOCAL = VTExplainType } yyVAL.union = yyLOCAL case 794: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType //line sql.y:4292 { - yyLOCAL = AnalyzeType + yyLOCAL = TraditionalType } yyVAL.union = yyLOCAL case 795: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4298 + var yyLOCAL ExplainType +//line sql.y:4296 { - yyVAL.str = yyDollar[1].str + yyLOCAL = AnalyzeType } + yyVAL.union = yyLOCAL case 796: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4302 @@ -14819,18 +14752,16 @@ yydefault: } case 798: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL Statement -//line sql.y:4312 +//line sql.y:4310 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyVAL.str = yyDollar[1].str } - yyVAL.union = yyLOCAL case 799: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement //line sql.y:4316 { - yyLOCAL = yyDollar[1].statementUnion() + yyLOCAL = yyDollar[1].selStmtUnion() } yyVAL.union = yyLOCAL case 800: @@ -14850,200 +14781,202 @@ yydefault: } yyVAL.union = yyLOCAL case 802: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4329 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Statement +//line sql.y:4328 { - yyVAL.str = "" + yyLOCAL = yyDollar[1].statementUnion() } + yyVAL.union = yyLOCAL case 803: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:4333 { - yyVAL.str = yyDollar[1].identifierCI.val + yyVAL.str = "" } case 804: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4337 { - yyVAL.str = encodeSQLString(yyDollar[1].str) + yyVAL.str = yyDollar[1].identifierCI.val } case 805: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4341 + { + yyVAL.str = encodeSQLString(yyDollar[1].str) + } + case 806: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4343 +//line sql.y:4347 { yyLOCAL = &ExplainTab{Table: yyDollar[3].tableName, Wild: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 806: + case 807: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4347 +//line sql.y:4351 { yyLOCAL = &ExplainStmt{Type: yyDollar[3].explainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 807: + case 808: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4353 +//line sql.y:4357 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 808: + case 809: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4357 +//line sql.y:4361 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 809: + case 810: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4363 +//line sql.y:4367 { yyLOCAL = &LockTables{Tables: yyDollar[3].tableAndLockTypesUnion()} } yyVAL.union = yyLOCAL - case 810: + case 811: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableAndLockTypes -//line sql.y:4369 +//line sql.y:4373 { yyLOCAL = TableAndLockTypes{yyDollar[1].tableAndLockTypeUnion()} } yyVAL.union = yyLOCAL - case 811: + case 812: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4373 +//line sql.y:4377 { yySLICE := (*TableAndLockTypes)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableAndLockTypeUnion()) } - case 812: + case 813: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *TableAndLockType -//line sql.y:4379 +//line sql.y:4383 { yyLOCAL = &TableAndLockType{Table: yyDollar[1].aliasedTableNameUnion(), Lock: yyDollar[2].lockTypeUnion()} } yyVAL.union = yyLOCAL - case 813: + case 814: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4385 +//line sql.y:4389 { yyLOCAL = Read } yyVAL.union = yyLOCAL - case 814: + case 815: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4389 +//line sql.y:4393 { yyLOCAL = ReadLocal } yyVAL.union = yyLOCAL - case 815: + case 816: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4393 +//line sql.y:4397 { yyLOCAL = Write } yyVAL.union = yyLOCAL - case 816: + case 817: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4397 +//line sql.y:4401 { yyLOCAL = LowPriorityWrite } yyVAL.union = yyLOCAL - case 817: + case 818: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4403 +//line sql.y:4407 { yyLOCAL = &UnlockTables{} } yyVAL.union = yyLOCAL - case 818: + case 819: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4409 +//line sql.y:4413 { yyLOCAL = &RevertMigration{Comments: Comments(yyDollar[2].strs).Parsed(), UUID: string(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 819: + case 820: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4415 +//line sql.y:4419 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), FlushOptions: yyDollar[3].strs} } yyVAL.union = yyLOCAL - case 820: + case 821: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4419 +//line sql.y:4423 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion()} } yyVAL.union = yyLOCAL - case 821: + case 822: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4423 +//line sql.y:4427 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 822: + case 823: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4427 +//line sql.y:4431 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL - case 823: + case 824: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4431 +//line sql.y:4435 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 824: + case 825: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4435 +//line sql.y:4439 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), ForExport: true} } yyVAL.union = yyLOCAL - case 825: + case 826: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4441 +//line sql.y:4445 { yyVAL.strs = []string{yyDollar[1].str} } - case 826: + case 827: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4445 +//line sql.y:4449 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } - case 827: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4451 - { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) - } case 828: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4455 @@ -15063,10 +14996,10 @@ yydefault: yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 831: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4467 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 832: yyDollar = yyS[yypt-1 : yypt+1] @@ -15081,22 +15014,22 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 834: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4479 { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str + yyVAL.str = string(yyDollar[1].str) } case 835: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:4483 { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str } case 836: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4487 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 837: yyDollar = yyS[yypt-1 : yypt+1] @@ -15111,144 +15044,150 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 839: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4499 + { + yyVAL.str = string(yyDollar[1].str) + } + case 840: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4500 +//line sql.y:4504 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 840: + case 841: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4504 +//line sql.y:4508 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 841: + case 842: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4508 +//line sql.y:4512 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 842: + case 843: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4513 +//line sql.y:4517 { yyVAL.str = "" } - case 843: + case 844: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4517 +//line sql.y:4521 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String() } - case 844: + case 845: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4522 +//line sql.y:4526 { setAllowComments(yylex, true) } - case 845: + case 846: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4526 +//line sql.y:4530 { yyVAL.strs = yyDollar[2].strs setAllowComments(yylex, false) } - case 846: + case 847: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4532 +//line sql.y:4536 { yyVAL.strs = nil } - case 847: + case 848: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4536 +//line sql.y:4540 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 848: + case 849: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4542 +//line sql.y:4546 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 849: + case 850: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4546 +//line sql.y:4550 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 850: + case 851: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4550 +//line sql.y:4554 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 851: + case 852: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4555 +//line sql.y:4559 { yyVAL.str = "" } - case 852: + case 853: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4559 +//line sql.y:4563 { yyVAL.str = SQLNoCacheStr } - case 853: + case 854: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4563 +//line sql.y:4567 { yyVAL.str = SQLCacheStr } - case 854: + case 855: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4568 +//line sql.y:4572 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 855: + case 856: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4572 +//line sql.y:4576 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 856: + case 857: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4576 +//line sql.y:4580 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 857: + case 858: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4582 +//line sql.y:4586 { yyLOCAL = &PrepareStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Statement: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 858: + case 859: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4586 +//line sql.y:4590 { yyLOCAL = &PrepareStmt{ Name: yyDollar[3].identifierCI, @@ -15257,109 +15196,103 @@ yydefault: } } yyVAL.union = yyLOCAL - case 859: + case 860: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4596 +//line sql.y:4600 { yyLOCAL = &ExecuteStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Arguments: yyDollar[4].variablesUnion()} } yyVAL.union = yyLOCAL - case 860: + case 861: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4601 +//line sql.y:4605 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 861: + case 862: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4605 +//line sql.y:4609 { yyLOCAL = yyDollar[2].variablesUnion() } yyVAL.union = yyLOCAL - case 862: + case 863: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4611 +//line sql.y:4615 { yyLOCAL = &DeallocateStmt{Type: DeallocateType, Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 863: + case 864: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4615 +//line sql.y:4619 { yyLOCAL = &DeallocateStmt{Type: DropType, Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 864: + case 865: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4620 +//line sql.y:4624 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 865: + case 866: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4624 +//line sql.y:4628 { yyLOCAL = yyDollar[1].selectExprsUnion() } yyVAL.union = yyLOCAL - case 866: + case 867: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4629 +//line sql.y:4633 { yyVAL.strs = nil } - case 867: + case 868: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4633 +//line sql.y:4637 { yyVAL.strs = []string{yyDollar[1].str} } - case 868: + case 869: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4637 +//line sql.y:4641 { // TODO: This is a hack since I couldn't get it to work in a nicer way. I got 'conflicts: 8 shift/reduce' yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str} } - case 869: + case 870: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4641 +//line sql.y:4645 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } - case 870: + case 871: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4645 +//line sql.y:4649 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } - case 871: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4651 - { - yyVAL.str = SQLNoCacheStr - } case 872: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4655 { - yyVAL.str = SQLCacheStr + yyVAL.str = SQLNoCacheStr } case 873: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4659 { - yyVAL.str = DistinctStr + yyVAL.str = SQLCacheStr } case 874: yyDollar = yyS[yypt-1 : yypt+1] @@ -15371,481 +15304,487 @@ yydefault: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4667 { - yyVAL.str = StraightJoinHint + yyVAL.str = DistinctStr } case 876: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4671 { - yyVAL.str = SQLCalcFoundRowsStr + yyVAL.str = StraightJoinHint } case 877: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4675 { - yyVAL.str = AllStr // These are not picked up by NewSelect, and so ALL will be dropped. But this is OK, since it's redundant anyway + yyVAL.str = SQLCalcFoundRowsStr } case 878: yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4679 + { + yyVAL.str = AllStr // These are not picked up by NewSelect, and so ALL will be dropped. But this is OK, since it's redundant anyway + } + case 879: + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4681 +//line sql.y:4685 { yyLOCAL = SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL - case 879: + case 880: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4685 +//line sql.y:4689 { yySLICE := (*SelectExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].selectExprUnion()) } - case 880: + case 881: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4691 +//line sql.y:4695 { yyLOCAL = &StarExpr{} } yyVAL.union = yyLOCAL - case 881: + case 882: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4695 +//line sql.y:4699 { yyLOCAL = &AliasedExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 882: + case 883: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4699 +//line sql.y:4703 { yyLOCAL = &StarExpr{TableName: TableName{Name: yyDollar[1].identifierCS}} } yyVAL.union = yyLOCAL - case 883: + case 884: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4703 +//line sql.y:4707 { yyLOCAL = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL - case 884: + case 885: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4708 +//line sql.y:4712 { yyVAL.identifierCI = IdentifierCI{} } - case 885: + case 886: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4712 +//line sql.y:4716 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 886: + case 887: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4716 +//line sql.y:4720 { yyVAL.identifierCI = yyDollar[2].identifierCI } - case 888: + case 889: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4723 +//line sql.y:4727 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 889: + case 890: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4728 +//line sql.y:4732 { yyLOCAL = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewIdentifierCS("dual")}}} } yyVAL.union = yyLOCAL - case 890: + case 891: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4732 +//line sql.y:4736 { yyLOCAL = yyDollar[1].tableExprsUnion() } yyVAL.union = yyLOCAL - case 891: + case 892: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4738 +//line sql.y:4742 { yyLOCAL = yyDollar[2].tableExprsUnion() } yyVAL.union = yyLOCAL - case 892: + case 893: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4744 +//line sql.y:4748 { yyLOCAL = TableExprs{yyDollar[1].tableExprUnion()} } yyVAL.union = yyLOCAL - case 893: + case 894: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4748 +//line sql.y:4752 { yySLICE := (*TableExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableExprUnion()) } - case 896: + case 897: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4758 +//line sql.y:4762 { yyLOCAL = yyDollar[1].aliasedTableNameUnion() } yyVAL.union = yyLOCAL - case 897: + case 898: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4762 +//line sql.y:4766 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].derivedTableUnion(), As: yyDollar[3].identifierCS, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 898: + case 899: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4766 +//line sql.y:4770 { yyLOCAL = &ParenTableExpr{Exprs: yyDollar[2].tableExprsUnion()} } yyVAL.union = yyLOCAL - case 899: + case 900: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4770 +//line sql.y:4774 { yyLOCAL = yyDollar[1].tableExprUnion() } yyVAL.union = yyLOCAL - case 900: + case 901: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4776 +//line sql.y:4780 { yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 901: + case 902: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4780 +//line sql.y:4784 { yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].selStmtUnion()} } yyVAL.union = yyLOCAL - case 902: + case 903: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4786 +//line sql.y:4790 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].identifierCS, Hints: yyDollar[3].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 903: + case 904: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4790 +//line sql.y:4794 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitionsUnion(), As: yyDollar[6].identifierCS, Hints: yyDollar[7].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 904: + case 905: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4795 +//line sql.y:4799 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 905: + case 906: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:4799 +//line sql.y:4803 { yyLOCAL = yyDollar[2].columnsUnion() } yyVAL.union = yyLOCAL - case 906: + case 907: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4804 +//line sql.y:4808 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 907: + case 908: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4808 +//line sql.y:4812 { yyLOCAL = yyDollar[1].columnsUnion() } yyVAL.union = yyLOCAL - case 908: + case 909: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4814 +//line sql.y:4818 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 909: + case 910: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4818 +//line sql.y:4822 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 910: + case 911: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4824 +//line sql.y:4828 { yyLOCAL = []*Variable{yyDollar[1].variableUnion()} } yyVAL.union = yyLOCAL - case 911: + case 912: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4828 +//line sql.y:4832 { yySLICE := (*[]*Variable)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].variableUnion()) } - case 912: + case 913: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4834 +//line sql.y:4838 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 913: + case 914: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4838 +//line sql.y:4842 { yyLOCAL = Columns{NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 914: + case 915: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4842 +//line sql.y:4846 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 915: + case 916: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4846 +//line sql.y:4850 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewIdentifierCI(string(yyDollar[3].str))) } - case 916: + case 917: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Partitions -//line sql.y:4852 +//line sql.y:4856 { yyLOCAL = Partitions{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 917: + case 918: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4856 +//line sql.y:4860 { yySLICE := (*Partitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 918: + case 919: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4869 +//line sql.y:4873 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 919: + case 920: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4873 +//line sql.y:4877 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 920: + case 921: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4877 +//line sql.y:4881 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 921: + case 922: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4881 +//line sql.y:4885 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion()} } yyVAL.union = yyLOCAL - case 922: + case 923: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4887 +//line sql.y:4891 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 923: + case 924: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4889 +//line sql.y:4893 { yyVAL.joinCondition = &JoinCondition{Using: yyDollar[3].columnsUnion()} } - case 924: + case 925: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4893 +//line sql.y:4897 { yyVAL.joinCondition = &JoinCondition{} } - case 925: + case 926: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4895 +//line sql.y:4899 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 926: + case 927: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4899 +//line sql.y:4903 { yyVAL.joinCondition = &JoinCondition{} } - case 927: + case 928: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4901 +//line sql.y:4905 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 928: + case 929: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4904 +//line sql.y:4908 { yyVAL.empty = struct{}{} } - case 929: + case 930: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4906 +//line sql.y:4910 { yyVAL.empty = struct{}{} } - case 930: + case 931: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4909 +//line sql.y:4913 { yyVAL.identifierCS = NewIdentifierCS("") } - case 931: + case 932: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4913 +//line sql.y:4917 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 932: + case 933: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4917 +//line sql.y:4921 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 934: + case 935: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4924 +//line sql.y:4928 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 935: + case 936: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:4930 +//line sql.y:4934 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 936: + case 937: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4934 +//line sql.y:4938 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 937: + case 938: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4938 +//line sql.y:4942 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 938: + case 939: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:4944 +//line sql.y:4948 { yyLOCAL = StraightJoinType } yyVAL.union = yyLOCAL - case 939: + case 940: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4950 +//line sql.y:4954 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 940: + case 941: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:4954 +//line sql.y:4958 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 941: + case 942: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4958 +//line sql.y:4962 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 942: + case 943: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:4962 +//line sql.y:4966 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 943: + case 944: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4968 +//line sql.y:4972 { yyLOCAL = NaturalJoinType } yyVAL.union = yyLOCAL - case 944: + case 945: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4972 +//line sql.y:4976 { if yyDollar[2].joinTypeUnion() == LeftJoinType { yyLOCAL = NaturalLeftJoinType @@ -15854,347 +15793,339 @@ yydefault: } } yyVAL.union = yyLOCAL - case 945: + case 946: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4982 +//line sql.y:4986 { yyVAL.tableName = yyDollar[2].tableName } - case 946: + case 947: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4986 +//line sql.y:4990 { yyVAL.tableName = yyDollar[1].tableName } - case 947: + case 948: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4992 +//line sql.y:4996 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 948: + case 949: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4996 +//line sql.y:5000 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS} } - case 949: + case 950: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5002 +//line sql.y:5006 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 950: + case 951: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5007 +//line sql.y:5011 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 951: + case 952: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5011 +//line sql.y:5015 { yyLOCAL = yyDollar[1].indexHintsUnion() } yyVAL.union = yyLOCAL - case 952: + case 953: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5017 +//line sql.y:5021 { yyLOCAL = IndexHints{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL - case 953: + case 954: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5021 +//line sql.y:5025 { yySLICE := (*IndexHints)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexHintUnion()) } - case 954: + case 955: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5027 +//line sql.y:5031 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 955: + case 956: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5031 +//line sql.y:5035 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion()} } yyVAL.union = yyLOCAL - case 956: + case 957: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5035 +//line sql.y:5039 { yyLOCAL = &IndexHint{Type: IgnoreOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 957: + case 958: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5039 +//line sql.y:5043 { yyLOCAL = &IndexHint{Type: ForceOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 958: + case 959: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5044 +//line sql.y:5048 { yyLOCAL = NoForType } yyVAL.union = yyLOCAL - case 959: + case 960: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5048 +//line sql.y:5052 { yyLOCAL = JoinForType } yyVAL.union = yyLOCAL - case 960: + case 961: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5052 +//line sql.y:5056 { yyLOCAL = OrderByForType } yyVAL.union = yyLOCAL - case 961: + case 962: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5056 +//line sql.y:5060 { yyLOCAL = GroupByForType } yyVAL.union = yyLOCAL - case 962: + case 963: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5062 +//line sql.y:5066 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 963: + case 964: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5066 +//line sql.y:5070 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 964: + case 965: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5073 +//line sql.y:5077 { yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 965: + case 966: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5077 +//line sql.y:5081 { yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 966: + case 967: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5081 +//line sql.y:5085 { yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 967: + case 968: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5085 +//line sql.y:5089 { yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 968: + case 969: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5089 +//line sql.y:5093 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} } yyVAL.union = yyLOCAL - case 969: + case 970: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5093 +//line sql.y:5097 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 970: + case 971: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5097 +//line sql.y:5101 { yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 971: + case 972: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5103 +//line sql.y:5107 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} } yyVAL.union = yyLOCAL - case 972: + case 973: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5107 +//line sql.y:5111 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} } yyVAL.union = yyLOCAL - case 973: + case 974: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5111 +//line sql.y:5115 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 974: + case 975: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5115 +//line sql.y:5119 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 975: + case 976: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5121 +//line sql.y:5125 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} } yyVAL.union = yyLOCAL - case 976: + case 977: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5125 +//line sql.y:5129 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} } yyVAL.union = yyLOCAL - case 977: + case 978: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5129 +//line sql.y:5133 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 978: + case 979: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5133 +//line sql.y:5137 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 979: + case 980: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5137 +//line sql.y:5141 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 980: + case 981: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5141 +//line sql.y:5145 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 981: + case 982: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5145 +//line sql.y:5149 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 982: + case 983: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5149 +//line sql.y:5153 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 983: + case 984: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5153 +//line sql.y:5157 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 984: + case 985: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5157 +//line sql.y:5161 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 985: + case 986: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5161 +//line sql.y:5165 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 986: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5167 - { - } case 987: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5170 +//line sql.y:5171 { } case 988: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL Expr -//line sql.y:5176 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:5174 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } - yyVAL.union = yyLOCAL case 989: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5180 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 990: @@ -16202,7 +16133,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5184 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 991: @@ -16210,7 +16141,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5188 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 992: @@ -16218,7 +16149,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5192 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 993: @@ -16226,7 +16157,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5196 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 994: @@ -16234,7 +16165,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5200 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 995: @@ -16242,7 +16173,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5204 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 996: @@ -16250,7 +16181,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5208 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 997: @@ -16258,7 +16189,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5212 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 998: @@ -16266,7 +16197,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5216 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 999: @@ -16274,21 +16205,21 @@ yydefault: var yyLOCAL Expr //line sql.y:5220 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1000: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5224 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1001: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5230 +//line sql.y:5228 { yyLOCAL = yyDollar[1].exprUnion() } @@ -16318,19 +16249,19 @@ yydefault: } yyVAL.union = yyLOCAL case 1005: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5246 { - yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1006: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5250 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } yyVAL.union = yyLOCAL case 1007: @@ -16346,15 +16277,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5258 { - yyLOCAL = yyDollar[1].variableUnion() + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1009: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5262 { - yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? + yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL case 1010: @@ -16362,7 +16293,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5266 { - yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? } yyVAL.union = yyLOCAL case 1011: @@ -16370,7 +16301,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5270 { - yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1012: @@ -16378,15 +16309,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5274 { - yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1013: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5278 { - yyLOCAL = yyDollar[1].subqueryUnion() + yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1014: @@ -16394,23 +16325,23 @@ yydefault: var yyLOCAL Expr //line sql.y:5282 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL case 1015: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5286 { - yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1016: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5290 { - yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} + yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} } yyVAL.union = yyLOCAL case 1017: @@ -16418,15 +16349,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5294 { - yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} + yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} } yyVAL.union = yyLOCAL case 1018: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:5298 { - yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} + yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} } yyVAL.union = yyLOCAL case 1019: @@ -16434,13 +16365,21 @@ yydefault: var yyLOCAL Expr //line sql.y:5302 { - yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} + yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } yyVAL.union = yyLOCAL case 1020: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5306 + { + yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} + } + yyVAL.union = yyLOCAL + case 1021: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL Expr +//line sql.y:5310 { // From: https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#operator_binary // To convert a string expression to a binary string, these constructs are equivalent: @@ -16449,18 +16388,18 @@ yydefault: yyLOCAL = &ConvertExpr{Expr: yyDollar[2].exprUnion(), Type: &ConvertType{Type: yyDollar[1].str}} } yyVAL.union = yyLOCAL - case 1021: + case 1022: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5314 +//line sql.y:5318 { yyLOCAL = &Default{ColName: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1022: + case 1023: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5318 +//line sql.y:5322 { // INTERVAL can trigger a shift / reduce conflict. We want // to shift here for the interval rule. In case we do have @@ -16469,83 +16408,75 @@ yydefault: yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1023: + case 1024: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5326 +//line sql.y:5330 { yyLOCAL = &IntervalFuncExpr{Expr: yyDollar[3].exprUnion(), Exprs: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1024: + case 1025: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5330 +//line sql.y:5334 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONExtractOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1025: + case 1026: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5334 +//line sql.y:5338 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONUnquoteExtractOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1026: + case 1027: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5340 +//line sql.y:5344 { yyLOCAL = &IntervalExpr{Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].identifierCI.String()} } yyVAL.union = yyLOCAL - case 1027: + case 1028: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5346 +//line sql.y:5350 { yyLOCAL = yyDollar[1].colNamesUnion() } yyVAL.union = yyLOCAL - case 1028: + case 1029: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5350 +//line sql.y:5354 { yyLOCAL = yyDollar[2].colNamesUnion() } yyVAL.union = yyLOCAL - case 1029: + case 1030: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5356 +//line sql.y:5360 { yyLOCAL = []*ColName{yyDollar[1].colNameUnion()} } yyVAL.union = yyLOCAL - case 1030: + case 1031: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5360 +//line sql.y:5364 { yySLICE := (*[]*ColName)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colNameUnion()) } - case 1031: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL TrimType -//line sql.y:5366 - { - yyLOCAL = BothTrimType - } - yyVAL.union = yyLOCAL case 1032: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType //line sql.y:5370 { - yyLOCAL = LeadingTrimType + yyLOCAL = BothTrimType } yyVAL.union = yyLOCAL case 1033: @@ -16553,15 +16484,15 @@ yydefault: var yyLOCAL TrimType //line sql.y:5374 { - yyLOCAL = TrailingTrimType + yyLOCAL = LeadingTrimType } yyVAL.union = yyLOCAL case 1034: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL FrameUnitType -//line sql.y:5380 + var yyLOCAL TrimType +//line sql.y:5378 { - yyLOCAL = FrameRowsType + yyLOCAL = TrailingTrimType } yyVAL.union = yyLOCAL case 1035: @@ -16569,15 +16500,15 @@ yydefault: var yyLOCAL FrameUnitType //line sql.y:5384 { - yyLOCAL = FrameRangeType + yyLOCAL = FrameRowsType } yyVAL.union = yyLOCAL case 1036: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5391 + var yyLOCAL FrameUnitType +//line sql.y:5388 { - yyLOCAL = CumeDistExprType + yyLOCAL = FrameRangeType } yyVAL.union = yyLOCAL case 1037: @@ -16585,7 +16516,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5395 { - yyLOCAL = DenseRankExprType + yyLOCAL = CumeDistExprType } yyVAL.union = yyLOCAL case 1038: @@ -16593,7 +16524,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5399 { - yyLOCAL = PercentRankExprType + yyLOCAL = DenseRankExprType } yyVAL.union = yyLOCAL case 1039: @@ -16601,7 +16532,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5403 { - yyLOCAL = RankExprType + yyLOCAL = PercentRankExprType } yyVAL.union = yyLOCAL case 1040: @@ -16609,15 +16540,15 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5407 { - yyLOCAL = RowNumberExprType + yyLOCAL = RankExprType } yyVAL.union = yyLOCAL case 1041: - yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL *FramePoint -//line sql.y:5413 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ArgumentLessWindowExprType +//line sql.y:5411 { - yyLOCAL = &FramePoint{Type: CurrentRowType} + yyLOCAL = RowNumberExprType } yyVAL.union = yyLOCAL case 1042: @@ -16625,7 +16556,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5417 { - yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} + yyLOCAL = &FramePoint{Type: CurrentRowType} } yyVAL.union = yyLOCAL case 1043: @@ -16633,7 +16564,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5421 { - yyLOCAL = &FramePoint{Type: UnboundedFollowingType} + yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} } yyVAL.union = yyLOCAL case 1044: @@ -16641,7 +16572,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5425 { - yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} + yyLOCAL = &FramePoint{Type: UnboundedFollowingType} } yyVAL.union = yyLOCAL case 1045: @@ -16649,15 +16580,15 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5429 { - yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} + yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL case 1046: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL Expr -//line sql.y:5435 + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *FramePoint +//line sql.y:5433 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL case 1047: @@ -16669,281 +16600,281 @@ yydefault: } yyVAL.union = yyLOCAL case 1048: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Expr +//line sql.y:5443 + { + yyLOCAL = yyDollar[1].exprUnion() + } + yyVAL.union = yyLOCAL + case 1049: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5444 +//line sql.y:5448 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1049: + case 1050: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5448 +//line sql.y:5452 { yyLOCAL = yyDollar[1].frameClauseUnion() } yyVAL.union = yyLOCAL - case 1050: + case 1051: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5454 +//line sql.y:5458 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[2].framePointUnion()} } yyVAL.union = yyLOCAL - case 1051: + case 1052: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5458 +//line sql.y:5462 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[3].framePointUnion(), End: yyDollar[5].framePointUnion()} } yyVAL.union = yyLOCAL - case 1052: + case 1053: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:5463 +//line sql.y:5467 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1053: + case 1054: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:5467 +//line sql.y:5471 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1054: + case 1055: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5472 +//line sql.y:5476 { } - case 1055: + case 1056: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5475 +//line sql.y:5479 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1056: + case 1057: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *WindowSpecification -//line sql.y:5481 +//line sql.y:5485 { yyLOCAL = &WindowSpecification{Name: yyDollar[1].identifierCI, PartitionClause: yyDollar[2].exprsUnion(), OrderClause: yyDollar[3].orderByUnion(), FrameClause: yyDollar[4].frameClauseUnion()} } yyVAL.union = yyLOCAL - case 1057: + case 1058: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5487 +//line sql.y:5491 { yyLOCAL = &OverClause{WindowSpec: yyDollar[3].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1058: + case 1059: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5491 +//line sql.y:5495 { yyLOCAL = &OverClause{WindowName: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 1059: + case 1060: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5496 +//line sql.y:5500 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1061: + case 1062: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5503 +//line sql.y:5507 { yyLOCAL = &NullTreatmentClause{yyDollar[1].nullTreatmentTypeUnion()} } yyVAL.union = yyLOCAL - case 1062: + case 1063: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5509 +//line sql.y:5513 { yyLOCAL = RespectNullsType } yyVAL.union = yyLOCAL - case 1063: + case 1064: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5513 +//line sql.y:5517 { yyLOCAL = IgnoreNullsType } yyVAL.union = yyLOCAL - case 1064: + case 1065: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5519 +//line sql.y:5523 { yyLOCAL = FirstValueExprType } yyVAL.union = yyLOCAL - case 1065: + case 1066: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5523 +//line sql.y:5527 { yyLOCAL = LastValueExprType } yyVAL.union = yyLOCAL - case 1066: + case 1067: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5529 +//line sql.y:5533 { yyLOCAL = FromFirstType } yyVAL.union = yyLOCAL - case 1067: + case 1068: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5533 +//line sql.y:5537 { yyLOCAL = FromLastType } yyVAL.union = yyLOCAL - case 1068: + case 1069: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5538 +//line sql.y:5542 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1070: + case 1071: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5545 +//line sql.y:5549 { yyLOCAL = &FromFirstLastClause{yyDollar[1].fromFirstLastTypeUnion()} } yyVAL.union = yyLOCAL - case 1071: + case 1072: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5551 +//line sql.y:5555 { yyLOCAL = LagExprType } yyVAL.union = yyLOCAL - case 1072: + case 1073: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5555 +//line sql.y:5559 { yyLOCAL = LeadExprType } yyVAL.union = yyLOCAL - case 1073: + case 1074: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *WindowDefinition -//line sql.y:5561 +//line sql.y:5565 { yyLOCAL = &WindowDefinition{Name: yyDollar[1].identifierCI, WindowSpec: yyDollar[4].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1074: + case 1075: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL WindowDefinitions -//line sql.y:5567 +//line sql.y:5571 { yyLOCAL = WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL - case 1075: + case 1076: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5571 +//line sql.y:5575 { yySLICE := (*WindowDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].windowDefinitionUnion()) } - case 1076: + case 1077: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5577 +//line sql.y:5581 { yyVAL.str = "" } - case 1077: + case 1078: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5581 +//line sql.y:5585 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } - case 1078: + case 1079: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5587 +//line sql.y:5591 { yyLOCAL = BoolVal(true) } yyVAL.union = yyLOCAL - case 1079: + case 1080: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5591 +//line sql.y:5595 { yyLOCAL = BoolVal(false) } yyVAL.union = yyLOCAL - case 1080: + case 1081: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5598 +//line sql.y:5602 { yyLOCAL = IsTrueOp } yyVAL.union = yyLOCAL - case 1081: + case 1082: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5602 +//line sql.y:5606 { yyLOCAL = IsNotTrueOp } yyVAL.union = yyLOCAL - case 1082: + case 1083: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5606 +//line sql.y:5610 { yyLOCAL = IsFalseOp } yyVAL.union = yyLOCAL - case 1083: + case 1084: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5610 +//line sql.y:5614 { yyLOCAL = IsNotFalseOp } yyVAL.union = yyLOCAL - case 1084: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ComparisonExprOperator -//line sql.y:5616 - { - yyLOCAL = EqualOp - } - yyVAL.union = yyLOCAL case 1085: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator //line sql.y:5620 { - yyLOCAL = LessThanOp + yyLOCAL = EqualOp } yyVAL.union = yyLOCAL case 1086: @@ -16951,7 +16882,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5624 { - yyLOCAL = GreaterThanOp + yyLOCAL = LessThanOp } yyVAL.union = yyLOCAL case 1087: @@ -16959,7 +16890,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5628 { - yyLOCAL = LessEqualOp + yyLOCAL = GreaterThanOp } yyVAL.union = yyLOCAL case 1088: @@ -16967,7 +16898,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5632 { - yyLOCAL = GreaterEqualOp + yyLOCAL = LessEqualOp } yyVAL.union = yyLOCAL case 1089: @@ -16975,7 +16906,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5636 { - yyLOCAL = NotEqualOp + yyLOCAL = GreaterEqualOp } yyVAL.union = yyLOCAL case 1090: @@ -16983,15 +16914,15 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5640 { - yyLOCAL = NullSafeEqualOp + yyLOCAL = NotEqualOp } yyVAL.union = yyLOCAL case 1091: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ColTuple -//line sql.y:5646 + var yyLOCAL ComparisonExprOperator +//line sql.y:5644 { - yyLOCAL = yyDollar[1].valTupleUnion() + yyLOCAL = NullSafeEqualOp } yyVAL.union = yyLOCAL case 1092: @@ -16999,159 +16930,159 @@ yydefault: var yyLOCAL ColTuple //line sql.y:5650 { - yyLOCAL = yyDollar[1].subqueryUnion() + yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL case 1093: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple //line sql.y:5654 + { + yyLOCAL = yyDollar[1].subqueryUnion() + } + yyVAL.union = yyLOCAL + case 1094: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ColTuple +//line sql.y:5658 { yyLOCAL = ListArg(yyDollar[1].str[2:]) bindVariable(yylex, yyDollar[1].str[2:]) } yyVAL.union = yyLOCAL - case 1094: + case 1095: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Subquery -//line sql.y:5661 +//line sql.y:5665 { yyLOCAL = &Subquery{yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1095: + case 1096: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:5667 +//line sql.y:5671 { yyLOCAL = Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1096: + case 1097: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5671 +//line sql.y:5675 { yySLICE := (*Exprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].exprUnion()) } - case 1097: + case 1098: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5681 +//line sql.y:5685 { yyLOCAL = &FuncExpr{Name: yyDollar[1].identifierCI, Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1098: + case 1099: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5685 +//line sql.y:5689 { yyLOCAL = &FuncExpr{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCI, Exprs: yyDollar[5].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1099: - yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL Expr -//line sql.y:5695 - { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].selectExprsUnion()} - } - yyVAL.union = yyLOCAL case 1100: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5699 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1101: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5703 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1102: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5707 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1103: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5711 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1104: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5715 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1105: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5719 { - yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1106: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5723 { - yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} + yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1107: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5727 { - yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} + yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL case 1108: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr //line sql.y:5731 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} + yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL case 1109: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5742 +//line sql.y:5735 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1110: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5746 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} } yyVAL.union = yyLOCAL case 1111: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5752 +//line sql.y:5750 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1112: @@ -17159,31 +17090,31 @@ yydefault: var yyLOCAL Expr //line sql.y:5756 { - yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].exprUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} } yyVAL.union = yyLOCAL case 1113: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5761 +//line sql.y:5760 { - yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].exprUnion()} + yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1114: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5765 { - yyLOCAL = &CountStar{} + yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1115: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5769 { - yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion()} + yyLOCAL = &CountStar{} } yyVAL.union = yyLOCAL case 1116: @@ -17191,7 +17122,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5773 { - yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL case 1117: @@ -17199,7 +17130,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5777 { - yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1118: @@ -17207,7 +17138,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5781 { - yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1119: @@ -17215,15 +17146,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5785 { - yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1120: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5789 { - yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1121: @@ -17231,7 +17162,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5793 { - yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1122: @@ -17239,7 +17170,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5797 { - yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1123: @@ -17247,7 +17178,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5801 { - yyLOCAL = &Std{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1124: @@ -17255,7 +17186,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5805 { - yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &Std{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1125: @@ -17263,7 +17194,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5809 { - yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1126: @@ -17271,7 +17202,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5813 { - yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1127: @@ -17279,7 +17210,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5817 { - yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1128: @@ -17287,7 +17218,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5821 { - yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1129: @@ -17295,15 +17226,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5825 { - yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1130: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5829 { - yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} + yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1131: @@ -17311,7 +17242,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5833 { - yyLOCAL = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].identifierCI.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} + yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} } yyVAL.union = yyLOCAL case 1132: @@ -17319,31 +17250,31 @@ yydefault: var yyLOCAL Expr //line sql.y:5837 { - yyLOCAL = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].identifierCI.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} + yyLOCAL = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].identifierCI.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1133: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5841 { - yyLOCAL = &ExtractFuncExpr{IntervalTypes: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} + yyLOCAL = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].identifierCI.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1134: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5845 { - yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} + yyLOCAL = &ExtractFuncExpr{IntervalTypes: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1135: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5849 { - yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} } yyVAL.union = yyLOCAL case 1136: @@ -17351,7 +17282,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5853 { - yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1137: @@ -17359,7 +17290,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5857 { - yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1138: @@ -17367,7 +17298,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5861 { - yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1139: @@ -17375,23 +17306,23 @@ yydefault: var yyLOCAL Expr //line sql.y:5865 { - yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1140: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5869 { - yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1141: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:5873 { - yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL case 1142: @@ -17399,15 +17330,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5877 { - yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} + yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1143: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5881 { - yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} + yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1144: @@ -17415,7 +17346,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5885 { - yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} + yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} } yyVAL.union = yyLOCAL case 1145: @@ -17423,23 +17354,23 @@ yydefault: var yyLOCAL Expr //line sql.y:5889 { - yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1146: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5893 { - yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} + yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1147: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5897 { - yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} + yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1148: @@ -17447,15 +17378,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5901 { - yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} + yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1149: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5905 { - yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1150: @@ -17463,31 +17394,31 @@ yydefault: var yyLOCAL Expr //line sql.y:5909 { - yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1151: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5913 { - yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} + yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1152: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5917 { - yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} } yyVAL.union = yyLOCAL case 1153: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5921 { - yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} + yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1154: @@ -17495,15 +17426,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5925 { - yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} + yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1155: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5929 { - yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} + yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1156: @@ -17511,7 +17442,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5933 { - yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} + yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1157: @@ -17519,47 +17450,47 @@ yydefault: var yyLOCAL Expr //line sql.y:5937 { - yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1158: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5941 { - yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} + yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1159: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5945 { - yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} + yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} } yyVAL.union = yyLOCAL case 1160: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5949 { - yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} } yyVAL.union = yyLOCAL case 1161: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5953 { - yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1162: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5957 { - yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} + yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1163: @@ -17567,39 +17498,39 @@ yydefault: var yyLOCAL Expr //line sql.y:5961 { - yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} + yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1164: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5965 { - yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} + yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1165: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5969 { - yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} + yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1166: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr //line sql.y:5973 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} + yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} } yyVAL.union = yyLOCAL case 1167: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:5977 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} } yyVAL.union = yyLOCAL case 1168: @@ -17607,23 +17538,23 @@ yydefault: var yyLOCAL Expr //line sql.y:5981 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL case 1169: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5985 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL case 1170: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr //line sql.y:5989 { - yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} } yyVAL.union = yyLOCAL case 1171: @@ -17631,7 +17562,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5993 { - yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1172: @@ -17639,7 +17570,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5997 { - yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1173: @@ -17647,15 +17578,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6001 { - yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1174: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6005 { - yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1175: @@ -17663,7 +17594,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6009 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1176: @@ -17671,7 +17602,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6013 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1177: @@ -17679,7 +17610,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6017 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1178: @@ -17687,7 +17618,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6021 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1179: @@ -17695,7 +17626,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6025 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1180: @@ -17703,7 +17634,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6029 { - yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1181: @@ -17711,7 +17642,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6033 { - yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1182: @@ -17719,7 +17650,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6037 { - yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1183: @@ -17727,15 +17658,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6041 { - yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1184: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6045 { - yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} + yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1185: @@ -17743,55 +17674,55 @@ yydefault: var yyLOCAL Expr //line sql.y:6049 { - yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} + yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1186: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6053 { - yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} + yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} } yyVAL.union = yyLOCAL case 1187: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6057 { - yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} + yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL case 1188: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:6061 { - yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} + yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL case 1189: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr //line sql.y:6065 { - yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} + yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL case 1190: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6069 { - yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), Default: yyDollar[6].exprUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} + yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1195: - yyDollar = yyS[yypt-1 : yypt+1] + case 1191: + yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6079 +//line sql.y:6073 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), Default: yyDollar[6].exprUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL case 1196: @@ -17799,7 +17730,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6083 { - yyLOCAL = NewIntLiteral(yyDollar[1].str) + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1197: @@ -17807,296 +17738,296 @@ yydefault: var yyLOCAL Expr //line sql.y:6087 { - yyLOCAL = yyDollar[1].variableUnion() + yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL case 1198: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:6091 + { + yyLOCAL = yyDollar[1].variableUnion() + } + yyVAL.union = yyLOCAL + case 1199: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Expr +//line sql.y:6095 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1199: + case 1200: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6097 +//line sql.y:6101 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1200: + case 1201: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6101 +//line sql.y:6105 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1201: + case 1202: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6107 +//line sql.y:6111 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1202: + case 1203: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6111 +//line sql.y:6115 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1203: + case 1204: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6115 +//line sql.y:6119 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1204: + case 1205: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6119 +//line sql.y:6123 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1205: + case 1206: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6123 +//line sql.y:6127 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1206: + case 1207: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6128 +//line sql.y:6132 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1207: + case 1208: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6132 +//line sql.y:6136 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), MatchType: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1208: + case 1209: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6136 +//line sql.y:6140 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1209: + case 1210: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6140 +//line sql.y:6144 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1210: + case 1211: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6144 +//line sql.y:6148 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1211: + case 1212: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6148 +//line sql.y:6152 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1212: + case 1213: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6153 +//line sql.y:6157 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1213: + case 1214: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6157 +//line sql.y:6161 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1214: + case 1215: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6161 +//line sql.y:6165 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1215: + case 1216: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6165 +//line sql.y:6169 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), MatchType: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1216: + case 1217: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6172 +//line sql.y:6176 { yyLOCAL = &ExtractValueExpr{Fragment: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1217: + case 1218: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6176 +//line sql.y:6180 { yyLOCAL = &UpdateXMLExpr{Target: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion(), NewXML: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1218: + case 1219: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6182 +//line sql.y:6186 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatBytesType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1219: + case 1220: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6186 +//line sql.y:6190 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatPicoTimeType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1220: + case 1221: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6190 +//line sql.y:6194 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsCurrentThreadIDType} } yyVAL.union = yyLOCAL - case 1221: + case 1222: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6194 +//line sql.y:6198 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsThreadIDType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1222: + case 1223: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6200 +//line sql.y:6204 { yyLOCAL = >IDFuncExpr{Type: GTIDSubsetType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1223: + case 1224: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6204 +//line sql.y:6208 { yyLOCAL = >IDFuncExpr{Type: GTIDSubtractType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1224: + case 1225: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6208 +//line sql.y:6212 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1225: + case 1226: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6212 +//line sql.y:6216 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1226: + case 1227: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6216 +//line sql.y:6220 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1227: + case 1228: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6220 +//line sql.y:6224 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1228: + case 1229: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6224 +//line sql.y:6228 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion(), Channel: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1229: + case 1230: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6229 +//line sql.y:6233 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1230: + case 1231: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6233 +//line sql.y:6237 { yyLOCAL = yyDollar[2].convertTypeUnion() } yyVAL.union = yyLOCAL - case 1231: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6239 - { - } case 1232: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL IntervalTypes -//line sql.y:6241 +//line sql.y:6243 { - yyLOCAL = IntervalDayHour } - yyVAL.union = yyLOCAL case 1233: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes //line sql.y:6245 { - yyLOCAL = IntervalDayMicrosecond + yyLOCAL = IntervalDayHour } yyVAL.union = yyLOCAL case 1234: @@ -18104,7 +18035,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6249 { - yyLOCAL = IntervalDayMinute + yyLOCAL = IntervalDayMicrosecond } yyVAL.union = yyLOCAL case 1235: @@ -18112,7 +18043,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6253 { - yyLOCAL = IntervalDaySecond + yyLOCAL = IntervalDayMinute } yyVAL.union = yyLOCAL case 1236: @@ -18120,7 +18051,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6257 { - yyLOCAL = IntervalHourMicrosecond + yyLOCAL = IntervalDaySecond } yyVAL.union = yyLOCAL case 1237: @@ -18128,7 +18059,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6261 { - yyLOCAL = IntervalHourMinute + yyLOCAL = IntervalHourMicrosecond } yyVAL.union = yyLOCAL case 1238: @@ -18136,7 +18067,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6265 { - yyLOCAL = IntervalHourSecond + yyLOCAL = IntervalHourMinute } yyVAL.union = yyLOCAL case 1239: @@ -18144,7 +18075,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6269 { - yyLOCAL = IntervalMinuteMicrosecond + yyLOCAL = IntervalHourSecond } yyVAL.union = yyLOCAL case 1240: @@ -18152,7 +18083,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6273 { - yyLOCAL = IntervalMinuteSecond + yyLOCAL = IntervalMinuteMicrosecond } yyVAL.union = yyLOCAL case 1241: @@ -18160,7 +18091,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6277 { - yyLOCAL = IntervalSecondMicrosecond + yyLOCAL = IntervalMinuteSecond } yyVAL.union = yyLOCAL case 1242: @@ -18168,15 +18099,15 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6281 { - yyLOCAL = IntervalYearMonth + yyLOCAL = IntervalSecondMicrosecond } yyVAL.union = yyLOCAL case 1243: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:6287 +//line sql.y:6285 { - yyLOCAL = IntervalDay + yyLOCAL = IntervalYearMonth } yyVAL.union = yyLOCAL case 1244: @@ -18184,7 +18115,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6291 { - yyLOCAL = IntervalWeek + yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL case 1245: @@ -18192,7 +18123,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6295 { - yyLOCAL = IntervalHour + yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL case 1246: @@ -18200,7 +18131,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6299 { - yyLOCAL = IntervalMinute + yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL case 1247: @@ -18208,7 +18139,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6303 { - yyLOCAL = IntervalMonth + yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL case 1248: @@ -18216,7 +18147,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6307 { - yyLOCAL = IntervalQuarter + yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL case 1249: @@ -18224,7 +18155,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6311 { - yyLOCAL = IntervalSecond + yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL case 1250: @@ -18232,7 +18163,7 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6315 { - yyLOCAL = IntervalMicrosecond + yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL case 1251: @@ -18240,19 +18171,19 @@ yydefault: var yyLOCAL IntervalTypes //line sql.y:6319 { - yyLOCAL = IntervalYear + yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1254: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL Expr -//line sql.y:6329 + case 1252: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL IntervalTypes +//line sql.y:6323 { - yyLOCAL = nil + yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL case 1255: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr //line sql.y:6333 { @@ -18260,11 +18191,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1256: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:6337 { - yyLOCAL = NewIntLiteral(yyDollar[2].str) + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1257: @@ -18272,16 +18203,16 @@ yydefault: var yyLOCAL Expr //line sql.y:6341 { - yyLOCAL = NewArgument(yyDollar[2].str[1:]) - bindVariable(yylex, yyDollar[2].str[1:]) + yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL case 1258: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6352 +//line sql.y:6345 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = NewArgument(yyDollar[2].str[1:]) + bindVariable(yylex, yyDollar[2].str[1:]) } yyVAL.union = yyLOCAL case 1259: @@ -18289,7 +18220,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6356 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1260: @@ -18297,7 +18228,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6360 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1261: @@ -18305,7 +18236,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6364 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1262: @@ -18313,60 +18244,62 @@ yydefault: var yyLOCAL Expr //line sql.y:6368 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1263: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL MatchExprOption -//line sql.y:6374 + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL Expr +//line sql.y:6372 { - yyLOCAL = NoOption + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1264: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6378 { - yyLOCAL = BooleanModeOpt + yyLOCAL = NoOption } yyVAL.union = yyLOCAL case 1265: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6382 { - yyLOCAL = NaturalLanguageModeOpt + yyLOCAL = BooleanModeOpt } yyVAL.union = yyLOCAL case 1266: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6386 { - yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt + yyLOCAL = NaturalLanguageModeOpt } yyVAL.union = yyLOCAL case 1267: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:6390 { - yyLOCAL = QueryExpansionOpt + yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt } yyVAL.union = yyLOCAL case 1268: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6396 + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL MatchExprOption +//line sql.y:6394 { - yyVAL.str = string(yyDollar[1].identifierCI.String()) + yyLOCAL = QueryExpansionOpt } + yyVAL.union = yyLOCAL case 1269: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:6400 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].identifierCI.String()) } case 1270: yyDollar = yyS[yypt-1 : yypt+1] @@ -18375,19 +18308,17 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1271: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL *ConvertType -//line sql.y:6410 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:6408 { - yyLOCAL = nil + yyVAL.str = string(yyDollar[1].str) } - yyVAL.union = yyLOCAL case 1272: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6414 { - yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1273: @@ -18399,35 +18330,35 @@ yydefault: } yyVAL.union = yyLOCAL case 1274: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6424 +//line sql.y:6422 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} } yyVAL.union = yyLOCAL case 1275: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6428 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].columnCharset} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1276: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6432 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].columnCharset} } yyVAL.union = yyLOCAL case 1277: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6436 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1278: @@ -18435,37 +18366,37 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:6440 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} - yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length - yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1279: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6446 +//line sql.y:6444 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length + yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale } yyVAL.union = yyLOCAL case 1280: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6450 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1281: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6454 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1282: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6458 { @@ -18477,19 +18408,19 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:6462 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1284: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6466 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1285: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6470 { @@ -18501,15 +18432,15 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:6474 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1287: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:6478 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1288: @@ -18521,140 +18452,148 @@ yydefault: } yyVAL.union = yyLOCAL case 1289: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL *ConvertType +//line sql.y:6486 + { + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + } + yyVAL.union = yyLOCAL + case 1290: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:6488 +//line sql.y:6492 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1290: + case 1291: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:6492 +//line sql.y:6496 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1291: + case 1292: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6497 +//line sql.y:6501 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1292: + case 1293: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6501 +//line sql.y:6505 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1293: + case 1294: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6506 +//line sql.y:6510 { yyVAL.str = string("") } - case 1294: + case 1295: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6510 +//line sql.y:6514 { yyVAL.str = " separator " + encodeSQLString(yyDollar[2].str) } - case 1295: + case 1296: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*When -//line sql.y:6516 +//line sql.y:6520 { yyLOCAL = []*When{yyDollar[1].whenUnion()} } yyVAL.union = yyLOCAL - case 1296: + case 1297: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6520 +//line sql.y:6524 { yySLICE := (*[]*When)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].whenUnion()) } - case 1297: + case 1298: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *When -//line sql.y:6526 +//line sql.y:6530 { yyLOCAL = &When{Cond: yyDollar[2].exprUnion(), Val: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1298: + case 1299: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6531 +//line sql.y:6535 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1299: + case 1300: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6535 +//line sql.y:6539 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1300: + case 1301: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:6541 +//line sql.y:6545 { yyLOCAL = &ColName{Name: yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1301: + case 1302: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:6545 +//line sql.y:6549 { yyLOCAL = &ColName{Name: NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 1302: + case 1303: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColName -//line sql.y:6549 +//line sql.y:6553 { yyLOCAL = &ColName{Qualifier: TableName{Name: yyDollar[1].identifierCS}, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1303: + case 1304: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColName -//line sql.y:6553 +//line sql.y:6557 { yyLOCAL = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}, Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 1304: + case 1305: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6559 +//line sql.y:6563 { yyLOCAL = yyDollar[1].colNameUnion() } yyVAL.union = yyLOCAL - case 1305: + case 1306: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6563 +//line sql.y:6567 { yyLOCAL = &Offset{V: convertStringToInt(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1306: + case 1307: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6569 +//line sql.y:6573 { // TODO(sougou): Deprecate this construct. if yyDollar[1].identifierCI.Lowered() != "value" { @@ -18664,219 +18603,211 @@ yydefault: yyLOCAL = NewIntLiteral("1") } yyVAL.union = yyLOCAL - case 1307: + case 1308: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6578 +//line sql.y:6582 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1308: + case 1309: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6582 +//line sql.y:6586 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1309: + case 1310: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:6588 +//line sql.y:6592 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1310: + case 1311: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:6592 +//line sql.y:6596 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1311: + case 1312: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6597 +//line sql.y:6601 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1312: + case 1313: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6601 +//line sql.y:6605 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1313: + case 1314: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *NamedWindow -//line sql.y:6607 +//line sql.y:6611 { yyLOCAL = &NamedWindow{yyDollar[2].windowDefinitionsUnion()} } yyVAL.union = yyLOCAL - case 1314: + case 1315: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6613 +//line sql.y:6617 { yyLOCAL = NamedWindows{yyDollar[1].namedWindowUnion()} } yyVAL.union = yyLOCAL - case 1315: + case 1316: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6617 +//line sql.y:6621 { yySLICE := (*NamedWindows)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].namedWindowUnion()) } - case 1316: + case 1317: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6622 +//line sql.y:6626 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1317: + case 1318: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:6626 +//line sql.y:6630 { yyLOCAL = yyDollar[1].namedWindowsUnion() } yyVAL.union = yyLOCAL - case 1318: + case 1319: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6631 +//line sql.y:6635 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1319: + case 1320: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6635 +//line sql.y:6639 { yyLOCAL = yyDollar[1].orderByUnion() } yyVAL.union = yyLOCAL - case 1320: + case 1321: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6641 +//line sql.y:6645 { yyLOCAL = yyDollar[3].orderByUnion() } yyVAL.union = yyLOCAL - case 1321: + case 1322: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:6647 +//line sql.y:6651 { yyLOCAL = OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL - case 1322: + case 1323: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6651 +//line sql.y:6655 { yySLICE := (*OrderBy)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].orderUnion()) } - case 1323: + case 1324: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Order -//line sql.y:6657 +//line sql.y:6661 { yyLOCAL = &Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 1324: + case 1325: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6662 +//line sql.y:6666 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1325: + case 1326: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6666 +//line sql.y:6670 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1326: + case 1327: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:6670 +//line sql.y:6674 { yyLOCAL = DescOrder } yyVAL.union = yyLOCAL - case 1327: + case 1328: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Limit -//line sql.y:6675 +//line sql.y:6679 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1328: + case 1329: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Limit -//line sql.y:6679 +//line sql.y:6683 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1329: + case 1330: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Limit -//line sql.y:6685 +//line sql.y:6689 { yyLOCAL = &Limit{Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1330: + case 1331: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:6689 +//line sql.y:6693 { yyLOCAL = &Limit{Offset: yyDollar[2].exprUnion(), Rowcount: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1331: + case 1332: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:6693 +//line sql.y:6697 { yyLOCAL = &Limit{Offset: yyDollar[4].exprUnion(), Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1332: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL []AlterOption -//line sql.y:6698 - { - yyLOCAL = nil - } - yyVAL.union = yyLOCAL case 1333: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption //line sql.y:6702 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1334: @@ -18888,11 +18819,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1335: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption //line sql.y:6710 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL case 1336: @@ -18904,11 +18835,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1337: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL AlterOption -//line sql.y:6721 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL []AlterOption +//line sql.y:6718 { - yyLOCAL = &LockOption{Type: DefaultType} + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 1338: @@ -18916,7 +18847,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:6725 { - yyLOCAL = &LockOption{Type: NoneType} + yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL case 1339: @@ -18924,7 +18855,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:6729 { - yyLOCAL = &LockOption{Type: SharedType} + yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL case 1340: @@ -18932,15 +18863,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:6733 { - yyLOCAL = &LockOption{Type: ExclusiveType} + yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL case 1341: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:6739 +//line sql.y:6737 { - yyLOCAL = AlgorithmValue(yyDollar[3].str) + yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL case 1342: @@ -18968,16 +18899,18 @@ yydefault: } yyVAL.union = yyLOCAL case 1345: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6756 + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL AlterOption +//line sql.y:6755 { - yyVAL.str = "" + yyLOCAL = AlgorithmValue(yyDollar[3].str) } + yyVAL.union = yyLOCAL case 1346: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6760 { - yyVAL.str = string(yyDollar[3].str) + yyVAL.str = "" } case 1347: yyDollar = yyS[yypt-3 : yypt+1] @@ -18992,22 +18925,22 @@ yydefault: yyVAL.str = string(yyDollar[3].str) } case 1349: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6773 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:6772 { - yyVAL.str = "" + yyVAL.str = string(yyDollar[3].str) } case 1350: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6777 { - yyVAL.str = yyDollar[3].str + yyVAL.str = "" } case 1351: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6783 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:6781 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = yyDollar[3].str } case 1352: yyDollar = yyS[yypt-1 : yypt+1] @@ -19016,28 +18949,28 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1353: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6792 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:6791 { - yyVAL.str = "" + yyVAL.str = string(yyDollar[1].str) } case 1354: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6796 { - yyVAL.str = yyDollar[2].str + yyVAL.str = "" } case 1355: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6801 + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:6800 { - yyVAL.str = "cascaded" + yyVAL.str = yyDollar[2].str } case 1356: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:6805 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = "cascaded" } case 1357: yyDollar = yyS[yypt-1 : yypt+1] @@ -19046,45 +18979,51 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1358: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:6813 + { + yyVAL.str = string(yyDollar[1].str) + } + case 1359: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Definer -//line sql.y:6814 +//line sql.y:6818 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1359: + case 1360: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:6818 +//line sql.y:6822 { yyLOCAL = yyDollar[3].definerUnion() } yyVAL.union = yyLOCAL - case 1360: + case 1361: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Definer -//line sql.y:6824 +//line sql.y:6828 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1361: + case 1362: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:6830 +//line sql.y:6834 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1362: + case 1363: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Definer -//line sql.y:6836 +//line sql.y:6840 { yyLOCAL = &Definer{ Name: yyDollar[1].str, @@ -19092,369 +19031,369 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1363: + case 1364: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6845 +//line sql.y:6849 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 1364: + case 1365: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6849 +//line sql.y:6853 { yyVAL.str = formatIdentifier(yyDollar[1].str) } - case 1365: + case 1366: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6854 +//line sql.y:6858 { yyVAL.str = "" } - case 1366: + case 1367: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6858 +//line sql.y:6862 { yyVAL.str = formatAddress(yyDollar[1].str) } - case 1367: + case 1368: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:6864 +//line sql.y:6868 { yyLOCAL = ForUpdateLock } yyVAL.union = yyLOCAL - case 1368: + case 1369: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:6868 +//line sql.y:6872 { yyLOCAL = ShareModeLock } yyVAL.union = yyLOCAL - case 1369: + case 1370: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:6874 +//line sql.y:6878 { yyLOCAL = &SelectInto{Type: IntoOutfileS3, FileName: encodeSQLString(yyDollar[4].str), Charset: yyDollar[5].columnCharset, FormatOption: yyDollar[6].str, ExportOption: yyDollar[7].str, Manifest: yyDollar[8].str, Overwrite: yyDollar[9].str} } yyVAL.union = yyLOCAL - case 1370: + case 1371: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:6878 +//line sql.y:6882 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1371: + case 1372: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:6882 +//line sql.y:6886 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1372: + case 1373: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6887 +//line sql.y:6891 { yyVAL.str = "" } - case 1373: + case 1374: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6891 +//line sql.y:6895 { yyVAL.str = " format csv" + yyDollar[3].str } - case 1374: + case 1375: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6895 +//line sql.y:6899 { yyVAL.str = " format text" + yyDollar[3].str } - case 1375: + case 1376: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6900 +//line sql.y:6904 { yyVAL.str = "" } - case 1376: + case 1377: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6904 +//line sql.y:6908 { yyVAL.str = " header" } - case 1377: + case 1378: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6909 +//line sql.y:6913 { yyVAL.str = "" } - case 1378: + case 1379: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6913 +//line sql.y:6917 { yyVAL.str = " manifest on" } - case 1379: + case 1380: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6917 +//line sql.y:6921 { yyVAL.str = " manifest off" } - case 1380: + case 1381: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6922 +//line sql.y:6926 { yyVAL.str = "" } - case 1381: + case 1382: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6926 +//line sql.y:6930 { yyVAL.str = " overwrite on" } - case 1382: + case 1383: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6930 +//line sql.y:6934 { yyVAL.str = " overwrite off" } - case 1383: + case 1384: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6936 +//line sql.y:6940 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1384: + case 1385: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6941 +//line sql.y:6945 { yyVAL.str = "" } - case 1385: + case 1386: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6945 +//line sql.y:6949 { yyVAL.str = " lines" + yyDollar[2].str } - case 1386: + case 1387: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6951 +//line sql.y:6955 { yyVAL.str = yyDollar[1].str } - case 1387: + case 1388: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6955 +//line sql.y:6959 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1388: + case 1389: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6961 +//line sql.y:6965 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } - case 1389: + case 1390: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6965 +//line sql.y:6969 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1390: + case 1391: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6970 +//line sql.y:6974 { yyVAL.str = "" } - case 1391: + case 1392: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6974 +//line sql.y:6978 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } - case 1392: + case 1393: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6980 +//line sql.y:6984 { yyVAL.str = yyDollar[1].str } - case 1393: + case 1394: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:6984 +//line sql.y:6988 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1394: + case 1395: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6990 +//line sql.y:6994 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1395: + case 1396: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:6994 +//line sql.y:6998 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } - case 1396: + case 1397: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:6998 +//line sql.y:7002 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } - case 1397: + case 1398: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7003 +//line sql.y:7007 { yyVAL.str = "" } - case 1398: + case 1399: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7007 +//line sql.y:7011 { yyVAL.str = " optionally" } - case 1399: + case 1400: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Insert -//line sql.y:7020 +//line sql.y:7024 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion()} } yyVAL.union = yyLOCAL - case 1400: + case 1401: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7024 +//line sql.y:7028 { yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1401: + case 1402: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7028 +//line sql.y:7032 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion()} } yyVAL.union = yyLOCAL - case 1402: + case 1403: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7032 +//line sql.y:7036 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion()} } yyVAL.union = yyLOCAL - case 1403: + case 1404: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7036 +//line sql.y:7040 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1404: + case 1405: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7042 +//line sql.y:7046 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1405: + case 1406: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7046 +//line sql.y:7050 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1406: + case 1407: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7050 +//line sql.y:7054 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 1407: + case 1408: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7054 +//line sql.y:7058 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) } - case 1408: + case 1409: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7059 +//line sql.y:7063 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1409: + case 1410: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7063 +//line sql.y:7067 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 1410: + case 1411: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7069 +//line sql.y:7073 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL - case 1411: + case 1412: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7073 +//line sql.y:7077 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) } - case 1412: + case 1413: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7079 +//line sql.y:7083 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1413: + case 1414: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7083 +//line sql.y:7087 { yyLOCAL = ValTuple{} } yyVAL.union = yyLOCAL - case 1414: + case 1415: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7089 +//line sql.y:7093 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1415: + case 1416: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7093 +//line sql.y:7097 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1416: + case 1417: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7098 +//line sql.y:7102 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -19463,283 +19402,277 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1417: + case 1418: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7108 +//line sql.y:7112 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 1418: + case 1419: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7112 +//line sql.y:7116 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) } - case 1419: + case 1420: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7118 +//line sql.y:7122 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1420: + case 1421: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:7124 +//line sql.y:7128 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL - case 1421: + case 1422: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7128 +//line sql.y:7132 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) } - case 1422: + case 1423: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:7134 +//line sql.y:7138 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("on")} } yyVAL.union = yyLOCAL - case 1423: + case 1424: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:7138 +//line sql.y:7142 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("off")} } yyVAL.union = yyLOCAL - case 1424: + case 1425: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:7142 +//line sql.y:7146 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1425: + case 1426: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:7146 +//line sql.y:7150 { yyLOCAL = &SetExpr{Var: NewSetVariable(string(yyDollar[1].str), SessionScope), Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1426: + case 1427: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:7152 +//line sql.y:7156 { yyLOCAL = NewSetVariable(string(yyDollar[1].str), SessionScope) } yyVAL.union = yyLOCAL - case 1427: + case 1428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:7156 +//line sql.y:7160 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 1428: + case 1429: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Variable -//line sql.y:7160 +//line sql.y:7164 { yyLOCAL = NewSetVariable(string(yyDollar[2].str), yyDollar[1].scopeUnion()) } yyVAL.union = yyLOCAL - case 1430: + case 1431: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7167 +//line sql.y:7171 { yyVAL.str = "charset" } - case 1433: + case 1434: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7177 +//line sql.y:7181 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } yyVAL.union = yyLOCAL - case 1434: + case 1435: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7181 +//line sql.y:7185 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1435: + case 1436: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7185 +//line sql.y:7189 { yyLOCAL = &Default{} } yyVAL.union = yyLOCAL - case 1438: + case 1439: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7194 +//line sql.y:7198 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1439: + case 1440: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7196 +//line sql.y:7200 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1440: + case 1441: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7199 +//line sql.y:7203 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1441: + case 1442: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7201 +//line sql.y:7205 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1442: + case 1443: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7204 +//line sql.y:7208 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1443: + case 1444: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:7206 +//line sql.y:7210 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1444: + case 1445: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:7209 +//line sql.y:7213 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1445: + case 1446: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:7211 +//line sql.y:7215 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1446: + case 1447: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7214 +//line sql.y:7218 { yyVAL.empty = struct{}{} } - case 1447: + case 1448: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7216 +//line sql.y:7220 { yyVAL.empty = struct{}{} } - case 1448: + case 1449: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7218 +//line sql.y:7222 { yyVAL.empty = struct{}{} } - case 1449: + case 1450: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:7222 +//line sql.y:7226 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL - case 1450: + case 1451: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:7227 +//line sql.y:7231 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1451: + case 1452: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:7231 +//line sql.y:7235 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1452: + case 1453: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7236 +//line sql.y:7240 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1453: + case 1454: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7238 +//line sql.y:7242 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 1454: + case 1455: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:7242 +//line sql.y:7246 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL - case 1455: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7248 - { - yyVAL.identifierCI = yyDollar[1].identifierCI - } case 1456: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:7252 { - yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) + yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1458: + case 1457: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7259 +//line sql.y:7256 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1459: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7265 +//line sql.y:7263 { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1460: yyDollar = yyS[yypt-1 : yypt+1] @@ -19748,52 +19681,52 @@ yydefault: yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 1461: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:7273 + { + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + } + case 1462: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7275 +//line sql.y:7279 { yyVAL.identifierCS = NewIdentifierCS("") } - case 1462: + case 1463: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7279 +//line sql.y:7283 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 1464: + case 1465: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7286 +//line sql.y:7290 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 2006: + case 2007: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7854 +//line sql.y:7858 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 2007: + case 2008: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7863 +//line sql.y:7867 { decNesting(yylex) } - case 2008: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7868 - { - skipToEnd(yylex) - } case 2009: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7873 +//line sql.y:7872 { skipToEnd(yylex) } case 2010: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:7877 { skipToEnd(yylex) @@ -19804,6 +19737,12 @@ yydefault: { skipToEnd(yylex) } + case 2012: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:7885 + { + skipToEnd(yylex) + } } goto yystack /* stack new state and value */ } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 5c2e7c397e1..a7300cb50ef 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -2788,7 +2788,11 @@ insert_method_options: | LAST table_opt_value: - reserved_sql_id + table_id '.' reserved_table_id + { + $$ = String(TableName{Qualifier: $1, Name: $3}) + } +| reserved_sql_id { $$ = $1.String() } @@ -5336,7 +5340,7 @@ function_call_keyword } interval_value: - INTERVAL simple_expr sql_id + INTERVAL bit_expr sql_id { $$ = &IntervalExpr{Expr: $2, Unit: $3.String()} } 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/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go b/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go index 19a580c451c..6e3916c22a5 100644 --- a/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go +++ b/go/vt/vtctl/grpcvtctldserver/endtoend/init_shard_primary_test.go @@ -63,6 +63,7 @@ func TestInitShardPrimary(t *testing.T) { tablet2.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // These come from tablet startup + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", @@ -76,6 +77,7 @@ func TestInitShardPrimary(t *testing.T) { tablet2.FakeMysqlDaemon.SetReplicationSourceInputs = append(tablet2.FakeMysqlDaemon.SetReplicationSourceInputs, fmt.Sprintf("%v:%v", tablet1.Tablet.Hostname, tablet1.Tablet.MysqlPort)) tablet3.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ + "STOP SLAVE", "RESET SLAVE ALL", "FAKE SET MASTER", "START SLAVE", diff --git a/go/vt/vtexplain/testdata/multi-output/unsharded-output.txt b/go/vt/vtexplain/testdata/multi-output/unsharded-output.txt index 8bb3ecef970..0adc5661077 100644 --- a/go/vt/vtexplain/testdata/multi-output/unsharded-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/unsharded-output.txt @@ -45,3 +45,8 @@ select ID from t1 1 ks_unsharded/-: select ID from t1 limit 10001 ---------------------------------------------------------------------- +select t1.id, t2.c2 from t1 join t2 on t1.id = t2.t1_id where t2.c2 in (1) + +1 ks_unsharded/-: select t1.id, t2.c2 from t1 join t2 on t1.id = t2.t1_id where t2.c2 in (1) limit 10001 + +---------------------------------------------------------------------- diff --git a/go/vt/vtexplain/testdata/test-schema.sql b/go/vt/vtexplain/testdata/test-schema.sql index 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 ee94946e5c1..05932f785a0 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -504,199 +504,230 @@ func (t *explainTablet) HandleQuery(c *mysql.Conn, query string, callback func(* } switch sqlparser.Preview(query) { case sqlparser.StmtSelect: - // Parse the select statement to figure out the table and columns - // that were referenced so that the synthetic response has the - // expected field names and types. - stmt, err := sqlparser.Parse(query) + var err error + result, err = t.handleSelect(query) if err != nil { return err } - - var selStmt *sqlparser.Select - switch stmt := stmt.(type) { - case *sqlparser.Select: - selStmt = stmt - case *sqlparser.Union: - selStmt = sqlparser.GetFirstSelect(stmt) - default: - return fmt.Errorf("vtexplain: unsupported statement type +%v", reflect.TypeOf(stmt)) + case sqlparser.StmtBegin, sqlparser.StmtCommit, sqlparser.StmtSet, + sqlparser.StmtSavepoint, sqlparser.StmtSRollback, sqlparser.StmtRelease: + result = &sqltypes.Result{} + case sqlparser.StmtShow: + result = &sqltypes.Result{Fields: sqltypes.MakeTestFields("", "")} + case sqlparser.StmtInsert, sqlparser.StmtReplace, sqlparser.StmtUpdate, sqlparser.StmtDelete: + result = &sqltypes.Result{ + RowsAffected: 1, } + default: + return fmt.Errorf("unsupported query %s", query) + } - // Gen4 supports more complex queries so we now need to - // handle multiple FROM clauses - tables := make([]*sqlparser.AliasedTableExpr, len(selStmt.From)) - for _, from := range selStmt.From { - tables = append(tables, getTables(from)...) - } + return callback(result) +} - tableColumnMap := map[sqlparser.IdentifierCS]map[string]querypb.Type{} - for _, table := range tables { - if table == nil { - continue - } +func (t *explainTablet) handleSelect(query string) (*sqltypes.Result, error) { + // Parse the select statement to figure out the table and columns + // that were referenced so that the synthetic response has the + // expected field names and types. + stmt, err := sqlparser.Parse(query) + if err != nil { + return nil, err + } - tableName := sqlparser.String(sqlparser.GetTableName(table.Expr)) - columns, exists := t.vte.getGlobalTabletEnv().tableColumns[tableName] - if !exists && tableName != "" && tableName != "dual" { - return fmt.Errorf("unable to resolve table name %s", tableName) - } + var selStmt *sqlparser.Select + switch stmt := stmt.(type) { + case *sqlparser.Select: + selStmt = stmt + case *sqlparser.Union: + selStmt = sqlparser.GetFirstSelect(stmt) + default: + return nil, fmt.Errorf("vtexplain: unsupported statement type +%v", reflect.TypeOf(stmt)) + } - colTypeMap := map[string]querypb.Type{} + // Gen4 supports more complex queries so we now need to + // handle multiple FROM clauses + tables := make([]*sqlparser.AliasedTableExpr, len(selStmt.From)) + for _, from := range selStmt.From { + tables = append(tables, getTables(from)...) + } - if table.As.IsEmpty() { - tableColumnMap[sqlparser.GetTableName(table.Expr)] = colTypeMap - } else { - tableColumnMap[table.As] = colTypeMap - } + tableColumnMap := map[sqlparser.IdentifierCS]map[string]querypb.Type{} + for _, table := range tables { + if table == nil { + continue + } - for k, v := range columns { - if colType, exists := colTypeMap[k]; exists { - if colType != v { - return fmt.Errorf("column type mismatch for column : %s, types: %d vs %d", k, colType, v) - } - continue - } - colTypeMap[k] = v - } + tableName := sqlparser.String(sqlparser.GetTableName(table.Expr)) + columns, exists := t.vte.getGlobalTabletEnv().tableColumns[tableName] + if !exists && tableName != "" && tableName != "dual" { + return nil, fmt.Errorf("unable to resolve table name %s", tableName) + } + + colTypeMap := map[string]querypb.Type{} + if table.As.IsEmpty() { + tableColumnMap[sqlparser.GetTableName(table.Expr)] = colTypeMap + } else { + tableColumnMap[table.As] = colTypeMap } - colNames := make([]string, 0, 4) - colTypes := make([]querypb.Type, 0, 4) - for _, node := range selStmt.SelectExprs { - switch node := node.(type) { - case *sqlparser.AliasedExpr: - colNames, colTypes = inferColTypeFromExpr(node.Expr, tableColumnMap, colNames, colTypes) - case *sqlparser.StarExpr: - if node.TableName.Name.IsEmpty() { - // SELECT * - for _, colTypeMap := range tableColumnMap { - for col, colType := range colTypeMap { - colNames = append(colNames, col) - colTypes = append(colTypes, colType) - } - } - } else { - // SELECT tableName.* - colTypeMap := tableColumnMap[node.TableName.Name] - for col, colType := range colTypeMap { - colNames = append(colNames, col) - colTypes = append(colTypes, colType) - } + for k, v := range columns { + if colType, exists := colTypeMap[k]; exists { + if colType != v { + return nil, fmt.Errorf("column type mismatch for column : %s, types: %d vs %d", k, colType, v) } + continue } + colTypeMap[k] = v } - // the query against lookup table is in-query, handle it specifically - var inColName string - inVal := make([]sqltypes.Value, 0, 10) - - rowCount := 1 - if selStmt.Where != nil { - switch v := selStmt.Where.Expr.(type) { - case *sqlparser.ComparisonExpr: - if v.Operator == sqlparser.InOp { - switch c := v.Left.(type) { - case *sqlparser.ColName: - colName := strings.ToLower(c.Name.String()) - colType := tableColumnMap[sqlparser.GetTableName(selStmt.From[0].(*sqlparser.AliasedTableExpr).Expr)][colName] - - switch values := v.Right.(type) { - case sqlparser.ValTuple: - for _, val := range values { - switch v := val.(type) { - case *sqlparser.Literal: - value, err := evalengine.LiteralToValue(v) - if err != nil { - return err - } - - // Cast the value in the tuple to the expected value of the column - castedValue, err := evalengine.Cast(value, colType) - if err != nil { - return err - } - - // Check if we have a duplicate value - isNewValue := true - for _, v := range inVal { - result, err := evalengine.NullsafeCompare(v, value, collations.Default()) - if err != nil { - return err - } - - if result == 0 { - isNewValue = false - break - } - } - - if isNewValue { - inVal = append(inVal, castedValue) - } - } - } - rowCount = len(inVal) - } - inColName = strings.ToLower(c.Name.String()) - } - } - } + } + + colNames, colTypes := t.analyzeExpressions(selStmt, tableColumnMap) + + inColName, inVal, rowCount, s, err := t.analyzeWhere(selStmt, tableColumnMap) + if err != nil { + return s, err + } + + fields := make([]*querypb.Field, len(colNames)) + rows := make([][]sqltypes.Value, 0, rowCount) + for i, col := range colNames { + colType := colTypes[i] + fields[i] = &querypb.Field{ + Name: col, + Type: colType, } + } - fields := make([]*querypb.Field, len(colNames)) - rows := make([][]sqltypes.Value, 0, rowCount) + for j := 0; j < rowCount; j++ { + values := make([]sqltypes.Value, len(colNames)) for i, col := range colNames { + // Generate a fake value for the given column. For the column in the IN clause, + // use the provided values in the query, For numeric types, + // use the column index. For all other types, just shortcut to using + // a string type that encodes the column name + index. colType := colTypes[i] - fields[i] = &querypb.Field{ - Name: col, - Type: colType, + if len(inVal) > j && col == inColName { + values[i], _ = sqltypes.NewValue(querypb.Type_VARBINARY, inVal[j].Raw()) + } else if sqltypes.IsIntegral(colType) { + values[i] = sqltypes.NewInt32(int32(i + 1)) + } else if sqltypes.IsFloat(colType) { + values[i] = sqltypes.NewFloat64(1.0 + float64(i)) + } else { + values[i] = sqltypes.NewVarChar(fmt.Sprintf("%s_val_%d", col, i+1)) } } + rows = append(rows, values) + } + result := &sqltypes.Result{ + Fields: fields, + InsertID: 0, + Rows: rows, + } - for j := 0; j < rowCount; j++ { - values := make([]sqltypes.Value, len(colNames)) - for i, col := range colNames { - // Generate a fake value for the given column. For the column in the IN clause, - // use the provided values in the query, For numeric types, - // use the column index. For all other types, just shortcut to using - // a string type that encodes the column name + index. - colType := colTypes[i] - if len(inVal) > j && col == inColName { - values[i], _ = sqltypes.NewValue(querypb.Type_VARBINARY, inVal[j].Raw()) - } else if sqltypes.IsIntegral(colType) { - values[i] = sqltypes.NewInt32(int32(i + 1)) - } else if sqltypes.IsFloat(colType) { - values[i] = sqltypes.NewFloat64(1.0 + float64(i)) - } else { - values[i] = sqltypes.NewVarChar(fmt.Sprintf("%s_val_%d", col, i+1)) - } + resultJSON, _ := json.MarshalIndent(result, "", " ") + log.V(100).Infof("query %s result %s\n", query, string(resultJSON)) + return result, nil +} + +func (t *explainTablet) analyzeWhere(selStmt *sqlparser.Select, tableColumnMap map[sqlparser.IdentifierCS]map[string]querypb.Type) (inColName string, inVal []sqltypes.Value, rowCount int, result *sqltypes.Result, err error) { + // the query against lookup table is in-query, handle it specifically + rowCount = 1 + if selStmt.Where == nil { + return + } + v, ok := selStmt.Where.Expr.(*sqlparser.ComparisonExpr) + if !ok || v.Operator != sqlparser.InOp { + return + } + c, ok := v.Left.(*sqlparser.ColName) + if !ok { + return + } + colName := strings.ToLower(c.Name.String()) + colType := querypb.Type_VARCHAR + tableExpr := selStmt.From[0] + expr, ok := tableExpr.(*sqlparser.AliasedTableExpr) + if ok { + m := tableColumnMap[sqlparser.GetTableName(expr.Expr)] + if m != nil { + t, found := m[colName] + if found { + colType = t } - rows = append(rows, values) } - result = &sqltypes.Result{ - Fields: fields, - InsertID: 0, - Rows: rows, + } + + values, ok := v.Right.(sqlparser.ValTuple) + if !ok { + return + } + for _, val := range values { + lit, ok := val.(*sqlparser.Literal) + if !ok { + continue + } + value, err := evalengine.LiteralToValue(lit) + if err != nil { + return "", nil, 0, nil, err } - resultJSON, _ := json.MarshalIndent(result, "", " ") - log.V(100).Infof("query %s result %s\n", query, string(resultJSON)) + // Cast the value in the tuple to the expected value of the column + castedValue, err := evalengine.Cast(value, colType) + if err != nil { + return "", nil, 0, nil, err + } - case sqlparser.StmtBegin, sqlparser.StmtCommit, sqlparser.StmtSet, - sqlparser.StmtSavepoint, sqlparser.StmtSRollback, sqlparser.StmtRelease: - result = &sqltypes.Result{} - case sqlparser.StmtShow: - result = &sqltypes.Result{Fields: sqltypes.MakeTestFields("", "")} - case sqlparser.StmtInsert, sqlparser.StmtReplace, sqlparser.StmtUpdate, sqlparser.StmtDelete: - result = &sqltypes.Result{ - RowsAffected: 1, + // Check if we have a duplicate value + isNewValue := true + for _, v := range inVal { + result, err := evalengine.NullsafeCompare(v, value, collations.Default()) + if err != nil { + return "", nil, 0, nil, err + } + + if result == 0 { + isNewValue = false + break + } + } + + if isNewValue { + inVal = append(inVal, castedValue) } - default: - return fmt.Errorf("unsupported query %s", query) } + inColName = strings.ToLower(c.Name.String()) + return inColName, inVal, rowCount, nil, nil +} - return callback(result) +func (t *explainTablet) analyzeExpressions(selStmt *sqlparser.Select, tableColumnMap map[sqlparser.IdentifierCS]map[string]querypb.Type) ([]string, []querypb.Type) { + colNames := make([]string, 0, 4) + colTypes := make([]querypb.Type, 0, 4) + for _, node := range selStmt.SelectExprs { + switch node := node.(type) { + case *sqlparser.AliasedExpr: + colNames, colTypes = inferColTypeFromExpr(node.Expr, tableColumnMap, colNames, colTypes) + case *sqlparser.StarExpr: + if node.TableName.Name.IsEmpty() { + // SELECT * + for _, colTypeMap := range tableColumnMap { + for col, colType := range colTypeMap { + colNames = append(colNames, col) + colTypes = append(colTypes, colType) + } + } + } else { + // SELECT tableName.* + colTypeMap := tableColumnMap[node.TableName.Name] + for col, colType := range colTypeMap { + colNames = append(colNames, col) + colTypes = append(colTypes, colType) + } + } + } + } + return colNames, colTypes } func getTables(node sqlparser.SQLNode) []*sqlparser.AliasedTableExpr { diff --git a/go/vt/vtgate/engine/fake_vcursor_test.go b/go/vt/vtgate/engine/fake_vcursor_test.go index 35c90977d4d..c452c44e210 100644 --- a/go/vt/vtgate/engine/fake_vcursor_test.go +++ b/go/vt/vtgate/engine/fake_vcursor_test.go @@ -105,6 +105,10 @@ func (t *noopVCursor) ExecutePrimitive(ctx context.Context, primitive Primitive, return primitive.TryExecute(ctx, t, bindVars, wantfields) } +func (t *noopVCursor) ExecutePrimitiveStandalone(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { + return primitive.TryExecute(ctx, t, bindVars, wantfields) +} + func (t *noopVCursor) StreamExecutePrimitive(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { return primitive.TryStreamExecute(ctx, t, bindVars, wantfields, callback) } @@ -350,6 +354,10 @@ func (f *loggingVCursor) ExecutePrimitive(ctx context.Context, primitive Primiti return primitive.TryExecute(ctx, f, bindVars, wantfields) } +func (f *loggingVCursor) ExecutePrimitiveStandalone(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { + return primitive.TryExecute(ctx, f, bindVars, wantfields) +} + func (f *loggingVCursor) StreamExecutePrimitive(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { return primitive.TryStreamExecute(ctx, f, bindVars, wantfields, callback) } diff --git a/go/vt/vtgate/engine/primitive.go b/go/vt/vtgate/engine/primitive.go index 51725adc5da..dd1aa219ed4 100644 --- a/go/vt/vtgate/engine/primitive.go +++ b/go/vt/vtgate/engine/primitive.go @@ -57,9 +57,15 @@ type ( Execute(ctx context.Context, method string, query string, bindVars map[string]*querypb.BindVariable, rollbackOnError bool, co vtgatepb.CommitOrder) (*sqltypes.Result, error) AutocommitApproval() bool - // Primitive functions + // Execute the given primitive ExecutePrimitive(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) + // Execute the given primitive in a new autocommit session + ExecutePrimitiveStandalone(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) + + // Execute the given primitive StreamExecutePrimitive(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error + // Execute the given primitive in a new autocommit session + StreamExecutePrimitiveStandalone(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(result *sqltypes.Result) error) error // Shard-level functions. ExecuteMultiShard(ctx context.Context, rss []*srvtopo.ResolvedShard, queries []*querypb.BoundQuery, rollbackOnError, canAutocommit bool) (*sqltypes.Result, []error) @@ -109,9 +115,6 @@ type ( // ReleaseLock releases all the held advisory locks. ReleaseLock(ctx context.Context) error - - // StreamExecutePrimitiveStandalone executes the primitive in its own new autocommit session. - StreamExecutePrimitiveStandalone(ctx context.Context, primitive Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(result *sqltypes.Result) error) error } // SessionActions gives primitives ability to interact with the session state diff --git a/go/vt/vtgate/engine/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/engine/vindex_lookup.go b/go/vt/vtgate/engine/vindex_lookup.go index 8883f138dcd..816507ae086 100644 --- a/go/vt/vtgate/engine/vindex_lookup.go +++ b/go/vt/vtgate/engine/vindex_lookup.go @@ -187,10 +187,17 @@ func (vr *VindexLookup) executeNonBatch(ctx context.Context, vcursor VCursor, id bindVars := map[string]*querypb.BindVariable{ vr.Arguments[0]: vars, } - result, err := vcursor.ExecutePrimitive(ctx, vr.Lookup, bindVars, false) + + var result *sqltypes.Result + if vr.Vindex.AutoCommitEnabled() { + result, err = vcursor.ExecutePrimitiveStandalone(ctx, vr.Lookup, bindVars, false) + } else { + result, err = vcursor.ExecutePrimitive(ctx, vr.Lookup, bindVars, false) + } if err != nil { return nil, err } + rows := make([][]sqltypes.Value, 0, len(result.Rows)) for _, row := range result.Rows { rows = append(rows, []sqltypes.Value{row[1]}) @@ -212,7 +219,17 @@ func (vr *VindexLookup) executeBatch(ctx context.Context, vcursor VCursor, ids [ bindVars := map[string]*querypb.BindVariable{ vr.Arguments[0]: vars, } - result, err := vcursor.ExecutePrimitive(ctx, vr.Lookup, bindVars, false) + + var result *sqltypes.Result + if vr.Vindex.AutoCommitEnabled() { + result, err = vcursor.ExecutePrimitiveStandalone(ctx, vr.Lookup, bindVars, false) + } else { + result, err = vcursor.ExecutePrimitive(ctx, vr.Lookup, bindVars, false) + } + if err != nil { + return nil, err + } + if err != nil { return nil, vterrors.Wrapf(err, "failed while running the lookup query") } diff --git a/go/vt/vtgate/evalengine/convert.go b/go/vt/vtgate/evalengine/convert.go index e769196b62c..d1996fcb1ee 100644 --- a/go/vt/vtgate/evalengine/convert.go +++ b/go/vt/vtgate/evalengine/convert.go @@ -39,6 +39,10 @@ type ( ) func (c *ConvertExpr) unsupported() { + throwEvalError(c.returnUnsupportedError()) +} + +func (c *ConvertExpr) returnUnsupportedError() error { var err error switch { case c.HasLength && c.HasScale: @@ -48,7 +52,7 @@ func (c *ConvertExpr) unsupported() { default: err = vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "Unsupported type conversion: %s", c.Type) } - throwEvalError(err) + return err } func (c *ConvertExpr) eval(env *ExpressionEnv, result *EvalResult) { @@ -86,15 +90,9 @@ func (c *ConvertExpr) eval(env *ExpressionEnv, result *EvalResult) { case "FLOAT": if c.HasLength { switch p := c.Length; { - case p <= 24: - c.unsupported() - case p <= 53: - result.makeFloat() - default: + case p > 53: throwEvalError(vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "Too-big precision %d specified for 'CONVERT'. Maximum is 53.", p)) } - } else { - c.unsupported() } c.unsupported() case "SIGNED", "SIGNED INTEGER": diff --git a/go/vt/vtgate/evalengine/translate.go b/go/vt/vtgate/evalengine/translate.go index 6fdce977b08..d2ba9326911 100644 --- a/go/vt/vtgate/evalengine/translate.go +++ b/go/vt/vtgate/evalengine/translate.go @@ -493,6 +493,11 @@ func translateConvertExpr(expr sqlparser.Expr, convertType *sqlparser.ConvertTyp if err != nil { return nil, err } + case "BINARY", "DOUBLE", "REAL", "SIGNED", "SIGNED INTEGER", "UNSIGNED", "UNSIGNED INTEGER": + // Supported types for conv expression + default: + // For unsupported types, we should return an error on translation instead of returning an error on runtime. + return nil, convert.returnUnsupportedError() } return &convert, nil diff --git a/go/vt/vtgate/evalengine/translate_test.go b/go/vt/vtgate/evalengine/translate_test.go index ce8249653dc..22cede333ba 100644 --- a/go/vt/vtgate/evalengine/translate_test.go +++ b/go/vt/vtgate/evalengine/translate_test.go @@ -340,3 +340,37 @@ func TestEvaluateTuple(t *testing.T) { }) } } + +// TestTranslationFailures tests that translation fails for functions that we don't support evaluation for. +func TestTranslationFailures(t *testing.T) { + testcases := []struct { + expression string + expectedErr string + }{ + { + expression: "cast('2023-01-07 12:34:56' as date)", + expectedErr: "Unsupported type conversion: DATE", + }, { + expression: "cast('2023-01-07 12:34:56' as datetime(5))", + expectedErr: "Unsupported type conversion: DATETIME(5)", + }, { + expression: "cast('3.4' as FLOAT)", + expectedErr: "Unsupported type conversion: FLOAT", + }, { + expression: "cast('3.4' as FLOAT(3))", + expectedErr: "Unsupported type conversion: FLOAT(3)", + }, + } + + for _, testcase := range testcases { + t.Run(testcase.expression, func(t *testing.T) { + // Given + stmt, err := sqlparser.Parse("select " + testcase.expression) + require.NoError(t, err) + astExpr := stmt.(*sqlparser.Select).SelectExprs[0].(*sqlparser.AliasedExpr).Expr + _, err = Translate(astExpr, LookupDefaultCollation(45)) + require.EqualError(t, err, testcase.expectedErr) + }) + } + +} diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index eac23981d01..d060e7dfa6c 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -3614,7 +3614,7 @@ func TestSelectAggregationData(t *testing.T) { }{ { sql: `select count(distinct col) from user`, - sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col", "int64"), "1", "2", "2", "3"), + sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col|weight_string(col)", "int64|varbinary"), "1|NULL", "2|NULL", "2|NULL", "3|NULL"), expSandboxQ: "select col, weight_string(col) from `user` group by col, weight_string(col) order by col asc", expField: `[name:"count(distinct col)" type:INT64]`, expRow: `[[INT64(3)]]`, @@ -3628,14 +3628,14 @@ func TestSelectAggregationData(t *testing.T) { }, { sql: `select col, count(*) from user group by col`, - sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col|count(*)", "int64|int64"), "1|3"), + sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col|count(*)|weight_string(col)", "int64|int64|varbinary"), "1|3|NULL"), expSandboxQ: "select col, count(*), weight_string(col) from `user` group by col, weight_string(col) order by col asc", expField: `[name:"col" type:INT64 name:"count(*)" type:INT64]`, expRow: `[[INT64(1) INT64(24)]]`, }, { sql: `select col, count(*) from user group by col limit 2`, - sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col|count(*)", "int64|int64"), "1|2", "2|1", "3|4"), + sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col|count(*)|weight_string(col)", "int64|int64|varbinary"), "1|2|NULL", "2|1|NULL", "3|4|NULL"), expSandboxQ: "select col, count(*), weight_string(col) from `user` group by col, weight_string(col) order by col asc limit :__upper_limit", expField: `[name:"col" type:INT64 name:"count(*)" type:INT64]`, expRow: `[[INT64(1) INT64(16)] [INT64(2) INT64(8)]]`, @@ -3744,6 +3744,40 @@ func TestSelectHexAndBit(t *testing.T) { require.Equal(t, `[[UINT64(10) UINT64(10) UINT64(10) UINT64(10)]]`, fmt.Sprintf("%v", qr.Rows)) } +func TestSelectAggregationRandom(t *testing.T) { + cell := "aa" + hc := discovery.NewFakeHealthCheck(nil) + createSandbox(KsTestSharded).VSchema = executorVSchema + getSandbox(KsTestUnsharded).VSchema = unshardedVSchema + serv := newSandboxForCells([]string{cell}) + resolver := newTestResolver(hc, serv, cell) + shards := []string{"-20", "20-40", "40-60", "60-80", "80-a0", "a0-c0", "c0-e0", "e0-"} + var conns []*sandboxconn.SandboxConn + for _, shard := range shards { + sbc := hc.AddTestTablet(cell, shard, 1, KsTestSharded, shard, topodatapb.TabletType_PRIMARY, true, 1, nil) + conns = append(conns, sbc) + + sbc.SetResults([]*sqltypes.Result{sqltypes.MakeTestResult( + sqltypes.MakeTestFields("a|b", "int64|int64"), + "null|null", + )}) + } + + conns[0].SetResults([]*sqltypes.Result{sqltypes.MakeTestResult( + sqltypes.MakeTestFields("a|b", "int64|int64"), + "10|1", + )}) + + executor := createExecutor(serv, cell, resolver) + executor.pv = querypb.ExecuteOptions_Gen4 + session := NewAutocommitSession(&vtgatepb.Session{}) + + rs, err := executor.Execute(context.Background(), "TestSelectCFC", session, + "select /*vt+ PLANNER=gen4 */ A.a, A.b, (A.a / A.b) as c from (select sum(a) as a, sum(b) as b from user) A", nil) + require.NoError(t, err) + assert.Equal(t, `[[INT64(10) INT64(1) DECIMAL(10.0000)]]`, fmt.Sprintf("%v", rs.Rows)) +} + func TestMain(m *testing.M) { _flag.ParseFlagsForTest() os.Exit(m.Run()) diff --git a/go/vt/vtgate/executor_vschema_ddl_test.go b/go/vt/vtgate/executor_vschema_ddl_test.go index a1b387e2ad5..ce89b9ca505 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) { @@ -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") diff --git a/go/vt/vtgate/planbuilder/abstract/concatenate.go b/go/vt/vtgate/planbuilder/abstract/concatenate.go index c3d8a1e7621..4dba7d33ac7 100644 --- a/go/vt/vtgate/planbuilder/abstract/concatenate.go +++ b/go/vt/vtgate/planbuilder/abstract/concatenate.go @@ -47,6 +47,20 @@ func (c *Concatenate) TableID() semantics.TableSet { // PushPredicate implements the Operator interface func (c *Concatenate) PushPredicate(expr sqlparser.Expr, semTable *semantics.SemTable) (LogicalOperator, error) { + op, err := c.tryPush(expr, semTable) + if err == nil { + return op, nil + } + + // if we fail to push down the predicate, we can always evaluate it at the vtgate level + filter := &Filter{ + Source: c, + Predicates: []sqlparser.Expr{expr}, + } + return filter, nil +} + +func (c *Concatenate) tryPush(expr sqlparser.Expr, semTable *semantics.SemTable) (LogicalOperator, error) { newSources := make([]LogicalOperator, 0, len(c.Sources)) for index, source := range c.Sources { if len(c.SelectStmts[index].SelectExprs) != 1 { diff --git a/go/vt/vtgate/planbuilder/abstract/queryprojection.go b/go/vt/vtgate/planbuilder/abstract/queryprojection.go index f3acdd3693c..26ad330d3b7 100644 --- a/go/vt/vtgate/planbuilder/abstract/queryprojection.go +++ b/go/vt/vtgate/planbuilder/abstract/queryprojection.go @@ -22,6 +22,8 @@ import ( "strings" "vitess.io/vitess/go/vt/vtgate/engine" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/semantics" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/sqlparser" @@ -575,6 +577,85 @@ func (qp *QueryProjection) GetColumnCount() int { return len(qp.SelectExprs) - qp.AddedColumn } +// NeedsProjecting returns true if we have projections that need to be evaluated at the vtgate level +// and can't be pushed down to MySQL +func (qp *QueryProjection) NeedsProjecting( + ctx *plancontext.PlanningContext, + pusher func(expr *sqlparser.AliasedExpr) (int, error), +) (needsVtGateEval bool, expressions []sqlparser.Expr, colNames []string, err error) { + for _, se := range qp.SelectExprs { + var ae *sqlparser.AliasedExpr + ae, err = se.GetAliasedExpr() + if err != nil { + return false, nil, nil, err + } + + expr := ae.Expr + colNames = append(colNames, ae.ColumnName()) + + if _, isCol := expr.(*sqlparser.ColName); isCol { + offset, err := pusher(ae) + if err != nil { + return false, nil, nil, err + } + expressions = append(expressions, sqlparser.NewOffset(offset, expr)) + continue + } + + rExpr := sqlparser.Rewrite(sqlparser.CloneExpr(expr), func(cursor *sqlparser.Cursor) bool { + col, isCol := cursor.Node().(*sqlparser.ColName) + if !isCol { + return true + } + var tableInfo semantics.TableInfo + tableInfo, err = ctx.SemTable.TableInfoForExpr(col) + if err != nil { + return true + } + _, isDT := tableInfo.(*semantics.DerivedTable) + if !isDT { + return true + } + + var rewritten sqlparser.Expr + rewritten, err = semantics.RewriteDerivedTableExpression(col, tableInfo) + if err != nil { + return false + } + if sqlparser.ContainsAggregation(rewritten) { + offset, tErr := pusher(&sqlparser.AliasedExpr{Expr: col}) + if tErr != nil { + err = tErr + return false + } + + cursor.Replace(sqlparser.NewOffset(offset, col)) + } + return true + }, nil).(sqlparser.Expr) + + if err != nil { + return + } + + if !sqlparser.EqualsExpr(rExpr, expr) { + // if we changed the expression, it means that we have to evaluate the rest at the vtgate level + expressions = append(expressions, rExpr) + needsVtGateEval = true + continue + } + + // we did not need to push any parts of this expression down. Let's check if we can push all of it + offset, err := pusher(ae) + if err != nil { + return false, nil, nil, err + } + expressions = append(expressions, sqlparser.NewOffset(offset, expr)) + } + + return +} + func checkForInvalidGroupingExpressions(expr sqlparser.Expr) error { return sqlparser.Walk(func(node sqlparser.SQLNode) (bool, error) { if _, isAggregate := node.(sqlparser.AggrFunc); isAggregate { diff --git a/go/vt/vtgate/planbuilder/gen4_planner.go b/go/vt/vtgate/planbuilder/gen4_planner.go index 924169fc966..67604f4e9be 100644 --- a/go/vt/vtgate/planbuilder/gen4_planner.go +++ b/go/vt/vtgate/planbuilder/gen4_planner.go @@ -222,13 +222,13 @@ func newBuildSelectPlan( return nil, nil, err } - plan = optimizePlan(plan) - plan, err = planHorizon(ctx, plan, selStmt, true) if err != nil { return nil, nil, err } + optimizePlan(plan) + sel, isSel := selStmt.(*sqlparser.Select) if isSel { if err := setMiscFunc(plan, sel); err != nil { @@ -249,25 +249,25 @@ func newBuildSelectPlan( } // optimizePlan removes unnecessary simpleProjections that have been created while planning -func optimizePlan(plan logicalPlan) logicalPlan { - newPlan, _ := visit(plan, func(plan logicalPlan) (bool, logicalPlan, error) { - this, ok := plan.(*simpleProjection) - if !ok { - return true, plan, nil - } +func optimizePlan(plan logicalPlan) { + for _, lp := range plan.Inputs() { + optimizePlan(lp) + } - input, ok := this.input.(*simpleProjection) - if !ok { - return true, plan, nil - } + this, ok := plan.(*simpleProjection) + if !ok { + return + } - for i, col := range this.eSimpleProj.Cols { - this.eSimpleProj.Cols[i] = input.eSimpleProj.Cols[col] - } - this.input = input.input - return true, this, nil - }) - return newPlan + input, ok := this.input.(*simpleProjection) + if !ok { + return + } + + for i, col := range this.eSimpleProj.Cols { + this.eSimpleProj.Cols[i] = input.eSimpleProj.Cols[col] + } + this.input = input.input } func gen4UpdateStmtPlanner( diff --git a/go/vt/vtgate/planbuilder/horizon_planning.go b/go/vt/vtgate/planbuilder/horizon_planning.go index f84c69ac3cc..1088aa357bc 100644 --- a/go/vt/vtgate/planbuilder/horizon_planning.go +++ b/go/vt/vtgate/planbuilder/horizon_planning.go @@ -59,7 +59,8 @@ func (hp *horizonPlanning) planHorizon(ctx *plancontext.PlanningContext, plan lo // a simpleProjection. We create a new Route that contains the derived table in the // FROM clause. Meaning that, when we push expressions to the select list of this // new Route, we do not want them to rewrite them. - if _, isSimpleProj := plan.(*simpleProjection); isSimpleProj { + sp, derivedTable := plan.(*simpleProjection) + if derivedTable { oldRewriteDerivedExpr := ctx.RewriteDerivedExpr defer func() { ctx.RewriteDerivedExpr = oldRewriteDerivedExpr @@ -74,10 +75,11 @@ func (hp *horizonPlanning) planHorizon(ctx *plancontext.PlanningContext, plan lo } needsOrdering := len(hp.qp.OrderExprs) > 0 - canShortcut := isRoute && hp.sel.Having == nil && !needsOrdering // If we still have a HAVING clause, it's because it could not be pushed to the WHERE, // so it probably has aggregations + canShortcut := isRoute && hp.sel.Having == nil && !needsOrdering + switch { case hp.qp.NeedsAggregation() || hp.sel.Having != nil: plan, err = hp.planAggregations(ctx, plan) @@ -91,6 +93,26 @@ func (hp *horizonPlanning) planHorizon(ctx *plancontext.PlanningContext, plan lo if err != nil { return nil, err } + case derivedTable: + pusher := func(ae *sqlparser.AliasedExpr) (int, error) { + offset, _, err := pushProjection(ctx, ae, sp.input, true, true, false) + return offset, err + } + needsVtGate, projections, colNames, err := hp.qp.NeedsProjecting(ctx, pusher) + if err != nil { + return nil, err + } + if !needsVtGate { + break + } + + // there were some expressions we could not push down entirely, + // so replace the simpleProjection with a real projection + plan = &projection{ + source: sp.input, + columns: projections, + columnNames: colNames, + } default: err = pushProjections(ctx, plan, hp.qp.SelectExprs) if err != nil { @@ -395,7 +417,13 @@ func generateAggregateParams(aggrs []abstract.Aggr, aggrParamOffsets [][]offsets aggrExpr = &sqlparser.BinaryExpr{ Operator: sqlparser.MultOp, Left: aggrExpr, - Right: curr, + Right: &sqlparser.FuncExpr{ + Name: sqlparser.NewIdentifierCI("coalesce"), + Exprs: sqlparser.SelectExprs{ + &sqlparser.AliasedExpr{Expr: curr}, + &sqlparser.AliasedExpr{Expr: sqlparser.NewIntLiteral("1")}, + }, + }, } } } diff --git a/go/vt/vtgate/planbuilder/operator_to_query.go b/go/vt/vtgate/planbuilder/operator_to_query.go index 87dec2d8526..1e2d4ff54c4 100644 --- a/go/vt/vtgate/planbuilder/operator_to_query.go +++ b/go/vt/vtgate/planbuilder/operator_to_query.go @@ -89,7 +89,7 @@ func buildQuery(op abstract.PhysicalOperator, qb *queryBuilder) { sel.Limit = opQuery.Limit sel.OrderBy = opQuery.OrderBy sel.GroupBy = opQuery.GroupBy - sel.Having = opQuery.Having + sel.Having = mergeHaving(sel.Having, opQuery.Having) sel.SelectExprs = opQuery.SelectExprs qb.addTableExpr(op.Alias, op.Alias, op.TableID(), &sqlparser.DerivedTable{ Select: sel, @@ -161,12 +161,16 @@ func (qb *queryBuilder) addPredicate(expr sqlparser.Expr) { } sel := qb.sel.(*sqlparser.Select) - if sel.Where == nil { - sel.AddWhere(expr) - return + _, isSubQuery := expr.(*sqlparser.ExtractedSubquery) + var addPred func(sqlparser.Expr) + + if sqlparser.ContainsAggregation(expr) && !isSubQuery { + addPred = sel.AddHaving + } else { + addPred = sel.AddWhere } for _, exp := range sqlparser.SplitAndExpression(nil, expr) { - sel.AddWhere(exp) + addPred(exp) } } @@ -288,3 +292,17 @@ func (ts *tableSorter) Less(i, j int) bool { func (ts *tableSorter) Swap(i, j int) { ts.sel.From[i], ts.sel.From[j] = ts.sel.From[j], ts.sel.From[i] } + +func mergeHaving(h1, h2 *sqlparser.Where) *sqlparser.Where { + switch { + case h1 == nil && h2 == nil: + return nil + case h1 == nil: + return h2 + case h2 == nil: + return h1 + default: + h1.Expr = sqlparser.AndExpressions(h1.Expr, h2.Expr) + return h1 + } +} diff --git a/go/vt/vtgate/planbuilder/physical/operator_funcs.go b/go/vt/vtgate/planbuilder/physical/operator_funcs.go index e4ded531efc..1ea8d88822a 100644 --- a/go/vt/vtgate/planbuilder/physical/operator_funcs.go +++ b/go/vt/vtgate/planbuilder/physical/operator_funcs.go @@ -231,11 +231,10 @@ func PushOutputColumns(ctx *plancontext.PlanningContext, op abstract.PhysicalOpe var pos int op.ColumnsOffset, pos = addToIntSlice(op.ColumnsOffset, i) offsets = append(offsets, pos) - // skip adding to columns as it exists already. + op.Columns = append(op.Columns, col) if i > -1 { continue } - op.Columns = append(op.Columns, col) noQualifierNames = append(noQualifierNames, sqlparser.NewColName(col.Name.String())) } if len(noQualifierNames) > 0 { diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index f2a7d5f6cc7..96ac5cf964a 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -31,6 +31,8 @@ import ( "github.com/stretchr/testify/require" + "vitess.io/vitess/go/vt/servenv" + vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" "vitess.io/vitess/go/test/utils" @@ -110,6 +112,7 @@ func (*nameLkpIndex) Cost() int { return 3 } func (*nameLkpIndex) IsUnique() bool { return false } func (*nameLkpIndex) NeedsVCursor() bool { return false } func (*nameLkpIndex) AllowBatch() bool { return true } +func (*nameLkpIndex) AutoCommitEnabled() bool { return false } func (*nameLkpIndex) GetCommitOrder() vtgatepb.CommitOrder { return vtgatepb.CommitOrder_NORMAL } func (*nameLkpIndex) Verify(context.Context, vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) { return []bool{}, nil @@ -251,7 +254,16 @@ func TestPlan(t *testing.T) { testFile(t, "flush_cases_no_default_keyspace.json", testOutputTempDir, vschemaWrapper, false) testFile(t, "show_cases_no_default_keyspace.json", testOutputTempDir, vschemaWrapper, false) testFile(t, "stream_cases.json", testOutputTempDir, vschemaWrapper, false) - testFile(t, "systemtables_cases.json", testOutputTempDir, vschemaWrapper, false) + testFile(t, "systemtables_cases80.json", testOutputTempDir, vschemaWrapper, false) +} + +func TestSystemTables57(t *testing.T) { + // first we move everything to use 5.7 logic + servenv.SetMySQLServerVersionForTest("5.7") + defer servenv.SetMySQLServerVersionForTest("") + vschemaWrapper := &vschemaWrapper{v: loadSchema(t, "vschemas/schema.json", true)} + testOutputTempDir := makeTestOutput(t) + testFile(t, "systemtables_cases57.json", testOutputTempDir, vschemaWrapper, false) } func TestSysVarSetDisabled(t *testing.T) { diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index 760a136eca7..d5b46f3eb12 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -2922,7 +2922,7 @@ { "OperatorType": "Projection", "Expressions": [ - "[COLUMN 0] * [COLUMN 1] as count(*)" + "[COLUMN 0] * COALESCE([COLUMN 1], INT64(1)) as count(*)" ], "Inputs": [ { @@ -3041,7 +3041,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as a", - "[COLUMN 2] * [COLUMN 3] as count(*)", + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as count(*)", "[COLUMN 1]" ], "Inputs": [ @@ -3104,7 +3104,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as a", - "[COLUMN 2] * [COLUMN 3] as count(user_extra.a)", + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as count(user_extra.a)", "[COLUMN 1]" ], "Inputs": [ @@ -3166,8 +3166,8 @@ { "OperatorType": "Projection", "Expressions": [ - "([COLUMN 2] * [COLUMN 3]) * [COLUMN 4] as count(u.textcol1)", - "([COLUMN 5] * [COLUMN 6]) * [COLUMN 7] as count(ue.foo)", + "([COLUMN 2] * COALESCE([COLUMN 3], INT64(1))) * COALESCE([COLUMN 4], INT64(1)) as count(u.textcol1)", + "([COLUMN 5] * COALESCE([COLUMN 6], INT64(1))) * COALESCE([COLUMN 7], INT64(1)) as count(ue.foo)", "[COLUMN 0] as bar", "[COLUMN 1]" ], @@ -3797,7 +3797,7 @@ { "OperatorType": "Projection", "Expressions": [ - "[COLUMN 2] * [COLUMN 3] as sum(col)" + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as sum(col)" ], "Inputs": [ { @@ -4055,7 +4055,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as id", - "[COLUMN 2] * [COLUMN 3] as count(u.`name`)", + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as count(u.`name`)", "[COLUMN 1]" ], "Inputs": [ @@ -4181,7 +4181,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as id", - "[COLUMN 2] * [COLUMN 3] as count(*)", + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as count(*)", "[COLUMN 1]" ], "Inputs": [ @@ -4839,7 +4839,7 @@ "Expressions": [ "[COLUMN 0] as id", "[COLUMN 2] as name", - "[COLUMN 3] * [COLUMN 4] as count(m.predef1)", + "[COLUMN 3] * COALESCE([COLUMN 4], INT64(1)) as count(m.predef1)", "[COLUMN 1]" ], "Inputs": [ @@ -4896,5 +4896,142 @@ "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" + ] + } + }, + { + "comment": "Aggregations from derived table used in arithmetic outside derived table", + "query": "select A.a, A.b, (A.a / A.b) as d from (select sum(a) as a, sum(b) as b from user) A", + "v3-plan": "unsupported: expression on results of a cross-shard subquery", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select A.a, A.b, (A.a / A.b) as d from (select sum(a) as a, sum(b) as b from user) A", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "[COLUMN 0] as a", + "[COLUMN 1] as b", + "[COLUMN 0] / [COLUMN 1] as d" + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "sum(0) AS a, sum(1) AS b", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select sum(a) as a, sum(b) as b from `user` where 1 != 1", + "Query": "select sum(a) as a, sum(b) as b from `user`", + "Table": "`user`" + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } + }, + { + "comment": "when pushing predicates into derived tables, make sure to put them in HAVING when they contain aggregations", + "query": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as count from user_extra where localDate > :v1 group by user_id, flowId order by null) as t1 where count >= :v2", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as count from user_extra where localDate > :v1 group by user_id, flowId order by null) as t1 where count >= :v2", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as `count` from user_extra where 1 != 1 group by user_id, flowId) as t1 where 1 != 1", + "Query": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as `count` from user_extra where localDate > :v1 group by user_id, flowId order by null) as t1 where `count` >= :v2", + "Table": "user_extra" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as count from user_extra where localDate > :v1 group by user_id, flowId order by null) as t1 where count >= :v2", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as `count` from user_extra where 1 != 1 group by user_id, flowId) as t1 where 1 != 1", + "Query": "select t1.portalId, t1.flowId from (select portalId, flowId, count(*) as `count` from user_extra where localDate > :v1 group by user_id, flowId having count(*) >= :v2 order by null) as t1", + "Table": "user_extra" + }, + "TablesUsed": [ + "user.user_extra" + ] + } } ] \ No newline at end of file diff --git a/go/vt/vtgate/planbuilder/testdata/filter_cases.json b/go/vt/vtgate/planbuilder/testdata/filter_cases.json index 5ba0fea9007..242d447cc40 100644 --- a/go/vt/vtgate/planbuilder/testdata/filter_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/filter_cases.json @@ -4381,7 +4381,7 @@ { "comment": "SelectDBA with uncorrelated subqueries", "query": "select t.table_schema from information_schema.tables as t where t.table_schema in (select c.column_name from information_schema.columns as c)", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select t.table_schema from information_schema.tables as t where t.table_schema in (select c.column_name from information_schema.columns as c)", "Instructions": { @@ -4395,6 +4395,25 @@ "Query": "select t.table_schema from information_schema.`tables` as t where t.table_schema in (select c.column_name from information_schema.`columns` as c)", "Table": "information_schema.`tables`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select t.table_schema from information_schema.tables as t where t.table_schema in (select c.column_name from information_schema.columns as c)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select t.table_schema from information_schema.`tables` as t where 1 != 1", + "Query": "select t.table_schema from information_schema.`tables` as t where t.table_schema in (select c.column_name from information_schema.`columns` as c)", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.columns", + "information_schema.tables" + ] } }, { diff --git a/go/vt/vtgate/planbuilder/testdata/from_cases.json b/go/vt/vtgate/planbuilder/testdata/from_cases.json index f9c88a765fb..49b0cf5a3da 100644 --- a/go/vt/vtgate/planbuilder/testdata/from_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/from_cases.json @@ -587,6 +587,7 @@ "plan": "table disabled has been disabled" }, { + "comment": "select second_user.foo.col from second_user.foo join user on second_user.foo.id = user.id where second_user.foo.col = 42", "query": "select second_user.foo.col from second_user.foo join user on second_user.foo.id = user.id where second_user.foo.col = 42", "v3-plan": { "QueryType": "SELECT", @@ -623,6 +624,7 @@ } }, { + "comment": "select user.music.foo from user.music join user on user.music.id = user.id where user.music.col = 42", "query": "select user.music.foo from user.music join user on user.music.id = user.id where user.music.col = 42", "v3-plan": { "QueryType": "SELECT", @@ -3001,6 +3003,7 @@ ] }, "TablesUsed": [ + "information_schema.a", "main.unsharded" ] } @@ -3076,6 +3079,7 @@ ] }, "TablesUsed": [ + "information_schema.a", "main.unsharded" ] } @@ -4584,7 +4588,25 @@ { "comment": "verify ',' vs JOIN precedence", "query": "select u1.a from unsharded u1, unsharded u2 join unsharded u3 on u1.a = u2.a", - "plan": "symbol u1.a not found" + "v3-plan": "symbol u1.a not found", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select u1.a from unsharded u1, unsharded u2 join unsharded u3 on u1.a = u2.a", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select u1.a from unsharded as u1, unsharded as u2 join unsharded as u3 on u1.a = u2.a where 1 != 1", + "Query": "select u1.a from unsharded as u1, unsharded as u2 join unsharded as u3 on u1.a = u2.a", + "Table": "unsharded" + }, + "TablesUsed": [ + "main.unsharded" + ] + } }, { "comment": "first expression fails for ',' join (code coverage: ensure error is returned)", @@ -4594,7 +4616,25 @@ { "comment": "table names should be case-sensitive", "query": "select unsharded.id from unsharded where Unsharded.val = 1", - "plan": "symbol Unsharded.val not found" + "v3-plan": "symbol Unsharded.val not found", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select unsharded.id from unsharded where Unsharded.val = 1", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select unsharded.id from unsharded where 1 != 1", + "Query": "select unsharded.id from unsharded where Unsharded.val = 1", + "Table": "unsharded" + }, + "TablesUsed": [ + "main.unsharded" + ] + } }, { "comment": "implicit table reference for sharded keyspace", @@ -6160,6 +6200,7 @@ } }, { + "comment": "select * from (select bar as push_it from (select foo as bar from (select id as foo from user) as t1) as t2) as t3 where push_it = 12", "query": "select * from (select bar as push_it from (select foo as bar from (select id as foo from user) as t1) as t2) as t3 where push_it = 12", "v3-plan": { "QueryType": "SELECT", @@ -6202,5 +6243,49 @@ "user.user" ] } + }, + { + "comment": "missing and ambiguous column info is OK as long as we can send the query to a single unsharded keyspace", + "query": "select missing_column from unsharded, unsharded_a", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select missing_column from unsharded, unsharded_a", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select missing_column from unsharded, unsharded_a where 1 != 1", + "Query": "select missing_column from unsharded, unsharded_a", + "Table": "unsharded, unsharded_a" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select missing_column from unsharded, unsharded_a", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select missing_column from unsharded, unsharded_a where 1 != 1", + "Query": "select missing_column from unsharded, unsharded_a", + "Table": "unsharded, unsharded_a" + }, + "TablesUsed": [ + "main.unsharded", + "main.unsharded_a" + ] + } + }, + { + "comment": "missing and ambiguous column info is not valid when we have two different unsharded keyspaces in the query", + "query": "select missing_column from unsharded, unsharded_tab", + "v3-plan": "symbol missing_column not found", + "gen4-plan": "Column 'missing_column' in field list is ambiguous" } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index 5157e1acc9c..aadbc7840cd 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -2535,6 +2535,7 @@ } }, { + "comment": "(select id from unsharded) union (select id from unsharded_auto) order by id limit 5", "query": "(select id from unsharded) union (select id from unsharded_auto) order by id limit 5", "v3-plan": { "QueryType": "SELECT", @@ -3295,6 +3296,7 @@ "plan": "syntax error at position 41 near 'into'" }, { + "comment": "select (select u.id from user as u where u.id = 1), a.id from user as a where a.id = 1", "query": "select (select u.id from user as u where u.id = 1), a.id from user as a where a.id = 1", "v3-plan": { "QueryType": "SELECT", @@ -3416,6 +3418,7 @@ } }, { + "comment": "((((select 1))))", "query": "((((select 1))))", "v3-plan": { "QueryType": "SELECT", @@ -3585,6 +3588,7 @@ } }, { + "comment": "select (select col from user limit 1) as a from user join user_extra order by a", "query": "select (select col from user limit 1) as a from user join user_extra order by a", "v3-plan": { "QueryType": "SELECT", @@ -3716,6 +3720,7 @@ } }, { + "comment": "select t.a from (select (select col from user limit 1) as a from user join user_extra) t", "query": "select t.a from (select (select col from user limit 1) as a from user join user_extra) t", "v3-plan": { "QueryType": "SELECT", @@ -3860,6 +3865,7 @@ } }, { + "comment": "select (select col from user where user_extra.id = 4 limit 1) as a from user join user_extra", "query": "select (select col from user where user_extra.id = 4 limit 1) as a from user join user_extra", "plan": "unsupported: cross-shard correlated subquery" }, @@ -4462,6 +4468,7 @@ } }, { + "comment": "select user.id, trim(leading 'x' from user.name) from user", "query": "select user.id, trim(leading 'x' from user.name) from user", "v3-plan": { "QueryType": "SELECT", @@ -4571,6 +4578,7 @@ "Table": "dual" }, "TablesUsed": [ + "information_schema.TABLES", "main.dual" ] } @@ -4613,6 +4621,7 @@ } }, { + "comment": "select (select id from user order by id limit 1) from user_extra", "query": "select (select id from user order by id limit 1) from user_extra", "v3-plan": { "QueryType": "SELECT", @@ -7687,6 +7696,7 @@ } }, { + "comment": "select user.a, t.b from user join (select id, count(*) b, req from user_extra group by req, id) as t on user.id = t.id", "query": "select user.a, t.b from user join (select id, count(*) b, req from user_extra group by req, id) as t on user.id = t.id", "v3-plan": "unsupported: filtering on results of cross-shard subquery", "gen4-plan": { @@ -7765,6 +7775,7 @@ "gen4-plan": "unsupported: JOIN not supported between derived tables" }, { + "comment": "SELECT music.id FROM (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other JOIN music ON other.maxt = music.id", "query": "SELECT music.id FROM (SELECT MAX(id) as maxt FROM music WHERE music.user_id = 5) other JOIN music ON other.maxt = music.id", "v3-plan": { "QueryType": "SELECT", @@ -7870,5 +7881,43 @@ "main.dual" ] } + }, + { + "comment": "query with a derived table and dual table in unsharded keyspace", + "query": "SELECT * FROM unsharded_a AS t1 JOIN (SELECT trim((SELECT MAX(name) FROM unsharded_a)) AS name) AS t2 WHERE t1.name >= t2.name ORDER BY t1.name ASC LIMIT 1;", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM unsharded_a AS t1 JOIN (SELECT trim((SELECT MAX(name) FROM unsharded_a)) AS name) AS t2 WHERE t1.name >= t2.name ORDER BY t1.name ASC LIMIT 1;", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a where 1 != 1)) as `name` from dual where 1 != 1) as t2 where 1 != 1", + "Query": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a)) as `name` from dual) as t2 where t1.`name` >= t2.`name` order by t1.`name` asc limit 1", + "Table": "unsharded_a, dual" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM unsharded_a AS t1 JOIN (SELECT trim((SELECT MAX(name) FROM unsharded_a)) AS name) AS t2 WHERE t1.name >= t2.name ORDER BY t1.name ASC LIMIT 1;", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a where 1 != 1)) as `name` from dual where 1 != 1) as t2 where 1 != 1", + "Query": "select * from unsharded_a as t1 join (select trim((select max(`name`) from unsharded_a)) as `name` from dual) as t2 where t1.`name` >= t2.`name` order by t1.`name` asc limit 1", + "Table": "dual, unsharded_a" + }, + "TablesUsed": [ + "main.dual", + "main.unsharded_a" + ] + } } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/planbuilder/testdata/sysschema_default.json b/go/vt/vtgate/planbuilder/testdata/sysschema_default.json index 2d12dd815cf..275a6720e29 100644 --- a/go/vt/vtgate/planbuilder/testdata/sysschema_default.json +++ b/go/vt/vtgate/planbuilder/testdata/sysschema_default.json @@ -69,7 +69,11 @@ "Query": "select t.table_schema, t.table_name, c.column_name, c.column_type from information_schema.`tables` as t, information_schema.`columns` as c where t.table_schema = :__vtschemaname and c.table_schema = :__vtschemaname and c.table_schema = t.table_schema and c.table_name = t.table_name order by t.table_schema asc, t.table_name asc, c.column_name asc", "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"user\")]", "Table": "information_schema.`columns`, information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.columns", + "information_schema.tables" + ] } }, { @@ -107,6 +111,7 @@ "Table": "dual" }, "TablesUsed": [ + "information_schema.schemata", "main.dual" ] } @@ -144,7 +149,10 @@ "Query": "select x.`1` from (select 1 from information_schema.schemata where schema_name = :__vtschemaname limit 1) as x", "SysTableTableSchema": "[VARCHAR(\"MyDatabase\")]", "Table": "information_schema.schemata" - } + }, + "TablesUsed": [ + "information_schema.schemata" + ] } } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json b/go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json new file mode 100644 index 00000000000..a056ca24fec --- /dev/null +++ b/go/vt/vtgate/planbuilder/testdata/systemtables_cases57.json @@ -0,0 +1,1880 @@ +[ + { + "comment": "Single information_schema query", + "query": "select TABLE_NAME from information_schema.TABLES", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select TABLE_NAME from information_schema.TABLES", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`TABLES` where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`TABLES`", + "Table": "information_schema.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select TABLE_NAME from information_schema.TABLES", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`TABLES` where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`TABLES`", + "Table": "information_schema.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "',' join information_schema", + "query": "select a.ENGINE, b.DATA_TYPE from information_schema.TABLES as a, information_schema.COLUMNS as b", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select a.ENGINE, b.DATA_TYPE from information_schema.TABLES as a, information_schema.COLUMNS as b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.`ENGINE`, b.DATA_TYPE from information_schema.`TABLES` as a, information_schema.`COLUMNS` as b where 1 != 1", + "Query": "select a.`ENGINE`, b.DATA_TYPE from information_schema.`TABLES` as a, information_schema.`COLUMNS` as b", + "Table": "information_schema.`TABLES`, information_schema.`COLUMNS`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select a.ENGINE, b.DATA_TYPE from information_schema.TABLES as a, information_schema.COLUMNS as b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.`ENGINE`, b.DATA_TYPE from information_schema.`TABLES` as a, information_schema.`COLUMNS` as b where 1 != 1", + "Query": "select a.`ENGINE`, b.DATA_TYPE from information_schema.`TABLES` as a, information_schema.`COLUMNS` as b", + "Table": "information_schema.`COLUMNS`, information_schema.`TABLES`" + }, + "TablesUsed": [ + "information_schema.COLUMNS", + "information_schema.TABLES" + ] + } + }, + { + "comment": "information schema query that uses table_schema", + "query": "select column_name from information_schema.columns where table_schema = (select schema())", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select column_name from information_schema.columns where table_schema = (select schema())", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.`columns` where 1 != 1", + "Query": "select column_name from information_schema.`columns` where table_schema = schema()", + "Table": "information_schema.`columns`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select column_name from information_schema.columns where table_schema = (select schema())", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.`columns` where 1 != 1", + "Query": "select column_name from information_schema.`columns` where table_schema = schema()", + "Table": "information_schema.`columns`" + }, + "TablesUsed": [ + "information_schema.columns" + ] + } + }, + { + "comment": "information schema join", + "query": "select tables.TABLE_SCHEMA, files.`STATUS` from information_schema.tables join information_schema.files", + "v3-plan": "symbol `tables`.TABLE_SCHEMA not found", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select tables.TABLE_SCHEMA, files.`STATUS` from information_schema.tables join information_schema.files", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select `tables`.TABLE_SCHEMA, files.`STATUS` from information_schema.`tables`, information_schema.files where 1 != 1", + "Query": "select `tables`.TABLE_SCHEMA, files.`STATUS` from information_schema.`tables`, information_schema.files", + "Table": "information_schema.`tables`, information_schema.files" + }, + "TablesUsed": [ + "information_schema.files", + "information_schema.tables" + ] + } + }, + { + "comment": "access to qualified column names in information_schema", + "query": "select * from information_schema.COLUMNS where information_schema.COLUMNS.COLUMN_NAME='toto'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from information_schema.COLUMNS where information_schema.COLUMNS.COLUMN_NAME='toto'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from information_schema.`COLUMNS` where 1 != 1", + "Query": "select * from information_schema.`COLUMNS` where information_schema.`COLUMNS`.COLUMN_NAME = 'toto'", + "Table": "information_schema.`COLUMNS`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select * from information_schema.COLUMNS where information_schema.COLUMNS.COLUMN_NAME='toto'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, DATETIME_PRECISION, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE, COLUMN_KEY, EXTRA, `PRIVILEGES`, COLUMN_COMMENT, GENERATION_EXPRESSION from information_schema.`COLUMNS` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, DATETIME_PRECISION, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE, COLUMN_KEY, EXTRA, `PRIVILEGES`, COLUMN_COMMENT, GENERATION_EXPRESSION from information_schema.`COLUMNS` where `COLUMNS`.COLUMN_NAME = 'toto'", + "Table": "information_schema.`COLUMNS`" + }, + "TablesUsed": [ + "information_schema.COLUMNS" + ] + } + }, + { + "comment": "union of information_schema", + "query": "select TABLE_NAME from information_schema.columns union select table_schema from information_schema.tables", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select TABLE_NAME from information_schema.columns union select table_schema from information_schema.tables", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`columns` where 1 != 1 union select table_schema from information_schema.`tables` where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`columns` union select table_schema from information_schema.`tables`", + "Table": "information_schema.`columns`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select TABLE_NAME from information_schema.columns union select table_schema from information_schema.tables", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`columns` where 1 != 1 union select table_schema from information_schema.`tables` where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`columns` union select table_schema from information_schema.`tables`", + "Table": "information_schema.`columns`" + }, + "TablesUsed": [ + "information_schema.columns", + "information_schema.tables" + ] + } + }, + { + "comment": "union between information_schema tables that should not be merged", + "query": "select * from information_schema.tables where table_schema = 'user' union select * from information_schema.tables where table_schema = 'main'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from information_schema.tables where table_schema = 'user' union select * from information_schema.tables where table_schema = 'main'", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from information_schema.`tables` where 1 != 1", + "Query": "select * from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from information_schema.`tables` where 1 != 1", + "Query": "select * from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"main\")]", + "Table": "information_schema.`tables`" + } + ] + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select * from information_schema.tables where table_schema = 'user' union select * from information_schema.tables where table_schema = 'main'", + "Instructions": { + "OperatorType": "Distinct", + "Collations": [ + "(0:21)", + "(1:22)", + "(2:23)", + "(3:24)", + "(4:25)", + "5: binary", + "(6:26)", + "7: binary", + "8: binary", + "9: binary", + "10: binary", + "11: binary", + "12: binary", + "13: binary", + "(14:27)", + "(15:28)", + "(16:29)", + "(17:30)", + "18: binary", + "(19:31)", + "(20:32)" + ], + "ResultColumns": 21, + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where 1 != 1", + "Query": "select distinct TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where 1 != 1", + "Query": "select distinct TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"main\")]", + "Table": "information_schema.`tables`" + } + ] + } + ] + }, + "TablesUsed": [ + "information_schema.tables" + ] + } + }, + { + "comment": "Select from information schema query with two tables that route should be merged", + "query": "SELECT RC.CONSTRAINT_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.COLUMN_NAME = 'id' AND KCU.REFERENCED_TABLE_SCHEMA = 'test' AND KCU.CONSTRAINT_NAME = 'data_type_table_id_fkey' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT RC.CONSTRAINT_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.COLUMN_NAME = 'id' AND KCU.REFERENCED_TABLE_SCHEMA = 'test' AND KCU.CONSTRAINT_NAME = 'data_type_table_id_fkey' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select RC.CONSTRAINT_NAME, ORDINAL_POSITION from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC on KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME where 1 != 1", + "Query": "select RC.CONSTRAINT_NAME, ORDINAL_POSITION from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC on KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME where KCU.TABLE_SCHEMA = :__vtschemaname and KCU.TABLE_NAME = :KCU_TABLE_NAME and KCU.COLUMN_NAME = 'id' and KCU.REFERENCED_TABLE_SCHEMA = 'test' and KCU.CONSTRAINT_NAME = 'data_type_table_id_fkey' order by KCU.CONSTRAINT_NAME asc, KCU.COLUMN_NAME asc", + "SysTableTableName": "[KCU_TABLE_NAME:VARCHAR(\"data_type_table\")]", + "SysTableTableSchema": "[VARCHAR(\"test\")]", + "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT RC.CONSTRAINT_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.COLUMN_NAME = 'id' AND KCU.REFERENCED_TABLE_SCHEMA = 'test' AND KCU.CONSTRAINT_NAME = 'data_type_table_id_fkey' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select RC.CONSTRAINT_NAME, ORDINAL_POSITION from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC where 1 != 1", + "Query": "select RC.CONSTRAINT_NAME, ORDINAL_POSITION from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC where KCU.TABLE_SCHEMA = :__vtschemaname and KCU.TABLE_NAME = :KCU_TABLE_NAME and KCU.COLUMN_NAME = 'id' and KCU.REFERENCED_TABLE_SCHEMA = 'test' and KCU.CONSTRAINT_NAME = 'data_type_table_id_fkey' and KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME order by KCU.CONSTRAINT_NAME asc, KCU.COLUMN_NAME asc", + "SysTableTableName": "[KCU_TABLE_NAME:VARCHAR(\"data_type_table\")]", + "SysTableTableSchema": "[VARCHAR(\"test\")]", + "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS" + }, + "TablesUsed": [ + "information_schema.KEY_COLUMN_USAGE", + "information_schema.REFERENTIAL_CONSTRAINTS" + ] + } + }, + { + "comment": "Select from information schema query with three tables such that route for 2 should be merged but not for the last.", + "query": "SELECT KCU.`TABLE_NAME`, S.`TABLE_NAME` FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME, INFORMATION_SCHEMA.`TABLES` AS S WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.TABLE_NAME = 'data_type_table' AND S.TABLE_SCHEMA = 'test' AND S.TABLE_NAME = 'sc' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT KCU.`TABLE_NAME`, S.`TABLE_NAME` FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME, INFORMATION_SCHEMA.`TABLES` AS S WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.TABLE_NAME = 'data_type_table' AND S.TABLE_SCHEMA = 'test' AND S.TABLE_NAME = 'sc' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0,R:0", + "TableName": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS_INFORMATION_SCHEMA.`TABLES`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select KCU.TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC on KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME where 1 != 1", + "Query": "select KCU.TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC on KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME where KCU.TABLE_SCHEMA = :__vtschemaname and KCU.TABLE_NAME = :KCU_TABLE_NAME and KCU.TABLE_NAME = :KCU_TABLE_NAME1 order by KCU.CONSTRAINT_NAME asc, KCU.COLUMN_NAME asc", + "SysTableTableName": "[KCU_TABLE_NAME1:VARCHAR(\"data_type_table\"), KCU_TABLE_NAME:VARCHAR(\"data_type_table\")]", + "SysTableTableSchema": "[VARCHAR(\"test\")]", + "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select S.TABLE_NAME from INFORMATION_SCHEMA.`TABLES` as S where 1 != 1", + "Query": "select S.TABLE_NAME from INFORMATION_SCHEMA.`TABLES` as S where S.TABLE_SCHEMA = :__vtschemaname and S.TABLE_NAME = :S_TABLE_NAME", + "SysTableTableName": "[S_TABLE_NAME:VARCHAR(\"sc\")]", + "SysTableTableSchema": "[VARCHAR(\"test\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT KCU.`TABLE_NAME`, S.`TABLE_NAME` FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME, INFORMATION_SCHEMA.`TABLES` AS S WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.TABLE_NAME = 'data_type_table' AND S.TABLE_SCHEMA = 'test' AND S.TABLE_NAME = 'sc' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select KCU.TABLE_NAME, S.TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC, INFORMATION_SCHEMA.`TABLES` as S where 1 != 1", + "Query": "select KCU.TABLE_NAME, S.TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC, INFORMATION_SCHEMA.`TABLES` as S where S.TABLE_SCHEMA = :__vtschemaname and S.TABLE_NAME = :S_TABLE_NAME and KCU.TABLE_SCHEMA = :__vtschemaname and KCU.TABLE_NAME = :KCU_TABLE_NAME and KCU.TABLE_NAME = :KCU_TABLE_NAME1 and KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME order by KCU.CONSTRAINT_NAME asc, KCU.COLUMN_NAME asc", + "SysTableTableName": "[KCU_TABLE_NAME1:VARCHAR(\"data_type_table\"), KCU_TABLE_NAME:VARCHAR(\"data_type_table\"), S_TABLE_NAME:VARCHAR(\"sc\")]", + "SysTableTableSchema": "[VARCHAR(\"test\"), VARCHAR(\"test\")]", + "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS, INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.KEY_COLUMN_USAGE", + "information_schema.REFERENTIAL_CONSTRAINTS", + "information_schema.TABLES" + ] + } + }, + { + "comment": "information_schema.routines", + "query": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select routine_name as `name`, routine_definition as definition from information_schema.routines where 1 != 1", + "Query": "select routine_name as `name`, routine_definition as definition from information_schema.routines where ROUTINE_SCHEMA = :__vtschemaname and ROUTINE_TYPE = 'PROCEDURE'", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.routines" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select routine_name as `name`, routine_definition as definition from information_schema.routines where 1 != 1", + "Query": "select routine_name as `name`, routine_definition as definition from information_schema.routines where ROUTINE_SCHEMA = :__vtschemaname and ROUTINE_TYPE = 'PROCEDURE'", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.routines" + }, + "TablesUsed": [ + "information_schema.routines" + ] + } + }, + { + "comment": "information_schema table sizes", + "query": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select sum(data_length + index_length) as size from information_schema.`TABLES` where 1 != 1", + "Query": "select sum(data_length + index_length) as size from information_schema.`TABLES` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select sum(data_length + index_length) as size from information_schema.`TABLES` where 1 != 1", + "Query": "select sum(data_length + index_length) as size from information_schema.`TABLES` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "information_schema referential contraints", + "query": "SELECT kcu.constraint_name constraint_name, kcu.column_name column_name, kcu.referenced_table_name referenced_table_name, kcu.referenced_column_name referenced_column_name, kcu.ordinal_position ordinal_position, kcu.table_name table_name, rc.delete_rule delete_rule, rc.update_rule update_rule FROM information_schema.key_column_usage AS kcu INNER JOIN information_schema.referential_constraints AS rc ON kcu.constraint_name = rc.constraint_name WHERE kcu.table_schema = ? AND rc.constraint_schema = ? AND kcu.referenced_column_name IS NOT NULL ORDER BY ordinal_position", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT kcu.constraint_name constraint_name, kcu.column_name column_name, kcu.referenced_table_name referenced_table_name, kcu.referenced_column_name referenced_column_name, kcu.ordinal_position ordinal_position, kcu.table_name table_name, rc.delete_rule delete_rule, rc.update_rule update_rule FROM information_schema.key_column_usage AS kcu INNER JOIN information_schema.referential_constraints AS rc ON kcu.constraint_name = rc.constraint_name WHERE kcu.table_schema = ? AND rc.constraint_schema = ? AND kcu.referenced_column_name IS NOT NULL ORDER BY ordinal_position", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select kcu.constraint_name as constraint_name, kcu.column_name as column_name, kcu.referenced_table_name as referenced_table_name, kcu.referenced_column_name as referenced_column_name, kcu.ordinal_position as ordinal_position, kcu.table_name as table_name, rc.delete_rule as delete_rule, rc.update_rule as update_rule from information_schema.key_column_usage as kcu join information_schema.referential_constraints as rc on kcu.constraint_name = rc.constraint_name where 1 != 1", + "Query": "select kcu.constraint_name as constraint_name, kcu.column_name as column_name, kcu.referenced_table_name as referenced_table_name, kcu.referenced_column_name as referenced_column_name, kcu.ordinal_position as ordinal_position, kcu.table_name as table_name, rc.delete_rule as delete_rule, rc.update_rule as update_rule from information_schema.key_column_usage as kcu join information_schema.referential_constraints as rc on kcu.constraint_name = rc.constraint_name where kcu.table_schema = :__vtschemaname and rc.constraint_schema = :__vtschemaname and kcu.referenced_column_name is not null order by ordinal_position asc", + "SysTableTableSchema": "[:v1, :v2]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT kcu.constraint_name constraint_name, kcu.column_name column_name, kcu.referenced_table_name referenced_table_name, kcu.referenced_column_name referenced_column_name, kcu.ordinal_position ordinal_position, kcu.table_name table_name, rc.delete_rule delete_rule, rc.update_rule update_rule FROM information_schema.key_column_usage AS kcu INNER JOIN information_schema.referential_constraints AS rc ON kcu.constraint_name = rc.constraint_name WHERE kcu.table_schema = ? AND rc.constraint_schema = ? AND kcu.referenced_column_name IS NOT NULL ORDER BY ordinal_position", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select kcu.constraint_name as constraint_name, kcu.column_name as column_name, kcu.referenced_table_name as referenced_table_name, kcu.referenced_column_name as referenced_column_name, kcu.ordinal_position as ordinal_position, kcu.table_name as table_name, rc.delete_rule as delete_rule, rc.update_rule as update_rule from information_schema.key_column_usage as kcu, information_schema.referential_constraints as rc where 1 != 1", + "Query": "select kcu.constraint_name as constraint_name, kcu.column_name as column_name, kcu.referenced_table_name as referenced_table_name, kcu.referenced_column_name as referenced_column_name, kcu.ordinal_position as ordinal_position, kcu.table_name as table_name, rc.delete_rule as delete_rule, rc.update_rule as update_rule from information_schema.key_column_usage as kcu, information_schema.referential_constraints as rc where kcu.table_schema = :__vtschemaname and kcu.referenced_column_name is not null and rc.constraint_schema = :__vtschemaname and kcu.constraint_name = rc.constraint_name order by ordinal_position asc", + "SysTableTableSchema": "[:v1, :v2]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] + } + }, + { + "comment": "rails query", + "query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as name, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = ':vtg1' and rc.constraint_schema = database() and rc.table_name = ':vtg1'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as name, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = ':vtg1' and rc.constraint_schema = database() and rc.table_name = ':vtg1'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where 1 != 1", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = :fk_table_name and rc.constraint_schema = database() and rc.table_name = :rc_table_name", + "SysTableTableName": "[fk_table_name:VARCHAR(\":vtg1\"), rc_table_name:VARCHAR(\":vtg1\")]", + "Table": "information_schema.referential_constraints, information_schema.key_column_usage" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as name, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = ':vtg1' and rc.constraint_schema = database() and rc.table_name = ':vtg1'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where 1 != 1", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = database() and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = :fk_table_name and rc.constraint_schema = fk.constraint_schema and rc.constraint_name = fk.constraint_name", + "SysTableTableName": "[fk_table_name:VARCHAR(\":vtg1\"), rc_table_name:VARCHAR(\":vtg1\")]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] + } + }, + { + "comment": "rails_query 2", + "query": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from information_schema.schemata where 1 != 1", + "Query": "select * from information_schema.schemata where schema_name = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\")]", + "Table": "information_schema.schemata" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, SQL_PATH from information_schema.schemata where 1 != 1", + "Query": "select CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, SQL_PATH from information_schema.schemata where schema_name = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\")]", + "Table": "information_schema.schemata" + }, + "TablesUsed": [ + "information_schema.schemata" + ] + } + }, + { + "comment": "rails_query 3", + "query": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_comment from information_schema.`tables` where 1 != 1", + "Query": "select table_comment from information_schema.`tables` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"schema_name\")]", + "Table": "information_schema.`tables`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_comment from information_schema.`tables` where 1 != 1", + "Query": "select table_comment from information_schema.`tables` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"schema_name\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables" + ] + } + }, + { + "comment": "rails_query 4", + "query": "SELECT fk.referenced_table_name AS 'to_table', fk.referenced_column_name AS 'primary_key',fk.column_name AS 'column',fk.constraint_name AS 'name',rc.update_rule AS 'on_update',rc.delete_rule AS 'on_delete' FROM information_schema.referential_constraints rc JOIN information_schema.key_column_usage fk USING (constraint_schema, constraint_name) WHERE fk.referenced_column_name IS NOT NULL AND fk.table_schema = 'table_schema' AND fk.table_name = 'table_name' AND rc.constraint_schema = 'table_schema' AND rc.table_name = 'table_name'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT fk.referenced_table_name AS 'to_table', fk.referenced_column_name AS 'primary_key',fk.column_name AS 'column',fk.constraint_name AS 'name',rc.update_rule AS 'on_update',rc.delete_rule AS 'on_delete' FROM information_schema.referential_constraints rc JOIN information_schema.key_column_usage fk USING (constraint_schema, constraint_name) WHERE fk.referenced_column_name IS NOT NULL AND fk.table_schema = 'table_schema' AND fk.table_name = 'table_name' AND rc.constraint_schema = 'table_schema' AND rc.table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where 1 != 1", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc join information_schema.key_column_usage as fk using (constraint_schema, constraint_name) where fk.referenced_column_name is not null and fk.table_schema = :__vtschemaname and fk.table_name = :fk_table_name and rc.constraint_schema = :__vtschemaname and rc.table_name = :rc_table_name", + "SysTableTableName": "[fk_table_name:VARCHAR(\"table_name\"), rc_table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\"), VARCHAR(\"table_schema\")]", + "Table": "information_schema.referential_constraints, information_schema.key_column_usage" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT fk.referenced_table_name AS 'to_table', fk.referenced_column_name AS 'primary_key',fk.column_name AS 'column',fk.constraint_name AS 'name',rc.update_rule AS 'on_update',rc.delete_rule AS 'on_delete' FROM information_schema.referential_constraints rc JOIN information_schema.key_column_usage fk USING (constraint_schema, constraint_name) WHERE fk.referenced_column_name IS NOT NULL AND fk.table_schema = 'table_schema' AND fk.table_name = 'table_name' AND rc.constraint_schema = 'table_schema' AND rc.table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where 1 != 1", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = :__vtschemaname and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = :__vtschemaname and fk.table_name = :fk_table_name and rc.constraint_schema = fk.constraint_schema and rc.constraint_name = fk.constraint_name", + "SysTableTableName": "[fk_table_name:VARCHAR(\"table_name\"), rc_table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\"), VARCHAR(\"table_schema\")]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] + } + }, + { + "comment": "rails_query 6", + "query": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.statistics where 1 != 1", + "Query": "select column_name from information_schema.statistics where index_name = 'PRIMARY' and table_schema = :__vtschemaname and table_name = :table_name order by seq_in_index asc", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.statistics" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.statistics where 1 != 1", + "Query": "select column_name from information_schema.statistics where index_name = 'PRIMARY' and table_schema = :__vtschemaname and table_name = :table_name order by seq_in_index asc", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.statistics" + }, + "TablesUsed": [ + "information_schema.statistics" + ] + } + }, + { + "comment": "rails_query 7", + "query": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select generation_expression from information_schema.`columns` where 1 != 1", + "Query": "select generation_expression from information_schema.`columns` where table_schema = :__vtschemaname and table_name = :table_name and column_name = 'column_name'", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`columns`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select generation_expression from information_schema.`columns` where 1 != 1", + "Query": "select generation_expression from information_schema.`columns` where table_schema = :__vtschemaname and table_name = :table_name and column_name = 'column_name'", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`columns`" + }, + "TablesUsed": [ + "information_schema.columns" + ] + } + }, + { + "comment": "rails_query 8", + "query": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select id from information_schema.`processlist` where 1 != 1", + "Query": "select id from information_schema.`processlist` where info like '% FOR UPDATE'", + "Table": "information_schema.`processlist`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select id from information_schema.`processlist` where 1 != 1", + "Query": "select id from information_schema.`processlist` where info like '% FOR UPDATE'", + "Table": "information_schema.`processlist`" + }, + "TablesUsed": [ + "information_schema.processlist" + ] + } + }, + { + "comment": "rails_query 9", + "query": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select * from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select * from information_schema.`tables` where table_schema = :__vtschemaname) as _subquery", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`tables`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where table_schema = :__vtschemaname) as _subquery", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables" + ] + } + }, + { + "comment": "rails_query 10", + "query": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery WHERE _subquery.table_type = 'table_type' AND _subquery.table_name = 'table_name'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery WHERE _subquery.table_type = 'table_type' AND _subquery.table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select * from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select * from information_schema.`tables` where table_schema = :__vtschemaname) as _subquery where _subquery.table_type = 'table_type' and _subquery.table_name = :_subquery_table_name", + "SysTableTableName": "[_subquery_table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`tables`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery WHERE _subquery.table_type = 'table_type' AND _subquery.table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where table_schema = :__vtschemaname and table_type = 'table_type' and table_name = 'table_name') as _subquery", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables" + ] + } + }, + { + "comment": "system schema in where clause of information_schema query", + "query": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select count(*) from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select count(*) from INFORMATION_SCHEMA.`TABLES` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"foo\")]", + "SysTableTableSchema": "[VARCHAR(\"performance_schema\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select count(*) from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select count(*) from INFORMATION_SCHEMA.`TABLES` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"foo\")]", + "SysTableTableSchema": "[VARCHAR(\"performance_schema\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "subquery of information_schema with itself", + "query": "select TABLES.CHECKSUM from information_schema.`TABLES` where `TABLE_NAME` in (select `TABLE_NAME` from information_schema.`COLUMNS`)", + "v3-plan": "symbol `TABLES`.`CHECKSUM` not found", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select TABLES.CHECKSUM from information_schema.`TABLES` where `TABLE_NAME` in (select `TABLE_NAME` from information_schema.`COLUMNS`)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select `TABLES`.`CHECKSUM` from information_schema.`TABLES` where 1 != 1", + "Query": "select `TABLES`.`CHECKSUM` from information_schema.`TABLES` where TABLE_NAME in (select TABLE_NAME from information_schema.`COLUMNS`)", + "Table": "information_schema.`TABLES`" + }, + "TablesUsed": [ + "information_schema.COLUMNS", + "information_schema.TABLES" + ] + } + }, + { + "comment": "query trying to query two different keyspaces at the same time", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "information_schema query using database() func", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = database()", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = database()", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "table_schema predicate the wrong way around", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "table_name predicate against a routed table", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and TABLE_NAME = :TABLE_NAME", + "SysTableTableName": "[TABLE_NAME:VARCHAR(\"route1\")]", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and TABLE_NAME = :TABLE_NAME", + "SysTableTableName": "[TABLE_NAME:VARCHAR(\"route1\")]", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "information_schema query with additional predicates", + "query": "SELECT `TABLE_NAME` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' and DATA_FREE = 42", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT `TABLE_NAME` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' and DATA_FREE = 42", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_NAME from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and DATA_FREE = 42", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT `TABLE_NAME` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' and DATA_FREE = 42", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_NAME from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and DATA_FREE = 42", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "able to isolate table_schema value even when hidden inside of ORs", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_SCHEMA = 'ks' and DATA_FREE = 42) OR (TABLE_SCHEMA = 'ks' and CHECKSUM = 'value')", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_SCHEMA = 'ks' and DATA_FREE = 42) OR (TABLE_SCHEMA = 'ks' and CHECKSUM = 'value')", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and (DATA_FREE = 42 or TABLE_SCHEMA = 'ks') and (DATA_FREE = 42 or `CHECKSUM` = 'value')", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_SCHEMA = 'ks' and DATA_FREE = 42) OR (TABLE_SCHEMA = 'ks' and CHECKSUM = 'value')", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and (DATA_FREE = 42 or TABLE_SCHEMA = 'ks') and (DATA_FREE = 42 or `CHECKSUM` = 'value')", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + }, + { + "comment": "expand star with information schema", + "query": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select x.table_name from (select a.* from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", + "Query": "select x.table_name from (select a.* from information_schema.key_column_usage as a) as x", + "Table": "information_schema.key_column_usage" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", + "Query": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a) as x", + "Table": "information_schema.key_column_usage" + }, + "TablesUsed": [ + "information_schema.key_column_usage" + ] + } + }, + { + "comment": "expand star with information schema in a derived table", + "query": "select x.table_name from (select a.* from information_schema.key_column_usage a) x join user on x.`COLUMN_NAME` = user.id", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x join user on x.`COLUMN_NAME` = user.id", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0", + "JoinVars": { + "x_COLUMN_NAME": 1 + }, + "TableName": "information_schema.key_column_usage_`user`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select x.table_name, x.COLUMN_NAME from (select a.* from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", + "Query": "select x.table_name, x.COLUMN_NAME from (select a.* from information_schema.key_column_usage as a) as x", + "Table": "information_schema.key_column_usage" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user` where `user`.id = :x_COLUMN_NAME", + "Table": "`user`", + "Values": [ + ":x_COLUMN_NAME" + ], + "Vindex": "user_index" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x join user on x.`COLUMN_NAME` = user.id", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:1", + "JoinVars": { + "x_COLUMN_NAME": 0 + }, + "TableName": "information_schema.key_column_usage_`user`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select x.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" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user` where `user`.id = :x_COLUMN_NAME", + "Table": "`user`", + "Values": [ + ":x_COLUMN_NAME" + ], + "Vindex": "user_index" + } + ] + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "user.user" + ] + } + }, + { + "comment": "join of information_schema queries with select stars exprs", + "query": "select a.*, b.* from information_schema.a a, information_schema.b b", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select a.*, b.* from information_schema.a a, information_schema.b b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.*, b.* from information_schema.a as a, information_schema.b as b where 1 != 1", + "Query": "select a.*, b.* from information_schema.a as a, information_schema.b as b", + "Table": "information_schema.a, information_schema.b" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select a.*, b.* from information_schema.a a, information_schema.b b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.*, b.* from information_schema.a as a, information_schema.b as b where 1 != 1", + "Query": "select a.*, b.* from information_schema.a as a, information_schema.b as b", + "Table": "information_schema.a, information_schema.b" + }, + "TablesUsed": [ + "information_schema.a", + "information_schema.b" + ] + } + }, + { + "comment": "join two routes with SysTableTableName entries in LHS and RHS", + "query": "select a.table_name from (select * from information_schema.key_column_usage a where a.table_name = 'users') a join (select * from information_schema.referential_constraints where table_name = 'users') b", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select a.table_name from (select * from information_schema.key_column_usage a where a.table_name = 'users') a join (select * from information_schema.referential_constraints where table_name = 'users') b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.table_name from (select * from information_schema.key_column_usage as a where 1 != 1) as a join (select * from information_schema.referential_constraints where 1 != 1) as b where 1 != 1", + "Query": "select a.table_name from (select * from information_schema.key_column_usage as a where a.table_name = :a_table_name) as a join (select * from information_schema.referential_constraints where table_name = :table_name) as b", + "SysTableTableName": "[a_table_name:VARCHAR(\"users\"), table_name:VARCHAR(\"users\")]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select a.table_name from (select * from information_schema.key_column_usage a where a.table_name = 'users') a join (select * from information_schema.referential_constraints where table_name = 'users') b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as a, (select CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE, TABLE_NAME, REFERENCED_TABLE_NAME from information_schema.referential_constraints where 1 != 1) as b where 1 != 1", + "Query": "select a.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where a.table_name = :a_table_name) as a, (select CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE, TABLE_NAME, REFERENCED_TABLE_NAME from information_schema.referential_constraints where table_name = :table_name) as b", + "SysTableTableName": "[a_table_name:VARCHAR(\"users\"), table_name:VARCHAR(\"users\")]", + "Table": "information_schema.key_column_usage, information_schema.referential_constraints" + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] + } + }, + { + "comment": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "query": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "v3-plan": "unsupported: cross-shard query with aggregates", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select sum(found) from (select 1 as found from information_schema.`tables` where 1 != 1 union all (select 1 as found from information_schema.views where 1 != 1)) as t where 1 != 1", + "Query": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)) as t", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"music\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] + } + }, + { + "comment": "union as a derived table", + "query": "select found from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select found from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "Instructions": { + "OperatorType": "SimpleProjection", + "Columns": [ + 0 + ], + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"music\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.views where 1 != 1", + "Query": "select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1", + "SysTableTableSchema": "[VARCHAR(\"music\")]", + "Table": "information_schema.views" + } + ] + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select found from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select found from (select 1 as found from information_schema.`tables` where 1 != 1 union all (select 1 as found from information_schema.views where 1 != 1)) as t where 1 != 1", + "Query": "select found from (select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)) as t", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"music\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] + } + }, + { + "comment": "merge system schema queries as long as they have any same table_schema", + "query": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.views where 1 != 1", + "Query": "select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"user\")]", + "Table": "information_schema.views" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1 union all (select 1 as found from information_schema.views where 1 != 1)", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] + } + }, + { + "comment": "merge system schema queries as long as they have any same table_name", + "query": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.views where 1 != 1", + "Query": "select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"user\")]", + "Table": "information_schema.views" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_schema = 'music' and table_schema = 'Music' union all (select 1 as found from information_schema.views where table_schema = 'music' and table_schema = 'user' limit 1)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1 union all (select 1 as found from information_schema.views where 1 != 1)", + "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)", + "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] + } + }, + { + "comment": "merge union subquery with outer query referencing the same system schemas", + "query": "select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' and exists (select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' union all (select 1 as found from information_schema.views where table_name = 'music' and table_name = 'user' limit 1))", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' and exists (select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' union all (select 1 as found from information_schema.views where table_name = 'music' and table_name = 'user' limit 1))", + "Instructions": { + "OperatorType": "Subquery", + "Variant": "PulloutExists", + "PulloutVars": [ + "__sq_has_values1", + "__sq1" + ], + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_name = :table_name2 and table_name = :table_name3", + "SysTableTableName": "[table_name2:VARCHAR(\"music\"), table_name3:VARCHAR(\"Music\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.views where 1 != 1", + "Query": "select 1 as found from information_schema.views where table_name = :table_name4 and table_name = :table_name5 limit 1", + "SysTableTableName": "[table_name4:VARCHAR(\"music\"), table_name5:VARCHAR(\"user\")]", + "Table": "information_schema.views" + } + ] + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_name = :table_name and table_name = :table_name1 and :__sq_has_values1", + "SysTableTableName": "[table_name1:VARCHAR(\"Music\"), table_name:VARCHAR(\"music\")]", + "Table": "information_schema.`tables`" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' and exists (select 1 as found from information_schema.`tables` where table_name = 'music' and table_name = 'Music' union all (select 1 as found from information_schema.views where table_name = 'music' and table_name = 'user' limit 1))", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 as found from information_schema.`tables` where 1 != 1", + "Query": "select 1 as found from information_schema.`tables` where table_name = :table_name and table_name = :table_name1 and exists (select 1 as found from information_schema.`tables` where table_name = :table_name2 and table_name = :table_name3 union all (select 1 as found from information_schema.views where table_name = :table_name4 and table_name = :table_name5 limit 1))", + "SysTableTableName": "[table_name1:VARCHAR(\"Music\"), table_name2:VARCHAR(\"music\"), table_name3:VARCHAR(\"Music\"), table_name4:VARCHAR(\"music\"), table_name5:VARCHAR(\"user\"), table_name:VARCHAR(\"music\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] + } + }, + { + "comment": "merge even one side have schema name in derived table", + "query": "select * from (select TABLE_NAME from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select TABLE_NAME from information_schema.columns) dt", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from (select TABLE_NAME from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select TABLE_NAME from information_schema.columns) dt", + "Instructions": { + "OperatorType": "SimpleProjection", + "Columns": [ + 0 + ], + "Inputs": [ + { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`tables` as t where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`tables` as t where t.TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"a\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_NAME from information_schema.`columns` where 1 != 1", + "Query": "select TABLE_NAME from information_schema.`columns`", + "Table": "information_schema.`columns`" + } + ] + } + ] + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select * from (select TABLE_NAME from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select TABLE_NAME from information_schema.columns) dt", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select dt.TABLE_NAME from (select TABLE_NAME from information_schema.`tables` as t where 1 != 1 union select TABLE_NAME from information_schema.`columns` where 1 != 1) as dt where 1 != 1", + "Query": "select dt.TABLE_NAME from (select TABLE_NAME from information_schema.`tables` as t where t.TABLE_SCHEMA = :__vtschemaname union select TABLE_NAME from information_schema.`columns`) as dt", + "SysTableTableSchema": "[VARCHAR(\"a\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.columns", + "information_schema.tables" + ] + } + }, + { + "comment": "merge even one side have schema name in subquery", + "query": "select `COLLATION_NAME` from information_schema.`COLUMNS` t where `COLUMN_NAME` in (select `COLUMN_NAME` from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select `COLUMN_NAME` from information_schema.columns)", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select `COLLATION_NAME` from information_schema.`COLUMNS` t where `COLUMN_NAME` in (select `COLUMN_NAME` from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select `COLUMN_NAME` from information_schema.columns)", + "Instructions": { + "OperatorType": "Subquery", + "Variant": "PulloutIn", + "PulloutVars": [ + "__sq_has_values1", + "__sq1" + ], + "Inputs": [ + { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select COLUMN_NAME from information_schema.`tables` as t where 1 != 1", + "Query": "select COLUMN_NAME from information_schema.`tables` as t where t.TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"a\")]", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select COLUMN_NAME from information_schema.`columns` where 1 != 1", + "Query": "select COLUMN_NAME from information_schema.`columns`", + "Table": "information_schema.`columns`" + } + ] + } + ] + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select COLLATION_NAME from information_schema.`COLUMNS` as t where 1 != 1", + "Query": "select COLLATION_NAME from information_schema.`COLUMNS` as t where :__sq_has_values1 = 1 and COLUMN_NAME in ::__sq1", + "Table": "information_schema.`COLUMNS`" + } + ] + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select `COLLATION_NAME` from information_schema.`COLUMNS` t where `COLUMN_NAME` in (select `COLUMN_NAME` from information_schema.tables t where t.TABLE_SCHEMA = 'a' union select `COLUMN_NAME` from information_schema.columns)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select COLLATION_NAME from information_schema.`COLUMNS` as t where 1 != 1", + "Query": "select COLLATION_NAME from information_schema.`COLUMNS` as t where COLUMN_NAME in (select COLUMN_NAME from information_schema.`tables` as t where t.TABLE_SCHEMA = :__vtschemaname union select COLUMN_NAME from information_schema.`columns`)", + "SysTableTableSchema": "[VARCHAR(\"a\")]", + "Table": "information_schema.`COLUMNS`" + }, + "TablesUsed": [ + "information_schema.COLUMNS", + "information_schema.columns", + "information_schema.tables" + ] + } + }, + { + "comment": "table_schema OR predicate\n# It is unsupported because we do not route queries to multiple keyspaces right now", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", + "v3-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = 'ks' or TABLE_SCHEMA = 'main'", + "Table": "INFORMATION_SCHEMA.`TABLES`" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = 'ks' or TABLE_SCHEMA = 'main'", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] + } + } +] diff --git a/go/vt/vtgate/planbuilder/testdata/systemtables_cases.json b/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json similarity index 64% rename from go/vt/vtgate/planbuilder/testdata/systemtables_cases.json rename to go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json index 235fc1c398b..41b30d32151 100644 --- a/go/vt/vtgate/planbuilder/testdata/systemtables_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/systemtables_cases80.json @@ -2,7 +2,7 @@ { "comment": "Single information_schema query", "query": "select col from information_schema.foo", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select col from information_schema.foo", "Instructions": { @@ -16,12 +16,13 @@ "Query": "select col from information_schema.foo", "Table": "information_schema.foo" } - } + }, + "gen4-plan": "symbol col not found" }, { "comment": "',' join information_schema", "query": "select a.id,b.id from information_schema.a as a, information_schema.b as b", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select a.id,b.id from information_schema.a as a, information_schema.b as b", "Instructions": { @@ -35,12 +36,13 @@ "Query": "select a.id, b.id from information_schema.a as a, information_schema.b as b", "Table": "information_schema.a, information_schema.b" } - } + }, + "gen4-plan": "symbol b.id not found" }, { "comment": "information schema query that uses table_schema", "query": "select column_name from information_schema.columns where table_schema = (select schema())", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select column_name from information_schema.columns where table_schema = (select schema())", "Instructions": { @@ -54,6 +56,24 @@ "Query": "select column_name from information_schema.`columns` where table_schema = schema()", "Table": "information_schema.`columns`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select column_name from information_schema.columns where table_schema = (select schema())", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.`columns` where 1 != 1", + "Query": "select column_name from information_schema.`columns` where table_schema = schema()", + "Table": "information_schema.`columns`" + }, + "TablesUsed": [ + "information_schema.columns" + ] } }, { @@ -87,13 +107,17 @@ "FieldQuery": "select * from information_schema.a, information_schema.b where 1 != 1", "Query": "select * from information_schema.a, information_schema.b", "Table": "information_schema.a, information_schema.b" - } + }, + "TablesUsed": [ + "information_schema.a", + "information_schema.b" + ] } }, { "comment": "access to unqualified column names in information_schema", "query": "select * from information_schema.a where b=10", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select * from information_schema.a where b=10", "Instructions": { @@ -107,7 +131,8 @@ "Query": "select * from information_schema.a where b = 10", "Table": "information_schema.a" } - } + }, + "gen4-plan": "symbol b not found" }, { "comment": "access to qualified column names in information_schema", @@ -127,9 +152,14 @@ "Table": "information_schema.a" } }, - "gen4-plan": { + "gen4-plan": "symbol information_schema.a.b not found" + }, + { + "comment": "union of information_schema", + "query": "select * from information_schema.a union select * from information_schema.b", + "v3-plan": { "QueryType": "SELECT", - "Original": "select * from information_schema.a where information_schema.a.b=10", + "Original": "select * from information_schema.a union select * from information_schema.b", "Instructions": { "OperatorType": "Route", "Variant": "DBA", @@ -137,16 +167,12 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select * from information_schema.a where 1 != 1", - "Query": "select * from information_schema.a where a.b = 10", + "FieldQuery": "select * from information_schema.a where 1 != 1 union select * from information_schema.b where 1 != 1", + "Query": "select * from information_schema.a union select * from information_schema.b", "Table": "information_schema.a" } - } - }, - { - "comment": "union of information_schema", - "query": "select * from information_schema.a union select * from information_schema.b", - "plan": { + }, + "gen4-plan": { "QueryType": "SELECT", "Original": "select * from information_schema.a union select * from information_schema.b", "Instructions": { @@ -159,7 +185,11 @@ "FieldQuery": "select * from information_schema.a where 1 != 1 union select * from information_schema.b where 1 != 1", "Query": "select * from information_schema.a union select * from information_schema.b", "Table": "information_schema.a" - } + }, + "TablesUsed": [ + "information_schema.a", + "information_schema.b" + ] } }, { @@ -208,6 +238,30 @@ "Original": "select * from information_schema.tables where table_schema = 'user' union select * from information_schema.tables where table_schema = 'main'", "Instructions": { "OperatorType": "Distinct", + "Collations": [ + "(0:21)", + "(1:22)", + "(2:23)", + "(3:24)", + "(4:25)", + "5: binary", + "(6:26)", + "7: binary", + "8: binary", + "9: binary", + "10: binary", + "11: binary", + "12: binary", + "13: binary", + "(14:27)", + "(15:28)", + "(16:29)", + "(17:30)", + "18: binary", + "(19:31)", + "(20:32)" + ], + "ResultColumns": 21, "Inputs": [ { "OperatorType": "Concatenate", @@ -219,8 +273,8 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select * from information_schema.`tables` where 1 != 1", - "Query": "select distinct * from information_schema.`tables` where table_schema = :__vtschemaname", + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where 1 != 1", + "Query": "select distinct TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where table_schema = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"user\")]", "Table": "information_schema.`tables`" }, @@ -231,15 +285,18 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select * from information_schema.`tables` where 1 != 1", - "Query": "select distinct * from information_schema.`tables` where table_schema = :__vtschemaname", + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where 1 != 1", + "Query": "select distinct TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT, weight_string(TABLE_CATALOG), weight_string(TABLE_SCHEMA), weight_string(TABLE_NAME), weight_string(TABLE_TYPE), weight_string(`ENGINE`), weight_string(`ROW_FORMAT`), weight_string(CREATE_TIME), weight_string(UPDATE_TIME), weight_string(CHECK_TIME), weight_string(TABLE_COLLATION), weight_string(CREATE_OPTIONS), weight_string(TABLE_COMMENT) from information_schema.`tables` where table_schema = :__vtschemaname", "SysTableTableSchema": "[VARCHAR(\"main\")]", "Table": "information_schema.`tables`" } ] } ] - } + }, + "TablesUsed": [ + "information_schema.tables" + ] } }, { @@ -277,7 +334,11 @@ "SysTableTableName": "[KCU_TABLE_NAME:VARCHAR(\"data_type_table\")]", "SysTableTableSchema": "[VARCHAR(\"test\")]", "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS" - } + }, + "TablesUsed": [ + "information_schema.KEY_COLUMN_USAGE", + "information_schema.REFERENTIAL_CONSTRAINTS" + ] } }, { @@ -321,9 +382,14 @@ ] } }, - "gen4-plan": { + "gen4-plan": "symbol S.TABLE_NAME not found" + }, + { + "comment": "information_schema.routines", + "query": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", + "v3-plan": { "QueryType": "SELECT", - "Original": "SELECT KCU.DELETE_RULE, S.UPDATE_RULE FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME, INFORMATION_SCHEMA.K AS S WHERE KCU.TABLE_SCHEMA = 'test' AND KCU.TABLE_NAME = 'data_type_table' AND KCU.TABLE_NAME = 'data_type_table' AND S.TABLE_SCHEMA = 'test' AND S.TABLE_NAME = 'sc' ORDER BY KCU.CONSTRAINT_NAME, KCU.COLUMN_NAME", + "Original": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", "Instructions": { "OperatorType": "Route", "Variant": "DBA", @@ -331,18 +397,13 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select KCU.DELETE_RULE, S.UPDATE_RULE from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC, INFORMATION_SCHEMA.K as S where 1 != 1", - "Query": "select KCU.DELETE_RULE, S.UPDATE_RULE from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as RC, INFORMATION_SCHEMA.K as S where S.TABLE_SCHEMA = :__vtschemaname and S.TABLE_NAME = :S_TABLE_NAME and KCU.TABLE_SCHEMA = :__vtschemaname and KCU.TABLE_NAME = :KCU_TABLE_NAME and KCU.TABLE_NAME = :KCU_TABLE_NAME1 and KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME order by KCU.CONSTRAINT_NAME asc, KCU.COLUMN_NAME asc", - "SysTableTableName": "[KCU_TABLE_NAME1:VARCHAR(\"data_type_table\"), KCU_TABLE_NAME:VARCHAR(\"data_type_table\"), S_TABLE_NAME:VARCHAR(\"sc\")]", - "SysTableTableSchema": "[VARCHAR(\"test\"), VARCHAR(\"test\")]", - "Table": "INFORMATION_SCHEMA.K, INFORMATION_SCHEMA.KEY_COLUMN_USAGE, INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS" + "FieldQuery": "select routine_name as `name`, routine_definition as definition from information_schema.routines where 1 != 1", + "Query": "select routine_name as `name`, routine_definition as definition from information_schema.routines where ROUTINE_SCHEMA = :__vtschemaname and ROUTINE_TYPE = 'PROCEDURE'", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.routines" } - } - }, - { - "comment": "information_schema.routines", - "query": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", - "plan": { + }, + "gen4-plan": { "QueryType": "SELECT", "Original": "SELECT routine_name AS name, routine_definition AS definition FROM information_schema.routines WHERE ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'", "Instructions": { @@ -356,13 +417,16 @@ "Query": "select routine_name as `name`, routine_definition as definition from information_schema.routines where ROUTINE_SCHEMA = :__vtschemaname and ROUTINE_TYPE = 'PROCEDURE'", "SysTableTableSchema": "[:v1]", "Table": "information_schema.routines" - } + }, + "TablesUsed": [ + "information_schema.routines" + ] } }, { "comment": "information_schema table sizes", "query": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", "Instructions": { @@ -377,6 +441,25 @@ "SysTableTableSchema": "[:v1]", "Table": "information_schema.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT SUM(data_length + index_length) as size FROM information_schema.TABLES WHERE table_schema = ?", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select sum(data_length + index_length) as size from information_schema.`TABLES` where 1 != 1", + "Query": "select sum(data_length + index_length) as size from information_schema.`TABLES` where table_schema = :__vtschemaname", + "SysTableTableSchema": "[:v1]", + "Table": "information_schema.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { @@ -412,7 +495,11 @@ "Query": "select kcu.constraint_name as constraint_name, kcu.column_name as column_name, kcu.referenced_table_name as referenced_table_name, kcu.referenced_column_name as referenced_column_name, kcu.ordinal_position as ordinal_position, kcu.table_name as table_name, rc.delete_rule as delete_rule, rc.update_rule as update_rule from information_schema.key_column_usage as kcu, information_schema.referential_constraints as rc where kcu.table_schema = :__vtschemaname and kcu.referenced_column_name is not null and rc.constraint_schema = :__vtschemaname and kcu.constraint_name = rc.constraint_name order by ordinal_position asc", "SysTableTableSchema": "[:v1, :v2]", "Table": "information_schema.key_column_usage, information_schema.referential_constraints" - } + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] } }, { @@ -445,16 +532,20 @@ "Sharded": false }, "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where 1 != 1", - "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = database() and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = :fk_table_name", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = database() and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = database() and fk.table_name = :fk_table_name and rc.constraint_schema = fk.constraint_schema and rc.constraint_name = fk.constraint_name", "SysTableTableName": "[fk_table_name:VARCHAR(\":vtg1\"), rc_table_name:VARCHAR(\":vtg1\")]", "Table": "information_schema.key_column_usage, information_schema.referential_constraints" - } + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] } }, { "comment": "rails_query 2", "query": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", "Instructions": { @@ -469,12 +560,31 @@ "SysTableTableSchema": "[VARCHAR(\"user\")]", "Table": "information_schema.schemata" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM information_schema.schemata WHERE schema_name = 'user'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, SQL_PATH, DEFAULT_ENCRYPTION from information_schema.schemata where 1 != 1", + "Query": "select CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, SQL_PATH, DEFAULT_ENCRYPTION from information_schema.schemata where schema_name = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\")]", + "Table": "information_schema.schemata" + }, + "TablesUsed": [ + "information_schema.schemata" + ] } }, { "comment": "rails_query 3", "query": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", "Instructions": { @@ -490,6 +600,26 @@ "SysTableTableSchema": "[VARCHAR(\"schema_name\")]", "Table": "information_schema.`tables`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_comment FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_comment from information_schema.`tables` where 1 != 1", + "Query": "select table_comment from information_schema.`tables` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"schema_name\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables" + ] } }, { @@ -523,11 +653,15 @@ "Sharded": false }, "FieldQuery": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where 1 != 1", - "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = :__vtschemaname and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = :__vtschemaname and fk.table_name = :fk_table_name", + "Query": "select fk.referenced_table_name as to_table, fk.referenced_column_name as primary_key, fk.column_name as `column`, fk.constraint_name as `name`, rc.update_rule as on_update, rc.delete_rule as on_delete from information_schema.referential_constraints as rc, information_schema.key_column_usage as fk where rc.constraint_schema = :__vtschemaname and rc.table_name = :rc_table_name and fk.referenced_column_name is not null and fk.table_schema = :__vtschemaname and fk.table_name = :fk_table_name and rc.constraint_schema = fk.constraint_schema and rc.constraint_name = fk.constraint_name", "SysTableTableName": "[fk_table_name:VARCHAR(\"table_name\"), rc_table_name:VARCHAR(\"table_name\")]", "SysTableTableSchema": "[VARCHAR(\"table_schema\"), VARCHAR(\"table_schema\")]", "Table": "information_schema.key_column_usage, information_schema.referential_constraints" - } + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] } }, { @@ -561,17 +695,21 @@ "Sharded": false }, "FieldQuery": "select cc.constraint_name as `name`, cc.check_clause as expression from information_schema.check_constraints as cc, information_schema.table_constraints as tc where 1 != 1", - "Query": "select cc.constraint_name as `name`, cc.check_clause as expression from information_schema.check_constraints as cc, information_schema.table_constraints as tc where cc.constraint_schema = :__vtschemaname and tc.table_schema = :__vtschemaname and tc.table_name = :tc_table_name", + "Query": "select cc.constraint_name as `name`, cc.check_clause as expression from information_schema.check_constraints as cc, information_schema.table_constraints as tc where cc.constraint_schema = :__vtschemaname and tc.table_schema = :__vtschemaname and tc.table_name = :tc_table_name and cc.constraint_schema = tc.constraint_schema and cc.constraint_name = tc.constraint_name", "SysTableTableName": "[tc_table_name:VARCHAR(\"table_name\")]", "SysTableTableSchema": "[VARCHAR(\"constraint_schema\"), VARCHAR(\"table_schema\")]", "Table": "information_schema.check_constraints, information_schema.table_constraints" - } + }, + "TablesUsed": [ + "information_schema.check_constraints", + "information_schema.table_constraints" + ] } }, { "comment": "rails_query 6", "query": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", "Instructions": { @@ -587,12 +725,32 @@ "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", "Table": "information_schema.statistics" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT column_name FROM information_schema.statistics WHERE index_name = 'PRIMARY' AND table_schema = 'table_schema' AND table_name = 'table_name' ORDER BY seq_in_index", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select column_name from information_schema.statistics where 1 != 1", + "Query": "select column_name from information_schema.statistics where index_name = 'PRIMARY' and table_schema = :__vtschemaname and table_name = :table_name order by seq_in_index asc", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.statistics" + }, + "TablesUsed": [ + "information_schema.statistics" + ] } }, { "comment": "rails_query 7", "query": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", "Instructions": { @@ -608,12 +766,32 @@ "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", "Table": "information_schema.`columns`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT generation_expression FROM information_schema.columns WHERE table_schema = 'table_schema' AND table_name = 'table_name' AND column_name = 'column_name'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select generation_expression from information_schema.`columns` where 1 != 1", + "Query": "select generation_expression from information_schema.`columns` where table_schema = :__vtschemaname and table_name = :table_name and column_name = 'column_name'", + "SysTableTableName": "[table_name:VARCHAR(\"table_name\")]", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`columns`" + }, + "TablesUsed": [ + "information_schema.columns" + ] } }, { "comment": "rails_query 8", "query": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", "Instructions": { @@ -627,12 +805,30 @@ "Query": "select id from information_schema.`processlist` where info like '% FOR UPDATE'", "Table": "information_schema.`processlist`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT id FROM information_schema.processlist WHERE info LIKE '% FOR UPDATE'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select id from information_schema.`processlist` where 1 != 1", + "Query": "select id from information_schema.`processlist` where info like '% FOR UPDATE'", + "Table": "information_schema.`processlist`" + }, + "TablesUsed": [ + "information_schema.processlist" + ] } }, { "comment": "rails_query 9", "query": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", "Instructions": { @@ -647,6 +843,25 @@ "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", "Table": "information_schema.`tables`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT table_name FROM (SELECT * FROM information_schema.tables WHERE table_schema = 'table_schema') _subquery", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where table_schema = :__vtschemaname) as _subquery", + "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", + "Table": "information_schema.`tables`" + }, + "TablesUsed": [ + "information_schema.tables" + ] } }, { @@ -679,17 +894,20 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select table_name from (select * from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", - "Query": "select table_name from (select * from information_schema.`tables` where table_schema = :__vtschemaname and table_type = 'table_type' and table_name = 'table_name') as _subquery", + "FieldQuery": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where 1 != 1) as _subquery where 1 != 1", + "Query": "select table_name from (select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from information_schema.`tables` where table_schema = :__vtschemaname and table_type = 'table_type' and table_name = 'table_name') as _subquery", "SysTableTableSchema": "[VARCHAR(\"table_schema\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables" + ] } }, { "comment": "two predicates specifying the database for the same table work if the database is the same", "query": "SELECT cc.constraint_name AS 'name' FROM information_schema.check_constraints cc WHERE cc.constraint_schema = 'a' AND cc.table_schema = 'a'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT cc.constraint_name AS 'name' FROM information_schema.check_constraints cc WHERE cc.constraint_schema = 'a' AND cc.table_schema = 'a'", "Instructions": { @@ -704,12 +922,13 @@ "SysTableTableSchema": "[VARCHAR(\"a\"), VARCHAR(\"a\")]", "Table": "information_schema.check_constraints" } - } + }, + "gen4-plan": "symbol cc.table_schema not found" }, { "comment": "system schema in where clause of information_schema query", "query": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", "Instructions": { @@ -725,14 +944,10 @@ "SysTableTableSchema": "[VARCHAR(\"performance_schema\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } - } - }, - { - "comment": "subquery of information_schema with itself", - "query": "select * from information_schema.a where id in (select * from information_schema.b)", - "plan": { + }, + "gen4-plan": { "QueryType": "SELECT", - "Original": "select * from information_schema.a where id in (select * from information_schema.b)", + "Original": "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND table_name = 'foo'", "Instructions": { "OperatorType": "Route", "Variant": "DBA", @@ -740,16 +955,41 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select * from information_schema.a where 1 != 1", - "Query": "select * from information_schema.a where id in (select * from information_schema.b)", - "Table": "information_schema.a" - } + "FieldQuery": "select count(*) from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select count(*) from INFORMATION_SCHEMA.`TABLES` where table_schema = :__vtschemaname and table_name = :table_name", + "SysTableTableName": "[table_name:VARCHAR(\"foo\")]", + "SysTableTableSchema": "[VARCHAR(\"performance_schema\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, + { + "comment": "subquery of information_schema with itself", + "query": "select * from information_schema.a where id in (select * from information_schema.b)", + "v3-plan": { + "QueryType": "SELECT", + "Original": "select * from information_schema.a where id in (select * from information_schema.b)", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from information_schema.a where 1 != 1", + "Query": "select * from information_schema.a where id in (select * from information_schema.b)", + "Table": "information_schema.a" + } + }, + "gen4-plan": "symbol id not found" + }, { "comment": "query trying to query two different keyspaces at the same time", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", "Instructions": { @@ -764,12 +1004,31 @@ "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'user' AND TABLE_SCHEMA = 'main'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"main\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { "comment": "information_schema query using database() func", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", "Instructions": { @@ -783,12 +1042,30 @@ "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = database()", "Table": "INFORMATION_SCHEMA.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = database()", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = database()", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { "comment": "table_schema predicate the wrong way around", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", "Instructions": { @@ -803,12 +1080,31 @@ "SysTableTableSchema": "[VARCHAR(\"ks\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 'ks' = TABLE_SCHEMA", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { "comment": "table_name predicate against a routed table", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", "Instructions": { @@ -824,12 +1120,32 @@ "SysTableTableSchema": "[VARCHAR(\"ks\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 'route1'", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = :__vtschemaname and TABLE_NAME = :TABLE_NAME", + "SysTableTableName": "[TABLE_NAME:VARCHAR(\"route1\")]", + "SysTableTableSchema": "[VARCHAR(\"ks\")]", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { "comment": "information_schema query with additional predicates", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' and other_column = 42", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' and other_column = 42", "Instructions": { @@ -844,12 +1160,13 @@ "SysTableTableSchema": "[VARCHAR(\"ks\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } - } + }, + "gen4-plan": "symbol other_column not found" }, { "comment": "able to isolate table_schema value even when hidden inside of ORs", "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_SCHEMA = 'ks' and other_column = 42) OR (TABLE_SCHEMA = 'ks' and foobar = 'value')", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_SCHEMA = 'ks' and other_column = 42) OR (TABLE_SCHEMA = 'ks' and foobar = 'value')", "Instructions": { @@ -864,12 +1181,13 @@ "SysTableTableSchema": "[VARCHAR(\"ks\")]", "Table": "INFORMATION_SCHEMA.`TABLES`" } - } + }, + "gen4-plan": "symbol foobar not found" }, { "comment": "expand star with information schema", "query": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", "Instructions": { @@ -883,6 +1201,24 @@ "Query": "select x.table_name from (select a.* from information_schema.key_column_usage as a) as x", "Table": "information_schema.key_column_usage" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", + "Query": "select x.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a) as x", + "Table": "information_schema.key_column_usage" + }, + "TablesUsed": [ + "information_schema.key_column_usage" + ] } }, { @@ -929,55 +1265,12 @@ ] } }, - "gen4-plan": { - "QueryType": "SELECT", - "Original": "select x.table_name from (select a.* from information_schema.key_column_usage a) x join user on x.id = user.id", - "Instructions": { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "L:1", - "JoinVars": { - "x_id": 0 - }, - "TableName": "information_schema.key_column_usage_`user`", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "DBA", - "Keyspace": { - "Name": "main", - "Sharded": false - }, - "FieldQuery": "select x.id, x.table_name from (select a.* from information_schema.key_column_usage as a where 1 != 1) as x where 1 != 1", - "Query": "select x.id, x.table_name from (select a.* from information_schema.key_column_usage as a) as x", - "Table": "information_schema.key_column_usage" - }, - { - "OperatorType": "Route", - "Variant": "EqualUnique", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select 1 from `user` where 1 != 1", - "Query": "select 1 from `user` where `user`.id = :x_id", - "Table": "`user`", - "Values": [ - ":x_id" - ], - "Vindex": "user_index" - } - ] - }, - "TablesUsed": [ - "user.user" - ] - } + "gen4-plan": "symbol x.id not found" }, { "comment": "join of information_schema queries with select stars exprs", "query": "select a.*, b.* from information_schema.a a, information_schema.b b", - "plan": { + "v3-plan": { "QueryType": "SELECT", "Original": "select a.*, b.* from information_schema.a a, information_schema.b b", "Instructions": { @@ -991,6 +1284,25 @@ "Query": "select a.*, b.* from information_schema.a as a, information_schema.b as b", "Table": "information_schema.a, information_schema.b" } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select a.*, b.* from information_schema.a a, information_schema.b b", + "Instructions": { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a.*, b.* from information_schema.a as a, information_schema.b as b where 1 != 1", + "Query": "select a.*, b.* from information_schema.a as a, information_schema.b as b", + "Table": "information_schema.a, information_schema.b" + }, + "TablesUsed": [ + "information_schema.a", + "information_schema.b" + ] } }, { @@ -1022,14 +1334,19 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select a.table_name from (select * from information_schema.key_column_usage as a where 1 != 1) as a, (select * from information_schema.referential_constraints where 1 != 1) as b where 1 != 1", - "Query": "select a.table_name from (select * from information_schema.key_column_usage as a where a.table_name = :a_table_name) as a, (select * from information_schema.referential_constraints where table_name = :table_name) as b", + "FieldQuery": "select a.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where 1 != 1) as a, (select CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE, TABLE_NAME, REFERENCED_TABLE_NAME from information_schema.referential_constraints where 1 != 1) as b where 1 != 1", + "Query": "select a.table_name from (select a.CONSTRAINT_CATALOG, a.CONSTRAINT_SCHEMA, a.CONSTRAINT_NAME, a.TABLE_CATALOG, a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME, a.ORDINAL_POSITION, a.POSITION_IN_UNIQUE_CONSTRAINT, a.REFERENCED_TABLE_SCHEMA, a.REFERENCED_TABLE_NAME, a.REFERENCED_COLUMN_NAME from information_schema.key_column_usage as a where a.table_name = :a_table_name) as a, (select CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE, TABLE_NAME, REFERENCED_TABLE_NAME from information_schema.referential_constraints where table_name = :table_name) as b", "SysTableTableName": "[a_table_name:VARCHAR(\"users\"), table_name:VARCHAR(\"users\")]", "Table": "information_schema.key_column_usage, information_schema.referential_constraints" - } + }, + "TablesUsed": [ + "information_schema.key_column_usage", + "information_schema.referential_constraints" + ] } }, { + "comment": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", "query": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = 'music' union all (select 1 as found from information_schema.views where table_schema = 'music' limit 1)) as t", "v3-plan": "unsupported: cross-shard query with aggregates", "gen4-plan": { @@ -1046,7 +1363,11 @@ "Query": "select sum(found) from (select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)) as t", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"music\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] } }, { @@ -1107,7 +1428,11 @@ "Query": "select found from (select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)) as t", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"music\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] } }, { @@ -1160,7 +1485,11 @@ "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] } }, { @@ -1213,7 +1542,11 @@ "Query": "select 1 as found from information_schema.`tables` where table_schema = :__vtschemaname union all (select 1 as found from information_schema.views where table_schema = :__vtschemaname limit 1)", "SysTableTableSchema": "[VARCHAR(\"music\"), VARCHAR(\"Music\"), VARCHAR(\"music\"), VARCHAR(\"user\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] } }, { @@ -1288,7 +1621,11 @@ "Query": "select 1 as found from information_schema.`tables` where table_name = :table_name and table_name = :table_name1 and exists (select 1 as found from information_schema.`tables` where table_name = :table_name2 and table_name = :table_name3 union all (select 1 as found from information_schema.views where table_name = :table_name4 and table_name = :table_name5 limit 1))", "SysTableTableName": "[table_name1:VARCHAR(\"Music\"), table_name2:VARCHAR(\"music\"), table_name3:VARCHAR(\"Music\"), table_name4:VARCHAR(\"music\"), table_name5:VARCHAR(\"user\"), table_name:VARCHAR(\"music\")]", "Table": "information_schema.`tables`" - } + }, + "TablesUsed": [ + "information_schema.tables", + "information_schema.views" + ] } }, { @@ -1339,22 +1676,7 @@ ] } }, - "gen4-plan": { - "QueryType": "SELECT", - "Original": "select id from (select id from information_schema.table t where t.schema_name = 'a' union select id from information_schema.columns) dt", - "Instructions": { - "OperatorType": "Route", - "Variant": "DBA", - "Keyspace": { - "Name": "main", - "Sharded": false - }, - "FieldQuery": "select id from (select id from information_schema.`table` as t where 1 != 1 union select id from information_schema.`columns` where 1 != 1) as dt where 1 != 1", - "Query": "select id from (select id from information_schema.`table` as t where t.schema_name = :__vtschemaname union select id from information_schema.`columns`) as dt", - "SysTableTableSchema": "[VARCHAR(\"a\")]", - "Table": "information_schema.`table`" - } - } + "gen4-plan": "symbol id not found" }, { "comment": "merge even one side have schema name in subquery", @@ -1417,9 +1739,14 @@ ] } }, - "gen4-plan": { + "gen4-plan": "symbol id not found" + }, + { + "comment": "table_schema OR predicate\n# It is unsupported because we do not route queries to multiple keyspaces right now", + "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", + "v3-plan": { "QueryType": "SELECT", - "Original": "select id from information_schema.random t where t.col in (select id from information_schema.table t where t.schema_name = 'a' union select id from information_schema.columns)", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", "Instructions": { "OperatorType": "Route", "Variant": "DBA", @@ -1427,20 +1754,14 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select id from information_schema.random as t where 1 != 1", - "Query": "select id from information_schema.random as t where t.col in (select id from information_schema.`table` as t where t.schema_name = :__vtschemaname union select id from information_schema.`columns`)", - "SysTableTableSchema": "[VARCHAR(\"a\")]", - "Table": "information_schema.random" + "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = 'ks' or TABLE_SCHEMA = 'main'", + "Table": "INFORMATION_SCHEMA.`TABLES`" } - } - }, - { - "comment": "systable union query in derived table with constraint on outside (star projection)", - "query": "select * from (select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `constraint_name` = 'primary'", - "v3-plan": "symbol constraint_name not found in table or subquery", + }, "gen4-plan": { "QueryType": "SELECT", - "Original": "select * from (select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select * from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `constraint_name` = 'primary'", + "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", "Instructions": { "OperatorType": "Route", "Variant": "DBA", @@ -1448,31 +1769,102 @@ "Name": "main", "Sharded": false }, - "FieldQuery": "select * from (select * from information_schema.key_column_usage as kcu where 1 != 1 union select * from information_schema.key_column_usage as kcu where 1 != 1) as kcu where 1 != 1", - "Query": "select * from (select * from information_schema.key_column_usage as kcu where kcu.table_schema = :__vtschemaname and kcu.table_name = :kcu_table_name and constraint_name = 'primary' union select * from information_schema.key_column_usage as kcu where kcu.table_schema = :__vtschemaname and kcu.table_name = :kcu_table_name1 and constraint_name = 'primary') as kcu", - "SysTableTableName": "[kcu_table_name1:VARCHAR(\"music\"), kcu_table_name:VARCHAR(\"user_extra\")]", - "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"user\")]", - "Table": "information_schema.key_column_usage" - } + "FieldQuery": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where 1 != 1", + "Query": "select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, `ENGINE`, VERSION, `ROW_FORMAT`, TABLE_ROWS, `AVG_ROW_LENGTH`, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, `AUTO_INCREMENT`, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, `CHECKSUM`, CREATE_OPTIONS, TABLE_COMMENT from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = 'ks' or TABLE_SCHEMA = 'main'", + "Table": "INFORMATION_SCHEMA.`TABLES`" + }, + "TablesUsed": [ + "information_schema.TABLES" + ] } }, { - "comment": "table_schema OR predicate\n# It is unsupported because we do not route queries to multiple keyspaces right now", - "query": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", - "plan": { + "comment": "Query from TypeORM", + "query": "SELECT * FROM ( SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'fuelings' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'order_payments' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'pools' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'orders' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'order_hops' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'markets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'market_outlets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'prefuel' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'billing_statements' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'perp_markets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'perp_market_outlets' ) `kcu` WHERE `CONSTRAINT_NAME` = 'PRIMARY'", + "v3-plan": "symbol CONSTRAINT_NAME not found in table or subquery", + "gen4-plan": { "QueryType": "SELECT", - "Original": "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'ks' OR TABLE_SCHEMA = 'main'", + "Original": "SELECT * FROM ( SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'fuelings' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'order_payments' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'pools' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'orders' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'order_hops' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'markets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'market_outlets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'prefuel' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'billing_statements' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'perp_markets' UNION SELECT * FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu` WHERE `kcu`.`TABLE_SCHEMA` = 'rio' AND `kcu`.`TABLE_NAME` = 'perp_market_outlets' ) `kcu` WHERE `CONSTRAINT_NAME` = 'PRIMARY'", "Instructions": { - "OperatorType": "Route", - "Variant": "DBA", - "Keyspace": { - "Name": "main", - "Sharded": false - }, - "FieldQuery": "select * from INFORMATION_SCHEMA.`TABLES` where 1 != 1", - "Query": "select * from INFORMATION_SCHEMA.`TABLES` where TABLE_SCHEMA = 'ks' or TABLE_SCHEMA = 'main'", - "Table": "INFORMATION_SCHEMA.`TABLES`" - } + "OperatorType": "SimpleProjection", + "Columns": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "Inputs": [ + { + "OperatorType": "Filter", + "Predicate": "kcu.CONSTRAINT_NAME = 'PRIMARY'", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1 union select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where 1 != 1", + "Query": "select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME1 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME2 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME3 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME4 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME5 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME6 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME7 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME8 union all select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME9 union select kcu.CONSTRAINT_CATALOG, kcu.CONSTRAINT_SCHEMA, kcu.CONSTRAINT_NAME, kcu.TABLE_CATALOG, kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION, kcu.POSITION_IN_UNIQUE_CONSTRAINT, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu where kcu.TABLE_SCHEMA = :__vtschemaname and kcu.TABLE_NAME = :kcu_TABLE_NAME10", + "SysTableTableName": "[kcu_TABLE_NAME10:VARCHAR(\"perp_market_outlets\"), kcu_TABLE_NAME1:VARCHAR(\"order_payments\"), kcu_TABLE_NAME2:VARCHAR(\"pools\"), kcu_TABLE_NAME3:VARCHAR(\"orders\"), kcu_TABLE_NAME4:VARCHAR(\"order_hops\"), kcu_TABLE_NAME5:VARCHAR(\"markets\"), kcu_TABLE_NAME6:VARCHAR(\"market_outlets\"), kcu_TABLE_NAME7:VARCHAR(\"prefuel\"), kcu_TABLE_NAME8:VARCHAR(\"billing_statements\"), kcu_TABLE_NAME9:VARCHAR(\"perp_markets\"), kcu_TABLE_NAME:VARCHAR(\"fuelings\")]", + "SysTableTableSchema": "[VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\"), VARCHAR(\"rio\")]", + "Table": "INFORMATION_SCHEMA.KEY_COLUMN_USAGE" + } + ] + } + ] + }, + "TablesUsed": [ + "information_schema.KEY_COLUMN_USAGE" + ] + } + }, + { + "comment": "systable union query in derived table with constraint on outside (without star projection)", + "query": "select CONSTRAINT_NAME from (select CONSTRAINT_NAME from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select CONSTRAINT_NAME from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `CONSTRAINT_NAME` = 'primary'", + "v3-plan": "unsupported: filtering on results of cross-shard subquery", + "gen4-plan": { + "QueryType": "SELECT", + "Original": "select CONSTRAINT_NAME from (select CONSTRAINT_NAME from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'user_extra' union select CONSTRAINT_NAME from `information_schema`.`key_column_usage` `kcu` where `kcu`.`table_schema` = 'user' and `kcu`.`table_name` = 'music') `kcu` where `CONSTRAINT_NAME` = 'primary'", + "Instructions": { + "OperatorType": "SimpleProjection", + "Columns": [ + 0 + ], + "Inputs": [ + { + "OperatorType": "Filter", + "Predicate": "CONSTRAINT_NAME = 'primary'", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select CONSTRAINT_NAME from information_schema.key_column_usage as kcu where 1 != 1 union select CONSTRAINT_NAME from information_schema.key_column_usage as kcu where 1 != 1", + "Query": "select CONSTRAINT_NAME from information_schema.key_column_usage as kcu where kcu.table_schema = :__vtschemaname and kcu.table_name = :kcu_table_name union select CONSTRAINT_NAME from information_schema.key_column_usage as kcu where kcu.table_schema = :__vtschemaname and kcu.table_name = :kcu_table_name1", + "SysTableTableName": "[kcu_table_name1:VARCHAR(\"music\"), kcu_table_name:VARCHAR(\"user_extra\")]", + "SysTableTableSchema": "[VARCHAR(\"user\"), VARCHAR(\"user\")]", + "Table": "information_schema.key_column_usage" + } + ] + } + ] + }, + "TablesUsed": [ + "information_schema.key_column_usage" + ] } } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json index 087448bc990..90ac48623f3 100644 --- a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json @@ -38,7 +38,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as l_orderkey", - "([COLUMN 6] * [COLUMN 7]) * [COLUMN 8] as revenue", + "([COLUMN 6] * COALESCE([COLUMN 7], INT64(1))) * COALESCE([COLUMN 8], INT64(1)) as revenue", "[COLUMN 1] as o_orderdate", "[COLUMN 2] as o_shippriority", "[COLUMN 5]", @@ -247,7 +247,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as n_name", - "(((([COLUMN 2] * [COLUMN 3]) * [COLUMN 4]) * [COLUMN 5]) * [COLUMN 6]) * [COLUMN 7] as revenue", + "(((([COLUMN 2] * COALESCE([COLUMN 3], INT64(1))) * COALESCE([COLUMN 4], INT64(1))) * COALESCE([COLUMN 5], INT64(1))) * COALESCE([COLUMN 6], INT64(1))) * COALESCE([COLUMN 7], INT64(1)) as revenue", "[COLUMN 1]" ], "Inputs": [ @@ -512,7 +512,7 @@ "[COLUMN 4] as supp_nation", "[COLUMN 5] as cust_nation", "[COLUMN 6] as l_year", - "(((([COLUMN 10] * [COLUMN 11]) * [COLUMN 12]) * [COLUMN 13]) * [COLUMN 14]) * [COLUMN 15] as revenue", + "(((([COLUMN 10] * COALESCE([COLUMN 11], INT64(1))) * COALESCE([COLUMN 12], INT64(1))) * COALESCE([COLUMN 13], INT64(1))) * COALESCE([COLUMN 14], INT64(1))) * COALESCE([COLUMN 15], INT64(1)) as revenue", "[COLUMN 9]", "[COLUMN 8]", "[COLUMN 7]" @@ -720,7 +720,7 @@ "Expressions": [ "[COLUMN 0] as c_custkey", "[COLUMN 1] as c_name", - "(([COLUMN 14] * [COLUMN 15]) * [COLUMN 16]) * [COLUMN 17] as revenue", + "(([COLUMN 14] * COALESCE([COLUMN 15], INT64(1))) * COALESCE([COLUMN 16], INT64(1))) * COALESCE([COLUMN 17], INT64(1)) as revenue", "[COLUMN 2] as c_acctbal", "[COLUMN 4] as n_name", "[COLUMN 5] as c_address", @@ -896,8 +896,8 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as l_shipmode", - "[COLUMN 2] * [COLUMN 3] as high_line_count", - "[COLUMN 4] * [COLUMN 5] as low_line_count", + "[COLUMN 2] * COALESCE([COLUMN 3], INT64(1)) as high_line_count", + "[COLUMN 4] * COALESCE([COLUMN 5], INT64(1)) as low_line_count", "[COLUMN 1]" ], "Inputs": [ @@ -1153,7 +1153,7 @@ "[COLUMN 4] as o_orderkey", "[COLUMN 1] as o_orderdate", "[COLUMN 0] as o_totalprice", - "([COLUMN 10] * [COLUMN 11]) * [COLUMN 12] as sum(l_quantity)", + "([COLUMN 10] * COALESCE([COLUMN 11], INT64(1))) * COALESCE([COLUMN 12], INT64(1)) as sum(l_quantity)", "[COLUMN 9]", "[COLUMN 8]", "[COLUMN 7]", @@ -1288,7 +1288,7 @@ { "OperatorType": "Projection", "Expressions": [ - "[COLUMN 0] * [COLUMN 1] as revenue" + "[COLUMN 0] * COALESCE([COLUMN 1], INT64(1)) as revenue" ], "Inputs": [ { @@ -1370,7 +1370,7 @@ "OperatorType": "Projection", "Expressions": [ "[COLUMN 0] as s_name", - "(([COLUMN 2] * [COLUMN 3]) * [COLUMN 4]) * [COLUMN 5] as numwait", + "(([COLUMN 2] * COALESCE([COLUMN 3], INT64(1))) * COALESCE([COLUMN 4], INT64(1))) * COALESCE([COLUMN 5], INT64(1)) as numwait", "[COLUMN 1]" ], "Inputs": [ diff --git a/go/vt/vtgate/planbuilder/testdata/union_cases.json b/go/vt/vtgate/planbuilder/testdata/union_cases.json index e32d28c862c..62970b1b2b1 100644 --- a/go/vt/vtgate/planbuilder/testdata/union_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/union_cases.json @@ -660,6 +660,7 @@ ] }, "TablesUsed": [ + "information_schema.a", "main.unsharded" ] } @@ -739,6 +740,7 @@ ] }, "TablesUsed": [ + "information_schema.a", "main.unsharded" ] } @@ -2286,6 +2288,7 @@ "plan": "can't do ORDER BY on top of UNION" }, { + "comment": "select 1 from (select id+42 as foo from user union select 1+id as foo from unsharded) as t", "query": "select 1 from (select id+42 as foo from user union select 1+id as foo from unsharded) as t", "v3-plan": "unsupported: expression on results of a cross-shard subquery", "gen4-plan": { @@ -2339,5 +2342,42 @@ "user.user" ] } + }, + { + "comment": "unknown columns are OK as long as the whole query is unsharded", + "query": "(SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'FAILED' ORDER BY buildNumber DESC LIMIT 1) AS last_failed) UNION ALL (SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'SUCCEEDED' ORDER BY buildNumber DESC LIMIT 1) AS last_succeeded) ORDER BY buildNumber DESC LIMIT 1", + "v3-plan": { + "QueryType": "SELECT", + "Original": "(SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'FAILED' ORDER BY buildNumber DESC LIMIT 1) AS last_failed) UNION ALL (SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'SUCCEEDED' ORDER BY buildNumber DESC LIMIT 1) AS last_succeeded) ORDER BY buildNumber DESC LIMIT 1", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from (select * from unsharded where 1 != 1) as last_failed where 1 != 1 union all select * from (select * from unsharded where 1 != 1) as last_succeeded where 1 != 1", + "Query": "select * from (select * from unsharded where branchId = 203622 and buildNumber <= 113893 and state = 'FAILED' order by buildNumber desc limit 1) as last_failed union all select * from (select * from unsharded where branchId = 203622 and buildNumber <= 113893 and state = 'SUCCEEDED' order by buildNumber desc limit 1) as last_succeeded order by buildNumber desc limit 1", + "Table": "unsharded" + } + }, + "gen4-plan": { + "QueryType": "SELECT", + "Original": "(SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'FAILED' ORDER BY buildNumber DESC LIMIT 1) AS last_failed) UNION ALL (SELECT * FROM (SELECT * FROM unsharded WHERE branchId = 203622 AND buildNumber <= 113893 AND state = 'SUCCEEDED' ORDER BY buildNumber DESC LIMIT 1) AS last_succeeded) ORDER BY buildNumber DESC LIMIT 1", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select * from (select * from unsharded where 1 != 1) as last_failed where 1 != 1 union all select * from (select * from unsharded where 1 != 1) as last_succeeded where 1 != 1", + "Query": "select * from (select * from unsharded where branchId = 203622 and buildNumber <= 113893 and state = 'FAILED' order by buildNumber desc limit 1) as last_failed union all select * from (select * from unsharded where branchId = 203622 and buildNumber <= 113893 and state = 'SUCCEEDED' order by buildNumber desc limit 1) as last_succeeded order by buildNumber desc limit 1", + "Table": "unsharded" + }, + "TablesUsed": [ + "main.unsharded" + ] + } } -] \ No newline at end of file +] diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json index 7e908b958f4..5a8e11c7d4d 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json @@ -273,26 +273,32 @@ "plan": "unsupported: REPLACE INTO with sharded schema" }, { + "comment": "select keyspace_id from user_index where id = 1 and id = 2", "query": "select keyspace_id from user_index where id = 1 and id = 2", "plan": "unsupported: where clause for vindex function must be of the form id =