Repository: vitessio/vitess
Pull request #6120 (2020-04-27 06:37:36)

Add unit test for function in go/sync2/atomic.go
Signed-off-by: ZouYu <zouy.fnst@cn.fujitsu.com>


Patch:
diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml
index 1f8bb41019..9b59864e37 100644
--- a/.github/workflows/create_release.yml
+++ b/.github/workflows/create_release.yml
@@ -26,7 +26,7 @@ jobs:
         sudo apt-get update
         sudo apt-get install -y make ruby ruby-dev
         go mod download
-        sudo gem install fpm
+        sudo gem install --no-ri --no-rdoc fpm
 
     - name: Make Packages
       run: |
diff --git a/Makefile b/Makefile
index 551aba4783..15cffad9e4 100644
--- a/Makefile
+++ b/Makefile
@@ -228,18 +228,10 @@ docker_lite_mysql57:
 	chmod -R o=g *
 	docker build -f docker/lite/Dockerfile.mysql57 -t vitess/lite:mysql57 .
 
-docker_lite_ubi7.mysql57:
-	chmod -R o=g *
-	docker build -f docker/lite/Dockerfile.ubi7.mysql57 -t vitess/lite:ubi7.mysql57 .
-
 docker_lite_mysql80:
 	chmod -R o=g *
 	docker build -f docker/lite/Dockerfile.mysql80 -t vitess/lite:mysql80 .
 
-docker_lite_ubi7.mysql80:
-	chmod -R o=g *
-	docker build -f docker/lite/Dockerfile.ubi7.mysql80 -t vitess/lite:ubi7.mysql80 .
-
 docker_lite_mariadb:
 	chmod -R o=g *
 	docker build -f docker/lite/Dockerfile.mariadb -t vitess/lite:mariadb .
@@ -256,18 +248,10 @@ docker_lite_percona57:
 	chmod -R o=g *
 	docker build -f docker/lite/Dockerfile.percona57 -t vitess/lite:percona57 .
 
-docker_lite_ubi7.percona57:
-	chmod -R o=g *
-	docker build -f docker/lite/Dockerfile.ubi7.percona57 -t vitess/lite:ubi7.percona57 .
-
 docker_lite_percona80:
 	chmod -R o=g *
 	docker build -f docker/lite/Dockerfile.percona80 -t vitess/lite:percona80 .
 
-docker_lite_ubi7.percona80:
-	chmod -R o=g *
-	docker build -f docker/lite/Dockerfile.ubi7.percona80 -t vitess/lite:ubi7.percona80 .
-
 docker_lite_alpine:
 	chmod -R o=g *
 	docker build -f docker/lite/Dockerfile.alpine -t vitess/lite:alpine .
diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57
deleted file mode 100644
index d4dbe1df4f..0000000000
--- a/docker/lite/Dockerfile.ubi7.mysql57
+++ /dev/null
@@ -1,102 +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.
-
-# NOTE: We have to build the Vitess binaries from scratch instead of sharing
-#       a base image because Docker Hub dropped the feature we relied upon to
-#       ensure images contain the right binaries.
-
-# Use a temporary layer for the build stage.
-FROM vitess/bootstrap:mysql57 AS builder
-
-# Allows some docker builds to disable CGO
-ARG CGO_ENABLED=0
-
-# Re-copy sources from working tree.
-COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess
-
-# Build and install Vitess in a temporary output directory.
-USER vitess
-RUN make install PREFIX=/vt/install
-
-# Start over and build the final image.
-FROM registry.access.redhat.com/ubi7/ubi:latest
-
-# Install keys and dependencies
-RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \
- && yum install --setopt=alwaysprompt=no gnupg \
- && ( gpg --keyserver keyserver.ubuntu.com --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 A4A9406876FCBD3C456770C88C718D3B5072E1F5 \
- ||   gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 A4A9406876FCBD3C456770C88C718D3B5072E1F5 ) \
- && gpg --export --armor 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A > ${GNUPGHOME}/RPM-GPG-KEY-Percona.1 \
- && gpg --export --armor 4D1BB29D63D98E422B2113B19334A25F8507EFA5 > ${GNUPGHOME}/RPM-GPG-KEY-Percona.2 \
- && gpg --export --armor 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 > ${GNUPGHOME}/RPM-GPG-KEY-CentOS-7 \
- && gpg --export --armor A4A9406876FCBD3C456770C88C718D3B5072E1F5 > ${GNUPGHOME}/RPM-GPG-KEY-MySQL \
- && rpmkeys --import ${GNUPGHOME}/RPM-GPG-KEY-Percona.1 ${GNUPGHOME}/RPM-GPG-KEY-Percona.2 ${GNUPGHOME}/RPM-GPG-KEY-CentOS-7 ${GNUPGHOME}/RPM-GPG-KEY-MySQL /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/mysqlrepo.rpm https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/perconarepo.rpm https://repo.percona.com/yum/percona-release-latest.noarch.rpm \
- && rpmkeys --checksig /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm \
- && rpm -Uvh /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm \
- && rm -f /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm
-RUN curl -L --retry-delay 10 --retry 3 -o /tmp/libev.rpm http://mirror.centos.org/centos/7/extras/x86_64/Packages/libev-4.15-7.el7.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/gperf.rpm http://mirror.centos.org/centos/7/os/x86_64/Packages/gperftools-libs-2.6.1-1.el7.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/numactl.rpm http://mirror.centos.org/centos/7/updates/x86_64/Packages/numactl-libs-2.0.12-3.el7_7.1.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/sysstat.rpm http://mirror.centos.org/centos/7/updates/x86_64/Packages/sysstat-10.1.5-18.el7_7.1.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/strace.rpm http://mirror.centos.org/centos/7/os/x86_64/Packages/strace-4.12-9.el7.x86_64.rpm \
- && rpm -i --nodeps /tmp/libev.rpm /tmp/gperf.rpm /tmp/numactl.rpm /tmp/sysstat.rpm /tmp/strace.rpm \
- && rm -f /tmp/libev.rpm /tmp/gperf.rpm /tmp/numactl.rpm /tmp/sysstat.rpm /tmp/strace.rpm
-RUN yum update \
- && yum install --setopt=alwaysprompt=no --setopt=tsflags=nodocs bzip2 ca-certificates gnupg libaio libcurl \
-    jemalloc gperftools-libs procps-ng rsync wget openssl hostname curl tzdata make \
-# Can't use alwaysprompt=no here, since we need to pick up deps
-#   No way to separate key imports and accept deps separately in yum/dnf
- && yum install -y --setopt=tsflags=nodocs --enablerepo mysql57-community --disablerepo mysql80-community \
-    mysql-community-client mysql-community-server \
-# Have to use hacks to ignore conflicts on /etc/my.cnf install
- && mkdir -p /tmp/1 \
- && yum install --setopt=alwaysprompt=no --downloadonly --downloaddir=/tmp/1 --enablerepo mysql57-community --disablerepo mysql80-community percona-xtrabackup-24 \
- && rpm -Uvh --replacefiles /tmp/1/*rpm \
- && rm -rf /tmp/1 \
- && yum clean all \
- && yum clean all --enablerepo mysql57-community --disablerepo mysql80-community \
- && rm -rf /etc/my.cnf /var/lib/mysql /tmp/gpg /sbin/mysqld-debug
-
-# Set up Vitess user and directory tree.
-RUN groupadd -g 1001 -r vitess && useradd -r -u 1001 -g vitess vitess
-RUN mkdir -p /vt/vtdataroot && chown -R vitess:vitess /vt
-
-# Set up Vitess environment (just enough to run pre-built Go binaries)
-ENV VTROOT /vt/src/vitess.io/vitess
-ENV VTDATAROOT /vt/vtdataroot
-ENV PATH $VTROOT/bin:$PATH
-
-# Copy artifacts from builder layer.
-COPY --from=builder --chown=vitess:vitess /vt/install /vt
-
-RUN mkdir -p /licenses
-COPY LICENSE /licenses
-
-# Create mount point for actual data (e.g. MySQL data dir)
-VOLUME /vt/vtdataroot
-USER vitess
-
-LABEL name="Vitess Lite image - MySQL Community Server 5.7" \
-      io.k8s.display-name="Vitess Lite image - MySQL Community Server 5.7" \
-      maintainer="cncf-vitess-maintainers@lists.cncf.io" \
-      vendor="CNCF" \
-      version="6.0.0" \
-      release="1" \
-      summary="Vitess base container image, containing Vitess components along with MySQL Community Server 5.7" \
-      description="Vitess base container image, containing Vitess components along with MySQL Community Server 5.7" \
-      io.k8s.description="Vitess base container image, containing Vitess components along with MySQL Community Server 5.7" \
-      distribution-scope="public" \
-      url="https://vitess.io"
diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80
deleted file mode 100644
index 9da03ca65a..0000000000
--- a/docker/lite/Dockerfile.ubi7.mysql80
+++ /dev/null
@@ -1,103 +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.
-
-# NOTE: We have to build the Vitess binaries from scratch instead of sharing
-#       a base image because Docker Hub dropped the feature we relied upon to
-#       ensure images contain the right binaries.
-
-# Use a temporary layer for the build stage.
-FROM vitess/bootstrap:mysql80 AS builder
-
-# Allows some docker builds to disable CGO
-ARG CGO_ENABLED=0
-
-# Re-copy sources from working tree.
-COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess
-
-# Build and install Vitess in a temporary output directory.
-USER vitess
-RUN make install PREFIX=/vt/install
-
-# Start over and build the final image.
-FROM registry.access.redhat.com/ubi7/ubi:latest
-
-# Install keys and dependencies
-RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \
- && yum install --setopt=alwaysprompt=no gnupg \
- && ( gpg --keyserver keyserver.ubuntu.com --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 A4A9406876FCBD3C456770C88C718D3B5072E1F5 \
- ||   gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 A4A9406876FCBD3C456770C88C718D3B5072E1F5 ) \
- && gpg --export --armor 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A > ${GNUPGHOME}/RPM-GPG-KEY-Percona.1 \
- && gpg --export --armor 4D1BB29D63D98E422B2113B19334A25F8507EFA5 > ${GNUPGHOME}/RPM-GPG-KEY-Percona.2 \
- && gpg --export --armor 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 > ${GNUPGHOME}/RPM-GPG-KEY-CentOS-7 \
- && gpg --export --armor A4A9406876FCBD3C456770C88C718D3B5072E1F5 > ${GNUPGHOME}/RPM-GPG-KEY-MySQL \
- && rpmkeys --import ${GNUPGHOME}/RPM-GPG-KEY-Percona.1 ${GNUPGHOME}/RPM-GPG-KEY-Percona.2 ${GNUPGHOME}/RPM-GPG-KEY-CentOS-7 ${GNUPGHOME}/RPM-GPG-KEY-MySQL /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/mysqlrepo.rpm https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/perconarepo.rpm https://repo.percona.com/yum/percona-release-latest.noarch.rpm \
- && rpmkeys --checksig /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm \
- && rpm -Uvh /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm \
- && rm -f /tmp/mysqlrepo.rpm /tmp/perconarepo.rpm
-RUN curl -L --retry-delay 10 --retry 3 -o /tmp/libev.rpm http://mirror.centos.org/centos/7/extras/x86_64/Packages/libev-4.15-7.el7.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/gperf.rpm http://mirror.centos.org/centos/7/os/x86_64/Packages/gperftools-libs-2.6.1-1.el7.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/numactl.rpm http://mirror.centos.org/centos/7/updates/x86_64/Packages/numactl-libs-2.0.12-3.el7_7.1.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/sysstat.rpm http://mirror.centos.org/centos/7/updates/x86_64/Packages/sysstat-10.1.5-18.el7_7.1.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/strace.rpm http://mirror.centos.org/centos/7/os/x86_64/Packages/strace-4.12-9.el7.x86_64.rpm \
- && rpm -i --nodeps /tmp/libev.rpm /tmp/gperf.rpm /tmp/numactl.rpm /tmp/sysstat.rpm /tmp/strace.rpm \
- && rm -f /tmp/libev.rpm /tmp/gperf.rpm /tmp/numactl.rpm /tmp/sysstat.rpm /tmp/strace.rpm
-RUN yum update \
- && yum install --setopt=alwaysprompt=no --setopt=tsflags=nodocs bzip2 ca-certificates gnupg libaio libcurl \
-    jemalloc gperftools-libs procps-ng rsync wget openssl hostname curl tzdata make \
-# Can't use alwaysprompt=no here, since we need to pick up deps
-#   No way to separate key imports and accept deps separately in yum/dnf
- && yum install -y --setopt=tsflags=nodocs --enablerepo mysql80-community --disablerepo mysql57-community \
-    mysql-community-client mysql-community-server \
-# Have to use hacks to ignore conflicts on /etc/my.cnf install
- && mkdir -p /tmp/1 \
- && yum install --setopt=alwaysprompt=no --downloadonly --downloaddir=/tmp/1 --enablerepo mysql80-community --disablerepo mysql57-community percona-xtrabackup-80 \
- && rpm -Uvh --replacefiles /tmp/1/*rpm \
- && rm -rf /tmp/1 \
- && yum clean all \
- && yum clean all --enablerepo mysql80-community --disablerepo mysql57-community \
- && rm -rf /etc/my.cnf /var/lib/mysql /tmp/gpg /sbin/mysqld-debug
-
-# Set up Vitess user and directory tree.
-RUN groupadd -g 1001 -r vitess && useradd -r -u 1001 -g vitess vitess
-RUN mkdir -p /vt/vtdataroot && chown -R vitess:vitess /vt
-
-# Set up Vitess environment (just enough to run pre-built Go binaries)
-ENV VTROOT /vt/src/vitess.io/vitess
-ENV VTDATAROOT /vt/vtdataroot
-ENV PATH $VTROOT/bin:$PATH
-ENV MYSQL_FLAVOR MySQL80
-
-# Copy artifacts from builder layer.
-COPY --from=builder --chown=vitess:vitess /vt/install /vt
-
-RUN mkdir -p /licenses
-COPY LICENSE /licenses
-
-# Create mount point for actual data (e.g. MySQL data dir)
-VOLUME /vt/vtdataroot
-USER vitess
-
-LABEL name="Vitess Lite image - MySQL Community Server 8.0" \
-      io.k8s.display-name="Vitess Lite image - MySQL Community Server 8.0" \
-      maintainer="cncf-vitess-maintainers@lists.cncf.io" \
-      vendor="CNCF" \
-      version="6.0.0" \
-      release="1" \
-      summary="Vitess base container image, containing Vitess components along with MySQL Community Server 8.0" \
-      description="Vitess base container image, containing Vitess components along with MySQL Community Server 8.0" \
-      io.k8s.description="Vitess base container image, containing Vitess components along with MySQL Community Server 8.0" \
-      distribution-scope="public" \
-      url="https://vitess.io"
diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57
deleted file mode 100644
index c05e8150cf..0000000000
--- a/docker/lite/Dockerfile.ubi7.percona57
+++ /dev/null
@@ -1,93 +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.
-
-# NOTE: We have to build the Vitess binaries from scratch instead of sharing
-#       a base image because Docker Hub dropped the feature we relied upon to
-#       ensure images contain the right binaries.
-
-# Use a temporary layer for the build stage.
-FROM vitess/bootstrap:percona57 AS builder
-
-# Allows some docker builds to disable CGO
-ARG CGO_ENABLED=0
-
-# Re-copy sources from working tree.
-COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess
-
-# Build and install Vitess in a temporary output directory.
-USER vitess
-RUN make install PREFIX=/vt/install
-
-# Start over and build the final image.
-FROM registry.access.redhat.com/ubi7/ubi:latest
-
-# Install keys and dependencies
-RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \
- && yum install --setopt=alwaysprompt=no gnupg \
- && ( gpg --keyserver keyserver.ubuntu.com --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 \
- ||   gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 ) \
- && gpg --export --armor 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A > ${GNUPGHOME}/RPM-GPG-KEY-Percona.1 \
- && gpg --export --armor 4D1BB29D63D98E422B2113B19334A25F8507EFA5 > ${GNUPGHOME}/RPM-GPG-KEY-Percona.2 \
- && gpg --export --armor 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 > ${GNUPGHOME}/RPM-GPG-KEY-CentOS-7 \
- && rpmkeys --import ${GNUPGHOME}/RPM-GPG-KEY-Percona.1 ${GNUPGHOME}/RPM-GPG-KEY-Percona.2 ${GNUPGHOME}/RPM-GPG-KEY-CentOS-7 /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/perconarepo.rpm https://repo.percona.com/yum/percona-release-latest.noarch.rpm \
- && rpmkeys --checksig /tmp/perconarepo.rpm \
- && rpm -Uvh /tmp/perconarepo.rpm \
- && rm -f /tmp/perconarepo.rpm
-RUN curl -L --retry-delay 10 --retry 3 -o /tmp/libev.rpm http://mirror.centos.org/centos/7/extras/x86_64/Packages/libev-4.15-7.el7.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/gperf.rpm http://mirror.centos.org/centos/7/os/x86_64/Packages/gperftools-libs-2.6.1-1.el7.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/numactl.rpm http://mirror.centos.org/centos/7/updates/x86_64/Packages/numactl-libs-2.0.12-3.el7_7.1.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/sysstat.rpm http://mirror.centos.org/centos/7/updates/x86_64/Packages/sysstat-10.1.5-18.el7_7.1.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/strace.rpm http://mirror.centos.org/centos/7/os/x86_64/Packages/strace-4.12-9.el7.x86_64.rpm \
- && rpm -i --nodeps /tmp/libev.rpm /tmp/gperf.rpm /tmp/numactl.rpm /tmp/sysstat.rpm /tmp/strace.rpm \
- && rm -f /tmp/libev.rpm /tmp/gperf.rpm /tmp/numactl.rpm /tmp/sysstat.rpm /tmp/strace.rpm
-RUN yum update \
- && yum install --setopt=alwaysprompt=no --setopt=tsflags=nodocs bzip2 ca-certificates gnupg libaio libcurl \
-    jemalloc gperftools-libs procps-ng rsync wget openssl hostname curl tzdata make \
-# Can't use alwaysprompt=no here, since we need to pick up deps
-#   No way to separate key imports and accept deps separately in yum/dnf
- && yum install -y --setopt=tsflags=nodocs Percona-Server-server-57 percona-xtrabackup-24 \
- && yum clean all \
- && rm -rf /etc/my.cnf /var/lib/mysql /tmp/gpg /sbin/mysqld-debug
-
-# Set up Vitess user and directory tree.
-RUN groupadd -g 1001 -r vitess && useradd -r -u 1001 -g vitess vitess
-RUN mkdir -p /vt/vtdataroot && chown -R vitess:vitess /vt
-
-# Set up Vitess environment (just enough to run pre-built Go binaries)
-ENV VTROOT /vt/src/vitess.io/vitess
-ENV VTDATAROOT /vt/vtdataroot
-ENV PATH $VTROOT/bin:$PATH
-
-# Copy artifacts from builder layer.
-COPY --from=builder --chown=vitess:vitess /vt/install /vt
-
-RUN mkdir -p /licenses
-COPY LICENSE /licenses
-
-# Create mount point for actual data (e.g. MySQL data dir)
-VOLUME /vt/vtdataroot
-USER vitess
-
-LABEL name="Vitess Lite image - Percona Server 5.7" \
-      io.k8s.display-name="Vitess Lite image - Percona Server 5.7" \
-      maintainer="cncf-vitess-maintainers@lists.cncf.io" \
-      vendor="CNCF" \
-      version="6.0.0" \
-      release="1" \
-      summary="Vitess base container image, containing Vitess components along with Percona Server 5.7" \
-      description="Vitess base container image, containing Vitess components along with Percona Server 5.7" \
-      io.k8s.description="Vitess base container image, containing Vitess components along with Percona Server 5.7" \
-      distribution-scope="public" \
-      url="https://vitess.io"
diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80
deleted file mode 100644
index 828b0a79db..0000000000
--- a/docker/lite/Dockerfile.ubi7.percona80
+++ /dev/null
@@ -1,98 +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.
-
-# NOTE: We have to build the Vitess binaries from scratch instead of sharing
-#       a base image because Docker Hub dropped the feature we relied upon to
-#       ensure images contain the right binaries.
-
-# Use a temporary layer for the build stage.
-FROM vitess/bootstrap:percona80 AS builder
-
-# Allows some docker builds to disable CGO
-ARG CGO_ENABLED=0
-
-# Re-copy sources from working tree.
-COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess
-
-# Build and install Vitess in a temporary output directory.
-USER vitess
-RUN make install PREFIX=/vt/install
-
-# Start over and build the final image.
-FROM registry.access.redhat.com/ubi7/ubi:latest
-
-# Install keys and dependencies
-RUN mkdir /tmp/gpg && chmod 700 /tmp/gpg && export GNUPGHOME=/tmp/gpg \
- && yum install --setopt=alwaysprompt=no gnupg \
- && ( gpg --keyserver keyserver.ubuntu.com --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 \
- ||   gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A 4D1BB29D63D98E422B2113B19334A25F8507EFA5 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 ) \
- && gpg --export --armor 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A > ${GNUPGHOME}/RPM-GPG-KEY-Percona.1 \
- && gpg --export --armor 4D1BB29D63D98E422B2113B19334A25F8507EFA5 > ${GNUPGHOME}/RPM-GPG-KEY-Percona.2 \
- && gpg --export --armor 6341AB2753D78A78A7C27BB124C6A8A7F4A80EB5 > ${GNUPGHOME}/RPM-GPG-KEY-CentOS-7 \
- && rpmkeys --import ${GNUPGHOME}/RPM-GPG-KEY-Percona.1 ${GNUPGHOME}/RPM-GPG-KEY-Percona.2 ${GNUPGHOME}/RPM-GPG-KEY-CentOS-7 /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/perconarepo.rpm https://repo.percona.com/yum/percona-release-latest.noarch.rpm \
- && rpmkeys --checksig /tmp/perconarepo.rpm \
- && rpm -Uvh /tmp/perconarepo.rpm \
- && rm -f /tmp/perconarepo.rpm
-RUN curl -L --retry-delay 10 --retry 3 -o /tmp/libev.rpm http://mirror.centos.org/centos/7/extras/x86_64/Packages/libev-4.15-7.el7.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/gperf.rpm http://mirror.centos.org/centos/7/os/x86_64/Packages/gperftools-libs-2.6.1-1.el7.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/numactl.rpm http://mirror.centos.org/centos/7/updates/x86_64/Packages/numactl-libs-2.0.12-3.el7_7.1.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/sysstat.rpm http://mirror.centos.org/centos/7/updates/x86_64/Packages/sysstat-10.1.5-18.el7_7.1.x86_64.rpm \
- && curl -L --retry-delay 10 --retry 3 -o /tmp/strace.rpm http://mirror.centos.org/centos/7/os/x86_64/Packages/strace-4.12-9.el7.x86_64.rpm \
- && rpm -i --nodeps /tmp/libev.rpm /tmp/gperf.rpm /tmp/numactl.rpm /tmp/sysstat.rpm /tmp/strace.rpm \
- && rm -f /tmp/libev.rpm /tmp/gperf.rpm /tmp/numactl.rpm /tmp/sysstat.rpm /tmp/strace.rpm
-RUN yum update \
- && yum install --setopt=alwaysprompt=no --setopt=tsflags=nodocs bzip2 ca-certificates gnupg libaio libcurl \
-    jemalloc gperftools-libs procps-ng rsync wget openssl hostname curl tzdata make \
- && percona-release setup ps80 \
-# Without this pause, the subsequent yum install fails downloads
-# regularly
- && sleep 5 \
-# Can't use alwaysprompt=no here, since we need to pick up deps
-#   No way to separate key imports and accept deps separately in yum/dnf
- && yum install -y --setopt=tsflags=nodocs percona-server-server percona-xtrabackup-80 \
- && yum clean all \
- && rm -rf /etc/my.cnf /var/lib/mysql /tmp/gpg /sbin/mysqld-debug
-
-# Set up Vitess user and directory tree.
-RUN groupadd -g 1001 -r vitess && useradd -r -u 1001 -g vitess vitess
-RUN mkdir -p /vt/vtdataroot && chown -R vitess:vitess /vt
-
-# Set up Vitess environment (just enough to run pre-built Go binaries)
-ENV VTROOT /vt/src/vitess.io/vitess
-ENV VTDATAROOT /vt/vtdataroot
-ENV PATH $VTROOT/bin:$PATH
-ENV MYSQL_FLAVOR MySQL80
-
-# Copy artifacts from builder layer.
-COPY --from=builder --chown=vitess:vitess /vt/install /vt
-
-RUN mkdir -p /licenses
-COPY LICENSE /licenses
-
-# Create mount point for actual data (e.g. MySQL data dir)
-VOLUME /vt/vtdataroot
-USER vitess
-
-LABEL name="Vitess Lite image - Percona Server 8.0" \
-      io.k8s.display-name="Vitess Lite image - Percona Server 8.0" \
-      maintainer="cncf-vitess-maintainers@lists.cncf.io" \
-      vendor="CNCF" \
-      version="6.0.0" \
-      release="1" \
-      summary="Vitess base container image, containing Vitess components along with Percona Server 8.0" \
-      description="Vitess base container image, containing Vitess components along with Percona Server 8.0" \
-      io.k8s.description="Vitess base container image, containing Vitess components along with Percona Server 8.0" \
-      distribution-scope="public" \
-      url="https://vitess.io"
diff --git a/examples/local/205_clean_commerce.sh b/examples/local/205_clean_commerce.sh
index 6fe9350e8a..f01fa2429a 100755
--- a/examples/local/205_clean_commerce.sh
+++ b/examples/local/205_clean_commerce.sh
@@ -22,5 +22,4 @@ source ./env.sh
 vtctlclient SetShardTabletControl -blacklisted_tables=customer,corder -remove commerce/0 rdonly
 vtctlclient SetShardTabletControl -blacklisted_tables=customer,corder -remove commerce/0 replica
 vtctlclient SetShardTabletControl -blacklisted_tables=customer,corder -remove commerce/0 master
-vtctlclient ApplySchema -sql-file drop_commerce_tables.sql commerce
 vtctlclient ApplyRoutingRules -rules='{}'
diff --git a/go/vt/sqlparser/expression_converter.go b/go/vt/sqlparser/expression_converter.go
index d0bf78229b..ce7763e470 100644
--- a/go/vt/sqlparser/expression_converter.go
+++ b/go/vt/sqlparser/expression_converter.go
@@ -35,8 +35,6 @@ func Convert(e Expr) (evalengine.Expr, error) {
 			return evalengine.NewLiteralFloat(node.Val)
 		case ValArg:
 			return &evalengine.BindVariable{Key: string(node.Val[1:])}, nil
-		case StrVal:
-			return evalengine.NewLiteralString(node.Val)
 		}
 	case *BinaryExpr:
 		var op evalengine.BinaryExpr
diff --git a/go/vt/topo/server.go b/go/vt/topo/server.go
index 29a1680b13..6da787dc25 100644
--- a/go/vt/topo/server.go
+++ b/go/vt/topo/server.go
@@ -218,9 +218,6 @@ func Open() *Server {
 	if *topoGlobalServerAddress == "" && *topoImplementation != "k8s" {
 		log.Exitf("topo_global_server_address must be configured")
 	}
-	if *topoGlobalRoot == "" {
-		log.Exit("topo_global_root must be non-empty")
-	}
 	ts, err := OpenServer(*topoImplementation, *topoGlobalServerAddress, *topoGlobalRoot)
 	if err != nil {
 		log.Exitf("Failed to open topo server (%v,%v,%v): %v", *topoImplementation, *topoGlobalServerAddress, *topoGlobalRoot, err)
diff --git a/go/vt/vtctl/cell_info.go b/go/vt/vtctl/cell_info.go
index d9c97af14d..acee57789e 100644
--- a/go/vt/vtctl/cell_info.go
+++ b/go/vt/vtctl/cell_info.go
@@ -73,9 +73,6 @@ func commandAddCellInfo(ctx context.Context, wr *wrangler.Wrangler, subFlags *fl
 	if err := subFlags.Parse(args); err != nil {
 		return err
 	}
-	if *root == "" {
-		return fmt.Errorf("root must be non-empty")
-	}
 	if subFlags.NArg() != 1 {
 		return fmt.Errorf("the <cell> argument is required for the AddCellInfo command")
 	}
diff --git a/go/vt/vtctld/api.go b/go/vt/vtctld/api.go
index 8c44b373cf..ede03e9881 100644
--- a/go/vt/vtctld/api.go
+++ b/go/vt/vtctld/api.go
@@ -287,17 +287,9 @@ func initAPI(ctx context.Context, ts *topo.Server, actions *ActionRepository, re
 
 		if cell == "local" {
 			if *localCell == "" {
-				cells, err := ts.GetCellInfoNames(ctx)
-				if err != nil {
-					return nil, fmt.Errorf("could not fetch cell info: %v", err)
-				}
-				if len(cells) == 0 {
-					return nil, fmt.Errorf("no local cells have been created yet")
-				}
-				cell = cells[0]
-			} else {
-				cell = *localCell
+				return nil, fmt.Errorf("local cell requested, but not specified. Please set with -cell flag")
 			}
+			cell = *localCell
 		}
 
 		// If a keyspace is provided then return the specified srvkeyspace.
@@ -417,7 +409,7 @@ func initAPI(ctx context.Context, ts *topo.Server, actions *ActionRepository, re
 			MasterTermStartTime: t.MasterTermStartTime,
 		}
 		if *proxyTablets {
-			tab.URL = fmt.Sprintf("/vttablet/%s-%d/debug/status", t.Alias.Cell, t.Alias.Uid)
+			tab.URL = fmt.Sprintf("/vttablet/%s-%d", t.Alias.Cell, t.Alias.Uid)
 		} else {
 			tab.URL = "http://" + netutil.JoinHostPort(t.Hostname, t.PortMap["vt"])
 		}
diff --git a/go/vt/vtgate/engine/delete.go b/go/vt/vtgate/engine/delete.go
index d1d935a6ad..64b5540d86 100644
--- a/go/vt/vtgate/engine/delete.go
+++ b/go/vt/vtgate/engine/delete.go
@@ -45,7 +45,6 @@ type Delete struct {
 var delName = map[DMLOpcode]string{
 	Unsharded:     "DeleteUnsharded",
 	Equal:         "DeleteEqual",
-	In:            "DeleteIn",
 	Scatter:       "DeleteScatter",
 	ByDestination: "DeleteByDestination",
 }
@@ -80,8 +79,6 @@ func (del *Delete) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVar
 		return del.execDeleteUnsharded(vcursor, bindVars)
 	case Equal:
 		return del.execDeleteEqual(vcursor, bindVars)
-	case In:
-		return del.execDeleteIn(vcursor, bindVars)
 	case Scatter:
 		return del.execDeleteByDestination(vcursor, bindVars, key.DestinationAllShards{})
 	case ByDestination:
@@ -134,41 +131,6 @@ func (del *Delete) execDeleteEqual(vcursor VCursor, bindVars map[string]*querypb
 	return execShard(vcursor, del.Query, bindVars, rs, true /* rollbackOnError */, true /* canAutocommit */)
 }
 
-func (del *Delete) execDeleteIn(vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) {
-	rss, queries, err := resolveMultiValueShards(vcursor, del.Keyspace, del.Query, bindVars, del.Values[0], del.Vindex)
-	if err != nil {
-		return nil, err
-	}
-	if del.OwnedVindexQuery != "" {
-		if err := del.deleteVindexEntries(vcursor, bindVars, rss); err != nil {
-			return nil, vterrors.Wrap(err, "execDeleteIn")
-		}
-	}
-	return execMultiShard(vcursor, rss, queries, del.MultiShardAutocommit)
-}
-
-func (del *Delete) execDeleteByDestination(vcursor VCursor, bindVars map[string]*querypb.BindVariable, dest key.Destination) (*sqltypes.Result, error) {
-	rss, _, err := vcursor.ResolveDestinations(del.Keyspace.Name, nil, []key.Destination{dest})
-	if err != nil {
-		return nil, vterrors.Wrap(err, "execDeleteScatter")
-	}
-
-	queries := make([]*querypb.BoundQuery, len(rss))
-	for i := range rss {
-		queries[i] = &querypb.BoundQuery{
-			Sql:           del.Query,
-			BindVariables: bindVars,
-		}
-	}
-	if len(del.Table.Owned) > 0 {
-		err = del.deleteVindexEntries(vcursor, bindVars, rss)
-		if err != nil {
-			return nil, err
-		}
-	}
-	return execMultiShard(vcursor, rss, queries, del.MultiShardAutocommit)
-}
-
 // deleteVindexEntries performs an delete if table owns vindex.
 // Note: the commit order may be different from the DML order because it's possible
 // for DMLs to reuse existing transactions.
@@ -211,6 +173,30 @@ func (del *Delete) deleteVindexEntries(vcursor VCursor, bindVars map[string]*que
 	return nil
 }
 
+func (del *Delete) execDeleteByDestination(vcursor VCursor, bindVars map[string]*querypb.BindVariable, dest key.Destination) (*sqltypes.Result, error) {
+	rss, _, err := vcursor.ResolveDestinations(del.Keyspace.Name, nil, []key.Destination{dest})
+	if err != nil {
+		return nil, vterrors.Wrap(err, "execDeleteScatter")
+	}
+
+	queries := make([]*querypb.BoundQuery, len(rss))
+	for i := range rss {
+		queries[i] = &querypb.BoundQuery{
+			Sql:           del.Query,
+			BindVariables: bindVars,
+		}
+	}
+	if len(del.Table.Owned) > 0 {
+		err = del.deleteVindexEntries(vcursor, bindVars, rss)
+		if err != nil {
+			return nil, err
+		}
+	}
+	autocommit := (len(rss) == 1 || del.MultiShardAutocommit) && vcursor.AutocommitApproval()
+	res, errs := vcursor.ExecuteMultiShard(rss, queries, true /* rollbackOnError */, autocommit)
+	return res, vterrors.Aggregate(errs)
+}
+
 func (del *Delete) description() PrimitiveDescription {
 	other := map[string]interface{}{
 		"Query":                del.Query,
diff --git a/go/vt/vtgate/engine/dml.go b/go/vt/vtgate/engine/dml.go
index 9fe6360bb2..ec814a0483 100644
--- a/go/vt/vtgate/engine/dml.go
+++ b/go/vt/vtgate/engine/dml.go
@@ -19,9 +19,6 @@ package engine
 import (
 	"vitess.io/vitess/go/sqltypes"
 	"vitess.io/vitess/go/vt/key"
-	querypb "vitess.io/vitess/go/vt/proto/query"
-	"vitess.io/vitess/go/vt/srvtopo"
-	"vitess.io/vitess/go/vt/vterrors"
 	"vitess.io/vitess/go/vt/vtgate/vindexes"
 )
 
@@ -71,27 +68,26 @@ type DMLOpcode int
 
 // This is the list of UpdateOpcode values.
 const (
-	// Unsharded is for routing a dml statement
+	// UpdateUnsharded is for routing an update statement
 	// to an unsharded keyspace.
 	Unsharded = DMLOpcode(iota)
-	// Equal is for routing an dml statement to a single shard.
-	// Requires: A Vindex, and a single Value.
+	// UpdateEqual is for routing an update statement
+	// to a single shard: Requires: A Vindex, and
+	// a single Value.
 	Equal
-	// In is for routing an dml statement to a multi shard.
-	// Requires: A Vindex, and a multi Values.
-	In
-	// Scatter is for routing a scattered dml statement.
+	// UpdateScatter is for routing a scattered
+	// update statement.
 	Scatter
-	// ByDestination is to route explicitly to a given target destination.
-	// Is used when the query explicitly sets a target destination:
-	// in the clause e.g: UPDATE `keyspace[-]`.x1 SET foo=1
+	// UpdateByDestination is to route explicitly to a given
+	// target destination. Is used when the query explicitly sets a target destination:
+	// in the clause:
+	// e.g: UPDATE `keyspace[-]`.x1 SET foo=1
 	ByDestination
 )
 
 var opcodeName = map[DMLOpcode]string{
 	Unsharded:     "Unsharded",
 	Equal:         "Equal",
-	In:            "In",
 	Scatter:       "Scatter",
 	ByDestination: "ByDestination",
 }
@@ -99,28 +95,3 @@ var opcodeName = map[DMLOpcode]string{
 func (op DMLOpcode) String() string {
 	return opcodeName[op]
 }
-
-func resolveMultiValueShards(vcursor VCursor, keyspace *vindexes.Keyspace, query string, bindVars map[string]*querypb.BindVariable, pv sqltypes.PlanValue, vindex vindexes.SingleColumn) ([]*srvtopo.ResolvedShard, []*querypb.BoundQuery, error) {
-	keys, err := pv.ResolveList(bindVars)
-	if err != nil {
-		return nil, nil, vterrors.Wrap(err, "execDeleteIn")
-	}
-	rss, err := resolveMultiShard(vcursor, vindex, keyspace, keys)
-	if err != nil {
-		return nil, nil, vterrors.Wrap(err, "execDeleteIn")
-	}
-	queries := make([]*querypb.BoundQuery, len(rss))
-	for i := range rss {
-		queries[i] = &querypb.BoundQuery{
-			Sql:           query,
-			BindVariables: bindVars,
-		}
-	}
-	return rss, queries, nil
-}
-
-func execMultiShard(vcursor VCursor, rss []*srvtopo.ResolvedShard, queries []*querypb.BoundQuery, multiShardAutoCommit bool) (*sqltypes.Result, error) {
-	autocommit := (len(rss) == 1 || multiShardAutoCommit) && vcursor.AutocommitApproval()
-	result, errs := vcursor.ExecuteMultiShard(rss, queries, true /* rollbackOnError */, autocommit)
-	return result, vterrors.Aggregate(errs)
-}
diff --git a/go/vt/vtgate/engine/route.go b/go/vt/vtgate/engine/route.go
index c6b098779d..e06e372204 100644
--- a/go/vt/vtgate/engine/route.go
+++ b/go/vt/vtgate/engine/route.go
@@ -483,18 +483,6 @@ func resolveSingleShard(vcursor VCursor, vindex vindexes.SingleColumn, keyspace
 	return rss[0], ksid, nil
 }
 
-func resolveMultiShard(vcursor VCursor, vindex vindexes.SingleColumn, keyspace *vindexes.Keyspace, vindexKey []sqltypes.Value) ([]*srvtopo.ResolvedShard, error) {
-	destinations, err := vindex.Map(vcursor, vindexKey)
-	if err != nil {
-		return nil, err
-	}
-	rss, _, err := vcursor.ResolveDestinations(keyspace.Name, nil, destinations)
-	if err != nil {
-		return nil, err
-	}
-	return rss, nil
-}
-
 func resolveKeyspaceID(vcursor VCursor, vindex vindexes.SingleColumn, vindexKey sqltypes.Value) ([]byte, error) {
 	destinations, err := vindex.Map(vcursor, []sqltypes.Value{vindexKey})
 	if err != nil {
diff --git a/go/vt/vtgate/engine/set.go b/go/vt/vtgate/engine/set.go
index 62c017a4ac..0c52c4972d 100644
--- a/go/vt/vtgate/engine/set.go
+++ b/go/vt/vtgate/engine/set.go
@@ -20,8 +20,6 @@ import (
 	"encoding/json"
 	"fmt"
 
-	"vitess.io/vitess/go/vt/vtgate/evalengine"
-
 	"vitess.io/vitess/go/mysql"
 
 	"vitess.io/vitess/go/sqltypes"
@@ -35,22 +33,21 @@ import (
 type (
 	// Set contains the instructions to perform set.
 	Set struct {
-		Ops   []SetOp
-		Input Primitive
-
+		Ops []SetOp
 		noTxNeeded
+		noInputs
 	}
 
 	// SetOp is an interface that different type of set operations implements.
 	SetOp interface {
-		Execute(vcursor VCursor, env evalengine.ExpressionEnv) error
+		Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable) error
 		VariableName() string
 	}
 
 	// UserDefinedVariable implements the SetOp interface to execute user defined variables.
 	UserDefinedVariable struct {
-		Name string
-		Expr evalengine.Expr
+		Name      string
+		PlanValue sqltypes.PlanValue
 	}
 
 	// SysVarIgnore implements the SetOp interface to ignore the settings.
@@ -86,20 +83,9 @@ func (s *Set) GetTableName() string {
 }
 
 //Execute implements the Primitive interface method.
-func (s *Set) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, _ bool) (*sqltypes.Result, error) {
-	input, err := s.Input.Execute(vcursor, bindVars, false)
-	if err != nil {
-		return nil, err
-	}
-	if len(input.Rows) != 1 {
-		return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "should get a single row")
-	}
-	env := evalengine.ExpressionEnv{
-		BindVars: bindVars,
-		Row:      input.Rows[0],
-	}
+func (s *Set) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) {
 	for _, setOp := range s.Ops {
-		err := setOp.Execute(vcursor, env)
+		err := setOp.Execute(vcursor, bindVars)
 		if err != nil {
 			return nil, err
 		}
@@ -109,21 +95,12 @@ func (s *Set) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable
 
 //StreamExecute implements the Primitive interface method.
 func (s *Set) StreamExecute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantields bool, callback func(*sqltypes.Result) error) error {
-	result, err := s.Execute(vcursor, bindVars, wantields)
-	if err != nil {
-		return err
-	}
-	return callback(result)
+	panic("implement me")
 }
 
 //GetFields implements the Primitive interface method.
-func (s *Set) GetFields(VCursor, map[string]*querypb.BindVariable) (*sqltypes.Result, error) {
-	return &sqltypes.Result{}, nil
-}
-
-//Inputs implements the Primitive interface
-func (s *Set) Inputs() []Primitive {
-	return []Primitive{s.Input}
+func (s *Set) GetFields(vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) {
+	panic("implement me")
 }
 
 func (s *Set) description() PrimitiveDescription {
@@ -143,12 +120,10 @@ var _ SetOp = (*UserDefinedVariable)(nil)
 func (u *UserDefinedVariable) MarshalJSON() ([]byte, error) {
 	return json.Marshal(struct {
 		Type string
-		Name string
-		Expr string
+		UserDefinedVariable
 	}{
-		Type: "UserDefinedVariable",
-		Name: u.Name,
-		Expr: u.Expr.String(),
+		Type:                "UserDefinedVariable",
+		UserDefinedVariable: *u,
 	})
 
 }
@@ -159,12 +134,12 @@ func (u *UserDefinedVariable) VariableName() string {
 }
 
 //Execute implements the SetOp interface method.
-func (u *UserDefinedVariable) Execute(vcursor VCursor, env evalengine.ExpressionEnv) error {
-	value, err := u.Expr.Evaluate(env)
+func (u *UserDefinedVariable) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable) error {
+	value, err := u.PlanValue.ResolveValue(bindVars)
 	if err != nil {
 		return err
 	}
-	return vcursor.Session().SetUDV(u.Name, value.Value())
+	return vcursor.Session().SetUDV(u.Name, value)
 }
 
 var _ SetOp = (*SysVarIgnore)(nil)
@@ -187,7 +162,7 @@ func (svi *SysVarIgnore) VariableName() string {
 }
 
 //Execute implements the SetOp interface method.
-func (svi *SysVarIgnore) Execute(vcursor VCursor, _ evalengine.ExpressionEnv) error {
+func (svi *SysVarIgnore) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable) error {
 	vcursor.Session().RecordWarning(&querypb.QueryWarning{Code: mysql.ERNotSupportedYet, Message: fmt.Sprintf("Ignored inapplicable SET %v = %v", svi.Name, svi.Expr)})
 	return nil
 }
@@ -212,7 +187,7 @@ func (svci *SysVarCheckAndIgnore) VariableName() string {
 }
 
 //Execute implements the SetOp interface method
-func (svci *SysVarCheckAndIgnore) Execute(vcursor VCursor, env evalengine.ExpressionEnv) error {
+func (svci *SysVarCheckAndIgnore) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable) error {
 	rss, _, err := vcursor.ResolveDestinations(svci.Keyspace.Name, nil, []key.Destination{svci.TargetDestination})
 	if err != nil {
 		return vterrors.Wrap(err, "SysVarCheckAndIgnore")
@@ -222,7 +197,7 @@ func (svci *SysVarCheckAndIgnore) Execute(vcursor VCursor, env evalengine.Expres
 		return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "Unexpected error, DestinationKeyspaceID mapping to multiple shards: %v", svci.TargetDestination)
 	}
 	checkSysVarQuery := fmt.Sprintf("select 1 from dual where @@%s = %s", svci.Name, svci.Expr)
-	result, err := execShard(vcursor, checkSysVarQuery, env.BindVars, rss[0], false /* rollbackOnError */, false /* canAutocommit */)
+	result, err := execShard(vcursor, checkSysVarQuery, bindVars, rss[0], false /* rollbackOnError */, false /* canAutocommit */)
 	if err != nil {
 		return err
 	}
diff --git a/go/vt/vtgate/engine/update.go b/go/vt/vtgate/engine/update.go
index c8717589da..0737342fe6 100644
--- a/go/vt/vtgate/engine/update.go
+++ b/go/vt/vtgate/engine/update.go
@@ -52,7 +52,6 @@ type Update struct {
 var updName = map[DMLOpcode]string{
 	Unsharded:     "UpdateUnsharded",
 	Equal:         "UpdateEqual",
-	In:            "UpdateIn",
 	Scatter:       "UpdateScatter",
 	ByDestination: "UpdateByDestination",
 }
@@ -87,8 +86,6 @@ func (upd *Update) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVar
 		return upd.execUpdateUnsharded(vcursor, bindVars)
 	case Equal:
 		return upd.execUpdateEqual(vcursor, bindVars)
-	case In:
-		return upd.execUpdateIn(vcursor, bindVars)
 	case Scatter:
 		return upd.execUpdateByDestination(vcursor, bindVars, key.DestinationAllShards{})
 	case ByDestination:
@@ -140,42 +137,6 @@ func (upd *Update) execUpdateEqual(vcursor VCursor, bindVars map[string]*querypb
 	return execShard(vcursor, upd.Query, bindVars, rs, true /* rollbackOnError */, true /* canAutocommit */)
 }
 
-func (upd *Update) execUpdateIn(vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) {
-	rss, queries, err := resolveMultiValueShards(vcursor, upd.Keyspace, upd.Query, bindVars, upd.Values[0], upd.Vindex)
-	if err != nil {
-		return nil, err
-	}
-	if len(upd.ChangedVindexValues) != 0 {
-		if err := upd.updateVindexEntries(vcursor, bindVars, rss); err != nil {
-			return nil, vterrors.Wrap(err, "execUpdateIn")
-		}
-	}
-	return execMultiShard(vcursor, rss, queries, upd.MultiShardAutocommit)
-}
-
-func (upd *Update) execUpdateByDestination(vcursor VCursor, bindVars map[string]*querypb.BindVariable, dest key.Destination) (*sqltypes.Result, error) {
-	rss, _, err := vcursor.ResolveDestinations(upd.Keyspace.Name, nil, []key.Destination{dest})
-	if err != nil {
-		return nil, vterrors.Wrap(err, "execUpdateByDestination")
-	}
-
-	queries := make([]*querypb.BoundQuery, len(rss))
-	for i := range rss {
-		queries[i] = &querypb.BoundQuery{
-			Sql:           upd.Query,
-			BindVariables: bindVars,
-		}
-	}
-
-	// update any owned vindexes
-	if len(upd.ChangedVindexValues) != 0 {
-		if err := upd.updateVindexEntries(vcursor, bindVars, rss); err != nil {
-			return nil, vterrors.Wrap(err, "execUpdateByDestination")
-		}
-	}
-	return execMultiShard(vcursor, rss, queries, upd.MultiShardAutocommit)
-}
-
 // updateVindexEntries performs an update when a vindex is being modified
 // by the statement.
 // Note: the commit order may be different from the DML order because it's possible
@@ -238,6 +199,32 @@ func (upd *Update) updateVindexEntries(vcursor VCursor, bindVars map[string]*que
 	return nil
 }
 
+func (upd *Update) execUpdateByDestination(vcursor VCursor, bindVars map[string]*querypb.BindVariable, dest key.Destination) (*sqltypes.Result, error) {
+	rss, _, err := vcursor.ResolveDestinations(upd.Keyspace.Name, nil, []key.Destination{dest})
+	if err != nil {
+		return nil, vterrors.Wrap(err, "execUpdateByDestination")
+	}
+
+	queries := make([]*querypb.BoundQuery, len(rss))
+	for i := range rss {
+		queries[i] = &querypb.BoundQuery{
+			Sql:           upd.Query,
+			BindVariables: bindVars,
+		}
+	}
+
+	// update any owned vindexes
+	if len(upd.ChangedVindexValues) != 0 {
+		if err := upd.updateVindexEntries(vcursor, bindVars, rss); err != nil {
+			return nil, vterrors.Wrap(err, "execUpdateByDestination")
+		}
+	}
+
+	autocommit := (len(rss) == 1 || upd.MultiShardAutocommit) && vcursor.AutocommitApproval()
+	result, errs := vcursor.ExecuteMultiShard(rss, queries, true /* rollbackOnError */, autocommit)
+	return result, vterrors.Aggregate(errs)
+}
+
 func (upd *Update) description() PrimitiveDescription {
 	other := map[string]interface{}{
 		"Query":                upd.Query,
diff --git a/go/vt/vtgate/evalengine/arithmetic.go b/go/vt/vtgate/evalengine/arithmetic.go
index 115ec7730f..97e9e5f321 100644
--- a/go/vt/vtgate/evalengine/arithmetic.go
+++ b/go/vt/vtgate/evalengine/arithmetic.go
@@ -19,7 +19,6 @@ package evalengine
 import (
 	"bytes"
 	"fmt"
-
 	"vitess.io/vitess/go/sqltypes"
 
 	"strconv"
@@ -40,12 +39,12 @@ func Add(v1, v2 sqltypes.Value) (sqltypes.Value, error) {
 		return sqltypes.NULL, nil
 	}
 
-	lv1, err := newEvalResult(v1)
+	lv1, err := newNumeric(v1)
 	if err != nil {
 		return sqltypes.NULL, err
 	}
 
-	lv2, err := newEvalResult(v2)
+	lv2, err := newNumeric(v2)
 	if err != nil {
 		return sqltypes.NULL, err
 	}
@@ -64,12 +63,12 @@ func Subtract(v1, v2 sqltypes.Value) (sqltypes.Value, error) {
 		return sqltypes.NULL, nil
 	}
 
-	lv1, err := newEvalResult(v1)
+	lv1, err := newNumeric(v1)
 	if err != nil {
 		return sqltypes.NULL, err
 	}
 
-	lv2, err := newEvalResult(v2)
+	lv2, err := newNumeric(v2)
 	if err != nil {
 		return sqltypes.NULL, err
 	}
@@ -88,11 +87,11 @@ func Multiply(v1, v2 sqltypes.Value) (sqltypes.Value, error) {
 		return sqltypes.NULL, nil
 	}
 
-	lv1, err := newEvalResult(v1)
+	lv1, err := newNumeric(v1)
 	if err != nil {
 		return sqltypes.NULL, err
 	}
-	lv2, err := newEvalResult(v2)
+	lv2, err := newNumeric(v2)
 	if err != nil {
 		return sqltypes.NULL, err
 	}
@@ -117,12 +116,12 @@ func Divide(v1, v2 sqltypes.Value) (sqltypes.Value, error) {
 		return sqltypes.NULL, err
 	}
 
-	lv1, err := newEvalResult(v1)
+	lv1, err := newNumeric(v1)
 	if err != nil {
 		return sqltypes.NULL, err
 	}
 
-	lv2, err := newEvalResult(v2)
+	lv2, err := newNumeric(v2)
 	if err != nil {
 		return sqltypes.NULL, err
 	}
@@ -154,11 +153,11 @@ func NullsafeAdd(v1, v2 sqltypes.Value, resultType querypb.Type) sqltypes.Value
 		v2 = sqltypes.MakeTrusted(resultType, zeroBytes)
 	}
 
-	lv1, err := newEvalResult(v1)
+	lv1, err := newNumeric(v1)
 	if err != nil {
 		return sqltypes.NULL
 	}
-	lv2, err := newEvalResult(v2)
+	lv2, err := newNumeric(v2)
 	if err != nil {
 		return sqltypes.NULL
 	}
@@ -187,11 +186,11 @@ func NullsafeCompare(v1, v2 sqltypes.Value) (int, error) {
 		return 1, nil
 	}
 	if sqltypes.IsNumber(v1.Type()) || sqltypes.IsNumber(v2.Type()) {
-		lv1, err := newEvalResult(v1)
+		lv1, err := newNumeric(v1)
 		if err != nil {
 			return 0, err
 		}
-		lv2, err := newEvalResult(v2)
+		lv2, err := newNumeric(v2)
 		if err != nil {
 			return 0, err
 		}
@@ -317,7 +316,7 @@ func ToInt64(v sqltypes.Value) (int64, error) {
 
 // ToFloat64 converts Value to float64.
 func ToFloat64(v sqltypes.Value) (float64, error) {
-	num, err := newEvalResult(v)
+	num, err := newNumeric(v)
 	if err != nil {
 		return 0, err
 	}
@@ -329,16 +328,7 @@ func ToFloat64(v sqltypes.Value) (float64, error) {
 	case sqltypes.Float64:
 		return num.fval, nil
 	}
-
-	if sqltypes.IsText(num.typ) || sqltypes.IsBinary(num.typ) {
-		fval, err := strconv.ParseFloat(string(v.Raw()), 64)
-		if err != nil {
-			return 0, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "%v", err)
-		}
-		return fval, nil
-	}
-
-	return 0, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "cannot convert to float: %s", v.String())
+	panic("unreachable")
 }
 
 // ToNative converts Value to a native go type.
@@ -363,32 +353,38 @@ func ToNative(v sqltypes.Value) (interface{}, error) {
 	return out, err
 }
 
-// newEvalResult parses a value and produces an evalResult containing the value
-func newEvalResult(v sqltypes.Value) (evalResult, error) {
-	raw := v.Raw()
+// newNumeric parses a value and produces an Int64, Uint64 or Float64.
+func newNumeric(v sqltypes.Value) (evalResult, error) {
+	str := v.ToString()
 	switch {
-	case v.IsBinary() || v.IsText():
-		return evalResult{bytes: raw, typ: sqltypes.VarBinary}, nil
 	case v.IsSigned():
-		ival, err := strconv.ParseInt(string(raw), 10, 64)
+		ival, err := strconv.ParseInt(str, 10, 64)
 		if err != nil {
 			return evalResult{}, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "%v", err)
 		}
 		return evalResult{ival: ival, typ: sqltypes.Int64}, nil
 	case v.IsUnsigned():
-		uval, err := strconv.ParseUint(string(raw), 10, 64)
+		uval, err := strconv.ParseUint(str, 10, 64)
 		if err != nil {
 			return evalResult{}, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "%v", err)
 		}
 		return evalResult{uval: uval, typ: sqltypes.Uint64}, nil
-	case v.IsFloat() || v.Type() == sqltypes.Decimal:
-		fval, err := strconv.ParseFloat(string(raw), 64)
+	case v.IsFloat():
+		fval, err := strconv.ParseFloat(str, 64)
 		if err != nil {
 			return evalResult{}, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "%v", err)
 		}
 		return evalResult{fval: fval, typ: sqltypes.Float64}, nil
 	}
-	return evalResult{}, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "this should not be reached. got %s", v.String())
+
+	// For other types, do best effort.
+	if ival, err := strconv.ParseInt(str, 10, 64); err == nil {
+		return evalResult{ival: ival, typ: sqltypes.Int64}, nil
+	}
+	if fval, err := strconv.ParseFloat(str, 64); err == nil {
+		return evalResult{fval: fval, typ: sqltypes.Float64}, nil
+	}
+	return evalResult{ival: 0, typ: sqltypes.Int64}, nil
 }
 
 // newIntegralNumeric parses a value and produces an Int64 or Uint64.
@@ -420,7 +416,7 @@ func newIntegralNumeric(v sqltypes.Value) (evalResult, error) {
 }
 
 func addNumeric(v1, v2 evalResult) evalResult {
-	v1, v2 = makeNumericAndprioritize(v1, v2)
+	v1, v2 = prioritize(v1, v2)
 	switch v1.typ {
 	case sqltypes.Int64:
 		return intPlusInt(v1.ival, v2.ival)
@@ -438,7 +434,7 @@ func addNumeric(v1, v2 evalResult) evalResult {
 }
 
 func addNumericWithError(v1, v2 evalResult) (evalResult, error) {
-	v1, v2 = makeNumericAndprioritize(v1, v2)
+	v1, v2 = prioritize(v1, v2)
 	switch v1.typ {
 	case sqltypes.Int64:
 		return intPlusIntWithError(v1.ival, v2.ival)
@@ -452,13 +448,10 @@ func addNumericWithError(v1, v2 evalResult) (evalResult, error) {
 	case sqltypes.Float64:
 		return floatPlusAny(v1.fval, v2), nil
 	}
-	return evalResult{}, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid arithmetic between: %s %s", v1.Value().String(), v2.Value().String())
-
+	panic("unreachable")
 }
 
-func subtractNumericWithError(i1, i2 evalResult) (evalResult, error) {
-	v1 := makeNumeric(i1)
-	v2 := makeNumeric(i2)
+func subtractNumericWithError(v1, v2 evalResult) (evalResult, error) {
 	switch v1.typ {
 	case sqltypes.Int64:
 		switch v2.typ {
@@ -481,11 +474,11 @@ func subtractNumericWithError(i1, i2 evalResult) (evalResult, error) {
 	case sqltypes.Float64:
 		return floatMinusAny(v1.fval, v2), nil
 	}
-	return evalResult{}, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid arithmetic between: %s %s", v1.Value().String(), v2.Value().String())
+	panic("unreachable")
 }
 
 func multiplyNumericWithError(v1, v2 evalResult) (evalResult, error) {
-	v1, v2 = makeNumericAndprioritize(v1, v2)
+	v1, v2 = prioritize(v1, v2)
 	switch v1.typ {
 	case sqltypes.Int64:
 		return intTimesIntWithError(v1.ival, v2.ival)
@@ -499,13 +492,10 @@ func multiplyNumericWithError(v1, v2 evalResult) (evalResult, error) {
 	case sqltypes.Float64:
 		return floatTimesAny(v1.fval, v2), nil
 	}
-	return evalResult{}, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid arithmetic between: %s %s", v1.Value().String(), v2.Value().String())
-
+	panic("unreachable")
 }
 
-func divideNumericWithError(i1, i2 evalResult) (evalResult, error) {
-	v1 := makeNumeric(i1)
-	v2 := makeNumeric(i2)
+func divideNumericWithError(v1, v2 evalResult) (evalResult, error) {
 	switch v1.typ {
 	case sqltypes.Int64:
 		return floatDivideAnyWithError(float64(v1.ival), v2)
@@ -516,14 +506,12 @@ func divideNumericWithError(i1, i2 evalResult) (evalResult, error) {
 	case sqltypes.Float64:
 		return floatDivideAnyWithError(v1.fval, v2)
 	}
-	return evalResult{}, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid arithmetic between: %s %s", v1.Value().String(), v2.Value().String())
+	panic("unreachable")
 }
 
-// makeNumericAndprioritize reorders the input parameters
+// prioritize reorders the input parameters
 // to be Float64, Uint64, Int64.
-func makeNumericAndprioritize(i1, i2 evalResult) (evalResult, evalResult) {
-	v1 := makeNumeric(i1)
-	v2 := makeNumeric(i2)
+func prioritize(v1, v2 evalResult) (altv1, altv2 evalResult) {
 	switch v1.typ {
 	case sqltypes.Int64:
 		if v2.typ == sqltypes.Uint64 || v2.typ == sqltypes.Float64 {
@@ -537,19 +525,6 @@ func makeNumericAndprioritize(i1, i2 evalResult) (evalResult, evalResult) {
 	return v1, v2
 }
 
-func makeNumeric(v evalResult) evalResult {
-	if sqltypes.IsNumber(v.typ) {
-		return v
-	}
-	if ival, err := strconv.ParseInt(string(v.bytes), 10, 64); err == nil {
-		return evalResult{ival: ival, typ: sqltypes.Int64}
-	}
-	if fval, err := strconv.ParseFloat(string(v.bytes), 64); err == nil {
-		return evalResult{fval: fval, typ: sqltypes.Float64}
-	}
-	return evalResult{ival: 0, typ: sqltypes.Int64}
-}
-
 func intPlusInt(v1, v2 int64) evalResult {
 	result := v1 + v2
 	if v1 > 0 && v2 > 0 && result < 0 {
@@ -729,6 +704,7 @@ func castFromNumeric(v evalResult, resultType querypb.Type) sqltypes.Value {
 			return sqltypes.MakeTrusted(resultType, strconv.AppendInt(nil, int64(v.uval), 10))
 		case sqltypes.Float64:
 			return sqltypes.MakeTrusted(resultType, strconv.AppendInt(nil, int64(v.fval), 10))
+
 		}
 	case sqltypes.IsUnsigned(resultType):
 		switch v.typ {
@@ -738,6 +714,7 @@ func castFromNumeric(v evalResult, resultType querypb.Type) sqltypes.Value {
 			return sqltypes.MakeTrusted(resultType, strconv.AppendUint(nil, uint64(v.ival), 10))
 		case sqltypes.Float64:
 			return sqltypes.MakeTrusted(resultType, strconv.AppendUint(nil, uint64(v.fval), 10))
+
 		}
 	case sqltypes.IsFloat(resultType) || resultType == sqltypes.Decimal:
 		switch v.typ {
@@ -752,8 +729,8 @@ func castFromNumeric(v evalResult, resultType querypb.Type) sqltypes.Value {
 			}
 			return sqltypes.MakeTrusted(resultType, strconv.AppendFloat(nil, v.fval, format, -1, 64))
 		}
-	case resultType == sqltypes.VarChar || resultType == sqltypes.VarBinary || resultType == sqltypes.Binary || resultType == sqltypes.Text:
-		return sqltypes.MakeTrusted(resultType, v.bytes)
+	case resultType == sqltypes.VarChar || resultType == sqltypes.VarBinary:
+		return sqltypes.MakeTrusted(resultType, []byte(v.str))
 	}
 	return sqltypes.NULL
 }
diff --git a/go/vt/vtgate/evalengine/expressions.go b/go/vt/vtgate/evalengine/expressions.go
index 9581dd9067..36748e8b0f 100644
--- a/go/vt/vtgate/evalengine/expressions.go
+++ b/go/vt/vtgate/evalengine/expressions.go
@@ -17,7 +17,6 @@ limitations under the License.
 package evalengine
 
 import (
-	"fmt"
 	"strconv"
 
 	"vitess.io/vitess/go/sqltypes"
@@ -29,11 +28,11 @@ import (
 
 type (
 	evalResult struct {
-		typ   querypb.Type
-		ival  int64
-		uval  uint64
-		fval  float64
-		bytes []byte
+		typ  querypb.Type
+		ival int64
+		uval uint64
+		fval float64
+		str  string
 	}
 	//ExpressionEnv contains the environment that the expression
 	//evaluates in, such as the current row and bindvars
@@ -60,9 +59,9 @@ type (
 	}
 
 	// Expressions
-	Literal      struct{ Val EvalResult }
+	LiteralInt   struct{ Val EvalResult }
+	LiteralFloat struct{ Val EvalResult }
 	BindVariable struct{ Key string }
-	Column       struct{ Offset int }
 	BinaryOp     struct {
 		Expr        BinaryExpr
 		Left, Right Expr
@@ -80,33 +79,26 @@ func (e EvalResult) Value() sqltypes.Value {
 	return castFromNumeric(e, e.typ)
 }
 
-//NewLiteralInt returns a literal expression
 func NewLiteralInt(val []byte) (Expr, error) {
 	ival, err := strconv.ParseInt(string(val), 10, 64)
 	if err != nil {
 		return nil, err
 	}
-	return &Literal{evalResult{typ: sqltypes.Int64, ival: ival}}, nil
+	return &LiteralFloat{evalResult{typ: sqltypes.Int64, ival: ival}}, nil
 }
 
-//NewLiteralFloat returns a literal expression
 func NewLiteralFloat(val []byte) (Expr, error) {
 	fval, err := strconv.ParseFloat(string(val), 64)
 	if err != nil {
 		return nil, err
 	}
-	return &Literal{evalResult{typ: sqltypes.Float64, fval: fval}}, nil
+	return &LiteralFloat{evalResult{typ: sqltypes.Float64, fval: fval}}, nil
 }
 
-//NewLiteralFloat returns a literal expression
-func NewLiteralString(val []byte) (Expr, error) {
-	return &Literal{evalResult{typ: sqltypes.VarBinary, bytes: val}}, nil
-}
-
-var _ Expr = (*Literal)(nil)
+var _ Expr = (*LiteralInt)(nil)
+var _ Expr = (*LiteralFloat)(nil)
 var _ Expr = (*BindVariable)(nil)
 var _ Expr = (*BinaryOp)(nil)
-var _ Expr = (*Column)(nil)
 
 var _ BinaryExpr = (*Addition)(nil)
 var _ BinaryExpr = (*Subtraction)(nil)
@@ -127,7 +119,11 @@ func (b *BinaryOp) Evaluate(env ExpressionEnv) (EvalResult, error) {
 }
 
 //Evaluate implements the Expr interface
-func (l *Literal) Evaluate(ExpressionEnv) (EvalResult, error) {
+func (l *LiteralInt) Evaluate(ExpressionEnv) (EvalResult, error) {
+	return l.Val, nil
+}
+
+func (l *LiteralFloat) Evaluate(env ExpressionEnv) (EvalResult, error) {
 	return l.Val, nil
 }
 
@@ -140,13 +136,6 @@ func (b *BindVariable) Evaluate(env ExpressionEnv) (EvalResult, error) {
 	return evaluateByType(val)
 }
 
-//Evaluate implements the Expr interface
-func (c *Column) Evaluate(env ExpressionEnv) (EvalResult, error) {
-	value := env.Row[c.Offset]
-	numeric, err := newEvalResult(value)
-	return numeric, err
-}
-
 //Evaluate implements the BinaryOp interface
 func (a *Addition) Evaluate(left, right EvalResult) (EvalResult, error) {
 	return addNumericWithError(left, right)
@@ -202,12 +191,11 @@ func (b *BindVariable) Type(env ExpressionEnv) querypb.Type {
 }
 
 //Type implements the Expr interface
-func (l *Literal) Type(ExpressionEnv) querypb.Type {
-	return l.Val.typ
+func (l *LiteralInt) Type(_ ExpressionEnv) querypb.Type {
+	return sqltypes.Int64
 }
 
-//Type implements the Expr interface
-func (c *Column) Type(ExpressionEnv) querypb.Type {
+func (l *LiteralFloat) Type(env ExpressionEnv) querypb.Type {
 	return sqltypes.Float64
 }
 
@@ -242,13 +230,12 @@ func (b *BindVariable) String() string {
 }
 
 //String implements the Expr interface
-func (l *Literal) String() string {
+func (l *LiteralInt) String() string {
 	return l.Val.Value().String()
 }
 
-//String implements the Expr interface
-func (c *Column) String() string {
-	return fmt.Sprintf("[%d]", c.Offset)
+func (l *LiteralFloat) String() string {
+	return l.Val.Value().String()
 }
 
 func mergeNumericalTypes(ltype, rtype querypb.Type) querypb.Type {
@@ -285,8 +272,10 @@ func evaluateByType(val *querypb.BindVariable) (EvalResult, error) {
 			fval = 0
 		}
 		return evalResult{typ: sqltypes.Float64, fval: fval}, nil
-	case sqltypes.VarChar, sqltypes.Text, sqltypes.VarBinary:
-		return evalResult{typ: sqltypes.VarBinary, bytes: val.Value}, nil
+	case sqltypes.VarChar:
+		return evalResult{typ: sqltypes.VarChar, str: string(val.Value)}, nil
+	case sqltypes.VarBinary:
+		return evalResult{typ: sqltypes.VarBinary, str: string(val.Value)}, nil
 	}
-	return evalResult{}, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Type is not supported: %s", val.Type.String())
+	return evalResult{}, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Type is not supported")
 }
diff --git a/go/vt/vtgate/planbuilder/builder.go b/go/vt/vtgate/planbuilder/builder.go
index 4f6e3ce4ae..95ec66d36b 100644
--- a/go/vt/vtgate/planbuilder/builder.go
+++ b/go/vt/vtgate/planbuilder/builder.go
@@ -304,7 +304,7 @@ func BuildFromStmt(query string, stmt sqlparser.Statement, vschema ContextVSchem
 	case *sqlparser.OtherRead, *sqlparser.OtherAdmin:
 		instruction, err = buildOtherReadAndAdmin(query, vschema)
 	case *sqlparser.Set:
-		instruction, err = buildSetPlan(stmt, vschema)
+		instruction, err = buildSetPlan(query, stmt, vschema)
 	case *sqlparser.DBDDL:
 		return nil, vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "unsupported: Database DDL %v", sqlparser.String(stmt))
 	case *sqlparser.Show, *sqlparser.SetTransaction:
diff --git a/go/vt/vtgate/planbuilder/dml.go b/go/vt/vtgate/planbuilder/dml.go
index 67da3070e3..2c3b498fd5 100644
--- a/go/vt/vtgate/planbuilder/dml.go
+++ b/go/vt/vtgate/planbuilder/dml.go
@@ -48,11 +48,7 @@ func getDMLRouting(where *sqlparser.Where, table *vindexes.Table) (engine.DMLOpc
 		}
 
 		if pv, ok := getMatch(where.Expr, index.Columns[0]); ok {
-			opcode := engine.Equal
-			if pv.IsList() {
-				opcode = engine.In
-			}
-			return opcode, ksidVindex, ksidCol, single, []sqltypes.PlanValue{pv}, nil
+			return engine.Equal, ksidVindex, ksidCol, single, []sqltypes.PlanValue{pv}, nil
 		}
 	}
 	if ksidVindex == nil {
@@ -79,10 +75,6 @@ func getMatch(node sqlparser.Expr, col sqlparser.ColIdent) (pv sqltypes.PlanValu
 			if !sqlparser.IsValue(comparison.Right) {
 				continue
 			}
-		case sqlparser.InStr:
-			if !sqlparser.IsSimpleTuple(comparison.Right) {
-				continue
-			}
 		default:
 			continue
 		}
diff --git a/go/vt/vtgate/planbuilder/select.go b/go/vt/vtgate/planbuilder/select.go
index cacb6de0e1..42a4ab60bf 100644
--- a/go/vt/vtgate/planbuilder/select.go
+++ b/go/vt/vtgate/planbuilder/select.go
@@ -137,7 +137,8 @@ func (pb *primitiveBuilder) processSelect(sel *sqlparser.Select, outer *symtab)
 }
 
 func tryAtVtgate(sel *sqlparser.Select) engine.Primitive {
-	if !isOnlyDual(sel.From) {
+	dual := isOnlyDual(sel.From)
+	if !dual {
 		return nil
 	}
 
diff --git a/go/vt/vtgate/planbuilder/set.go b/go/vt/vtgate/planbuilder/set.go
index c155ef0db4..c932934ade 100644
--- a/go/vt/vtgate/planbuilder/set.go
+++ b/go/vt/vtgate/planbuilder/set.go
@@ -17,7 +17,6 @@ limitations under the License.
 package planbuilder
 
 import (
-	"fmt"
 	"strings"
 
 	vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc"
@@ -26,7 +25,6 @@ import (
 	"vitess.io/vitess/go/vt/key"
 	"vitess.io/vitess/go/vt/sqlparser"
 	"vitess.io/vitess/go/vt/vtgate/engine"
-	"vitess.io/vitess/go/vt/vtgate/evalengine"
 )
 
 var sysVarPlanningFunc = map[string]func(expr *sqlparser.SetExpr, vschema ContextVSchema) (engine.SetOp, error){}
@@ -36,37 +34,24 @@ func init() {
 	sysVarPlanningFunc["sql_mode"] = buildSetOpCheckAndIgnore
 }
 
-func buildSetPlan(stmt *sqlparser.Set, vschema ContextVSchema) (engine.Primitive, error) {
+func buildSetPlan(sql string, stmt *sqlparser.Set, vschema ContextVSchema) (engine.Primitive, error) {
 	var setOps []engine.SetOp
 	var setOp engine.SetOp
 	var err error
 
-	var tabletExpressions []*sqlparser.SetExpr
 	for _, expr := range stmt.Exprs {
 		switch expr.Scope {
 		case sqlparser.GlobalStr:
 			return nil, vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "unsupported in set: global")
 		case "":
-			exp, err := sqlparser.Convert(expr.Expr)
-			if err == nil {
-				setOp = &engine.UserDefinedVariable{
-					Name: expr.Name.Lowered(),
-					Expr: exp,
-				}
-			} else {
-				if err != sqlparser.ExprNotSupported {
-					return nil, err
-				}
-				if !expressionOkToDelegateToTablet(expr.Expr) {
-					return nil, vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "expression not supported for SET: %s", sqlparser.String(expr.Expr))
-				}
-				setOp = &engine.UserDefinedVariable{
-					Name: expr.Name.Lowered(),
-					Expr: &evalengine.Column{Offset: len(tabletExpressions)},
-				}
-				tabletExpressions = append(tabletExpressions, expr)
+			pv, err := sqlparser.NewPlanValue(expr.Expr)
+			if err != nil {
+				return nil, err
+			}
+			setOp = &engine.UserDefinedVariable{
+				Name:      expr.Name.Lowered(),
+				PlanValue: pv,
 			}
-			setOps = append(setOps, setOp)
 		case sqlparser.SessionStr:
 			planFunc, ok := sysVarPlanningFunc[expr.Name.Lowered()]
 			if !ok {
@@ -76,56 +61,16 @@ func buildSetPlan(stmt *sqlparser.Set, vschema ContextVSchema) (engine.Primitive
 			if err != nil {
 				return nil, err
 			}
-			setOps = append(setOps, setOp)
 		default:
 			return nil, ErrPlanNotSupported
 		}
+		setOps = append(setOps, setOp)
 	}
-
-	var input engine.Primitive
-	if len(tabletExpressions) == 0 {
-		input = &engine.SingleRow{}
-	} else {
-		primitive, err := planTabletInput(vschema, tabletExpressions)
-		if err != nil {
-			return nil, err
-		}
-		input = primitive
-	}
-
 	return &engine.Set{
-		Ops:   setOps,
-		Input: input,
+		Ops: setOps,
 	}, nil
 }
 
-func planTabletInput(vschema ContextVSchema, tabletExpressions []*sqlparser.SetExpr) (engine.Primitive, error) {
-	keyspace, err := vschema.DefaultKeyspace()
-	if err != nil {
-		return nil, err
-	}
-
-	dest := vschema.Destination()
-	if dest == nil {
-		dest = key.DestinationAnyShard{}
-	}
-
-	var expr []string
-	for _, e := range tabletExpressions {
-		expr = append(expr, sqlparser.String(e.Expr))
-	}
-	query := fmt.Sprintf("select %s from dual", strings.Join(expr, ","))
-
-	primitive := &engine.Send{
-		Keyspace:          keyspace,
-		TargetDestination: dest,
-		Query:             query,
-		IsDML:             false,
-		SingleShardOnly:   true,
-	}
-	return primitive, nil
-}
-
 func buildSetOpIgnore(expr *sqlparser.SetExpr, _ ContextVSchema) (engine.SetOp, error) {
 	buf := sqlparser.NewTrackedBuffer(nil)
 	buf.Myprintf("%v", expr.Expr)
@@ -151,161 +96,13 @@ func buildSetOpCheckAndIgnore(expr *sqlparser.SetExpr, vschema ContextVSchema) (
 		dest = key.DestinationAnyShard{}
 	}
 
+	buf := sqlparser.NewTrackedBuffer(nil)
+	buf.Myprintf("%v", expr.Expr)
+
 	return &engine.SysVarCheckAndIgnore{
 		Name:              expr.Name.Lowered(),
 		Keyspace:          keyspace,
 		TargetDestination: dest,
-		Expr:              sqlparser.String(expr.Expr),
+		Expr:              buf.String(),
 	}, nil
 }
-
-// whitelist of functions knows to be safe to pass through to mysql for evaluation
-// this list tries to not include functions that might return different results on different tablets
-var validFuncs = map[string]interface{}{
-	"if":               nil,
-	"ifnull":           nil,
-	"nullif":           nil,
-	"abs":              nil,
-	"acos":             nil,
-	"asin":             nil,
-	"atan2":            nil,
-	"atan":             nil,
-	"ceil":             nil,
-	"ceiling":          nil,
-	"conv":             nil,
-	"cos":              nil,
-	"cot":              nil,
-	"crc32":            nil,
-	"degrees":          nil,
-	"div":              nil,
-	"exp":              nil,
-	"floor":            nil,
-	"ln":               nil,
-	"log":              nil,
-	"log10":            nil,
-	"log2":             nil,
-	"mod":              nil,
-	"pi":               nil,
-	"pow":              nil,
-	"power":            nil,
-	"radians":          nil,
-	"rand":             nil,
-	"round":            nil,
-	"sign":             nil,
-	"sin":              nil,
-	"sqrt":             nil,
-	"tan":              nil,
-	"truncate":         nil,
-	"adddate":          nil,
-	"addtime":          nil,
-	"convert_tz":       nil,
-	"date":             nil,
-	"date_add":         nil,
-	"date_format":      nil,
-	"date_sub":         nil,
-	"datediff":         nil,
-	"day":              nil,
-	"dayname":          nil,
-	"dayofmonth":       nil,
-	"dayofweek":        nil,
-	"dayofyear":        nil,
-	"extract":          nil,
-	"from_days":        nil,
-	"from_unixtime":    nil,
-	"get_format":       nil,
-	"hour":             nil,
-	"last_day":         nil,
-	"makedate":         nil,
-	"maketime":         nil,
-	"microsecond":      nil,
-	"minute":           nil,
-	"month":            nil,
-	"monthname":        nil,
-	"period_add":       nil,
-	"period_diff":      nil,
-	"quarter":          nil,
-	"sec_to_time":      nil,
-	"second":           nil,
-	"str_to_date":      nil,
-	"subdate":          nil,
-	"subtime":          nil,
-	"time_format":      nil,
-	"time_to_sec":      nil,
-	"timediff":         nil,
-	"timestampadd":     nil,
-	"timestampdiff":    nil,
-	"to_days":          nil,
-	"to_seconds":       nil,
-	"week":             nil,
-	"weekday":          nil,
-	"weekofyear":       nil,
-	"year":             nil,
-	"yearweek":         nil,
-	"ascii":            nil,
-	"bin":              nil,
-	"bit_length":       nil,
-	"char":             nil,
-	"char_length":      nil,
-	"character_length": nil,
-	"concat":           nil,
-	"concat_ws":        nil,
-	"elt":              nil,
-	"export_set":       nil,
-	"field":            nil,
-	"find_in_set":      nil,
-	"format":           nil,
-	"from_base64":      nil,
-	"hex":              nil,
-	"insert":           nil,
-	"instr":            nil,
-	"lcase":            nil,
-	"left":             nil,
-	"length":           nil,
-	"load_file":        nil,
-	"locate":           nil,
-	"lower":            nil,
-	"lpad":             nil,
-	"ltrim":            nil,
-	"make_set":         nil,
-	"mid":              nil,
-	"oct":              nil,
-	"octet_length":     nil,
-	"ord":              nil,
-	"position":         nil,
-	"quote":            nil,
-	"repeat":           nil,
-	"replace":          nil,
-	"reverse":          nil,
-	"right":            nil,
-	"rpad":             nil,
-	"rtrim":            nil,
-	"soundex":          nil,
-	"space":            nil,
-	"strcmp":           nil,
-	"substr":           nil,
-	"substring":        nil,
-	"substring_index":  nil,
-	"to_base64":        nil,
-	"trim":             nil,
-	"ucase":            nil,
-	"unhex":            nil,
-	"upper":            nil,
-	"weight_string":    nil,
-}
-
-func expressionOkToDelegateToTablet(e sqlparser.Expr) bool {
-	valid := true
-	sqlparser.Rewrite(e, nil, func(cursor *sqlparser.Cursor) bool {
-		switch n := cursor.Node().(type) {
-		case *sqlparser.Subquery, *sqlparser.TimestampFuncExpr, *sqlparser.CurTimeFuncExpr:
-			valid = false
-			return false
-		case *sqlparser.FuncExpr:
-			_, ok := validFuncs[n.Name.Lowered()]
-			valid = ok
-			return ok
-		}
-		return true
-	})
-	return valid
-}
diff --git a/go/vt/vttablet/tabletserver/messager/message_manager.go b/go/vt/vttablet/tabletserver/messager/message_manager.go
index 88c949672e..5a5d889da9 100644
--- a/go/vt/vttablet/tabletserver/messager/message_manager.go
+++ b/go/vt/vttablet/tabletserver/messager/message_manager.go
@@ -20,7 +20,6 @@ import (
 	"bytes"
 	"fmt"
 	"io"
-	"math/rand"
 	"sync"
 	"time"
 
@@ -265,37 +264,36 @@ func newMessageManager(tsv TabletService, vs VStreamer, table *schema.Table, pos
 func buildPostponeQuery(name sqlparser.TableIdent, minBackoff, maxBackoff time.Duration) *sqlparser.ParsedQuery {
 	var args []interface{}
 
-	// since messages are immediately postponed upon sending, we need to add exponential backoff on top
-	// of the ackWaitTime, otherwise messages will be resent too quickly.
-	buf := bytes.NewBufferString("update %v set time_next = %a + %a + ")
-	args = append(args, name, ":time_now", ":wait_time")
+	buf := bytes.NewBufferString("update %v set time_next = ")
+	args = append(args, name)
 
-	// have backoff be +/- 33%, whenever this is injected, append (:min_backoff, :jitter)
-	jitteredBackoff := "FLOOR((%a<<ifnull(epoch, 0)) * %a)"
+	// have backoff be +/- 33%, seeded with :time_now to be consistent in multiple usages
+	// whenever this is injected, append (:min_backoff, :time_now)
+	jitteredBackoff := "FLOOR((%a<<ifnull(epoch, 0))*(.666666 + (RAND(%a) * .666666)))"
 
 	//
-	// if the jittered backoff is less than min_backoff, just set it to :min_backoff
+	// if the jittered backoff is less than min_backoff, just set it to time_now + min_backoff
 	//
-	buf.WriteString(fmt.Sprintf("IF(%s < %%a, %%a, ", jitteredBackoff))
+	buf.WriteString(fmt.Sprintf("IF(%s < %%a, %%a + %%a, ", jitteredBackoff))
 	// jitteredBackoff < :min_backoff
-	args = append(args, ":min_backoff", ":jitter", ":min_backoff")
-	// if it is less, then use :min_backoff
-	args = append(args, ":min_backoff")
+	args = append(args, ":min_backoff", ":time_now", ":min_backoff")
+	// if it is less, then use :time_now + :min_backoff
+	args = append(args, ":time_now", ":min_backoff")
 
 	// now we are setting the false case on the above IF statement
 	if maxBackoff == 0 {
-		// if there is no max_backoff, just use jitteredBackoff
-		buf.WriteString(jitteredBackoff)
-		args = append(args, ":min_backoff", ":jitter")
+		// if there is no max_backoff, just use :time_now + jitteredBackoff
+		buf.WriteString(fmt.Sprintf("%%a + %s", jitteredBackoff))
+		args = append(args, ":time_now", ":min_backoff", ":time_now")
 	} else {
 		// make sure that it doesn't exceed max_backoff
-		buf.WriteString(fmt.Sprintf("IF(%s > %%a, %%a, %s)", jitteredBackoff, jitteredBackoff))
+		buf.WriteString(fmt.Sprintf("IF(%s > %%a, %%a + %%a, %%a + %s)", jitteredBackoff, jitteredBackoff))
 		// jitteredBackoff > :max_backoff
-		args = append(args, ":min_backoff", ":jitter", ":max_backoff")
-		// if it is greater, then use :max_backoff
-		args = append(args, ":max_backoff")
-		// otherwise just use jitteredBackoff
-		args = append(args, ":min_backoff", ":jitter")
+		args = append(args, ":min_backoff", ":time_now", ":max_backoff")
+		// if it is greater, then use :time_now + :max_backoff
+		args = append(args, ":time_now", ":max_backoff")
+		// otherwise just use :time_now + jitteredBackoff
+		args = append(args, ":time_now", ":min_backoff", ":time_now")
 	}
 
 	// close the if statement
@@ -849,9 +847,7 @@ func (mm *messageManager) GeneratePostponeQuery(ids []string) (string, map[strin
 
 	bvs := map[string]*querypb.BindVariable{
 		"time_now":    sqltypes.Int64BindVariable(time.Now().UnixNano()),
-		"wait_time":   sqltypes.Int64BindVariable(int64(mm.ackWaitTime)),
 		"min_backoff": sqltypes.Int64BindVariable(int64(mm.minBackoff)),
-		"jitter":      sqltypes.Float64BindVariable(.666666 + rand.Float64()*.666666),
 		"ids":         idbvs,
 	}
 
diff --git a/go/vt/wrangler/switcher.go b/go/vt/wrangler/switcher.go
index a8fb24e89a..6f755370f0 100644
--- a/go/vt/wrangler/switcher.go
+++ b/go/vt/wrangler/switcher.go
@@ -114,10 +114,6 @@ func (r *switcher) dropTargetVReplicationStreams(ctx context.Context) error {
 	return r.ts.dropTargetVReplicationStreams(ctx)
 }
 
-func (r *switcher) dropSourceReverseVReplicationStreams(ctx context.Context) error {
-	return r.ts.dropSourceReverseVReplicationStreams(ctx)
-}
-
 func (r *switcher) logs() *[]string {
 	return nil
 }
diff --git a/go/vt/wrangler/switcher_dry_run.go b/go/vt/wrangler/switcher_dry_run.go
index 5cb6a33eb6..3c8aa1af9b 100644
--- a/go/vt/wrangler/switcher_dry_run.go
+++ b/go/vt/wrangler/switcher_dry_run.go
@@ -269,7 +269,7 @@ func (dr *switcherDryRun) validateWorkflowHasCompleted(ctx context.Context) erro
 }
 
 func (dr *switcherDryRun) dropTargetVReplicationStreams(ctx context.Context) error {
-	dr.drLog.Log("Delete vreplication streams on target:")
+	dr.drLog.Log("Delete vreplication streams on:")
 	logs := make([]string, 0)
 	for _, t := range dr.ts.targets {
 		logs = append(logs, fmt.Sprintf("\tKeyspace %s Shard %s Workflow %s DbName %s Tablet %d",
@@ -279,17 +279,6 @@ func (dr *switcherDryRun) dropTargetVReplicationStreams(ctx context.Context) err
 	return nil
 }
 
-func (dr *switcherDryRun) dropSourceReverseVReplicationStreams(ctx context.Context) error {
-	dr.drLog.Log("Delete reverse vreplication streams on source:")
-	logs := make([]string, 0)
-	for _, t := range dr.ts.sources {
-		logs = append(logs, fmt.Sprintf("\tKeyspace %s Shard %s Workflow %s DbName %s Tablet %d",
-			t.si.Keyspace(), t.si.ShardName(), reverseName(dr.ts.workflow), t.master.DbName(), t.master.Alias.Uid))
-	}
-	dr.drLog.LogSlice(logs)
-	return nil
-}
-
 func (dr *switcherDryRun) freezeTargetVReplication(ctx context.Context) error {
 	logs := make([]string, 0)
 	for _, target := range dr.ts.targets {
diff --git a/go/vt/wrangler/switcher_interface.go b/go/vt/wrangler/switcher_interface.go
index 49f84859cf..a9fcb2d457 100644
--- a/go/vt/wrangler/switcher_interface.go
+++ b/go/vt/wrangler/switcher_interface.go
@@ -44,7 +44,6 @@ type iswitcher interface {
 	dropSourceShards(ctx context.Context) error
 	dropSourceBlacklistedTables(ctx context.Context) error
 	freezeTargetVReplication(ctx context.Context) error
-	dropSourceReverseVReplicationStreams(ctx context.Context) error
 	dropTargetVReplicationStreams(ctx context.Context) error
 	logs() *[]string
 }
diff --git a/go/vt/wrangler/traffic_switcher.go b/go/vt/wrangler/traffic_switcher.go
index d9d8ca1501..5055c91412 100644
--- a/go/vt/wrangler/traffic_switcher.go
+++ b/go/vt/wrangler/traffic_switcher.go
@@ -339,9 +339,6 @@ func (wr *Wrangler) DropSources(ctx context.Context, targetKeyspace, workflow st
 			return nil, err
 		}
 	}
-	if err := sw.dropSourceReverseVReplicationStreams(ctx); err != nil {
-		return nil, err
-	}
 	if err := sw.dropTargetVReplicationStreams(ctx); err != nil {
 		return nil, err
 	}
@@ -1170,22 +1167,14 @@ func (ts *trafficSwitcher) freezeTargetVReplication(ctx context.Context) error {
 func (ts *trafficSwitcher) dropTargetVReplicationStreams(ctx context.Context) error {
 	return ts.forAllTargets(func(target *tsTarget) error {
 		ts.wr.Logger().Infof("Deleting target streams for workflow %s db_name %s", ts.workflow, target.master.DbName())
+		fmt.Printf("Delete target streams for workflow %s db_name %s tablet %d\n", ts.workflow, target.master.DbName(), target.master.Alias.Uid)
 		query := fmt.Sprintf("delete from _vt.vreplication where db_name=%s and workflow=%s", encodeString(target.master.DbName()), encodeString(ts.workflow))
+		fmt.Println(query)
 		_, err := ts.wr.tmc.VReplicationExec(ctx, target.master.Tablet, query)
 		return err
 	})
 }
 
-func (ts *trafficSwitcher) dropSourceReverseVReplicationStreams(ctx context.Context) error {
-	return ts.forAllSources(func(source *tsSource) error {
-		ts.wr.Logger().Infof("Deleting reverse streams for workflow %s db_name %s", ts.workflow, source.master.DbName())
-		query := fmt.Sprintf("delete from _vt.vreplication where db_name=%s and workflow=%s",
-			encodeString(source.master.DbName()), encodeString(reverseName(ts.workflow)))
-		_, err := ts.wr.tmc.VReplicationExec(ctx, source.master.Tablet, query)
-		return err
-	})
-}
-
 func (wr *Wrangler) getRoutingRules(ctx context.Context) (map[string][]string, error) {
 	rrs, err := wr.ts.GetRoutingRules(ctx)
 	if err != nil {
diff --git a/helm/vitess/templates/_vtctld.tpl b/helm/vitess/templates/_vtctld.tpl
index be70e1f4d4..576272064b 100644
--- a/helm/vitess/templates/_vtctld.tpl
+++ b/helm/vitess/templates/_vtctld.tpl
@@ -130,7 +130,6 @@ spec:
                 -grpc_port=15999
                 -service_map="grpc-vtctl"
                 -topo_global_root=/vitess/global
-                -proxy_tablets=true
                 {{- if eq ($cell.topologyProvider | default "") "etcd2" }}
                 -topo_implementation="etcd2"
                 -topo_global_server_address="etcd-global-client.{{ $namespace }}:2379"
diff --git a/helm/vitess/values.yaml b/helm/vitess/values.yaml
index 054361bfe8..7ba320f5b0 100644
--- a/helm/vitess/values.yaml
+++ b/helm/vitess/values.yaml
@@ -182,7 +182,7 @@ etcd:
 # Default values for vtctld resources defined in 'topology'
 vtctld:
   serviceType: ClusterIP
-  vitessTag: helm-2.0.1-0
+  vitessTag: helm-2.0.0-0
   resources:
     # requests:
     #   cpu: 100m
@@ -193,7 +193,7 @@ vtctld:
 # Default values for vtgate resources defined in 'topology'
 vtgate:
   serviceType: ClusterIP
-  vitessTag: helm-2.0.1-0
+  vitessTag: helm-2.0.0-0
   resources:
     # requests:
     #   cpu: 500m
@@ -212,13 +212,13 @@ vtgate:
 
 # Default values for vtctlclient resources defined in 'topology'
 vtctlclient:
-  vitessTag: helm-2.0.1-0
+  vitessTag: helm-2.0.0-0
   extraFlags: {}
   secrets: [] # secrets are mounted under /vt/usersecrets/{secretname}
 
 # Default values for vtworker resources defined in 'jobs'
 vtworker:
-  vitessTag: helm-2.0.1-0
+  vitessTag: helm-2.0.0-0
   extraFlags: {}
   resources:
     # requests:
@@ -229,7 +229,7 @@ vtworker:
 
 # Default values for vttablet resources defined in 'topology'
 vttablet:
-  vitessTag: helm-2.0.1-0
+  vitessTag: helm-2.0.0-0
 
   # valid values are
   # - mysql56 (for MySQL 8.0)


Test patch:
diff --git a/go/jsonutil/json_test.go b/go/jsonutil/json_test.go
index d40c26f558..9bb250cb8c 100644
--- a/go/jsonutil/json_test.go
+++ b/go/jsonutil/json_test.go
@@ -1,3 +1,19 @@
+/*
+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 jsonutil
 
 import (
diff --git a/go/sync2/atomic_test.go b/go/sync2/atomic_test.go
index 6c28fbed47..4590c5b92e 100644
--- a/go/sync2/atomic_test.go
+++ b/go/sync2/atomic_test.go
@@ -18,58 +18,93 @@ package sync2
 
 import (
 	"testing"
+	"time"
+
+	"gotest.tools/assert"
 )
 
+func TestAtomicInt32(t *testing.T) {
+	i := NewAtomicInt32(1)
+	assert.Equal(t, int32(1), i.Get())
+
+	i.Set(2)
+	assert.Equal(t, int32(2), i.Get())
+
+	i.Add(1)
+	assert.Equal(t, int32(3), i.Get())
+
+	i.CompareAndSwap(3, 4)
+	assert.Equal(t, int32(4), i.Get())
+
+	i.CompareAndSwap(3, 5)
+	assert.Equal(t, int32(4), i.Get())
+}
+
+func TestAtomicInt64(t *testing.T) {
+	i := NewAtomicInt64(1)
+	assert.Equal(t, int64(1), i.Get())
+
+	i.Set(2)
+	assert.Equal(t, int64(2), i.Get())
+
+	i.Add(1)
+	assert.Equal(t, int64(3), i.Get())
+
+	i.CompareAndSwap(3, 4)
+	assert.Equal(t, int64(4), i.Get())
+
+	i.CompareAndSwap(3, 5)
+	assert.Equal(t, int64(4), i.Get())
+}
+
+func TestAtomicDuration(t *testing.T) {
+	d := NewAtomicDuration(time.Second)
+	assert.Equal(t, time.Second, d.Get())
+
+	d.Set(time.Second * 2)
+	assert.Equal(t, time.Second*2, d.Get())
+
+	d.Add(time.Second)
+	assert.Equal(t, time.Second*3, d.Get())
+
+	d.CompareAndSwap(time.Second*3, time.Second*4)
+	assert.Equal(t, time.Second*4, d.Get())
+
+	d.CompareAndSwap(time.Second*3, time.Second*5)
+	assert.Equal(t, time.Second*4, d.Get())
+}
+
 func TestAtomicString(t *testing.T) {
 	var s AtomicString
-	if s.Get() != "" {
-		t.Errorf("want empty, got %s", s.Get())
-	}
+	assert.Equal(t, "", s.Get())
+
 	s.Set("a")
-	if s.Get() != "a" {
-		t.Errorf("want a, got %s", s.Get())
-	}
-	if s.CompareAndSwap("b", "c") {
-		t.Errorf("want false, got true")
-	}
-	if s.Get() != "a" {
-		t.Errorf("want a, got %s", s.Get())
-	}
-	if !s.CompareAndSwap("a", "c") {
-		t.Errorf("want true, got false")
-	}
-	if s.Get() != "c" {
-		t.Errorf("want c, got %s", s.Get())
-	}
+	assert.Equal(t, "a", s.Get())
+
+	assert.Equal(t, false, s.CompareAndSwap("b", "c"))
+	assert.Equal(t, "a", s.Get())
+
+	assert.Equal(t, true, s.CompareAndSwap("a", "c"))
+	assert.Equal(t, "c", s.Get())
 }
 
 func TestAtomicBool(t *testing.T) {
 	b := NewAtomicBool(true)
-	if !b.Get() {
-		t.Error("b.Get: false, want true")
-	}
+	assert.Equal(t, true, b.Get())
+
 	b.Set(false)
-	if b.Get() {
-		t.Error("b.Get: true, want false")
-	}
+	assert.Equal(t, false, b.Get())
+
 	b.Set(true)
-	if !b.Get() {
-		t.Error("b.Get: false, want true")
-	}
-
-	if b.CompareAndSwap(false, true) {
-		t.Error("b.CompareAndSwap false, true should fail")
-	}
-	if !b.CompareAndSwap(true, false) {
-		t.Error("b.CompareAndSwap true, false should succeed")
-	}
-	if !b.CompareAndSwap(false, false) {
-		t.Error("b.CompareAndSwap false, false should NOP")
-	}
-	if !b.CompareAndSwap(false, true) {
-		t.Error("b.CompareAndSwap false, true should succeed")
-	}
-	if !b.CompareAndSwap(true, true) {
-		t.Error("b.CompareAndSwap true, true should NOP")
-	}
+	assert.Equal(t, true, b.Get())
+
+	assert.Equal(t, false, b.CompareAndSwap(false, true))
+
+	assert.Equal(t, true, b.CompareAndSwap(true, false))
+
+	assert.Equal(t, true, b.CompareAndSwap(false, false))
+
+	assert.Equal(t, true, b.CompareAndSwap(false, true))
+
+	assert.Equal(t, true, b.CompareAndSwap(true, true))
 }
diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go
index c7a9a6a843..00931d4ec5 100644
--- a/go/test/endtoend/vreplication/vreplication_test.go
+++ b/go/test/endtoend/vreplication/vreplication_test.go
@@ -230,11 +230,9 @@ func shardCustomer(t *testing.T, testReverse bool) {
 		assert.False(t, exists)
 
 		for _, shard := range strings.Split("-80,80-", ",") {
-			expectNumberOfStreams(t, vtgateConn, "shardCustomerTargetStreams", "p2c", "customer:"+shard, 0)
+			expectNumberOfStreams(t, vtgateConn, "shardCustomer", "p2c", "customer:"+shard, 0)
 		}
 
-		expectNumberOfStreams(t, vtgateConn, "shardCustomerReverseStreams", "p2c_reverse", "product:0", 0)
-
 		var found bool
 		found, err = checkIfTableExists(t, vc, "zone1-100", "customer")
 		assert.NoError(t, err, "Customer table not deleted from zone1-100")
diff --git a/go/test/endtoend/vreplication/vreplication_test_env.go b/go/test/endtoend/vreplication/vreplication_test_env.go
index dc8dfac8d5..a7039c4ff3 100644
--- a/go/test/endtoend/vreplication/vreplication_test_env.go
+++ b/go/test/endtoend/vreplication/vreplication_test_env.go
@@ -101,9 +101,7 @@ var dryRunResultsDropSourcesCustomerShard = []string{
 	"	Keyspace product Shard 0 DbName vt_product Tablet 100 Table customer",
 	"Blacklisted tables customer will be removed from:",
 	"	Keyspace product Shard 0 Tablet 100",
-	"Delete reverse vreplication streams on source:",
-	"	Keyspace product Shard 0 Workflow p2c_reverse DbName vt_product Tablet 100",
-	"Delete vreplication streams on target:",
+	"Delete vreplication streams on:",
 	"	Keyspace customer Shard -80 Workflow p2c DbName vt_customer Tablet 200",
 	"	Keyspace customer Shard 80- Workflow p2c DbName vt_customer Tablet 300",
 	"Unlock keyspace customer",
diff --git a/go/test/endtoend/vtgate/lookup_test.go b/go/test/endtoend/vtgate/lookup_test.go
index a5b485399c..65c174bf8f 100644
--- a/go/test/endtoend/vtgate/lookup_test.go
+++ b/go/test/endtoend/vtgate/lookup_test.go
@@ -253,96 +253,6 @@ func TestDMLScatter(t *testing.T) {
 	require.Empty(t, qr.Rows)
 }
 
-func TestDMLIn(t *testing.T) {
-	ctx := context.Background()
-	conn, err := mysql.Connect(ctx, &vtParams)
-	require.NoError(t, err)
-	defer conn.Close()
-
-	/* Simple insert. after this dml, the tables will contain the following:
-	t3 (id5, id6, id7):
-	1 2 3
-	2 2 3
-	3 4 3
-	4 5 4
-
-	t3_id7_idx (id7, keyspace_id:id6):
-	3 2
-	3 2
-	3 4
-	4 5
-	*/
-	exec(t, conn, "begin")
-	exec(t, conn, "insert into t3(id5, id6, id7) values(1, 2, 3), (2, 2, 3), (3, 4, 3), (4, 5, 4)")
-	exec(t, conn, "commit")
-	qr := exec(t, conn, "select id5, id6, id7 from t3 order by id5, id6")
-	if got, want := fmt.Sprintf("%v", qr.Rows), "[[INT64(1) INT64(2) INT64(3)] [INT64(2) INT64(2) INT64(3)] [INT64(3) INT64(4) INT64(3)] [INT64(4) INT64(5) INT64(4)]]"; got != want {
-		t.Errorf("select:\n%v want\n%v", got, want)
-	}
-
-	/* Updating a non lookup column. after this dml, the tables will contain the following:
-	t3 (id5, id6, id7):
-	1 2 3
-	2 2 3
-	42 4 3
-	42 5 4
-
-	t3_id7_idx (id7, keyspace_id:id6):
-	3 2
-	3 2
-	3 4
-	4 5
-	*/
-	exec(t, conn, "update t3 set id5 = 42 where id6 in (4, 5)")
-	qr = exec(t, conn, "select id5, id6, id7 from t3 order by id5, id6")
-	if got, want := fmt.Sprintf("%v", qr.Rows), "[[INT64(1) INT64(2) INT64(3)] [INT64(2) INT64(2) INT64(3)] [INT64(42) INT64(4) INT64(3)] [INT64(42) INT64(5) INT64(4)]]"; got != want {
-		t.Errorf("select:\n%v want\n%v", got, want)
-	}
-
-	/* Updating a non lookup column. after this dml, the tables will contain the following:
-	t3 (id5, id6, id7):
-	1 2 42
-	2 2 42
-	42 4 3
-	42 5 4
-
-	t3_id7_idx (id7, keyspace_id:id6):
-	42 2
-	42 2
-	3 4
-	42 5
-	*/
-	exec(t, conn, "begin")
-	exec(t, conn, "update t3 set id7 = 42 where id6 in (2, 5)")
-	exec(t, conn, "commit")
-	qr = exec(t, conn, "select id5, id6, id7 from t3 order by id5, id6")
-	if got, want := fmt.Sprintf("%v", qr.Rows), "[[INT64(1) INT64(2) INT64(42)] [INT64(2) INT64(2) INT64(42)] [INT64(42) INT64(4) INT64(3)] [INT64(42) INT64(5) INT64(42)]]"; got != want {
-		t.Errorf("select:\n%v want\n%v", got, want)
-	}
-
-	/* Updating a non lookup column. after this dml, the tables will contain the following:
-	t3 (id5, id6, id7):
-	42 4 3
-	42 5 4
-
-	t3_id7_idx (id7, keyspace_id:id6):
-	3 4
-	42 5
-	*/
-	exec(t, conn, "delete from t3 where id6 in (2)")
-	qr = exec(t, conn, "select * from t3 where id6 = 2")
-	require.Empty(t, qr.Rows)
-	qr = exec(t, conn, "select * from t3_id7_idx where id6 = 2")
-	require.Empty(t, qr.Rows)
-
-	// delete all the rows.
-	exec(t, conn, "delete from t3 where id6 in (4, 5)")
-	qr = exec(t, conn, "select * from t3")
-	require.Empty(t, qr.Rows)
-	qr = exec(t, conn, "select * from t3_id7_idx")
-	require.Empty(t, qr.Rows)
-}
-
 func TestConsistentLookupMultiInsert(t *testing.T) {
 	defer cluster.PanicHandler(t)
 	ctx := context.Background()
diff --git a/go/test/endtoend/vtgate/setstatement/udv_test.go b/go/test/endtoend/vtgate/setstatement/udv_test.go
index 19ae64c7bb..b7fc1f8ff5 100644
--- a/go/test/endtoend/vtgate/setstatement/udv_test.go
+++ b/go/test/endtoend/vtgate/setstatement/udv_test.go
@@ -21,8 +21,6 @@ import (
 	"fmt"
 	"testing"
 
-	"vitess.io/vitess/go/test/utils"
-
 	"github.com/google/go-cmp/cmp"
 	"github.com/stretchr/testify/require"
 
@@ -44,11 +42,11 @@ func TestSetUDV(t *testing.T) {
 	}
 
 	queries := []queriesWithExpectations{{
-		query:        "set @foo = 'abc', @bar = 42, @baz = 30.5, @tablet = concat('foo','bar')",
+		query:        "set @foo = 'abc', @bar = 42, @baz = 30.5",
 		expectedRows: "", rowsAffected: 0,
 	}, {
-		query:        "select @foo, @bar, @baz, @tablet",
-		expectedRows: `[[VARBINARY("abc") INT64(42) FLOAT64(30.5) VARBINARY("foobar")]]`, rowsAffected: 1,
+		query:        "select @foo, @bar, @baz",
+		expectedRows: `[[VARBINARY("abc") INT64(42) FLOAT64(30.5)]]`, rowsAffected: 1,
 	}, {
 		query:        "insert into test(id, val1, val2, val3) values(1, @foo, null, null), (2, null, @bar, null), (3, null, null, @baz)",
 		expectedRows: ``, rowsAffected: 3,
@@ -77,11 +75,8 @@ func TestSetUDV(t *testing.T) {
 		query:        "select id, val1, val2 from test where val1=@foo",
 		expectedRows: `[[INT64(1) VARCHAR("abc") INT32(42)]]`, rowsAffected: 1,
 	}, {
-		query:        "insert into test(id, val1, val2, val3) values (42, @tablet, null, null)",
-		expectedRows: ``, rowsAffected: 1,
-	}, {
-		query:        "select id, val1 from test where val1 = @tablet",
-		expectedRows: `[[INT64(42) VARCHAR("foobar")]]`, rowsAffected: 1,
+		query:        "delete from test",
+		expectedRows: ``, rowsAffected: 2,
 	}}
 
 	conn, err := mysql.Connect(ctx, &vtParams)
@@ -102,23 +97,3 @@ func TestSetUDV(t *testing.T) {
 		})
 	}
 }
-
-func TestUserDefinedVariableResolvedAtTablet(t *testing.T) {
-	ctx := context.Background()
-	vtParams := mysql.ConnParams{
-		Host: "localhost",
-		Port: clusterInstance.VtgateMySQLPort,
-	}
-	conn, err := mysql.Connect(ctx, &vtParams)
-	require.NoError(t, err)
-	defer conn.Close()
-
-	// this should set the UDV foo to a value that has to be evaluated by mysqld
-	exec(t, conn, "set @foo = CONCAT('Any','Expression','Is','Valid')")
-
-	// now getting that value should return the value from the tablet
-	qr, err := exec(t, conn, "select @foo")
-	require.NoError(t, err)
-	got := fmt.Sprintf("%v", qr.Rows)
-	utils.MustMatch(t, `[[VARBINARY("AnyExpressionIsValid")]]`, got, "didnt match")
-}
diff --git a/go/vt/vtgate/autocommit_test.go b/go/vt/vtgate/autocommit_test.go
index 2c37d7b066..4f647530b2 100644
--- a/go/vt/vtgate/autocommit_test.go
+++ b/go/vt/vtgate/autocommit_test.go
@@ -175,34 +175,15 @@ func TestAutocommitDeleteLookup(t *testing.T) {
 	testCommitCount(t, "sbc1", sbc1, 1)
 }
 
-// TestAutocommitDeleteIn: instant-commit.
-func TestAutocommitDeleteIn(t *testing.T) {
-	executor, sbc1, sbc2, _ := createExecutorEnv()
-
-	_, err := autocommitExec(executor, "delete from user_extra where user_id in (1, 2)")
-	require.NoError(t, err)
-
-	testBatchQuery(t, "sbc1", sbc1, &querypb.BoundQuery{
-		Sql:           "delete from user_extra where user_id in (1, 2)",
-		BindVariables: map[string]*querypb.BindVariable{},
-	})
-	testAsTransactionCount(t, "sbc1", sbc1, 1)
-	testCommitCount(t, "sbc1", sbc1, 0)
-
-	testBatchQuery(t, "sbc2", sbc2, nil)
-	testAsTransactionCount(t, "sbc2", sbc2, 0)
-	testCommitCount(t, "sbc2", sbc2, 0)
-}
-
 // TestAutocommitDeleteMultiShard: instant-commit.
 func TestAutocommitDeleteMultiShard(t *testing.T) {
 	executor, sbc1, sbc2, _ := createExecutorEnv()
 
-	_, err := autocommitExec(executor, "delete from user_extra where user_id = user_id + 1")
+	_, err := autocommitExec(executor, "delete from user_extra where user_id in (1, 2)")
 	require.NoError(t, err)
 
 	testQueries(t, "sbc1", sbc1, []*querypb.BoundQuery{{
-		Sql:           "delete from user_extra where user_id = user_id + 1",
+		Sql:           "delete from user_extra where user_id in (1, 2)",
 		BindVariables: map[string]*querypb.BindVariable{},
 	}})
 	testBatchQuery(t, "sbc1", sbc1, nil)
@@ -210,30 +191,30 @@ func TestAutocommitDeleteMultiShard(t *testing.T) {
 	testCommitCount(t, "sbc1", sbc1, 1)
 
 	testQueries(t, "sbc2", sbc2, []*querypb.BoundQuery{{
-		Sql:           "delete from user_extra where user_id = user_id + 1",
+		Sql:           "delete from user_extra where user_id in (1, 2)",
 		BindVariables: map[string]*querypb.BindVariable{},
 	}})
 	testBatchQuery(t, "sbc2", sbc2, nil)
 	testAsTransactionCount(t, "sbc2", sbc2, 0)
-	testCommitCount(t, "sbc2", sbc2, 1)
+	testCommitCount(t, "sbc1", sbc1, 1)
 }
 
 // TestAutocommitDeleteMultiShardAutoCommit: instant-commit.
 func TestAutocommitDeleteMultiShardAutoCommit(t *testing.T) {
 	executor, sbc1, sbc2, _ := createExecutorEnv()
 
-	_, err := autocommitExec(executor, "delete /*vt+ MULTI_SHARD_AUTOCOMMIT=1 */ from user_extra where user_id = user_id + 1")
+	_, err := autocommitExec(executor, "delete /*vt+ MULTI_SHARD_AUTOCOMMIT=1 */ from user_extra where user_id in (1, 2)")
 	require.NoError(t, err)
 
 	testBatchQuery(t, "sbc1", sbc1, &querypb.BoundQuery{
-		Sql:           "delete /*vt+ MULTI_SHARD_AUTOCOMMIT=1 */ from user_extra where user_id = user_id + 1",
+		Sql:           "delete /*vt+ MULTI_SHARD_AUTOCOMMIT=1 */ from user_extra where user_id in (1, 2)",
 		BindVariables: map[string]*querypb.BindVariable{},
 	})
 	testAsTransactionCount(t, "sbc1", sbc1, 1)
 	testCommitCount(t, "sbc1", sbc1, 0)
 
 	testBatchQuery(t, "sbc2", sbc2, &querypb.BoundQuery{
-		Sql:           "delete /*vt+ MULTI_SHARD_AUTOCOMMIT=1 */ from user_extra where user_id = user_id + 1",
+		Sql:           "delete /*vt+ MULTI_SHARD_AUTOCOMMIT=1 */ from user_extra where user_id in (1, 2)",
 		BindVariables: map[string]*querypb.BindVariable{},
 	})
 	testAsTransactionCount(t, "sbc2", sbc2, 1)
diff --git a/go/vt/vtgate/engine/ordered_aggregate_test.go b/go/vt/vtgate/engine/ordered_aggregate_test.go
index e0f43d322a..4638462570 100644
--- a/go/vt/vtgate/engine/ordered_aggregate_test.go
+++ b/go/vt/vtgate/engine/ordered_aggregate_test.go
@@ -18,11 +18,9 @@ package engine
 
 import (
 	"errors"
+	"reflect"
 	"testing"
 
-	"github.com/stretchr/testify/require"
-	"vitess.io/vitess/go/test/utils"
-
 	"github.com/stretchr/testify/assert"
 	"vitess.io/vitess/go/sqltypes"
 	querypb "vitess.io/vitess/go/vt/proto/query"
@@ -503,6 +501,7 @@ func TestOrderedAggregateSumDistinctGood(t *testing.T) {
 }
 
 func TestOrderedAggregateSumDistinctTolerateError(t *testing.T) {
+	assert := assert.New(t)
 	fp := &fakePrimitive{
 		results: []*sqltypes.Result{sqltypes.MakeTestResult(
 			sqltypes.MakeTestFields(
@@ -527,7 +526,7 @@ func TestOrderedAggregateSumDistinctTolerateError(t *testing.T) {
 	}
 
 	result, err := oa.Execute(nil, nil, false)
-	assert.NoError(t, err)
+	assert.NoError(err)
 
 	wantResult := sqltypes.MakeTestResult(
 		sqltypes.MakeTestFields(
@@ -536,7 +535,7 @@ func TestOrderedAggregateSumDistinctTolerateError(t *testing.T) {
 		),
 		"a|1",
 	)
-	utils.MustMatch(t, wantResult, result, "")
+	assert.Equal(wantResult, result)
 }
 
 func TestOrderedAggregateKeysFail(t *testing.T) {
@@ -573,7 +572,6 @@ func TestOrderedAggregateKeysFail(t *testing.T) {
 }
 
 func TestOrderedAggregateMergeFail(t *testing.T) {
-	t.Skip("this looks like an invalid test")
 	fields := sqltypes.MakeTestFields(
 		"col|count(*)",
 		"varbinary|decimal",
@@ -616,13 +614,19 @@ func TestOrderedAggregateMergeFail(t *testing.T) {
 	}
 
 	res, err := oa.Execute(nil, nil, false)
-	require.NoError(t, err)
+	if err != nil {
+		t.Errorf("oa.Execute() failed: %v", err)
+	}
 
-	utils.MustMatch(t, result, res, "Found mismatched values")
+	if !reflect.DeepEqual(res, result) {
+		t.Fatalf("Found mismatched values: want %v, got %v", result, res)
+	}
 
 	fp.rewind()
-	err = oa.StreamExecute(nil, nil, false, func(_ *sqltypes.Result) error { return nil })
-	require.NoError(t, err)
+	if err := oa.StreamExecute(nil, nil, false, func(_ *sqltypes.Result) error { return nil }); err != nil {
+		t.Errorf("oa.StreamExecute(): %v", err)
+	}
+
 }
 
 func TestMerge(t *testing.T) {
diff --git a/go/vt/vtgate/engine/set_test.go b/go/vt/vtgate/engine/set_test.go
index f19ed43a49..3c4249f3ee 100644
--- a/go/vt/vtgate/engine/set_test.go
+++ b/go/vt/vtgate/engine/set_test.go
@@ -17,16 +17,14 @@ limitations under the License.
 package engine
 
 import (
-	"strconv"
 	"testing"
 
-	"github.com/stretchr/testify/require"
-	"vitess.io/vitess/go/vt/vtgate/evalengine"
-
 	"vitess.io/vitess/go/sqltypes"
 	"vitess.io/vitess/go/vt/key"
 	"vitess.io/vitess/go/vt/vtgate/vindexes"
 
+	"github.com/stretchr/testify/require"
+
 	querypb "vitess.io/vitess/go/vt/proto/query"
 )
 
@@ -40,12 +38,6 @@ func TestSetTable(t *testing.T) {
 		expectedError    string
 	}
 
-	intExpr := func(i int) evalengine.Expr {
-		s := strconv.FormatInt(int64(i), 10)
-		e, _ := evalengine.NewLiteralInt([]byte(s))
-		return e
-	}
-
 	tests := []testCase{
 		{
 			testName:         "nil set ops",
@@ -56,7 +48,9 @@ func TestSetTable(t *testing.T) {
 			setOps: []SetOp{
 				&UserDefinedVariable{
 					Name: "x",
-					Expr: intExpr(42),
+					PlanValue: sqltypes.PlanValue{
+						Value: sqltypes.NewInt64(42),
+					},
 				},
 			},
 			expectedQueryLog: []string{
@@ -147,7 +141,9 @@ func TestSetTable(t *testing.T) {
 			setOps: []SetOp{
 				&UserDefinedVariable{
 					Name: "x",
-					Expr: intExpr(1),
+					PlanValue: sqltypes.PlanValue{
+						Value: sqltypes.NewInt64(1),
+					},
 				},
 				&SysVarIgnore{
 					Name: "y",
@@ -185,8 +181,7 @@ func TestSetTable(t *testing.T) {
 	for _, tc := range tests {
 		t.Run(tc.testName, func(t *testing.T) {
 			set := &Set{
-				Ops:   tc.setOps,
-				Input: &SingleRow{},
+				Ops: tc.setOps,
 			}
 			vc := &loggingVCursor{
 				shards:  []string{"-20", "20-"},
diff --git a/go/vt/vtgate/engine/update_test.go b/go/vt/vtgate/engine/update_test.go
index 7851e6568f..d73e8bf168 100644
--- a/go/vt/vtgate/engine/update_test.go
+++ b/go/vt/vtgate/engine/update_test.go
@@ -404,158 +404,6 @@ func TestUpdateScatterChangedVindex(t *testing.T) {
 
 }
 
-func TestUpdateIn(t *testing.T) {
-	ks := buildTestVSchema().Keyspaces["sharded"]
-	upd := &Update{DML: DML{
-		Opcode:   In,
-		Keyspace: ks.Keyspace,
-		Query:    "dummy_update",
-		Vindex:   ks.Vindexes["hash"].(vindexes.SingleColumn),
-		Values: []sqltypes.PlanValue{{
-			Values: []sqltypes.PlanValue{
-				{Value: sqltypes.NewInt64(1)},
-				{Value: sqltypes.NewInt64(2)},
-			}},
-		}},
-	}
-
-	vc := &loggingVCursor{shards: []string{"-20", "20-"}}
-	_, err := upd.Execute(vc, map[string]*querypb.BindVariable{}, false)
-	require.NoError(t, err)
-	vc.ExpectLog(t, []string{
-		`ResolveDestinations sharded [] Destinations:DestinationKeyspaceID(166b40b44aba4bd6),DestinationKeyspaceID(06e7ea22ce92708f)`,
-		// ResolveDestinations is hard-coded to return -20.
-		`ExecuteMultiShard sharded.-20: dummy_update {} true true`,
-	})
-}
-
-func TestUpdateInChangedVindex(t *testing.T) {
-	ks := buildTestVSchema().Keyspaces["sharded"]
-	upd := &Update{
-		DML: DML{
-			Opcode:   In,
-			Keyspace: ks.Keyspace,
-			Query:    "dummy_update",
-			Vindex:   ks.Vindexes["hash"].(vindexes.SingleColumn),
-			Values: []sqltypes.PlanValue{{
-				Values: []sqltypes.PlanValue{
-					{Value: sqltypes.NewInt64(1)},
-					{Value: sqltypes.NewInt64(2)},
-				}},
-			},
-			Table:            ks.Tables["t1"],
-			OwnedVindexQuery: "dummy_subquery",
-			KsidVindex:       ks.Vindexes["hash"].(vindexes.SingleColumn),
-		},
-		ChangedVindexValues: map[string]VindexValues{
-			"twocol": {
-				"c1": {Value: sqltypes.NewInt64(1)},
-				"c2": {Value: sqltypes.NewInt64(2)},
-			},
-			"onecol": {
-				"c3": {Value: sqltypes.NewInt64(3)},
-			},
-		},
-	}
-
-	results := []*sqltypes.Result{sqltypes.MakeTestResult(
-		sqltypes.MakeTestFields(
-			"id|c1|c2|c3",
-			"int64|int64|int64|int64",
-		),
-		"1|4|5|6",
-		"2|21|22|23",
-	)}
-	vc := &loggingVCursor{
-		shards:  []string{"-20", "20-"},
-		results: results,
-	}
-
-	_, err := upd.Execute(vc, map[string]*querypb.BindVariable{}, false)
-	require.NoError(t, err)
-	vc.ExpectLog(t, []string{
-		`ResolveDestinations sharded [] Destinations:DestinationKeyspaceID(166b40b44aba4bd6),DestinationKeyspaceID(06e7ea22ce92708f)`,
-		// ResolveDestinations is hard-coded to return -20.
-		// It gets used to perform the subquery to fetch the changing column values.
-		`ExecuteMultiShard sharded.-20: dummy_subquery {} false false`,
-		// Those values are returned as 4,5 for twocol and 6 for onecol.
-		// 4,5 have to be replaced by 1,2 (the new values).
-		`Execute delete from lkp2 where from1 = :from1 and from2 = :from2 and toc = :toc from1: type:INT64 value:"4" from2: type:INT64 value:"5" toc: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		`Execute insert into lkp2(from1, from2, toc) values(:from10, :from20, :toc0) from10: type:INT64 value:"1" from20: type:INT64 value:"2" toc0: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		// 6 has to be replaced by 3.
-		`Execute delete from lkp1 where from = :from and toc = :toc from: type:INT64 value:"6" toc: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		`Execute insert into lkp1(from, toc) values(:from0, :toc0) from0: type:INT64 value:"3" toc0: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		// 21,22 have to be replaced by 1,2 (the new values).
-		`Execute delete from lkp2 where from1 = :from1 and from2 = :from2 and toc = :toc from1: type:INT64 value:"21" from2: type:INT64 value:"22" toc: type:VARBINARY value:"\006\347\352\"\316\222p\217"  true`,
-		`Execute insert into lkp2(from1, from2, toc) values(:from10, :from20, :toc0) from10: type:INT64 value:"1" from20: type:INT64 value:"2" toc0: type:VARBINARY value:"\006\347\352\"\316\222p\217"  true`,
-		// 23 has to be replaced by 3.
-		`Execute delete from lkp1 where from = :from and toc = :toc from: type:INT64 value:"23" toc: type:VARBINARY value:"\006\347\352\"\316\222p\217"  true`,
-		`Execute insert into lkp1(from, toc) values(:from0, :toc0) from0: type:INT64 value:"3" toc0: type:VARBINARY value:"\006\347\352\"\316\222p\217"  true`,
-		// Finally, the actual update, which is also sent to -20, same route as the subquery.
-		`ExecuteMultiShard sharded.-20: dummy_update {} true true`,
-	})
-
-	// No rows changing
-	vc = &loggingVCursor{
-		shards: []string{"-20", "20-"},
-	}
-	_, err = upd.Execute(vc, map[string]*querypb.BindVariable{}, false)
-	require.NoError(t, err)
-	vc.ExpectLog(t, []string{
-		`ResolveDestinations sharded [] Destinations:DestinationKeyspaceID(166b40b44aba4bd6),DestinationKeyspaceID(06e7ea22ce92708f)`,
-		// ResolveDestinations is hard-coded to return -20.
-		// It gets used to perform the subquery to fetch the changing column values.
-		`ExecuteMultiShard sharded.-20: dummy_subquery {} false false`,
-		// Subquery returns no rows. So, no vindexes are updated. We still pass-through the original update.
-		`ExecuteMultiShard sharded.-20: dummy_update {} true true`,
-	})
-
-	// Failure case: multiple rows changing.
-	results = []*sqltypes.Result{sqltypes.MakeTestResult(
-		sqltypes.MakeTestFields(
-			"id|c1|c2|c3",
-			"int64|int64|int64|int64",
-		),
-		"1|4|5|6",
-		"1|7|8|9",
-		"2|21|22|23",
-	)}
-	vc = &loggingVCursor{
-		shards:  []string{"-20", "20-"},
-		results: results,
-	}
-	_, err = upd.Execute(vc, map[string]*querypb.BindVariable{}, false)
-	require.NoError(t, err)
-	vc.ExpectLog(t, []string{
-		`ResolveDestinations sharded [] Destinations:DestinationKeyspaceID(166b40b44aba4bd6),DestinationKeyspaceID(06e7ea22ce92708f)`,
-		// ResolveDestinations is hard-coded to return -20.
-		// It gets used to perform the subquery to fetch the changing column values.
-		`ExecuteMultiShard sharded.-20: dummy_subquery {} false false`,
-		// Those values are returned as 4,5 for twocol and 6 for onecol.
-		// 4,5 have to be replaced by 1,2 (the new values).
-		`Execute delete from lkp2 where from1 = :from1 and from2 = :from2 and toc = :toc from1: type:INT64 value:"4" from2: type:INT64 value:"5" toc: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		`Execute insert into lkp2(from1, from2, toc) values(:from10, :from20, :toc0) from10: type:INT64 value:"1" from20: type:INT64 value:"2" toc0: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		// 6 has to be replaced by 3.
-		`Execute delete from lkp1 where from = :from and toc = :toc from: type:INT64 value:"6" toc: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		`Execute insert into lkp1(from, toc) values(:from0, :toc0) from0: type:INT64 value:"3" toc0: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		// 7,8 have to be replaced by 1,2 (the new values).
-		`Execute delete from lkp2 where from1 = :from1 and from2 = :from2 and toc = :toc from1: type:INT64 value:"7" from2: type:INT64 value:"8" toc: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		`Execute insert into lkp2(from1, from2, toc) values(:from10, :from20, :toc0) from10: type:INT64 value:"1" from20: type:INT64 value:"2" toc0: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		// 9 has to be replaced by 3.
-		`Execute delete from lkp1 where from = :from and toc = :toc from: type:INT64 value:"9" toc: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		`Execute insert into lkp1(from, toc) values(:from0, :toc0) from0: type:INT64 value:"3" toc0: type:VARBINARY value:"\026k@\264J\272K\326"  true`,
-		// 21,22 have to be replaced by 1,2 (the new values).
-		`Execute delete from lkp2 where from1 = :from1 and from2 = :from2 and toc = :toc from1: type:INT64 value:"21" from2: type:INT64 value:"22" toc: type:VARBINARY value:"\006\347\352\"\316\222p\217"  true`,
-		`Execute insert into lkp2(from1, from2, toc) values(:from10, :from20, :toc0) from10: type:INT64 value:"1" from20: type:INT64 value:"2" toc0: type:VARBINARY value:"\006\347\352\"\316\222p\217"  true`,
-		// 23 has to be replaced by 3.
-		`Execute delete from lkp1 where from = :from and toc = :toc from: type:INT64 value:"23" toc: type:VARBINARY value:"\006\347\352\"\316\222p\217"  true`,
-		`Execute insert into lkp1(from, toc) values(:from0, :toc0) from0: type:INT64 value:"3" toc0: type:VARBINARY value:"\006\347\352\"\316\222p\217"  true`,
-		// Finally, the actual update, which is also sent to -20, same route as the subquery.
-		`ExecuteMultiShard sharded.-20: dummy_update {} true true`,
-	})
-
-}
-
 func TestUpdateNoStream(t *testing.T) {
 	upd := &Update{}
 	err := upd.StreamExecute(nil, nil, false, nil)
diff --git a/go/vt/vtgate/evalengine/arithmetic_test.go b/go/vt/vtgate/evalengine/arithmetic_test.go
index 148588c0de..a23ee04a8c 100644
--- a/go/vt/vtgate/evalengine/arithmetic_test.go
+++ b/go/vt/vtgate/evalengine/arithmetic_test.go
@@ -24,8 +24,6 @@ import (
 	"strconv"
 	"testing"
 
-	"vitess.io/vitess/go/test/utils"
-
 	"github.com/stretchr/testify/require"
 
 	"vitess.io/vitess/go/sqltypes"
@@ -745,9 +743,6 @@ func TestToFloat64(t *testing.T) {
 	}{{
 		v:   sqltypes.TestValue(querypb.Type_VARCHAR, "abcd"),
 		out: 0,
-	}, {
-		v:   sqltypes.TestValue(querypb.Type_VARCHAR, "1.2"),
-		out: 1.2,
 	}, {
 		v:   sqltypes.NewInt64(1),
 		out: 1,
@@ -762,14 +757,17 @@ func TestToFloat64(t *testing.T) {
 		err: vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "strconv.ParseInt: parsing \"1.2\": invalid syntax"),
 	}}
 	for _, tcase := range tcases {
-		t.Run(tcase.v.String(), func(t *testing.T) {
-			got, err := ToFloat64(tcase.v)
-			if tcase.err != nil {
-				require.EqualError(t, err, tcase.err.Error())
-			} else {
-				require.Equal(t, tcase.out, got)
-			}
-		})
+		got, err := ToFloat64(tcase.v)
+		if !vterrors.Equals(err, tcase.err) {
+			t.Errorf("ToFloat64(%v) error: %v, want %v", tcase.v, vterrors.Print(err), vterrors.Print(tcase.err))
+		}
+		if tcase.err != nil {
+			continue
+		}
+
+		if got != tcase.out {
+			t.Errorf("ToFloat64(%v): %v, want %v", tcase.v, got, tcase.out)
+		}
 	}
 }
 
@@ -880,13 +878,6 @@ func TestToNative(t *testing.T) {
 	}
 }
 
-var mustMatch = utils.MustMatchFn(
-	[]interface{}{ // types with unexported fields
-		evalResult{},
-	},
-	[]string{}, // ignored fields
-)
-
 func TestNewNumeric(t *testing.T) {
 	tcases := []struct {
 		v   sqltypes.Value
@@ -926,15 +917,17 @@ func TestNewNumeric(t *testing.T) {
 		out: evalResult{typ: querypb.Type_FLOAT64, fval: 0},
 	}}
 	for _, tcase := range tcases {
-		got, err := newEvalResult(tcase.v)
+		got, err := newNumeric(tcase.v)
 		if !vterrors.Equals(err, tcase.err) {
-			t.Errorf("newEvalResult(%s) error: %v, want %v", printValue(tcase.v), vterrors.Print(err), vterrors.Print(tcase.err))
+			t.Errorf("newNumeric(%s) error: %v, want %v", printValue(tcase.v), vterrors.Print(err), vterrors.Print(tcase.err))
 		}
 		if tcase.err == nil {
 			continue
 		}
 
-		mustMatch(t, tcase.out, got, "newEvalResult")
+		if got != tcase.out {
+			t.Errorf("newNumeric(%s): %v, want %v", printValue(tcase.v), got, tcase.out)
+		}
 	}
 }
 
@@ -981,7 +974,9 @@ func TestNewIntegralNumeric(t *testing.T) {
 			continue
 		}
 
-		mustMatch(t, tcase.out, got, "newIntegralNumeric")
+		if got != tcase.out {
+			t.Errorf("newIntegralNumeric(%s): %v, want %v", printValue(tcase.v), got, tcase.out)
+		}
 	}
 }
 
@@ -1037,16 +1032,16 @@ func TestAddNumeric(t *testing.T) {
 	for _, tcase := range tcases {
 		got := addNumeric(tcase.v1, tcase.v2)
 
-		mustMatch(t, tcase.out, got, "addNumeric")
+		if got != tcase.out {
+			t.Errorf("addNumeric(%v, %v): %v, want %v", tcase.v1, tcase.v2, got, tcase.out)
+		}
 	}
 }
 
 func TestPrioritize(t *testing.T) {
-	ival := evalResult{typ: querypb.Type_INT64, ival: -1}
-	uval := evalResult{typ: querypb.Type_UINT64, uval: 1}
-	fval := evalResult{typ: querypb.Type_FLOAT64, fval: 1.2}
-	textIntval := evalResult{typ: querypb.Type_VARBINARY, bytes: []byte("-1")}
-	textFloatval := evalResult{typ: querypb.Type_VARBINARY, bytes: []byte("1.2")}
+	ival := evalResult{typ: querypb.Type_INT64}
+	uval := evalResult{typ: querypb.Type_UINT64}
+	fval := evalResult{typ: querypb.Type_FLOAT64}
 
 	tcases := []struct {
 		v1, v2     evalResult
@@ -1081,23 +1076,12 @@ func TestPrioritize(t *testing.T) {
 		v2:   uval,
 		out1: fval,
 		out2: uval,
-	}, {
-		v1:   textIntval,
-		v2:   ival,
-		out1: ival,
-		out2: ival,
-	}, {
-		v1:   ival,
-		v2:   textFloatval,
-		out1: fval,
-		out2: ival,
 	}}
 	for _, tcase := range tcases {
-		t.Run(tcase.v1.Value().String()+" - "+tcase.v2.Value().String(), func(t *testing.T) {
-			got1, got2 := makeNumericAndprioritize(tcase.v1, tcase.v2)
-			mustMatch(t, tcase.out1, got1, "makeNumericAndprioritize")
-			mustMatch(t, tcase.out2, got2, "makeNumericAndprioritize")
-		})
+		got1, got2 := prioritize(tcase.v1, tcase.v2)
+		if got1 != tcase.out1 || got2 != tcase.out2 {
+			t.Errorf("prioritize(%v, %v): (%v, %v) , want (%v, %v)", tcase.v1.typ, tcase.v2.typ, got1.typ, got2.typ, tcase.out1.typ, tcase.out2.typ)
+		}
 	}
 }
 
diff --git a/go/vt/vtgate/executor_set_test.go b/go/vt/vtgate/executor_set_test.go
index dc65530dec..17b3f6a4dc 100644
--- a/go/vt/vtgate/executor_set_test.go
+++ b/go/vt/vtgate/executor_set_test.go
@@ -19,6 +19,7 @@ package vtgate
 import (
 	"testing"
 
+	"vitess.io/vitess/go/mysql"
 	"vitess.io/vitess/go/test/utils"
 
 	"vitess.io/vitess/go/vt/vterrors"
@@ -28,6 +29,7 @@ import (
 	"vitess.io/vitess/go/sqltypes"
 	"vitess.io/vitess/go/vt/vtgate/vschemaacl"
 
+	querypb "vitess.io/vitess/go/vt/proto/query"
 	vtgatepb "vitess.io/vitess/go/vt/proto/vtgate"
 	vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc"
 
@@ -43,211 +45,211 @@ func TestExecutorSet(t *testing.T) {
 		out *vtgatepb.Session
 		err string
 	}{{
-		//	in:  "set autocommit = 1",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set @@autocommit = true",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set @@session.autocommit = true",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set @@session.`autocommit` = true",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set @@session.'autocommit' = true",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set @@session.\"autocommit\" = true",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set autocommit = true",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set autocommit = on",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set autocommit = ON",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set autocommit = 'on'",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set autocommit = `on`",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set autocommit = \"on\"",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set autocommit = false",
-		//	out: &vtgatepb.Session{},
-		//}, {
-		//	in:  "set autocommit = off",
-		//	out: &vtgatepb.Session{},
-		//}, {
-		//	in:  "set autocommit = OFF",
-		//	out: &vtgatepb.Session{},
-		//}, {
-		//	in:  "set AUTOCOMMIT = 0",
-		//	out: &vtgatepb.Session{},
-		//}, {
-		//	in:  "set AUTOCOMMIT = 'aa'",
-		//	err: "unexpected value for autocommit: aa",
-		//}, {
-		//	in:  "set autocommit = 2",
-		//	err: "unexpected value for autocommit: 2",
-		//}, {
-		//	in:  "set client_found_rows = 1",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{ClientFoundRows: true}},
-		//}, {
-		//	in:  "set client_found_rows = true",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{ClientFoundRows: true}},
-		//}, {
-		//	in:  "set client_found_rows = 0",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{}},
-		//}, {
-		//	in:  "set client_found_rows = false",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{}},
-		//}, {
-		//	in:  "set @@global.client_found_rows = 1",
-		//	err: "unsupported in set: global",
-		//}, {
-		//	in:  "set global client_found_rows = 1",
-		//	err: "unsupported in set: global",
-		//}, {
-		//	in:  "set global @@session.client_found_rows = 1",
-		//	err: "cannot use scope and @@",
-		//}, {
-		//	in:  "set client_found_rows = 'aa'",
-		//	err: "unexpected value type for client_found_rows: string",
-		//}, {
-		//	in:  "set client_found_rows = 2",
-		//	err: "unexpected value for client_found_rows: 2",
-		//}, {
-		//	in:  "set transaction_mode = 'unspecified'",
-		//	out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_UNSPECIFIED},
-		//}, {
-		//	in:  "set transaction_mode = 'single'",
-		//	out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_SINGLE},
-		//}, {
-		//	in:  "set transaction_mode = 'multi'",
-		//	out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_MULTI},
-		//}, {
-		//	in:  "set transaction_mode = 'twopc'",
-		//	out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_TWOPC},
-		//}, {
-		//	in:  "set transaction_mode = twopc",
-		//	out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_TWOPC},
-		//}, {
-		//	in:  "set transaction_mode = 'aa'",
-		//	err: "invalid transaction_mode: aa",
-		//}, {
-		//	in:  "set transaction_mode = 1",
-		//	err: "unexpected value type for transaction_mode: int64",
-		//}, {
-		//	in:  "set workload = 'unspecified'",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{Workload: querypb.ExecuteOptions_UNSPECIFIED}},
-		//}, {
-		//	in:  "set workload = 'oltp'",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{Workload: querypb.ExecuteOptions_OLTP}},
-		//}, {
-		//	in:  "set workload = 'olap'",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{Workload: querypb.ExecuteOptions_OLAP}},
-		//}, {
-		//	in:  "set workload = 'dba'",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{Workload: querypb.ExecuteOptions_DBA}},
-		//}, {
-		//	in:  "set workload = 'aa'",
-		//	err: "invalid workload: aa",
-		//}, {
-		//	in:  "set workload = 1",
-		//	err: "unexpected value type for workload: int64",
-		//}, {
-		//	in:  "set transaction_mode = 'twopc', autocommit=1",
-		//	out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_TWOPC},
-		//}, {
-		//	in:  "set sql_select_limit = 5",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{SqlSelectLimit: 5}},
-		//}, {
-		//	in:  "set sql_select_limit = DEFAULT",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{SqlSelectLimit: 0}},
-		//}, {
-		//	in:  "set sql_select_limit = 'asdfasfd'",
-		//	err: "unexpected string value for sql_select_limit: asdfasfd",
-		//}, {
-		//	in:  "set autocommit = 1+1",
-		//	err: "invalid syntax: 1 + 1",
-		//}, {
-		//	in:  "set character_set_results=null",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set character_set_results='abcd'",
-		//	err: "disallowed value for character_set_results: abcd",
-		//}, {
-		//	in:  "set foo = 1",
-		//	err: "unsupported construct: set foo = 1",
-		//}, {
-		//	in:  "set names utf8",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set names ascii",
-		//	err: "unexpected value for charset/names: ascii",
-		//}, {
-		//	in:  "set charset utf8",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set character set default",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set character set ascii",
-		//	err: "unexpected value for charset/names: ascii",
-		//}, {
-		//	in:  "set net_write_timeout = 600",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in: "set sql_mode = 'STRICT_ALL_TABLES'",
-		//	out: &vtgatepb.Session{Autocommit: true,
-		//		Warnings: []*querypb.QueryWarning{{
-		//			Code:    mysql.ERNotSupportedYet,
-		//			Message: "Ignored inapplicable SET sql_mode = 'STRICT_ALL_TABLES'",
-		//		}}},
-		//}, {
-		//	in:  "set net_read_timeout = 600",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set sql_quote_show_create = 1",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set foreign_key_checks = 0",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set unique_checks = 0",
-		//	out: &vtgatepb.Session{Autocommit: true},
-		//}, {
-		//	in:  "set skip_query_plan_cache = 1",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{SkipQueryPlanCache: true}},
-		//}, {
-		//	in:  "set skip_query_plan_cache = 0",
-		//	out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{}},
-		//}, {
-		//	in:  "set sql_auto_is_null = 0",
-		//	out: &vtgatepb.Session{Autocommit: true}, // no effect
-		//}, {
-		//	in:  "set sql_auto_is_null = 1",
-		//	err: "sql_auto_is_null is not currently supported",
-		//}, {
-		//	in:  "set tx_read_only = 2",
-		//	err: "unexpected value for tx_read_only: 2",
-		//}, {
-		//	in:  "set transaction_read_only = 2",
-		//	err: "unexpected value for transaction_read_only: 2",
-		//}, {
-		//	in:  "set tx_isolation = 'invalid'",
-		//	err: "unexpected value for tx_isolation: invalid",
-		//}, {
-		//	in:  "set sql_safe_updates = 2",
-		//	err: "unexpected value for sql_safe_updates: 2",
-		//}, {
+		in:  "set autocommit = 1",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set @@autocommit = true",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set @@session.autocommit = true",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set @@session.`autocommit` = true",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set @@session.'autocommit' = true",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set @@session.\"autocommit\" = true",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set autocommit = true",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set autocommit = on",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set autocommit = ON",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set autocommit = 'on'",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set autocommit = `on`",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set autocommit = \"on\"",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set autocommit = false",
+		out: &vtgatepb.Session{},
+	}, {
+		in:  "set autocommit = off",
+		out: &vtgatepb.Session{},
+	}, {
+		in:  "set autocommit = OFF",
+		out: &vtgatepb.Session{},
+	}, {
+		in:  "set AUTOCOMMIT = 0",
+		out: &vtgatepb.Session{},
+	}, {
+		in:  "set AUTOCOMMIT = 'aa'",
+		err: "unexpected value for autocommit: aa",
+	}, {
+		in:  "set autocommit = 2",
+		err: "unexpected value for autocommit: 2",
+	}, {
+		in:  "set client_found_rows = 1",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{ClientFoundRows: true}},
+	}, {
+		in:  "set client_found_rows = true",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{ClientFoundRows: true}},
+	}, {
+		in:  "set client_found_rows = 0",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{}},
+	}, {
+		in:  "set client_found_rows = false",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{}},
+	}, {
+		in:  "set @@global.client_found_rows = 1",
+		err: "unsupported in set: global",
+	}, {
+		in:  "set global client_found_rows = 1",
+		err: "unsupported in set: global",
+	}, {
+		in:  "set global @@session.client_found_rows = 1",
+		err: "cannot use scope and @@",
+	}, {
+		in:  "set client_found_rows = 'aa'",
+		err: "unexpected value type for client_found_rows: string",
+	}, {
+		in:  "set client_found_rows = 2",
+		err: "unexpected value for client_found_rows: 2",
+	}, {
+		in:  "set transaction_mode = 'unspecified'",
+		out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_UNSPECIFIED},
+	}, {
+		in:  "set transaction_mode = 'single'",
+		out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_SINGLE},
+	}, {
+		in:  "set transaction_mode = 'multi'",
+		out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_MULTI},
+	}, {
+		in:  "set transaction_mode = 'twopc'",
+		out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_TWOPC},
+	}, {
+		in:  "set transaction_mode = twopc",
+		out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_TWOPC},
+	}, {
+		in:  "set transaction_mode = 'aa'",
+		err: "invalid transaction_mode: aa",
+	}, {
+		in:  "set transaction_mode = 1",
+		err: "unexpected value type for transaction_mode: int64",
+	}, {
+		in:  "set workload = 'unspecified'",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{Workload: querypb.ExecuteOptions_UNSPECIFIED}},
+	}, {
+		in:  "set workload = 'oltp'",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{Workload: querypb.ExecuteOptions_OLTP}},
+	}, {
+		in:  "set workload = 'olap'",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{Workload: querypb.ExecuteOptions_OLAP}},
+	}, {
+		in:  "set workload = 'dba'",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{Workload: querypb.ExecuteOptions_DBA}},
+	}, {
+		in:  "set workload = 'aa'",
+		err: "invalid workload: aa",
+	}, {
+		in:  "set workload = 1",
+		err: "unexpected value type for workload: int64",
+	}, {
+		in:  "set transaction_mode = 'twopc', autocommit=1",
+		out: &vtgatepb.Session{Autocommit: true, TransactionMode: vtgatepb.TransactionMode_TWOPC},
+	}, {
+		in:  "set sql_select_limit = 5",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{SqlSelectLimit: 5}},
+	}, {
+		in:  "set sql_select_limit = DEFAULT",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{SqlSelectLimit: 0}},
+	}, {
+		in:  "set sql_select_limit = 'asdfasfd'",
+		err: "unexpected string value for sql_select_limit: asdfasfd",
+	}, {
+		in:  "set autocommit = 1+1",
+		err: "invalid syntax: 1 + 1",
+	}, {
+		in:  "set character_set_results=null",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set character_set_results='abcd'",
+		err: "disallowed value for character_set_results: abcd",
+	}, {
+		in:  "set foo = 1",
+		err: "unsupported construct: set foo = 1",
+	}, {
+		in:  "set names utf8",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set names ascii",
+		err: "unexpected value for charset/names: ascii",
+	}, {
+		in:  "set charset utf8",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set character set default",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set character set ascii",
+		err: "unexpected value for charset/names: ascii",
+	}, {
+		in:  "set net_write_timeout = 600",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in: "set sql_mode = 'STRICT_ALL_TABLES'",
+		out: &vtgatepb.Session{Autocommit: true,
+			Warnings: []*querypb.QueryWarning{{
+				Code:    mysql.ERNotSupportedYet,
+				Message: "Ignored inapplicable SET sql_mode = 'STRICT_ALL_TABLES'",
+			}}},
+	}, {
+		in:  "set net_read_timeout = 600",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set sql_quote_show_create = 1",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set foreign_key_checks = 0",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set unique_checks = 0",
+		out: &vtgatepb.Session{Autocommit: true},
+	}, {
+		in:  "set skip_query_plan_cache = 1",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{SkipQueryPlanCache: true}},
+	}, {
+		in:  "set skip_query_plan_cache = 0",
+		out: &vtgatepb.Session{Autocommit: true, Options: &querypb.ExecuteOptions{}},
+	}, {
+		in:  "set sql_auto_is_null = 0",
+		out: &vtgatepb.Session{Autocommit: true}, // no effect
+	}, {
+		in:  "set sql_auto_is_null = 1",
+		err: "sql_auto_is_null is not currently supported",
+	}, {
+		in:  "set tx_read_only = 2",
+		err: "unexpected value for tx_read_only: 2",
+	}, {
+		in:  "set transaction_read_only = 2",
+		err: "unexpected value for transaction_read_only: 2",
+	}, {
+		in:  "set tx_isolation = 'invalid'",
+		err: "unexpected value for tx_isolation: invalid",
+	}, {
+		in:  "set sql_safe_updates = 2",
+		err: "unexpected value for sql_safe_updates: 2",
+	}, {
 		in:  "set @foo = 'bar'",
 		out: &vtgatepb.Session{UserDefinedVariables: createMap([]string{"foo"}, []interface{}{"bar"}), Autocommit: true},
 	}, {
diff --git a/go/vt/vtgate/plan_executor_set_test.go b/go/vt/vtgate/plan_executor_set_test.go
index b5bfe15fae..13cc5c7fcd 100644
--- a/go/vt/vtgate/plan_executor_set_test.go
+++ b/go/vt/vtgate/plan_executor_set_test.go
@@ -358,25 +358,3 @@ func TestPlanExecutorSetMetadata(t *testing.T) {
 	assert.Equal(t, wantqr.Fields, gotqr.Fields)
 	assert.ElementsMatch(t, wantqr.Rows, gotqr.Rows)
 }
-
-func TestSetUDVFromTabletInput(t *testing.T) {
-	executor, sbc1, _, _ := createExecutorEnvUsing(planAllTheThings)
-
-	fields := sqltypes.MakeTestFields("some", "VARBINARY")
-	sbc1.SetResults([]*sqltypes.Result{
-		sqltypes.MakeTestResult(
-			fields,
-			"abc",
-		),
-	})
-
-	masterSession.TargetString = "TestExecutor"
-	defer func() {
-		masterSession.TargetString = ""
-	}()
-	_, err := executorExec(executor, "set @foo = concat('a','b','c')", nil)
-	require.NoError(t, err)
-
-	want := map[string]*querypb.BindVariable{"foo": sqltypes.StringBindVariable("abc")}
-	utils.MustMatch(t, want, masterSession.UserDefinedVariables, "")
-}
diff --git a/go/vt/vtgate/planbuilder/set_test.go b/go/vt/vtgate/planbuilder/set_test.go
deleted file mode 100644
index 16e3e7079e..0000000000
--- a/go/vt/vtgate/planbuilder/set_test.go
+++ /dev/null
@@ -1,52 +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 planbuilder
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/require"
-	"vitess.io/vitess/go/vt/sqlparser"
-)
-
-func TestExpressionOkToDelegateToTablet(t *testing.T) {
-	tests := []struct {
-		expr   string
-		expect bool
-	}{{
-		expr:   "42",
-		expect: true,
-	}, {
-		expr:   "(select count(*) from someTable)",
-		expect: false,
-	}, {
-		expr:   "TIMESTAMP()",
-		expect: false,
-	}, {
-		expr:   "concat('a','b')",
-		expect: true,
-	}}
-	for _, tt := range tests {
-		t.Run(tt.expr, func(t *testing.T) {
-			stmt, err := sqlparser.Parse("select " + tt.expr)
-			require.NoError(t, err)
-			e := stmt.(*sqlparser.Select).SelectExprs[0].(*sqlparser.AliasedExpr).Expr
-			got := expressionOkToDelegateToTablet(e)
-			require.Equal(t, tt.expect, got)
-		})
-	}
-}
diff --git a/go/vt/vtgate/planbuilder/testdata/dml_cases.txt b/go/vt/vtgate/planbuilder/testdata/dml_cases.txt
index 271b0ecbf9..40dedf77d3 100644
--- a/go/vt/vtgate/planbuilder/testdata/dml_cases.txt
+++ b/go/vt/vtgate/planbuilder/testdata/dml_cases.txt
@@ -1558,7 +1558,7 @@
   "Original": "update user_extra set val = 1 where user_id in (1, 2)",
   "Instructions": {
     "OperatorType": "Update",
-    "Variant": "In",
+    "Variant": "Scatter",
     "Keyspace": {
       "Name": "user",
       "Sharded": true
@@ -1566,14 +1566,7 @@
     "TargetTabletType": "MASTER",
     "MultiShardAutocommit": false,
     "Query": "update user_extra set val = 1 where user_id in (1, 2)",
-    "Table": "user_extra",
-    "Values": [
-      [
-        1,
-        2
-      ]
-    ],
-    "Vindex": "user_index"
+    "Table": "user_extra"
   }
 }
 
@@ -1756,7 +1749,7 @@
   "Original": "delete from user_extra where user_id in (1, 2)",
   "Instructions": {
     "OperatorType": "Delete",
-    "Variant": "In",
+    "Variant": "Scatter",
     "Keyspace": {
       "Name": "user",
       "Sharded": true
@@ -1764,14 +1757,7 @@
     "TargetTabletType": "MASTER",
     "MultiShardAutocommit": false,
     "Query": "delete from user_extra where user_id in (1, 2)",
-    "Table": "user_extra",
-    "Values": [
-      [
-        1,
-        2
-      ]
-    ],
-    "Vindex": "user_index"
+    "Table": "user_extra"
   }
 }
 
@@ -1865,7 +1851,7 @@
   "Original": "update user set name = null where id in (1, 2, 3)",
   "Instructions": {
     "OperatorType": "Update",
-    "Variant": "In",
+    "Variant": "Scatter",
     "Keyspace": {
       "Name": "user",
       "Sharded": true
@@ -1878,15 +1864,7 @@
     "MultiShardAutocommit": false,
     "OwnedVindexQuery": "select Id, Name, Costly from user where id in (1, 2, 3) for update",
     "Query": "update user set name = null where id in (1, 2, 3)",
-    "Table": "user",
-    "Values": [
-      [
-        1,
-        2,
-        3
-      ]
-    ],
-    "Vindex": "user_index"
+    "Table": "user"
   }
 }
 
@@ -1945,7 +1923,7 @@
   "Original": "delete from user where id in (1, 2, 3)",
   "Instructions": {
     "OperatorType": "Delete",
-    "Variant": "In",
+    "Variant": "Scatter",
     "Keyspace": {
       "Name": "user",
       "Sharded": true
@@ -1955,15 +1933,7 @@
     "MultiShardAutocommit": false,
     "OwnedVindexQuery": "select Id, Name, Costly from user where id in (1, 2, 3) for update",
     "Query": "delete from user where id in (1, 2, 3)",
-    "Table": "user",
-    "Values": [
-      [
-        1,
-        2,
-        3
-      ]
-    ],
-    "Vindex": "user_index"
+    "Table": "user"
   }
 }
 
diff --git a/go/vt/vtgate/planbuilder/testdata/set_cases.txt b/go/vt/vtgate/planbuilder/testdata/set_cases.txt
index 934dd769b1..8bfcf8b0df 100644
--- a/go/vt/vtgate/planbuilder/testdata/set_cases.txt
+++ b/go/vt/vtgate/planbuilder/testdata/set_cases.txt
@@ -9,12 +9,7 @@
       {
         "Type": "UserDefinedVariable",
         "Name": "foo",
-        "Expr": "INT64(42)"
-      }
-    ],
-    "Inputs": [
-      {
-        "OperatorType": "SingleRow"
+        "PlanValue": 42
       }
     ]
   }
@@ -31,79 +26,13 @@
       {
         "Type": "UserDefinedVariable",
         "Name": "foo",
-        "Expr": "INT64(42)"
+        "PlanValue": 42
       },
       {
         "Type": "UserDefinedVariable",
         "Name": "bar",
-        "Expr": ":__vtudvfoo"
-      }
-    ],
-    "Inputs": [
-      {
-        "OperatorType": "SingleRow"
+        "PlanValue": ":__vtudvfoo"
       }
     ]
   }
 }
-
-# set multi user defined variable with complex expression
-"set @foo = 42, @bar = @foo + 1"
-{
-  "QueryType": "SET",
-  "Original": "set @foo = 42, @bar = @foo + 1",
-  "Instructions": {
-    "OperatorType": "Set",
-    "Ops": [
-      {
-        "Type": "UserDefinedVariable",
-        "Name": "foo",
-        "Expr": "INT64(42)"
-      },
-      {
-        "Type": "UserDefinedVariable",
-        "Name": "bar",
-        "Expr": ":__vtudvfoo + INT64(1)"
-      }
-    ],
-    "Inputs": [
-      {
-        "OperatorType": "SingleRow"
-      }
-    ]
-  }
-}
-
-# set UDV to expression that can't be evaluated at vtgate
-"set @foo = CONCAT('Any','Expression','Is','Valid')"
-{
-  "QueryType": "SET",
-  "Original": "set @foo = CONCAT('Any','Expression','Is','Valid')",
-  "Instructions": {
-    "OperatorType": "Set",
-    "Ops": [
-      {
-        "Type": "UserDefinedVariable",
-        "Name": "foo",
-        "Expr": "[0]"
-      }
-    ],
-    "Inputs": [
-      {
-        "OperatorType": "Send",
-        "Keyspace": {
-          "Name": "main",
-          "Sharded": false
-        },
-        "TargetDestination": "AnyShard()",
-        "IsDML": false,
-        "Query": "select CONCAT('Any', 'Expression', 'Is', 'Valid') from dual",
-        "SingleShardOnly": true
-      }
-    ]
-  }
-}
-
-# only allow whitelisted functions
-"set @foo = BAD_FUNC()"
-"expression not supported for SET: BAD_FUNC()"
diff --git a/go/vt/vtgate/planbuilder/testdata/set_sysvar_cases.txt b/go/vt/vtgate/planbuilder/testdata/set_sysvar_cases.txt
index ca389a8965..e1c629eab1 100644
--- a/go/vt/vtgate/planbuilder/testdata/set_sysvar_cases.txt
+++ b/go/vt/vtgate/planbuilder/testdata/set_sysvar_cases.txt
@@ -11,11 +11,6 @@
         "Name": "default_storage_engine",
         "Expr": "'DONOTCHANGEME'"
       }
-    ],
-    "Inputs": [
-      {
-        "OperatorType": "SingleRow"
-      }
     ]
   }
 }
@@ -38,11 +33,6 @@
         "TargetDestination": {},
         "Expr": "concat(@@sql_mode, ',NO_AUTO_CREATE_USER')"
       }
-    ],
-    "Inputs": [
-      {
-        "OperatorType": "SingleRow"
-      }
     ]
   }
 }
diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt
index 9dfbcdf0ba..4bd698c490 100644
--- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt
+++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt
@@ -6,6 +6,10 @@
 "set a=1"
 "plan building not supported"
 
+# set multi user defined variable with complex expression
+"set @foo = 42, @bar = @foo + 1"
+"expression is too complex ':__vtudvfoo + 1'"
+
 # set user defined and system variable
 "set @foo = 42, @bar = @foo, @@wait_timeout = 28800"
 "plan building not supported"
diff --git a/go/vt/vttablet/tabletserver/messager/message_manager_test.go b/go/vt/vttablet/tabletserver/messager/message_manager_test.go
index b3aec44e4e..6d9ea39142 100644
--- a/go/vt/vttablet/tabletserver/messager/message_manager_test.go
+++ b/go/vt/vttablet/tabletserver/messager/message_manager_test.go
@@ -753,7 +753,7 @@ func TestMMGenerate(t *testing.T) {
 	utils.MustMatch(t, wantids, gotids, "did not match")
 
 	query, bv = mm.GeneratePostponeQuery([]string{"1", "2"})
-	wantQuery = "update foo set time_next = :time_now + :wait_time + IF(FLOOR((:min_backoff<<ifnull(epoch, 0)) * :jitter) < :min_backoff, :min_backoff, FLOOR((:min_backoff<<ifnull(epoch, 0)) * :jitter)), epoch = ifnull(epoch, 0)+1 where id in ::ids and time_acked is null"
+	wantQuery = "update foo set time_next = IF(FLOOR((:min_backoff<<ifnull(epoch, 0))*(.666666 + (RAND(:time_now) * .666666))) < :min_backoff, :time_now + :min_backoff, :time_now + FLOOR((:min_backoff<<ifnull(epoch, 0))*(.666666 + (RAND(:time_now) * .666666)))), epoch = ifnull(epoch, 0)+1 where id in ::ids and time_acked is null"
 	if query != wantQuery {
 		t.Errorf("GeneratePostponeQuery query: %s, want %s", query, wantQuery)
 	}
@@ -763,14 +763,7 @@ func TestMMGenerate(t *testing.T) {
 		// time_now cannot be compared.
 		delete(bv, "time_now")
 	}
-	if _, ok := bv["jitter"]; !ok {
-		t.Errorf("jitter is absent in %v", bv)
-	} else {
-		// jitter cannot be compared.
-		delete(bv, "jitter")
-	}
 	wantbv := map[string]*querypb.BindVariable{
-		"wait_time":   sqltypes.Int64BindVariable(1e9),
 		"min_backoff": sqltypes.Int64BindVariable(1e9),
 		"ids":         wantids,
 	}
@@ -797,7 +790,7 @@ func TestMMGenerateWithBackoff(t *testing.T) {
 	wantids := sqltypes.TestBindVariable([]interface{}{"1", "2"})
 
 	query, bv := mm.GeneratePostponeQuery([]string{"1", "2"})
-	wantQuery := "update foo set time_next = :time_now + :wait_time + IF(FLOOR((:min_backoff<<ifnull(epoch, 0)) * :jitter) < :min_backoff, :min_backoff, IF(FLOOR((:min_backoff<<ifnull(epoch, 0)) * :jitter) > :max_backoff, :max_backoff, FLOOR((:min_backoff<<ifnull(epoch, 0)) * :jitter))), epoch = ifnull(epoch, 0)+1 where id in ::ids and time_acked is null"
+	wantQuery := "update foo set time_next = IF(FLOOR((:min_backoff<<ifnull(epoch, 0))*(.666666 + (RAND(:time_now) * .666666))) < :min_backoff, :time_now + :min_backoff, IF(FLOOR((:min_backoff<<ifnull(epoch, 0))*(.666666 + (RAND(:time_now) * .666666))) > :max_backoff, :time_now + :max_backoff, :time_now + FLOOR((:min_backoff<<ifnull(epoch, 0))*(.666666 + (RAND(:time_now) * .666666))))), epoch = ifnull(epoch, 0)+1 where id in ::ids and time_acked is null"
 	if query != wantQuery {
 		t.Errorf("GeneratePostponeQuery query: %s, want %s", query, wantQuery)
 	}
@@ -807,14 +800,7 @@ func TestMMGenerateWithBackoff(t *testing.T) {
 		// time_now cannot be compared.
 		delete(bv, "time_now")
 	}
-	if _, ok := bv["jitter"]; !ok {
-		t.Errorf("jitter is absent in %v", bv)
-	} else {
-		// jitter cannot be compared.
-		delete(bv, "jitter")
-	}
 	wantbv := map[string]*querypb.BindVariable{
-		"wait_time":   sqltypes.Int64BindVariable(1e10),
 		"min_backoff": sqltypes.Int64BindVariable(1e9),
 		"max_backoff": sqltypes.Int64BindVariable(4e9),
 		"ids":         wantids,
diff --git a/go/vt/wrangler/stream_migrater_test.go b/go/vt/wrangler/stream_migrater_test.go
index 1ca5b4950d..ce971a02bf 100644
--- a/go/vt/wrangler/stream_migrater_test.go
+++ b/go/vt/wrangler/stream_migrater_test.go
@@ -162,6 +162,7 @@ func TestStreamMigrateMainflow(t *testing.T) {
 	tme.expectCreateReverseVReplication()
 	tme.expectStartReverseVReplication()
 	tme.expectFrozenTargetVReplication()
+	tme.expectDeleteTargetVReplication()
 	if _, _, err := tme.wr.SwitchWrites(ctx, tme.targetKeyspace, "test", 1*time.Second, false, true, false); err != nil {
 		t.Fatal(err)
 	}
@@ -176,8 +177,6 @@ func TestStreamMigrateMainflow(t *testing.T) {
 	checkIsMasterServing(t, tme.ts, "ks:-80", true)
 	checkIsMasterServing(t, tme.ts, "ks:80-", true)
 
-	tme.expectDeleteReverseVReplication()
-	tme.expectDeleteTargetVReplication()
 	if _, err := tme.wr.DropSources(ctx, tme.targetKeyspace, "test", false); err != nil {
 		t.Fatal(err)
 	}
diff --git a/go/vt/wrangler/traffic_switcher_test.go b/go/vt/wrangler/traffic_switcher_test.go
index a3d3d8da3e..474d833cd0 100644
--- a/go/vt/wrangler/traffic_switcher_test.go
+++ b/go/vt/wrangler/traffic_switcher_test.go
@@ -824,9 +824,7 @@ func TestTableMigrateOneToMany(t *testing.T) {
 		"	Keyspace ks1 Shard 0 DbName vt_ks1 Tablet 10 Table t2",
 		"Blacklisted tables t1,t2 will be removed from:",
 		"	Keyspace ks1 Shard 0 Tablet 10",
-		"Delete reverse vreplication streams on source:",
-		"	Keyspace ks1 Shard 0 Workflow test_reverse DbName vt_ks1 Tablet 10",
-		"Delete vreplication streams on target:",
+		"Delete vreplication streams on:",
 		"	Keyspace ks2 Shard -80 Workflow test DbName vt_ks2 Tablet 20",
 		"	Keyspace ks2 Shard 80- Workflow test DbName vt_ks2 Tablet 30",
 		"Unlock keyspace ks2",
@@ -840,7 +838,6 @@ func TestTableMigrateOneToMany(t *testing.T) {
 	dropSources := func() {
 		tme.dbTargetClients[0].addQuery("select 1 from _vt.vreplication where db_name='vt_ks2' and workflow='test' and message!='FROZEN'", &sqltypes.Result{}, nil)
 		tme.dbTargetClients[1].addQuery("select 1 from _vt.vreplication where db_name='vt_ks2' and workflow='test' and message!='FROZEN'", &sqltypes.Result{}, nil)
-		tme.dbSourceClients[0].addQuery("select id from _vt.vreplication where db_name = 'vt_ks1' and workflow = 'test_reverse'", &sqltypes.Result{}, nil)
 		tme.tmeDB.AddQuery("drop table vt_ks1.t1", &sqltypes.Result{})
 		tme.tmeDB.AddQuery("drop table vt_ks1.t2", &sqltypes.Result{})
 		tme.dbTargetClients[0].addQuery("select id from _vt.vreplication where db_name = 'vt_ks2' and workflow = 'test'", &sqltypes.Result{}, nil) //
@@ -848,7 +845,6 @@ func TestTableMigrateOneToMany(t *testing.T) {
 		//TODO, why are the delete queries not required?!
 		//tme.dbTargetClients[0].addQuery("delete from _vt.vreplication where db_name='vt_ks2' and workflow='test'", &sqltypes.Result{}, nil)
 		//tme.dbTargetClients[1].addQuery("delete from _vt.vreplication where db_name='vt_ks2' and workflow='test'", &sqltypes.Result{}, nil)
-
 	}
 	dropSources()
 
diff --git a/test/config.json b/test/config.json
index dfc4d67743..59ce7bdede 100644
--- a/test/config.json
+++ b/test/config.json
@@ -408,15 +408,6 @@
 			"RetryMax": 0,
 			"Tags": []
 		},
-		"vtgate_setstatement": {
-			"File": "unused.go",
-			"Args": ["vitess.io/vitess/go/test/endtoend/vtgate/setstatement"],
-			"Command": [],
-			"Manual": false,
-			"Shard": 17,
-			"RetryMax": 0,
-			"Tags": []
-		},
 		"vtgate_transaction": {
 			"File": "unused.go",
 			"Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction"],
diff --git a/test/local_example.sh b/test/local_example.sh
index 43ca3d0e6e..e6a06d62c9 100755
--- a/test/local_example.sh
+++ b/test/local_example.sh
@@ -29,7 +29,7 @@ source ./env.sh # Required so that "mysql" works from alias
 
 ./101_initial_cluster.sh
 
-sleep 5 # Give vtgate time to really start.
+sleep 1 # Give vtgate a second to really start.
 
 mysql < ../common/insert_commerce_data.sql
 mysql --table < ../common/select_commerce_data.sql