Repository: vitessio/vitess
Pull request #6121 (2020-04-27 16:29:07)

DropSources: delete reverse streams on source
Signed-off-by: Rohit Nayak <rohit@planetscale.com>


Patch:
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/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/vtctld/api.go b/go/vt/vtctld/api.go
index eea2ed685c..ede03e9881 100644
--- a/go/vt/vtctld/api.go
+++ b/go/vt/vtctld/api.go
@@ -409,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/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/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/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/wrangler/switcher.go b/go/vt/wrangler/switcher.go
index 6f755370f0..a8fb24e89a 100644
--- a/go/vt/wrangler/switcher.go
+++ b/go/vt/wrangler/switcher.go
@@ -114,6 +114,10 @@ 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 3c8aa1af9b..5cb6a33eb6 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:")
+	dr.drLog.Log("Delete vreplication streams on target:")
 	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,6 +279,17 @@ 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 a9fcb2d457..49f84859cf 100644
--- a/go/vt/wrangler/switcher_interface.go
+++ b/go/vt/wrangler/switcher_interface.go
@@ -44,6 +44,7 @@ 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 5055c91412..d9d8ca1501 100644
--- a/go/vt/wrangler/traffic_switcher.go
+++ b/go/vt/wrangler/traffic_switcher.go
@@ -339,6 +339,9 @@ 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
 	}
@@ -1167,14 +1170,22 @@ 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/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go
index 00931d4ec5..c7a9a6a843 100644
--- a/go/test/endtoend/vreplication/vreplication_test.go
+++ b/go/test/endtoend/vreplication/vreplication_test.go
@@ -230,9 +230,11 @@ func shardCustomer(t *testing.T, testReverse bool) {
 		assert.False(t, exists)
 
 		for _, shard := range strings.Split("-80,80-", ",") {
-			expectNumberOfStreams(t, vtgateConn, "shardCustomer", "p2c", "customer:"+shard, 0)
+			expectNumberOfStreams(t, vtgateConn, "shardCustomerTargetStreams", "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 a7039c4ff3..dc8dfac8d5 100644
--- a/go/test/endtoend/vreplication/vreplication_test_env.go
+++ b/go/test/endtoend/vreplication/vreplication_test_env.go
@@ -101,7 +101,9 @@ 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 vreplication streams on:",
+	"Delete reverse vreplication streams on source:",
+	"	Keyspace product Shard 0 Workflow p2c_reverse DbName vt_product Tablet 100",
+	"Delete vreplication streams on target:",
 	"	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/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/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/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/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/wrangler/stream_migrater_test.go b/go/vt/wrangler/stream_migrater_test.go
index ce971a02bf..1ca5b4950d 100644
--- a/go/vt/wrangler/stream_migrater_test.go
+++ b/go/vt/wrangler/stream_migrater_test.go
@@ -162,7 +162,6 @@ 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)
 	}
@@ -177,6 +176,8 @@ 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 474d833cd0..a3d3d8da3e 100644
--- a/go/vt/wrangler/traffic_switcher_test.go
+++ b/go/vt/wrangler/traffic_switcher_test.go
@@ -824,7 +824,9 @@ 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 vreplication streams on:",
+		"Delete reverse vreplication streams on source:",
+		"	Keyspace ks1 Shard 0 Workflow test_reverse DbName vt_ks1 Tablet 10",
+		"Delete vreplication streams on target:",
 		"	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",
@@ -838,6 +840,7 @@ 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) //
@@ -845,6 +848,7 @@ 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"],