You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by ta...@apache.org on 2020/04/01 16:15:08 UTC

[impala] branch master updated: IMPALA-5092 Add support for VARCHAR in Kudu tables

This is an automated email from the ASF dual-hosted git repository.

tarmstrong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git


The following commit(s) were added to refs/heads/master by this push:
     new 2576952  IMPALA-5092 Add support for VARCHAR in Kudu tables
2576952 is described below

commit 2576952655d8e252943379dd4dbcdd0315e457c5
Author: Attila Bukor <ab...@apache.org>
AuthorDate: Tue Mar 10 14:43:28 2020 +0100

    IMPALA-5092 Add support for VARCHAR in Kudu tables
    
    KUDU-1938 added VARCHAR column type support to Kudu.
    This commit adds support for Kudu's VARCHAR type to Impala.
    
    The length of a Kudu varchar is applied as a character length as opposed
    to a byte length like Impala currently uses.
    
    When writing data to Kudu, the VARCHAR length is not an issue because
    Impala only officially supports ASCII characters and those characters are
    the same size in bytes and characters. Additionally, extra bytes would be
    truncated by the Kudu client if somehow a value was too long.
    
    When reading data from Kudu, it is possible that the value written by
    some other application is wider in bytes than Impala expects and can
    handle. This can happen due to multi-byte UTF-8 characters. In that
    case, we adjust the length in Impala to truncate the extra bytes of the
    value. This isn’t a great solution, but one other integrations have taken
    as well given Impala doesn’t support UTF-8 values.
    
    IMPALA-5675 tracks adding UTF-8 Character length support to VARCHAR
    columns and marked the truncation code with a TODO that references
    that Jira.
    
    Testing:
    * Performed manual testing of standard DDL and DML interaction
    * Manually reproduced a check failure due to multi-byte characters
      and tested that length truncation resolve that issue.
    * Added/adjusted the following automated tests:
    ** AnalyzeDDLTest: CTAS into Kudu with varchar type
    ** AnalyzeKuduDDLTest: CREATE TABLE in Kudu with VARCHAR type
    ** kudu_create.test: Create table with VARCHAR column, key, hash
       partition, and range partition
    ** kudu_describe.test: Describe table with VARCHAR column and key
    ** kudu_insert.test: Insert with VARCHAR columns including null and
       non-null defaults
    ** kudu_update.test: Updates with VARCHAR column
    ** kudu_upsert.test: Upserts with VARCHAR column
    ** kudu_delete.test Deletes with VARCHAR columns
    ** kudu-scan-node.test Tests basic predicates with VARCHAR columns
    
    Follow on work:
    - IMPALA-9580: Add min-max runtime filter support/tests
    - IMPALA-9581: Pushdown string predicates
    - IMPALA-9583: Automated multibyte truncation tests
    
    Change-Id: I0d4959410fdd882bfa980cb55e8a7837c7823da8
    Reviewed-on: http://gerrit.cloudera.org:8080/14197
    Tested-by: Impala Public Jenkins <im...@cloudera.com>
    Reviewed-by: Thomas Tauber-Marshall <tm...@cloudera.com>
---
 be/src/exec/kudu-scanner.cc                        |  26 +-
 be/src/exec/kudu-scanner.h                         |   4 +
 be/src/exec/kudu-util.cc                           |  15 +-
 .../main/java/org/apache/impala/catalog/Type.java  |   1 +
 .../impala/planner/RuntimeFilterGenerator.java     |   2 +
 .../impala/service/KuduCatalogOpExecutor.java      |   5 +
 .../main/java/org/apache/impala/util/KuduUtil.java |   8 +-
 .../org/apache/impala/analysis/AnalyzeDDLTest.java |   7 +-
 .../apache/impala/analysis/AnalyzeKuduDDLTest.java |   5 +-
 .../queries/QueryTest/kudu-scan-node.test          |  22 ++
 .../queries/QueryTest/kudu_create.test             |  56 ++-
 .../queries/QueryTest/kudu_delete.test             | 282 +++++++-------
 .../queries/QueryTest/kudu_describe.test           |  20 +
 .../queries/QueryTest/kudu_insert.test             | 293 +++++++-------
 .../queries/QueryTest/kudu_update.test             | 276 +++++++-------
 .../queries/QueryTest/kudu_upsert.test             | 419 +++++++++++----------
 tests/query_test/test_kudu.py                      |   4 +-
 17 files changed, 806 insertions(+), 639 deletions(-)

diff --git a/be/src/exec/kudu-scanner.cc b/be/src/exec/kudu-scanner.cc
index a2c5b49..96adc28 100644
--- a/be/src/exec/kudu-scanner.cc
+++ b/be/src/exec/kudu-scanner.cc
@@ -79,8 +79,11 @@ KuduScanner::KuduScanner(KuduScanNodeBase* scan_node, RuntimeState* state)
 Status KuduScanner::Open() {
   for (int i = 0; i < scan_node_->tuple_desc()->slots().size(); ++i) {
     const SlotDescriptor* slot = scan_node_->tuple_desc()->slots()[i];
-    if (slot->type().type != TYPE_TIMESTAMP) continue;
-    timestamp_slots_.push_back(slot);
+    if (slot->type().type == TYPE_TIMESTAMP) {
+      timestamp_slots_.push_back(slot);
+    } else if (slot->type().type == TYPE_VARCHAR) {
+      varchar_slots_.push_back(slot);
+    }
   }
   return ScalarExprEvaluator::Clone(&obj_pool_, state_, expr_perm_pool_.get(),
       expr_results_pool_.get(), scan_node_->conjunct_evals(), &conjunct_evals_);
@@ -353,6 +356,25 @@ Status KuduScanner::DecodeRowsIntoRowBatch(RowBatch* row_batch, Tuple** tuple_me
       }
     }
 
+    // Kudu tuples containing VARCHAR columns use characters instead of bytes to limit
+    // the length. In the case of ASCII values there is no difference. However, if
+    // multi-byte characters are written to Kudu the length could be longer than allowed.
+    // This checks the actual length and truncates the value length if it is too long.
+    // TODO(IMPALA-5675): Remove this when Impala supports UTF-8 character VARCHAR length.
+    for (const SlotDescriptor* slot : varchar_slots_) {
+      DCHECK(slot->type().type == TYPE_VARCHAR);
+      if (slot->is_nullable() && kudu_tuple->IsNull(slot->null_indicator_offset())) {
+        continue;
+      }
+      StringValue* sv = reinterpret_cast<StringValue*>(
+          kudu_tuple->GetSlot(slot->tuple_offset()));
+      int src_len = sv->len;
+      int dst_len = slot->type().len;
+      if (src_len > dst_len) {
+        sv->len = dst_len;
+      }
+    }
+
     // Evaluate the conjuncts that haven't been pushed down to Kudu. Conjunct evaluation
     // is performed directly on the Kudu tuple because its memory layout is identical to
     // Impala's. We only copy the surviving tuples to Impala's output row batch.
diff --git a/be/src/exec/kudu-scanner.h b/be/src/exec/kudu-scanner.h
index 4c3e5cc..04528d9 100644
--- a/be/src/exec/kudu-scanner.h
+++ b/be/src/exec/kudu-scanner.h
@@ -130,6 +130,10 @@ class KuduScanner {
   /// Timestamp slots in the tuple descriptor of the scan node. Used to convert Kudu
   /// UNIXTIME_MICRO values inline.
   vector<const SlotDescriptor*> timestamp_slots_;
+
+  /// Varchar slots in the tuple descriptor of the scan node. Used to resize Kudu
+  /// VARCHAR values inline.
+  vector<const SlotDescriptor*> varchar_slots_;
 };
 
 } /// namespace impala
diff --git a/be/src/exec/kudu-util.cc b/be/src/exec/kudu-util.cc
index b29a53e..5032643 100644
--- a/be/src/exec/kudu-util.cc
+++ b/be/src/exec/kudu-util.cc
@@ -142,7 +142,18 @@ Status WriteKuduValue(int col, const ColumnType& col_type, const void* value,
   // TODO: codegen this to eliminate branching on type.
   PrimitiveType type = col_type.type;
   switch (type) {
-    case TYPE_VARCHAR:
+    case TYPE_VARCHAR: {
+      const StringValue* sv = reinterpret_cast<const StringValue*>(value);
+      kudu::Slice slice(reinterpret_cast<uint8_t*>(sv->ptr), sv->len);
+      if (copy_strings) {
+        KUDU_RETURN_IF_ERROR(row->SetVarchar(col, slice),
+            "Could not set Kudu row value.");
+      } else {
+        KUDU_RETURN_IF_ERROR(row->SetVarcharNoCopyUnsafe(col, slice),
+            "Could not set Kudu row value.");
+      }
+      break;
+    }
     case TYPE_STRING: {
       const StringValue* sv = reinterpret_cast<const StringValue*>(value);
       kudu::Slice slice(reinterpret_cast<uint8_t*>(sv->ptr), sv->len);
@@ -244,6 +255,8 @@ ColumnType KuduDataTypeToColumnType(
       return ColumnType::CreateDecimalType(
           type_attributes.precision(), type_attributes.scale());
     case DataType::DATE: return ColumnType(PrimitiveType::TYPE_DATE);
+    case DataType::VARCHAR:
+      return ColumnType::CreateVarcharType(type_attributes.length());
     default: return ColumnType(PrimitiveType::INVALID_TYPE);
   }
 }
diff --git a/fe/src/main/java/org/apache/impala/catalog/Type.java b/fe/src/main/java/org/apache/impala/catalog/Type.java
index ea55de7..a939034 100644
--- a/fe/src/main/java/org/apache/impala/catalog/Type.java
+++ b/fe/src/main/java/org/apache/impala/catalog/Type.java
@@ -187,6 +187,7 @@ public abstract class Type {
   public boolean isDate() { return isScalarType(PrimitiveType.DATE); }
   public boolean isDecimal() { return isScalarType(PrimitiveType.DECIMAL); }
   public boolean isFullySpecifiedDecimal() { return false; }
+  public boolean isVarchar() { return isScalarType(PrimitiveType.VARCHAR); }
   public boolean isWildcardDecimal() { return false; }
   public boolean isWildcardVarchar() { return false; }
   public boolean isWildcardChar() { return false; }
diff --git a/fe/src/main/java/org/apache/impala/planner/RuntimeFilterGenerator.java b/fe/src/main/java/org/apache/impala/planner/RuntimeFilterGenerator.java
index b9d3c3b..e892dcb 100644
--- a/fe/src/main/java/org/apache/impala/planner/RuntimeFilterGenerator.java
+++ b/fe/src/main/java/org/apache/impala/planner/RuntimeFilterGenerator.java
@@ -705,6 +705,8 @@ public final class RuntimeFilterGenerator {
         if (filter.getType() != TRuntimeFilterType.MIN_MAX) continue;
         // TODO: IMPALA-9294: Support Kudu Date Min/Max Filters
         if (targetExpr.getType().isDate()) continue;
+        // TODO: IMPALA-9580: Support Kudu VARCHAR Min/Max Filters
+        if (targetExpr.getType().isVarchar()) continue;
         SlotRef slotRef = targetExpr.unwrapSlotRef(true);
         // Kudu only supports targeting a single column, not general exprs, so the target
         // must be a SlotRef pointing to a column. We can allow implicit integer casts
diff --git a/fe/src/main/java/org/apache/impala/service/KuduCatalogOpExecutor.java b/fe/src/main/java/org/apache/impala/service/KuduCatalogOpExecutor.java
index 0508334..15eb986 100644
--- a/fe/src/main/java/org/apache/impala/service/KuduCatalogOpExecutor.java
+++ b/fe/src/main/java/org/apache/impala/service/KuduCatalogOpExecutor.java
@@ -49,6 +49,7 @@ import org.apache.kudu.client.KuduClient;
 import org.apache.kudu.client.KuduException;
 import org.apache.kudu.client.PartialRow;
 import org.apache.kudu.client.RangePartitionBound;
+import org.apache.kudu.util.CharUtil;
 import org.apache.kudu.util.DecimalUtil;
 import org.apache.log4j.Logger;
 
@@ -151,6 +152,10 @@ public class KuduCatalogOpExecutor {
       csb.typeAttributes(
           DecimalUtil.typeAttributes(type.getPrecision(), type.getDecimalDigits()));
     }
+    if (kuduType == org.apache.kudu.Type.VARCHAR) {
+      csb.typeAttributes(
+          CharUtil.typeAttributes(type.getColumnSize()));
+    }
     if (column.isSetComment() && !column.getComment().isEmpty()) {
       csb.comment(column.getComment());
     }
diff --git a/fe/src/main/java/org/apache/impala/util/KuduUtil.java b/fe/src/main/java/org/apache/impala/util/KuduUtil.java
index a601459..7568623 100644
--- a/fe/src/main/java/org/apache/impala/util/KuduUtil.java
+++ b/fe/src/main/java/org/apache/impala/util/KuduUtil.java
@@ -170,6 +170,10 @@ public class KuduUtil {
         checkCorrectType(literal.isSetInt_literal(), type, colName, literal);
         key.addLong(pos, literal.getInt_literal().getValue());
         break;
+      case VARCHAR:
+        checkCorrectType(literal.isSetString_literal(), type, colName, literal);
+        key.addVarchar(pos, literal.getString_literal().getValue());
+        break;
       case STRING:
         checkCorrectType(literal.isSetString_literal(), type, colName, literal);
         key.addString(pos, literal.getString_literal().getValue());
@@ -227,6 +231,7 @@ public class KuduUtil {
       case DOUBLE:
         checkCorrectType(literal.isSetFloat_literal(), type, colName, literal);
         return (double) literal.getFloat_literal().getValue();
+      case VARCHAR:
       case STRING:
         checkCorrectType(literal.isSetString_literal(), type, colName, literal);
         return literal.getString_literal().getValue();
@@ -440,13 +445,13 @@ public class KuduUtil {
       case TIMESTAMP: return org.apache.kudu.Type.UNIXTIME_MICROS;
       case DECIMAL: return org.apache.kudu.Type.DECIMAL;
       case DATE: return org.apache.kudu.Type.DATE;
+      case VARCHAR: return org.apache.kudu.Type.VARCHAR;
       /* Fall through below */
       case INVALID_TYPE:
       case NULL_TYPE:
       case BINARY:
       case DATETIME:
       case CHAR:
-      case VARCHAR:
       default:
         throw new ImpalaRuntimeException(format(
             "Type %s is not supported in Kudu", s.toSql()));
@@ -469,6 +474,7 @@ public class KuduUtil {
       case DECIMAL:
         return ScalarType.createDecimalType(
             typeAttributes.getPrecision(), typeAttributes.getScale());
+      case VARCHAR: return ScalarType.createVarcharType(typeAttributes.getLength());
       default:
         throw new ImpalaRuntimeException(String.format(
             "Kudu type '%s' is not supported in Impala", t.getName()));
diff --git a/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java b/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java
index e91179f..8dd968f 100644
--- a/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java
+++ b/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java
@@ -2199,6 +2199,10 @@ public class AnalyzeDDLTest extends FrontendTestBase {
     AnalyzesOk("create table t primary key (id) partition by hash partitions 3" +
         " stored as kudu as select c1 as id from functional.decimal_tiny");
 
+    // CTAS into Kudu with varchar type
+    AnalyzesOk("create table t primary key (vc) partition by hash partitions 3" +
+        " stored as kudu as select vc from functional.chars_tiny");
+
     // CTAS in an external Kudu table
     AnalysisError("create external table t stored as kudu " +
         "tblproperties('kudu.table_name'='t') as select id, int_col from " +
@@ -2209,9 +2213,6 @@ public class AnalyzeDDLTest extends FrontendTestBase {
     AnalysisError("create table t primary key (cs) partition by hash partitions 3" +
         " stored as kudu as select cs from functional.chars_tiny",
         "Cannot create table 't': Type CHAR(5) is not supported in Kudu");
-    AnalysisError("create table t primary key (vc) partition by hash partitions 3" +
-        " stored as kudu as select vc from functional.chars_tiny",
-        "Cannot create table 't': Type VARCHAR(32) is not supported in Kudu");
     AnalysisError("create table t primary key (id) partition by hash partitions 3" +
         " stored as kudu as select id, s from functional.complextypes_fileformat",
         "Expr 's' in select list returns a complex type 'STRUCT<f1:STRING,f2:INT>'.\n" +
diff --git a/fe/src/test/java/org/apache/impala/analysis/AnalyzeKuduDDLTest.java b/fe/src/test/java/org/apache/impala/analysis/AnalyzeKuduDDLTest.java
index c021b3d..b4c99b4 100644
--- a/fe/src/test/java/org/apache/impala/analysis/AnalyzeKuduDDLTest.java
+++ b/fe/src/test/java/org/apache/impala/analysis/AnalyzeKuduDDLTest.java
@@ -298,7 +298,7 @@ public class AnalyzeKuduDDLTest extends FrontendTestBase {
 
 
     // Test unsupported Kudu types
-    List<String> unsupportedTypes = Lists.newArrayList("VARCHAR(20)", "CHAR(20)",
+    List<String> unsupportedTypes = Lists.newArrayList("CHAR(20)",
         "STRUCT<f1:INT,f2:STRING>", "ARRAY<INT>", "MAP<STRING,STRING>");
     for (String t: unsupportedTypes) {
       String expectedError = String.format(
@@ -351,7 +351,7 @@ public class AnalyzeKuduDDLTest extends FrontendTestBase {
         "i2 smallint default null, i3 int default null, i4 bigint default null, " +
         "vals string default null, valf float default null, vald double default null, " +
         "valb boolean default null, valdec decimal(10, 5) default null, " +
-        "valdate date default null) " +
+        "valdate date default null, valvc varchar(10) default null) " +
         "partition by hash (x) partitions 3 stored as kudu", isExternalPurgeTbl);
     // Use NULL as a default value on a non-nullable column
     AnalysisError("create table tab (x int primary key, y int not null default null) " +
@@ -387,6 +387,7 @@ public class AnalyzeKuduDDLTest extends FrontendTestBase {
         "cast(3.1452 as double), valb boolean default true, " +
         "valdec decimal(10, 5) default 3.14159, " +
         "valdate date default date '1970-01-01', " +
+        "valvc varchar(10) default cast('test' as varchar(10)), " +
         "primary key (i1, i2, i3, i4, vals)) partition by hash (i1) partitions 3 " +
         "stored as kudu", isExternalPurgeTbl);
     AnalyzesOk("create table tab (i int primary key default 1+1+1) " +
diff --git a/testdata/workloads/functional-query/queries/QueryTest/kudu-scan-node.test b/testdata/workloads/functional-query/queries/QueryTest/kudu-scan-node.test
index f32c8a1..286be0d 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/kudu-scan-node.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/kudu-scan-node.test
@@ -141,6 +141,28 @@ order by id;
 INT, TIMESTAMP
 ====
 ---- QUERY
+# Push down VARCHAR predicates
+CREATE TABLE kudu_varchar_pred (key INT PRIMARY KEY, varchar_col VARCHAR(10))
+  PARTITION BY HASH (key) PARTITIONS 4 STORED AS KUDU;
+INSERT INTO kudu_varchar_pred VALUES
+  (1, cast('a' as VARCHAR(10))),
+  (2, cast('b' as VARCHAR(10))),
+  (3, cast('m' as VARCHAR(10))),
+  (4, cast('y' as VARCHAR(10))),
+  (5, cast('z' as VARCHAR(10))),
+  (6, NULL);
+select key, varchar_col from kudu_varchar_pred where
+varchar_col >= cast('b' as VARCHAR(10)) and
+varchar_col <= cast('y' as VARCHAR(10))
+order by key;
+---- RESULTS
+2,'b'
+3,'m'
+4,'y'
+---- TYPES
+INT, STRING
+====
+---- QUERY
 # Regression test for IMPALA-6187. Make sure count(*) queries with partition columns only
 # won't miss conjuncts evaluation. 'id' is the partition column here.
 select count(*) from functional_kudu.alltypes where rand() + id < 0.0;
diff --git a/testdata/workloads/functional-query/queries/QueryTest/kudu_create.test b/testdata/workloads/functional-query/queries/QueryTest/kudu_create.test
index ef8bb32..cebdf6f 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/kudu_create.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/kudu_create.test
@@ -152,7 +152,7 @@ create table tbl_with_null_defaults (x int primary key, i1 tinyint default null,
   vals string default null, valf float default null, vald double default null,
   valb boolean default null, valdec4 decimal(9) default null,
   valdec8 decimal(18) default null, valdec16 decimal(38) default null,
-  valdate date default null)
+  valdate date default null, valvc varchar(2000) default null)
   partition by hash (x) partitions 3 stored as kudu
 ---- RESULTS
 'Table has been created.'
@@ -163,11 +163,11 @@ insert into tbl_with_null_defaults (x) values (1);
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-X, I1, I2, I3, I4, VALS, VALF, VALD, VALB, VALDEC4, VALDEC8, VALDEC16, VALDATE
+X, I1, I2, I3, I4, VALS, VALF, VALD, VALB, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tbl_with_null_defaults
-1,NULL,NULL,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL
+1,NULL,NULL,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,TINYINT,SMALLINT,INT,BIGINT,STRING,FLOAT,DOUBLE,BOOLEAN,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,TINYINT,SMALLINT,INT,BIGINT,STRING,FLOAT,DOUBLE,BOOLEAN,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # Overlapping ranges are rejected by the Kudu client
@@ -422,3 +422,51 @@ select * from kudu_datepk_range;
 ---- TYPES
 DATE
 ====
+---- QUERY
+# Creates a Kudu table with varchar columns, primary key,
+# hash partition and range partition.
+create table create_varchar
+(
+ valvc varchar(10),
+ primary key (valvc))
+partition by hash (valvc) partitions 4, range (valvc) (
+ partition values < cast('m' as VARCHAR(10)),
+ partition cast('m' as VARCHAR(10)) <= values)
+stored as kudu;
+---- RESULTS
+'Table has been created.'
+====
+---- QUERY
+insert into create_varchar values
+  (cast('a' as VARCHAR(10))),
+  (cast('m' as VARCHAR(10))),
+  (cast('z' as VARCHAR(10)))
+---- RUNTIME_PROFILE
+NumModifiedRows: 3
+NumRowErrors: 0
+---- LABELS
+VALVC
+---- DML_RESULTS: create_varchar
+'a'
+'m'
+'z'
+---- TYPES
+STRING
+====
+---- QUERY
+# Creates as select table with varchar columns and primary key
+create table ctas_varchar primary key (vc)
+stored as kudu
+as select vc from functional.chars_tiny;
+select * from ctas_varchar;
+---- RESULTS
+'1cccc'
+'2cccccc'
+'3ccc'
+'4cc'
+'5c'
+'6c'
+'c'
+---- TYPES
+STRING
+====
diff --git a/testdata/workloads/functional-query/queries/QueryTest/kudu_delete.test b/testdata/workloads/functional-query/queries/QueryTest/kudu_delete.test
index 67a30b2..ceff38d 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/kudu_delete.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/kudu_delete.test
@@ -4,7 +4,7 @@ create table tdata
   (id int primary key, valf float null, vali bigint null, valv string null,
    valb boolean null, valt tinyint null, vals smallint null, vald double null,
    valdec4 decimal(9,9) null, valdec8 decimal(18,2) null,
-   valdec16 decimal(38, 0) null, valdate date null)
+   valdec16 decimal(38, 0) null, valdate date null, valvc varchar(10) null)
   PARTITION BY RANGE (PARTITION VALUES < 100, PARTITION 100 <= VALUES < 1000,
   PARTITION 1000 <= VALUES <= 10000) STORED AS KUDU
 ---- RESULTS
@@ -12,16 +12,16 @@ create table tdata
 ====
 ---- QUERY
 insert into table tdata values
-(1, 1.0, 1, 'one', true, 1, 1, 1, 0.000000001, 1.11, 1, DATE '2019-01-01'),
-(2, -2, 20, 'two', false, 0, 1, NULL, 0.000000002, 2.22, 2, DATE '2019-01-02'),
-(3, 0, NULL, 'three', false, 10, 20, 30, 0.000000040, 50.00, 60, DATE '2019-01-03'),
-(4, 5, 6, 'four', true, 7, 8, 9, 0.000000010, 11.11, 12, DATE '2019-01-04'),
-(5, 0, 10, 'five', NULL, 15, 20, 25, 0.000000030, 35.35, 40, DATE '2019-01-05'),
-(6, 9, 12, 'six', true, -1, -2, cast('inf' as double), -0.000000001, -1.11, -1, DATE '2019-01-06'),
-(7, NULL, 7, 'seven', false, 77, 777, NULL, NULL, NULL, NULL, NULL),
-(8, 0, 80, NULL, true, 10, 11, 12, 0.000000013, 0.14, 15, DATE '2019-01-08'),
-(9, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
-(127, 1, 2, '127', false, 3, 4, 5, 0.000000000, 0.00, 0, DATE '2019-01-27')
+(1, 1.0, 1, 'one', true, 1, 1, 1, 0.000000001, 1.11, 1, DATE '2019-01-01', CAST('one' AS VARCHAR(10))),
+(2, -2, 20, 'two', false, 0, 1, NULL, 0.000000002, 2.22, 2, DATE '2019-01-02', CAST('two' AS VARCHAR(10))),
+(3, 0, NULL, 'three', false, 10, 20, 30, 0.000000040, 50.00, 60, DATE '2019-01-03', CAST('three' AS VARCHAR(10))),
+(4, 5, 6, 'four', true, 7, 8, 9, 0.000000010, 11.11, 12, DATE '2019-01-04', CAST('four' AS VARCHAR(10))),
+(5, 0, 10, 'five', NULL, 15, 20, 25, 0.000000030, 35.35, 40, DATE '2019-01-05', CAST('five' AS VARCHAR(10))),
+(6, 9, 12, 'six', true, -1, -2, cast('inf' as double), -0.000000001, -1.11, -1, DATE '2019-01-06', CAST('six' AS VARCHAR(10))),
+(7, NULL, 7, 'seven', false, 77, 777, NULL, NULL, NULL, NULL, NULL, CAST('seven' AS VARCHAR(10))),
+(8, 0, 80, NULL, true, 10, 11, 12, 0.000000013, 0.14, 15, DATE '2019-01-08', NULL),
+(9, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(127, 1, 2, '127', false, 3, 4, 5, 0.000000000, 0.00, 0, DATE '2019-01-27', CAST('127' AS VARCHAR(10)))
 ---- RESULTS
 : 10
 ====
@@ -32,19 +32,19 @@ delete from tdata where id = 1
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04
-5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-7,NULL,7,'seven',false,77,777,NULL,NULL,NULL,NULL,NULL
-8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08
-9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-127,1,2,'127',false,3,4,5,0.000000000,0.00,0,2019-01-27
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04,'four'
+5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05,'five'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+7,NULL,7,'seven',false,77,777,NULL,NULL,NULL,NULL,NULL,'seven'
+8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08,'NULL'
+9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+127,1,2,'127',false,3,4,5,0.000000000,0.00,0,2019-01-27,'127'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # predicate on key, NULL
@@ -53,19 +53,19 @@ delete from tdata where id is NULL
 NumModifiedRows: 0
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04
-5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-7,NULL,7,'seven',false,77,777,NULL,NULL,NULL,NULL,NULL
-8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08
-9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-127,1,2,'127',false,3,4,5,0.000000000,0.00,0,2019-01-27
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04,'four'
+5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05,'five'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+7,NULL,7,'seven',false,77,777,NULL,NULL,NULL,NULL,NULL,'seven'
+8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08,'NULL'
+9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+127,1,2,'127',false,3,4,5,0.000000000,0.00,0,2019-01-27,'127'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # predicate on key, nothing is deleted
@@ -74,19 +74,19 @@ delete from tdata where id = 10
 NumModifiedRows: 0
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04
-5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-7,NULL,7,'seven',false,77,777,NULL,NULL,NULL,NULL,NULL
-8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08
-9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-127,1,2,'127',false,3,4,5,0.000000000,0.00,0,2019-01-27
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04,'four'
+5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05,'five'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+7,NULL,7,'seven',false,77,777,NULL,NULL,NULL,NULL,NULL,'seven'
+8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08,'NULL'
+9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+127,1,2,'127',false,3,4,5,0.000000000,0.00,0,2019-01-27,'127'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # predicate on key, boundary value
@@ -95,18 +95,18 @@ delete from tdata where id = max_tinyint()
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04
-5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-7,NULL,7,'seven',false,77,777,NULL,NULL,NULL,NULL,NULL
-8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08
-9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04,'four'
+5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05,'five'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+7,NULL,7,'seven',false,77,777,NULL,NULL,NULL,NULL,NULL,'seven'
+8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08,'NULL'
+9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # compound predicate on key
@@ -115,17 +115,17 @@ delete from tdata where id > 6 and id < 8
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04
-5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08
-9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04,'four'
+5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05,'five'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08,'NULL'
+9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # predicate on key, multiple rows
@@ -134,23 +134,23 @@ delete from tdata where id % 4 = 0
 NumModifiedRows: 2
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05,'five'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # insert new values, including some that were previously deleted
 insert into table tdata values
-(10, 20, 30, 'ten', true, 40, 50, 60, 0.000000070, 80.80, 90, DATE '2019-01-10'),
-(1, 1.0, 1, 'one', true, 1, 1, 1, 0.000000001, 1.11, 1, DATE '2019-01-01'),
-(11, -11, 11, 'eleven', false, 1, 11, 111, 0.000000011, 11.00, 11, DATE '2019-01-11'),
-(8, 0, 80, NULL, true, 10, 11, 12, 0.000000013, 0.14, 15, DATE '2019-01-08')
+(10, 20, 30, 'ten', true, 40, 50, 60, 0.000000070, 80.80, 90, DATE '2019-01-10', CAST('ten' AS VARCHAR(10))),
+(1, 1.0, 1, 'one', true, 1, 1, 1, 0.000000001, 1.11, 1, DATE '2019-01-01', CAST('one' AS VARCHAR(10))),
+(11, -11, 11, 'eleven', false, 1, 11, 111, 0.000000011, 11.00, 11, DATE '2019-01-11', CAST('eleven' AS VARCHAR(10))),
+(8, 0, 80, NULL, true, 10, 11, 12, 0.000000013, 0.14, 15, DATE '2019-01-08', NULL)
 ====
 ---- QUERY
 # single row, predicate on non-key
@@ -159,18 +159,18 @@ delete from tdata where valv = 'five'
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-10,20,30,'ten',true,40,50,60,0.000000070,80.80,90,2019-01-10
-1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01
-11,-11,11,'eleven',false,1,11,111,0.000000011,11.00,11,2019-01-11
-8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+9,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+10,20,30,'ten',true,40,50,60,0.000000070,80.80,90,2019-01-10,'ten'
+1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01,'one'
+11,-11,11,'eleven',false,1,11,111,0.000000011,11.00,11,2019-01-11,'eleven'
+8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # predicate on non-key, NULL
@@ -179,17 +179,17 @@ delete from tdata where valb is NULL
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-10,20,30,'ten',true,40,50,60,0.000000070,80.80,90,2019-01-10
-1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01
-11,-11,11,'eleven',false,1,11,111,0.000000011,11.00,11,2019-01-11
-8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+10,20,30,'ten',true,40,50,60,0.000000070,80.80,90,2019-01-10,'ten'
+1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01,'one'
+11,-11,11,'eleven',false,1,11,111,0.000000011,11.00,11,2019-01-11,'eleven'
+8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # predicate on non-key, nothing is deleted
@@ -198,17 +198,17 @@ delete from tdata where vals = -100
 NumModifiedRows: 0
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-10,20,30,'ten',true,40,50,60,0.000000070,80.80,90,2019-01-10
-1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01
-11,-11,11,'eleven',false,1,11,111,0.000000011,11.00,11,2019-01-11
-8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+10,20,30,'ten',true,40,50,60,0.000000070,80.80,90,2019-01-10,'ten'
+1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01,'one'
+11,-11,11,'eleven',false,1,11,111,0.000000011,11.00,11,2019-01-11,'eleven'
+8,0,80,'NULL',true,10,11,12,0.000000013,0.14,15,2019-01-08,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # predicate on non-key, compound predicate
@@ -217,16 +217,16 @@ delete from tdata where valf = 0 and vali = 80
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-10,20,30,'ten',true,40,50,60,0.000000070,80.80,90,2019-01-10
-1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01
-11,-11,11,'eleven',false,1,11,111,0.000000011,11.00,11,2019-01-11
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+10,20,30,'ten',true,40,50,60,0.000000070,80.80,90,2019-01-10,'ten'
+1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01,'one'
+11,-11,11,'eleven',false,1,11,111,0.000000011,11.00,11,2019-01-11,'eleven'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # predicate on non-key, multiple rows
@@ -235,14 +235,14 @@ delete from tdata where vals % 10 = 0
 NumModifiedRows: 2
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01
-11,-11,11,'eleven',false,1,11,111,0.000000011,11.00,11,2019-01-11
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01,'one'
+11,-11,11,'eleven',false,1,11,111,0.000000011,11.00,11,2019-01-11,'eleven'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # 'from' syntax - the join results in four deletes, 3 of which fail
@@ -251,13 +251,13 @@ delete a from tdata a, tdata b where a.id = 11
 NumModifiedRows: 1
 NumRowErrors: 3
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01,'one'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # Try to delete a row with a primary key value that is not covered by the existing range
@@ -267,20 +267,20 @@ delete from tdata where id = 10001
 NumModifiedRows: 0
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02
-6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06
-1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01
+2,-2,20,'two',false,0,1,NULL,0.000000002,2.22,2,2019-01-02,'two'
+6,9,12,'six',true,-1,-2,Infinity,-0.000000001,-1.11,-1,2019-01-06,'six'
+1,1.0,1,'one',true,1,1,1,0.000000001,1.11,1,2019-01-01,'one'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # Add a couple more rows back
 insert into table tdata values
-(3, 0, NULL, 'three', false, 10, 20, 30, 0.000000040, 50.00, 60, DATE '2019-01-03'),
-(4, 5, 6, 'four', true, 7, 8, 9, 0.000000010, 11.11, 12, DATE '2019-01-04'),
-(5, 0, 10, 'five', NULL, 15, 20, 25, 0.000000030, 35.35, 40, DATE '2019-01-05')
+(3, 0, NULL, 'three', false, 10, 20, 30, 0.000000040, 50.00, 60, DATE '2019-01-03', CAST('three' AS VARCHAR(10))),
+(4, 5, 6, 'four', true, 7, 8, 9, 0.000000010, 11.11, 12, DATE '2019-01-04', CAST('four' AS VARCHAR(10))),
+(5, 0, 10, 'five', NULL, 15, 20, 25, 0.000000030, 35.35, 40, DATE '2019-01-05', CAST('five' AS VARCHAR(10)))
 ---- RESULTS
 : 3
 ====
@@ -291,13 +291,13 @@ delete from tdata where valdec8 < 11.11
 NumModifiedRows: 3
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04
-5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04,'four'
+5,0,10,'five',NULL,15,20,25,0.000000030,35.35,40,2019-01-05,'five'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # predicate on decimal, single row
@@ -306,17 +306,17 @@ delete from tdata where valdec4 = 0.000000030
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03
-4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04
+3,0,NULL,'three',false,10,20,30,0.000000040,50.00,60,2019-01-03,'three'
+4,5,6,'four',true,7,8,9,0.000000010,11.11,12,2019-01-04,'four'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 insert into tdata
 select cast(id + 100 as int), float_col, bigint_col, string_col, bool_col, tinyint_col,
-smallint_col, double_col, NULL, NULL, NULL, NULL
+smallint_col, double_col, NULL, NULL, NULL, NULL, NULL
 from functional_kudu.alltypes
 ---- RESULTS
 : 7300
@@ -331,10 +331,10 @@ delete from tdata where id > -1
 NumModifiedRows: 7302
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 create table multiple_key_cols
diff --git a/testdata/workloads/functional-query/queries/QueryTest/kudu_describe.test b/testdata/workloads/functional-query/queries/QueryTest/kudu_describe.test
index 9c8c376..5d8f0ef 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/kudu_describe.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/kudu_describe.test
@@ -105,3 +105,23 @@ NAME,TYPE,COMMENT,PRIMARY_KEY,NULLABLE,DEFAULT_VALUE,ENCODING,COMPRESSION,BLOCK_
 ---- TYPES
 STRING,STRING,STRING,STRING,STRING,STRING,STRING,STRING,STRING
 ====
+---- QUERY
+# Test varchar columns and primary key
+create table describe_varchar_test
+(
+ varchar_pk varchar(1000) PRIMARY KEY,
+ varchar_val varchar(500) not null,
+ varchar_default varchar(200) not null default cast('foo' as varchar(200)),
+ varchar_null varchar(100) null)
+stored as kudu;
+describe describe_varchar_test;
+---- LABELS
+NAME,TYPE,COMMENT,PRIMARY_KEY,NULLABLE,DEFAULT_VALUE,ENCODING,COMPRESSION,BLOCK_SIZE
+---- RESULTS
+'varchar_pk','varchar(1000)','','true','false','','AUTO_ENCODING','DEFAULT_COMPRESSION','0'
+'varchar_val','varchar(500)','','false','false','','AUTO_ENCODING','DEFAULT_COMPRESSION','0'
+'varchar_default','varchar(200)','','false','false','foo','AUTO_ENCODING','DEFAULT_COMPRESSION','0'
+'varchar_null','varchar(100)','','false','true','','AUTO_ENCODING','DEFAULT_COMPRESSION','0'
+---- TYPES
+STRING,STRING,STRING,STRING,STRING,STRING,STRING,STRING,STRING
+====
diff --git a/testdata/workloads/functional-query/queries/QueryTest/kudu_insert.test b/testdata/workloads/functional-query/queries/QueryTest/kudu_insert.test
index ef7b8ec..eb35c29 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/kudu_insert.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/kudu_insert.test
@@ -4,7 +4,7 @@ create table tdata
   (id int primary key, valf float null, vali bigint null, valv string null,
    valb boolean null, valt tinyint null, vals smallint null, vald double null,
    ts timestamp, decimal4 decimal(9,9) null, decimal8 decimal(18,2) null,
-   decimal16 decimal(38, 0) null, valdate date null)
+   decimal16 decimal(38, 0) null, valdate date null, valvc varchar(10) null)
   PARTITION BY RANGE (PARTITION VALUES < 10, PARTITION 10 <= VALUES < 30,
   PARTITION 30 <= VALUES) STORED AS KUDU
 ---- RESULTS
@@ -13,30 +13,30 @@ create table tdata
 ---- QUERY
 # VALUES, single row, all target cols, no errors
 insert into tdata values (1, 1, 1, 'one', true, 1, 1, 1,
-  cast('1987-05-19 00:00:00' as timestamp), 0.000000001, 1.00, 1, DATE '1970-01-01')
+  cast('1987-05-19 00:00:00' as timestamp), 0.000000001, 1.00, 1, DATE '1970-01-01', cast('one' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01
+1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01,'one'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, all target cols, NULL
-insert into tdata values (2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
+insert into tdata values (2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01
-2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
+1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01,'one'
+2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, all target cols, boundary values. The timestamp value is the max
@@ -46,18 +46,18 @@ insert into tdata values
 (3, cast('nan' as float), max_bigint(), '', true, min_tinyint(), max_smallint(),
   cast('-inf' as double),
   nanoseconds_add(cast('9999-12-31 23:59:59' as timestamp), 999999999),
-  0.999999999, 9999999999999999.99, 99999999999999999999999999999999999999, DATE '9999-12-31')
+  0.999999999, 9999999999999999.99, 99999999999999999999999999999999999999, DATE '9999-12-31', cast('' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01
-2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31
+1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01,'one'
+2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31,''
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, subset of target cols
@@ -66,36 +66,36 @@ insert into tdata (valb, vald, id) values (true, 0, 4)
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01
-2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31
-4,NULL,NULL,'NULL',true,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL
+1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01,'one'
+2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31,''
+4,NULL,NULL,'NULL',true,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, multiple rows, all target cols
 insert into tdata values
-(5, 5.0, 5, 'five', false, NULL, NULL, NULL, NULL, NULL, NULL, NULL,NULL),
-(6, 16, 60, '', true, 0, -1, -6, cast('2010-12-31 23:59:59' as timestamp), -0.000000001, -1.00, -1, DATE '1970-01-01'),
-(7, NULL, 10, NULL, false, max_tinyint(), -7, 2, cast('1400-01-01 00:00:00' as timestamp), 0.000000000, 0.00, 0, DATE '1970-01-01')
+(5, 5.0, 5, 'five', false, NULL, NULL, NULL, NULL, NULL, NULL, NULL,NULL, cast('five' as varchar(10))),
+(6, 16, 60, '', true, 0, -1, -6, cast('2010-12-31 23:59:59' as timestamp), -0.000000001, -1.00, -1, DATE '1970-01-01', cast ('' as varchar(10))),
+(7, NULL, 10, NULL, false, max_tinyint(), -7, 2, cast('1400-01-01 00:00:00' as timestamp), 0.000000000, 0.00, 0, DATE '1970-01-01', NULL)
 ---- RUNTIME_PROFILE
 NumModifiedRows: 3
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01
-2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31
-4,NULL,NULL,'NULL',true,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL
-5,5.0,5,'five',false,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-6,16,60,'',true,0,-1,-6,2010-12-31 23:59:59,-0.000000001,-1.00,-1,1970-01-01
-7,NULL,10,'NULL',false,127,-7,2,1400-01-01 00:00:00,0.000000000,0.00,0,1970-01-01
+1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01,'one'
+2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31,''
+4,NULL,NULL,'NULL',true,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,'NULL'
+5,5.0,5,'five',false,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'five'
+6,16,60,'',true,0,-1,-6,2010-12-31 23:59:59,-0.000000001,-1.00,-1,1970-01-01,''
+7,NULL,10,'NULL',false,127,-7,2,1400-01-01 00:00:00,0.000000000,0.00,0,1970-01-01,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, multiple rows, subset of cols
@@ -106,44 +106,44 @@ insert into tdata (valv, valf, vali, id) values
 NumModifiedRows: 2
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01
-2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31
-4,NULL,NULL,'NULL',true,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL
-5,5.0,5,'five',false,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-6,16,60,'',true,0,-1,-6,2010-12-31 23:59:59,-0.000000001,-1.00,-1,1970-01-01
-7,NULL,10,'NULL',false,127,-7,2,1400-01-01 00:00:00,0.000000000,0.00,0,1970-01-01
-8,88,888,'eight',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-9,-9,-99,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
+1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01,'one'
+2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31,''
+4,NULL,NULL,'NULL',true,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,'NULL'
+5,5.0,5,'five',false,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'five'
+6,16,60,'',true,0,-1,-6,2010-12-31 23:59:59,-0.000000001,-1.00,-1,1970-01-01,''
+7,NULL,10,'NULL',false,127,-7,2,1400-01-01 00:00:00,0.000000000,0.00,0,1970-01-01,'NULL'
+8,88,888,'eight',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+9,-9,-99,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # SELECT, single row, all target cols
 insert into tdata
 select id, float_col, bigint_col, string_col, bool_col, tinyint_col, smallint_col,
-double_col, timestamp_col, NULL, NULL, NULL, NULL
+double_col, timestamp_col, NULL, NULL, NULL, NULL, NULL
 from functional.alltypes where id = 10
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01
-2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31
-4,NULL,NULL,'NULL',true,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL
-5,5.0,5,'five',false,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-6,16,60,'',true,0,-1,-6,2010-12-31 23:59:59,-0.000000001,-1.00,-1,1970-01-01
-7,NULL,10,'NULL',false,127,-7,2,1400-01-01 00:00:00,0.000000000,0.00,0,1970-01-01
-8,88,888,'eight',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-9,-9,-99,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-10,0,0,'0',true,0,0,0,2009-01-02 00:10:00.450000000,NULL,NULL,NULL,NULL
+1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01,'one'
+2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31,''
+4,NULL,NULL,'NULL',true,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,'NULL'
+5,5.0,5,'five',false,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'five'
+6,16,60,'',true,0,-1,-6,2010-12-31 23:59:59,-0.000000001,-1.00,-1,1970-01-01,''
+7,NULL,10,'NULL',false,127,-7,2,1400-01-01 00:00:00,0.000000000,0.00,0,1970-01-01,'NULL'
+8,88,888,'eight',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+9,-9,-99,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+10,0,0,'0',true,0,0,0,2009-01-02 00:10:00.450000000,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # SELECT, single row, subset of cols
@@ -154,21 +154,21 @@ from functional.alltypes where id = 11
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01
-2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31
-4,NULL,NULL,'NULL',true,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL
-5,5.0,5,'five',false,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-6,16,60,'',true,0,-1,-6,2010-12-31 23:59:59,-0.000000001,-1.00,-1,1970-01-01
-7,NULL,10,'NULL',false,127,-7,2,1400-01-01 00:00:00,0.000000000,0.00,0,1970-01-01
-8,88,888,'eight',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-9,-9,-99,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
-10,0,0,'0',true,0,0,0,2009-01-02 00:10:00.450000000,NULL,NULL,NULL,NULL
-11,NULL,10,'NULL',false,NULL,NULL,10.1,2009-01-02 00:11:00.450000000,NULL,NULL,NULL,NULL
+1,1,1,'one',true,1,1,1,1987-05-19 00:00:00,0.000000001,1.00,1,1970-01-01,'one'
+2,NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+3,NaN,9223372036854775807,'',true,-128,32767,-Infinity,9999-12-31 23:59:59.999999000,0.999999999,9999999999999999.99,99999999999999999999999999999999999999,9999-12-31,''
+4,NULL,NULL,'NULL',true,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,'NULL'
+5,5.0,5,'five',false,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'five'
+6,16,60,'',true,0,-1,-6,2010-12-31 23:59:59,-0.000000001,-1.00,-1,1970-01-01,''
+7,NULL,10,'NULL',false,127,-7,2,1400-01-01 00:00:00,0.000000000,0.00,0,1970-01-01,'NULL'
+8,88,888,'eight',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+9,-9,-99,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+10,0,0,'0',true,0,0,0,2009-01-02 00:10:00.450000000,NULL,NULL,NULL,NULL,'NULL'
+11,NULL,10,'NULL',false,NULL,NULL,10.1,2009-01-02 00:11:00.450000000,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 delete tdata
@@ -178,18 +178,18 @@ delete tdata
 # SELECT, multiple rows, all target cols
 insert into tdata
 select id, float_col, bigint_col, string_col, bool_col, tinyint_col, smallint_col,
-double_col, timestamp_col, NULL, NULL, NULL, NULL
+double_col, timestamp_col, NULL, NULL, NULL, NULL, cast(string_col as varchar(10))
 from functional.alltypes where id < 2
 ---- RUNTIME_PROFILE
 NumModifiedRows: 2
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-0,0,0,'0',true,0,0,0,2009-01-01 00:00:00,NULL,NULL,NULL,NULL
-1,1.100000023841858,10,'1',false,1,1,10.1,2009-01-01 00:01:00,NULL,NULL,NULL,NULL
+0,0,0,'0',true,0,0,0,2009-01-01 00:00:00,NULL,NULL,NULL,NULL,'0'
+1,1.100000023841858,10,'1',false,1,1,10.1,2009-01-01 00:01:00,NULL,NULL,NULL,NULL,'1'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # SELECT, multiple rows, subset of cols
@@ -200,20 +200,20 @@ from functional.alltypes where id > 2 and id < 6
 NumModifiedRows: 3
 NumRowErrors: 0
 ---- LABELS
-ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE
+ID, VALF, VALI, VALV, VALB, VALT, VALS, VALD, TS, DECIMAL4, DECIMAL8, DECIMAL16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-0,0,0,'0',true,0,0,0,2009-01-01 00:00:00,NULL,NULL,NULL,NULL
-1,1.100000023841858,10,'1',false,1,1,10.1,2009-01-01 00:01:00,NULL,NULL,NULL,NULL
-3,NULL,NULL,'NULL',NULL,3,3,30.3,2009-01-01 00:03:00.300000000,NULL,NULL,NULL,NULL
-4,NULL,NULL,'NULL',NULL,4,4,40.4,2009-01-01 00:04:00.600000000,NULL,NULL,NULL,NULL
-5,NULL,NULL,'NULL',NULL,5,5,50.5,2009-01-01 00:05:00.100000000,NULL,NULL,NULL,NULL
+0,0,0,'0',true,0,0,0,2009-01-01 00:00:00,NULL,NULL,NULL,NULL,'0'
+1,1.100000023841858,10,'1',false,1,1,10.1,2009-01-01 00:01:00,NULL,NULL,NULL,NULL,'1'
+3,NULL,NULL,'NULL',NULL,3,3,30.3,2009-01-01 00:03:00.300000000,NULL,NULL,NULL,NULL,'NULL'
+4,NULL,NULL,'NULL',NULL,4,4,40.4,2009-01-01 00:04:00.600000000,NULL,NULL,NULL,NULL,'NULL'
+5,NULL,NULL,'NULL',NULL,5,5,50.5,2009-01-01 00:05:00.100000000,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,TIMESTAMP,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # Make sure we can insert empty strings into string columns and that we can scan them
 # back.
-insert into tdata values (320, 2.0, 932, cast('' as string), false, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)
+insert into tdata values (320, 2.0, 932, cast('' as string), false, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, cast('' as varchar(10)))
 ---- RESULTS
 : 1
 ---- RUNTIME_PROFILE
@@ -221,15 +221,15 @@ NumModifiedRows: 1
 NumRowErrors: 0
 ====
 ---- QUERY
-select id, valv, valb from tdata where id = 320;
+select id, valv, valb, valvc from tdata where id = 320;
 ---- RESULTS
-320,'',false
+320,'',false,''
 ---- TYPES
-INT,STRING,BOOLEAN
+INT,STRING,BOOLEAN,STRING
 ====
 ---- QUERY
 insert into tdata values
-(666, cast(1.2 as float), 43, cast('z' as string), true, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)
+(666, cast(1.2 as float), 43, cast('z' as string), true, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL)
 ---- RESULTS
 : 1
 ---- RUNTIME_PROFILE
@@ -239,7 +239,7 @@ NumRowErrors: 0
 ---- QUERY
 # insert row with primary key that already exists
 insert into tdata values
-(666, cast(1.2 as float), 43, cast('z' as VARCHAR(20)), true, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)
+(666, cast(1.2 as float), 43, cast('z' as VARCHAR(20)), true, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL)
 ---- RESULTS
 : 0
 ---- RUNTIME_PROFILE
@@ -290,17 +290,18 @@ NumRowErrors: 7299
 ---- QUERY
 # Table with all supported types as primary key and distribution columns
 create table allkeytypes (i1 tinyint, i2 smallint, i3 int, i4 bigint, name string,
-  valt timestamp, valf float, vald double, primary key (i1, i2, i3, i4, name, valt))
+  valt timestamp, valvc varchar(10), valf float, vald double,
+  primary key (i1, i2, i3, i4, name, valt, valvc))
   partition by hash partitions 3, range
-  (partition value = (1,1,1,1,'1','2009-01-01 00:01:00'),
-  partition value = (2,2,2,2,'2','2009-01-01 00:02:00.100000000'),
-  partition value = (3,3,3,3,'3','2009-01-01 00:03:00.300000000')) stored as kudu
+  (partition value = (1,1,1,1,'1','2009-01-01 00:01:00',cast('1' as varchar(10))),
+  partition value = (2,2,2,2,'2','2009-01-01 00:02:00.100000000',cast('2' as varchar(10))),
+  partition value = (3,3,3,3,'3','2009-01-01 00:03:00.300000000',cast('3' as varchar(10)))) stored as kudu
 ---- RESULTS
 'Table has been created.'
 ====
 ---- QUERY
 insert into allkeytypes select cast(id as tinyint), smallint_col, int_col,
-  cast (bigint_col/10 as bigint), string_col, timestamp_col, float_col, double_col
+  cast (bigint_col/10 as bigint), string_col, timestamp_col, cast(string_col as varchar(10)), float_col, double_col
   from functional.alltypes where id > 1 and id < 10
 ---- RESULTS
 : 2
@@ -311,7 +312,7 @@ NumRowErrors: 6
 ---- QUERY
 # IMPALA-5871 - test that a cast is correctly added when inserting a string into a Kudu
 # timestamp partition column with distributed exec.
-insert into allkeytypes values (1,1,1,1,'1','2009-01-01 00:01:00',null,null)
+insert into allkeytypes values (1,1,1,1,'1','2009-01-01 00:01:00',cast('1' as varchar(10)),null,null)
 ---- RESULTS
 : 1
 ---- RUNTIME_PROFILE
@@ -337,8 +338,8 @@ NumRowErrors: 100
 create table tbl_with_defaults (a int primary key, b int null default 10,
   c int not null default 100, d int default 1000, e int null, f int not null,
   g string default 'test', h boolean default true,
-  i decimal(9, 2) default 1111.11) partition by hash (a)
-  partitions 3 stored as kudu
+  i decimal(9, 2) default 1111.11, j varchar(10) default cast('foo' as varchar(10)))
+  partition by hash (a) partitions 3 stored as kudu
 ---- RESULTS
 'Table has been created.'
 ====
@@ -348,63 +349,63 @@ insert into tbl_with_defaults (a, f) values (1, 1), (2, 2), (3, 3), (4, 4)
 NumModifiedRows: 4
 NumRowErrors: 0
 ---- LABELS
-A, B, C, D, E, F, G, H, I
+A, B, C, D, E, F, G, H, I, J
 ---- DML_RESULTS: tbl_with_defaults
-1,10,100,1000,NULL,1,'test',true,1111.11
-2,10,100,1000,NULL,2,'test',true,1111.11
-3,10,100,1000,NULL,3,'test',true,1111.11
-4,10,100,1000,NULL,4,'test',true,1111.11
+1,10,100,1000,NULL,1,'test',true,1111.11,'foo'
+2,10,100,1000,NULL,2,'test',true,1111.11,'foo'
+3,10,100,1000,NULL,3,'test',true,1111.11,'foo'
+4,10,100,1000,NULL,4,'test',true,1111.11,'foo'
 ---- TYPES
-INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL
+INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL,STRING
 ====
 ---- QUERY
-insert into tbl_with_defaults values (5, 5, 5, 5, 5, 5, 'row', false, 55555.55)
+insert into tbl_with_defaults values (5, 5, 5, 5, 5, 5, 'row', false, 55555.55, cast('row' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-A, B, C, D, E, F, G, H, I
+A, B, C, D, E, F, G, H, I, J
 ---- DML_RESULTS: tbl_with_defaults
-1,10,100,1000,NULL,1,'test',true,1111.11
-2,10,100,1000,NULL,2,'test',true,1111.11
-3,10,100,1000,NULL,3,'test',true,1111.11
-4,10,100,1000,NULL,4,'test',true,1111.11
-5,5,5,5,5,5,'row',false,55555.55
+1,10,100,1000,NULL,1,'test',true,1111.11,'foo'
+2,10,100,1000,NULL,2,'test',true,1111.11,'foo'
+3,10,100,1000,NULL,3,'test',true,1111.11,'foo'
+4,10,100,1000,NULL,4,'test',true,1111.11,'foo'
+5,5,5,5,5,5,'row',false,55555.55,'row'
 ---- TYPES
-INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL
+INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL,STRING
 ====
 ---- QUERY
-alter table tbl_with_defaults add columns (j int null, k int not null default 10000)
+alter table tbl_with_defaults add columns (k int null, l int not null default 10000)
 ---- RESULTS
 'Column(s) have been added.'
 ====
 ---- QUERY
 select * from tbl_with_defaults
 ---- RESULTS
-1,10,100,1000,NULL,1,'test',true,1111.11,NULL,10000
-2,10,100,1000,NULL,2,'test',true,1111.11,NULL,10000
-3,10,100,1000,NULL,3,'test',true,1111.11,NULL,10000
-4,10,100,1000,NULL,4,'test',true,1111.11,NULL,10000
-5,5,5,5,5,5,'row',false,55555.55,NULL,10000
+1,10,100,1000,NULL,1,'test',true,1111.11,'foo',NULL,10000
+2,10,100,1000,NULL,2,'test',true,1111.11,'foo',NULL,10000
+3,10,100,1000,NULL,3,'test',true,1111.11,'foo',NULL,10000
+4,10,100,1000,NULL,4,'test',true,1111.11,'foo',NULL,10000
+5,5,5,5,5,5,'row',false,55555.55,'row',NULL,10000
 ---- TYPES
-INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL,INT,INT
+INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL,STRING,INT,INT
 ====
 ---- QUERY
-insert into tbl_with_defaults values (6,6,6,6,6,6,'another row',false,66666.66,6,6)
+insert into tbl_with_defaults values (6,6,6,6,6,6,'another row',false,66666.66,cast('another' as varchar(10)),6,6)
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-A, B, C, D, E, F, G, H, I, J, K
+A, B, C, D, E, F, G, H, I, J, K, L
 ---- DML_RESULTS: tbl_with_defaults
-1,10,100,1000,NULL,1,'test',true,1111.11,NULL,10000
-2,10,100,1000,NULL,2,'test',true,1111.11,NULL,10000
-3,10,100,1000,NULL,3,'test',true,1111.11,NULL,10000
-4,10,100,1000,NULL,4,'test',true,1111.11,NULL,10000
-5,5,5,5,5,5,'row',false,55555.55,NULL,10000
-6,6,6,6,6,6,'another row',false,66666.66,6,6
+1,10,100,1000,NULL,1,'test',true,1111.11,'foo',NULL,10000
+2,10,100,1000,NULL,2,'test',true,1111.11,'foo',NULL,10000
+3,10,100,1000,NULL,3,'test',true,1111.11,'foo',NULL,10000
+4,10,100,1000,NULL,4,'test',true,1111.11,'foo',NULL,10000
+5,5,5,5,5,5,'row',false,55555.55,'row',NULL,10000
+6,6,6,6,6,6,'another row',false,66666.66,'another',6,6
 ---- TYPES
-INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL,INT,INT
+INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL,STRING,INT,INT
 ====
 ---- QUERY
 # IMPALA-5217: Try to insert NULL to a 'NOT NULL' col with a target col list that leaves
@@ -422,17 +423,37 @@ insert into tbl_with_defaults (a, b, d, f) values (0, 0, null, 0)
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-A, B, C, D, E, F, G, H, I, J, K
+A, B, C, D, E, F, G, H, I, J, K, L
 ---- DML_RESULTS: tbl_with_defaults
-0,0,100,NULL,NULL,0,'test',true,1111.11,NULL,10000
-1,10,100,1000,NULL,1,'test',true,1111.11,NULL,10000
-2,10,100,1000,NULL,2,'test',true,1111.11,NULL,10000
-3,10,100,1000,NULL,3,'test',true,1111.11,NULL,10000
-4,10,100,1000,NULL,4,'test',true,1111.11,NULL,10000
-5,5,5,5,5,5,'row',false,55555.55,NULL,10000
-6,6,6,6,6,6,'another row',false,66666.66,6,6
+0,0,100,NULL,NULL,0,'test',true,1111.11,'foo',NULL,10000
+1,10,100,1000,NULL,1,'test',true,1111.11,'foo',NULL,10000
+2,10,100,1000,NULL,2,'test',true,1111.11,'foo',NULL,10000
+3,10,100,1000,NULL,3,'test',true,1111.11,'foo',NULL,10000
+4,10,100,1000,NULL,4,'test',true,1111.11,'foo',NULL,10000
+5,5,5,5,5,5,'row',false,55555.55,'row',NULL,10000
+6,6,6,6,6,6,'another row',false,66666.66,'another',6,6
 ---- TYPES
-INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL,INT,INT
+INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL,STRING,INT,INT
+====
+---- QUERY
+# Test VARCHAR truncation
+insert into tbl_with_defaults values (7,7,7,7,7,7,'another row',false,77777.77,cast('sevensevensevenseven' as varchar(10)),7,7)
+---- RUNTIME_PROFILE
+NumModifiedRows: 1
+NumRowErrors: 0
+---- LABELS
+A, B, C, D, E, F, G, H, I, J, K, L
+---- DML_RESULTS: tbl_with_defaults
+0,0,100,NULL,NULL,0,'test',true,1111.11,'foo',NULL,10000
+1,10,100,1000,NULL,1,'test',true,1111.11,'foo',NULL,10000
+2,10,100,1000,NULL,2,'test',true,1111.11,'foo',NULL,10000
+3,10,100,1000,NULL,3,'test',true,1111.11,'foo',NULL,10000
+4,10,100,1000,NULL,4,'test',true,1111.11,'foo',NULL,10000
+5,5,5,5,5,5,'row',false,55555.55,'row',NULL,10000
+6,6,6,6,6,6,'another row',false,66666.66,'another',6,6
+7,7,7,7,7,7,'another row',false,77777.77,'sevenseven',7,7
+---- TYPES
+INT,INT,INT,INT,INT,INT,STRING,BOOLEAN,DECIMAL,STRING,INT,INT
 ====
 ---- QUERY
 create table multiple_partition_cols (x bigint, y bigint, z string, primary key(x, y))
diff --git a/testdata/workloads/functional-query/queries/QueryTest/kudu_update.test b/testdata/workloads/functional-query/queries/QueryTest/kudu_update.test
index 91c571a..fb91008 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/kudu_update.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/kudu_update.test
@@ -4,7 +4,7 @@ create table tdata
   (id int primary key, name string null, valf float null, vali bigint null,
    valv string null, valb boolean null, valt tinyint null, vals smallint null,
    vald double null, valdec4 decimal(9,9) null, valdec8 decimal(18,2) null,
-   valdec16 decimal(38, 0) null, valdate date null)
+   valdec16 decimal(38, 0) null, valdate date null, valvc varchar(10) null)
   PARTITION BY RANGE (PARTITION VALUES < 10, PARTITION 10 <= VALUES < 30,
   PARTITION 30 <= VALUES <= 10000) STORED AS KUDU
 ---- RESULTS
@@ -12,11 +12,11 @@ create table tdata
 ====
 ---- QUERY
 insert into tdata values
-(1, "martin", 1.0, 232232323, cast('a' as string), true, 1, 2, 3, 0.000000001, 2.22, 3, DATE '1970-01-01'),
-(2, "david", cast(1.0 as float), 99398493939, cast('b' as string), false, 4, 5, 6, 0.000000004, 5.55, 6, DATE '1970-01-02'),
-(3, "todd", cast(1.0 as float), 993393939, "c", true, 7, 8, 9, 0.000000007, 8.88, 9,DATE '1970-01-03'),
-(40, "he", cast(0.0 as float), 43, cast('e' as string), false, 50, 60, 70, 0.000000050, 66.60, 70, DATE '1970-01-04'),
-(120, "she", cast(0.0 as float), 99, cast('f' as string), true, -1, 0, 1, -0.000000001, 0.00, 1, DATE '1970-01-05')
+(1, "martin", 1.0, 232232323, cast('a' as string), true, 1, 2, 3, 0.000000001, 2.22, 3, DATE '1970-01-01', cast('martin' as varchar(10))),
+(2, "david", cast(1.0 as float), 99398493939, cast('b' as string), false, 4, 5, 6, 0.000000004, 5.55, 6, DATE '1970-01-02', cast('david' as varchar(10))),
+(3, "todd", cast(1.0 as float), 993393939, "c", true, 7, 8, 9, 0.000000007, 8.88, 9,DATE '1970-01-03', cast('todd' as varchar(10))),
+(40, "he", cast(0.0 as float), 43, cast('e' as string), false, 50, 60, 70, 0.000000050, 66.60, 70, DATE '1970-01-04', cast('he' as varchar(10))),
+(120, "she", cast(0.0 as float), 99, cast('f' as string), true, -1, 0, 1, -0.000000001, 0.00, 1, DATE '1970-01-05', cast('she' as varchar(10)))
 ---- RESULTS
 : 5
 ---- RUNTIME_PROFILE
@@ -32,15 +32,15 @@ update tdata set vali=43 where id = 1
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'martin',1.0,43,'a',true,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,99,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05
+1,'martin',1.0,43,'a',true,1,2,3,0.000000001,2.22,3,1970-01-01,'martin'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,99,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # single row, equality on key, string
@@ -51,15 +51,15 @@ update tdata set valv=cast('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as varchar(20)) wh
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',true,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,99,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05
+1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',true,1,2,3,0.000000001,2.22,3,1970-01-01,'martin'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,99,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # single row, equality on key, boolean
@@ -68,49 +68,49 @@ update tdata set valb=false where id = 1
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,99,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05
+1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'martin'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,99,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # single row, equality on key, set to NULL
-update tdata set name=null where id = 40
+update tdata set name=null, valvc=null where id = 40
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03
-40,'NULL',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,99,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05
+1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'martin'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03,'todd'
+40,'NULL',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'NULL'
+120,'she',0.0,99,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # single row, equlity on key, set from NULL
-update tdata set name='he' where id = 40
+update tdata set name='he', valvc=cast('he' as varchar(10)) where id = 40
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,99,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05
+1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'martin'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,99,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # single row, equality on key, boundary value
@@ -119,15 +119,15 @@ update tdata set vali = max_bigint() where id = 120
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05
+1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'martin'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # single row, inequality on key, float
@@ -136,15 +136,15 @@ update tdata set valf = -1 where id > 2 and id < 4
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',-1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05
+1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'martin'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',-1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',true,-1,0,1,-0.000000001,0.00,1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # single row, inequality on key, tinyint
@@ -153,32 +153,32 @@ update tdata set valt = 10 where id > 100
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',-1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',true,10,0,1,-0.000000001,0.00,1,1970-01-05
+1,'martin',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'martin'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',-1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',true,10,0,1,-0.000000001,0.00,1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # single row, equality on non-key, string
-update tdata set name='unknown' where name = 'martin'
+update tdata set name='unknown', valvc=cast('unknown' as varchar(10)) where name = 'martin'
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'unknown',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',-1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',true,10,0,1,-0.000000001,0.00,1,1970-01-05
+1,'unknown',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'unknown'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',-1.0,993393939,'c',true,7,8,9,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',true,10,0,1,-0.000000001,0.00,1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # single row, inequality on non-key, double
@@ -187,15 +187,15 @@ update tdata set vald = 0 where valf < 0
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'unknown',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',-1.0,993393939,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',true,10,0,1,-0.000000001,0.00,1,1970-01-05
+1,'unknown',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'unknown'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',-1.0,993393939,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',true,10,0,1,-0.000000001,0.00,1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # single row, inequality on non-key, decimal
@@ -204,15 +204,15 @@ update tdata set valdec4 = 0.000000001, valdec16 = -1 where valdec4 < 0
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'unknown',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',-1.0,993393939,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',true,10,0,1,0.000000001,0.00,-1,1970-01-05
+1,'unknown',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'unknown'
+2,'david',1.0,99398493939,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',-1.0,993393939,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',true,10,0,1,0.000000001,0.00,-1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # multiple rows, predicate on key
@@ -221,15 +221,15 @@ update tdata set vali=43 where id > 1 and id < 10
 NumModifiedRows: 2
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'unknown',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',true,10,0,1,0.000000001,0.00,-1,1970-01-05
+1,'unknown',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'unknown'
+2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',true,10,0,1,0.000000001,0.00,-1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # multiple rows, predicate on non-key
@@ -238,32 +238,32 @@ update tdata set valb=false where name LIKE '%he'
 NumModifiedRows: 2
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'unknown',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05
+1,'unknown',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'unknown'
+2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # update the same row multiple times: cross join produces 5 identical updates
-update a set a.name='they' from tdata a, tdata b where a.id = 1
+update a set a.name='they', a.valvc=cast('they' as varchar(10)) from tdata a, tdata b where a.id = 1
 ---- RUNTIME_PROFILE
 NumModifiedRows: 5
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'they',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05
+1,'they',1.0,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'they'
+2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # value of update is a constant expression
@@ -272,32 +272,32 @@ update tdata set valf = 1 + 2 where id = 1
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'they',3,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'todd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05
+1,'they',3,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'they'
+2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'todd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03,'todd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # value of update is a non-constant expression
-update tdata set name = concat(name, name) where id % 2 = 1
+update tdata set name = concat(name, name), valvc = cast(concat(valvc, valvc) as varchar(10)) where id % 2 = 1
 ---- RUNTIME_PROFILE
 NumModifiedRows: 2
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'theythey',3,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'toddtodd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05
+1,'theythey',3,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'theythey'
+2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'toddtodd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03,'toddtodd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # error - update key column
@@ -312,15 +312,15 @@ update tdata set name = 'none' where id = 10
 NumModifiedRows: 0
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'theythey',3,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'toddtodd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05
+1,'theythey',3,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'theythey'
+2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'toddtodd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03,'toddtodd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # Try to update a row with a primary key value that is not covered by the existing range
@@ -330,20 +330,20 @@ update tdata set vali = 10 where id = 10001
 NumModifiedRows: 0
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC4, VALDEC8, VALDEC16, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-1,'theythey',3,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01
-2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02
-3,'toddtodd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03
-40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04
-120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05
+1,'theythey',3,43,'aaaaaaaaaaaaaaaaaaaa',false,1,2,3,0.000000001,2.22,3,1970-01-01,'theythey'
+2,'david',1.0,43,'b',false,4,5,6,0.000000004,5.55,6,1970-01-02,'david'
+3,'toddtodd',-1.0,43,'c',true,7,8,0,0.000000007,8.88,9,1970-01-03,'toddtodd'
+40,'he',0.0,43,'e',false,50,60,70,0.000000050,66.60,70,1970-01-04,'he'
+120,'she',0.0,9223372036854775807,'f',false,10,0,1,0.000000001,0.00,-1,1970-01-05,'she'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DECIMAL,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 insert into tdata
 select id, string_col, float_col, bigint_col, string_col, bool_col, tinyint_col,
-smallint_col, double_col, NULL, NULL, NULL, NULL from functional_kudu.alltypes
+smallint_col, double_col, NULL, NULL, NULL, NULL, NULL from functional_kudu.alltypes
 ---- RESULTS
 : 7295
 ---- RUNTIME_PROFILE
diff --git a/testdata/workloads/functional-query/queries/QueryTest/kudu_upsert.test b/testdata/workloads/functional-query/queries/QueryTest/kudu_upsert.test
index 1a26eea..dd790cf 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/kudu_upsert.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/kudu_upsert.test
@@ -3,7 +3,7 @@
 create table tdata
   (id int primary key, name string null, valf float null, vali bigint null,
    valv string null, valb boolean null, valt tinyint null, vals smallint null,
-   vald double null, valdec decimal(9, 0) null, valdate date null)
+   vald double null, valdec decimal(9, 0) null, valdate date null, valvc varchar(10) null)
   PARTITION BY RANGE (PARTITION VALUES < 10, PARTITION 10 <= VALUES < 30,
   PARTITION 30 <= VALUES) STORED AS KUDU
 ---- RESULTS
@@ -11,286 +11,286 @@ create table tdata
 ====
 ---- QUERY
 insert into table tdata values
-(40,'he',0,43,'e',false,35,36,1.2,37,DATE '1970-01-05'),
-(1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,DATE '1970-01-01'),
-(2,'david',1,43,'b',false,0,0,0,0,DATE '1970-01-02'),
-(3,'todd',1,43,'c',true,3,3,3,3,DATE '1970-01-03')
+(40,'he',0,43,'e',false,35,36,1.2,37,DATE '1970-01-05',cast('he' as varchar(10))),
+(1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,DATE '1970-01-01',cast('unknown' as varchar(10))),
+(2,'david',1,43,'b',false,0,0,0,0,DATE '1970-01-02',cast('david' as varchar(10))),
+(3,'todd',1,43,'c',true,3,3,3,3,DATE '1970-01-03',cast('todd' as varchar(10)))
 ---- RESULTS
 : 4
 ====
 ---- QUERY
 # VALUES, single row, all cols, results in insert
-upsert into table tdata values (4, 'a', 0, 1, 'b', false, 1, 2, 1.5, 4,DATE '1970-01-04')
+upsert into table tdata values (4, 'a', 0, 1, 'b', false, 1, 2, 1.5, 4,DATE '1970-01-04', cast('a' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01
-2,'david',1,43,'b',false,0,0,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'a',0,1,'b',false,1,2,1.5,4,1970-01-04
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01,'unknown'
+2,'david',1,43,'b',false,0,0,0,0,1970-01-02,'david'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'a',0,1,'b',false,1,2,1.5,4,1970-01-04,'a'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, all cols, results in update
-upsert into table tdata values (4, 'b', -1, 1, 'a', true, 2, 3, 2.5, 5, DATE '1970-01-04')
+upsert into table tdata values (4, 'b', -1, 1, 'a', true, 2, 3, 2.5, 5, DATE '1970-01-04', cast('b' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01
-2,'david',1,43,'b',false,0,0,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'b',-1,1,'a',true,2,3,2.5,5,1970-01-04
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01,'unknown'
+2,'david',1,43,'b',false,0,0,0,0,1970-01-02,'david'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'b',-1,1,'a',true,2,3,2.5,5,1970-01-04,'b'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, all cols, insert NULL all types
-upsert into table tdata values (10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
+upsert into table tdata values (10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01
-2,'david',1,43,'b',false,0,0,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'b',-1,1,'a',true,2,3,2.5,5,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01,'unknown'
+2,'david',1,43,'b',false,0,0,0,0,1970-01-02,'david'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'b',-1,1,'a',true,2,3,2.5,5,1970-01-04,'b'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, all cols, update NULL all types
-upsert into table tdata values (4, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
+upsert into table tdata values (4, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01
-2,'david',1,43,'b',false,0,0,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01,'unknown'
+2,'david',1,43,'b',false,0,0,0,0,1970-01-02,'david'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, all cols, update from NULL all types
-upsert into table tdata values (4, 'four', 5, 6, 'f', true, 7, 8, 7.5, 9, DATE '1970-01-04')
+upsert into table tdata values (4, 'four', 5, 6, 'f', true, 7, 8, 7.5, 9, DATE '1970-01-04', cast('four' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01
-2,'david',1,43,'b',false,0,0,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01,'unknown'
+2,'david',1,43,'b',false,0,0,0,0,1970-01-02,'david'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04,'four'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, all cols, insert boundary values
 upsert into table tdata values
 (max_int(), '', cast('nan' as float), min_bigint(), '', true, max_tinyint(),
-  min_smallint(), cast('inf' as double), cast(999999999 as decimal(9, 0)), DATE '9999-12-31')
+  min_smallint(), cast('inf' as double), cast(999999999 as decimal(9, 0)), DATE '9999-12-31', cast('' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01
-2,'david',1,43,'b',false,0,0,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',NaN,-9223372036854775808,'',true,127,-32768,Infinity,999999999,9999-12-31
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01,'unknown'
+2,'david',1,43,'b',false,0,0,0,0,1970-01-02,'david'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04,'four'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',NaN,-9223372036854775808,'',true,127,-32768,Infinity,999999999,9999-12-31,''
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, all cols, update boundary values
 upsert into table tdata values
 (max_int(), '', cast('-inf' as float), max_bigint(), '', true, min_tinyint(),
-  max_smallint(), cast('nan' as double), cast(-999999999 as decimal(9, 0)), DATE '0001-01-01')
+  max_smallint(), cast('nan' as double), cast(-999999999 as decimal(9, 0)), DATE '0001-01-01', cast('' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01
-2,'david',1,43,'b',false,0,0,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01,'unknown'
+2,'david',1,43,'b',false,0,0,0,0,1970-01-02,'david'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04,'four'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01,''
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, subset of cols, results in insert
-upsert into table tdata (id, name, vali, valb, vald) values (5, 'five', -5, NULL, 0.5)
+upsert into table tdata (id, name, vali, valb, vald, valvc) values (5, 'five', -5, NULL, 0.5, cast('five' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01
-2,'david',1,43,'b',false,0,0,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01
-5,'five',NULL,-5,'NULL',NULL,NULL,NULL,0.5,NULL,NULL
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01,'unknown'
+2,'david',1,43,'b',false,0,0,0,0,1970-01-02,'david'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04,'four'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01,''
+5,'five',NULL,-5,'NULL',NULL,NULL,NULL,0.5,NULL,NULL,'five'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, subset of cols, results in update
-upsert into table tdata (id, name, valf, valv, valb) values (5, NULL, 0, 'six', false)
+upsert into table tdata (id, name, valf, valv, valb, valvc) values (5, NULL, 0, 'six', false, NULL)
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01
-2,'david',1,43,'b',false,0,0,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01
-5,'NULL',0,-5,'six',false,NULL,NULL,0.5,NULL,NULL
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'unknown',1,43,'aaaaaaaaaaaaaaaaaaaa',false,-1,-2,0,-3,1970-01-01,'unknown'
+2,'david',1,43,'b',false,0,0,0,0,1970-01-02,'david'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04,'four'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01,''
+5,'NULL',0,-5,'six',false,NULL,NULL,0.5,NULL,NULL,'NULL'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, multiple rows, all cols, no errors
 upsert into table tdata values
-(1, 'one', NULL, 44, 'a', true, -1, -2, 0, 0, DATE '1970-01-01'),
-(6, '', -6, 40, 'b', NULL, 0, 0, 10, 11, DATE '1970-01-06'),
-(7, 'seven', 0, min_bigint(), NULL, true, 7, 1, 2, 3, DATE '1970-01-07'),
-(2, 'you', cast('inf' as float), 0, 't', false, NULL, min_smallint(), 0, 0, DATE '1970-01-02')
+(1, 'one', NULL, 44, 'a', true, -1, -2, 0, 0, DATE '1970-01-01', cast('one' as varchar(10))),
+(6, '', -6, 40, 'b', NULL, 0, 0, 10, 11, DATE '1970-01-06', cast('' as varchar(10))),
+(7, 'seven', 0, min_bigint(), NULL, true, 7, 1, 2, 3, DATE '1970-01-07', cast('seven' as varchar(10))),
+(2, 'you', cast('inf' as float), 0, 't', false, NULL, min_smallint(), 0, 0, DATE '1970-01-02', cast('you' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 4
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'one',NULL,44,'a',true,-1,-2,0,0,1970-01-01
-2,'you',Infinity,0,'t',false,NULL,-32768,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01
-5,'NULL',0,-5,'six',false,NULL,NULL,0.5,NULL,NULL
-6,'',-6,40,'b',NULL,0,0,10,11,1970-01-06
-7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'one',NULL,44,'a',true,-1,-2,0,0,1970-01-01,'one'
+2,'you',Infinity,0,'t',false,NULL,-32768,0,0,1970-01-02,'you'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04,'four'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01,''
+5,'NULL',0,-5,'six',false,NULL,NULL,0.5,NULL,NULL,'NULL'
+6,'',-6,40,'b',NULL,0,0,10,11,1970-01-06,''
+7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07,'seven'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, multiple rows, subset of cols, no errors
-upsert into table tdata (id, valb, name, vali) values
-(1, true, NULL, 1),
-(8, false, 'hello', 2),
-(5, NULL, 'five', 10),
-(9, true, 'nine', 9)
+upsert into table tdata (id, valb, name, vali, valvc) values
+(1, true, NULL, 1, NULL),
+(8, false, 'hello', 2, cast('hello' as varchar(10))),
+(5, NULL, 'five', 10, cast('five' as varchar(10))),
+(9, true, 'nine', 9, cast('nine' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 4
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'NULL',NULL,1,'a',true,-1,-2,0,0,1970-01-01
-2,'you',Infinity,0,'t',false,NULL,-32768,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01
-5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL
-6,'',-6,40,'b',NULL,0,0,10,11,1970-01-06
-7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07
-8,'hello',NULL,2,'NULL',false,NULL,NULL,NULL,NULL,NULL
-9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'NULL',NULL,1,'a',true,-1,-2,0,0,1970-01-01,'NULL'
+2,'you',Infinity,0,'t',false,NULL,-32768,0,0,1970-01-02,'you'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04,'four'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01,''
+5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL,'five'
+6,'',-6,40,'b',NULL,0,0,10,11,1970-01-06,''
+7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07,'seven'
+8,'hello',NULL,2,'NULL',false,NULL,NULL,NULL,NULL,NULL,'hello'
+9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL,'nine'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # SELECT, all cols, single row, no errors
 upsert into table tdata
-select id, 'a', valf, vali, valv, NULL, valt, vals, 3, valdec, valdate from tdata where id = 1
+select id, 'a', valf, vali, valv, NULL, valt, vals, 3, valdec, valdate, cast('a' as varchar(10)) from tdata where id = 1
 ---- RUNTIME_PROFILE
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05
-1,'a',NULL,1,'a',NULL,-1,-2,3,0,1970-01-01
-2,'you',Infinity,0,'t',false,NULL,-32768,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01
-5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL
-6,'',-6,40,'b',NULL,0,0,10,11,1970-01-06
-7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07
-8,'hello',NULL,2,'NULL',false,NULL,NULL,NULL,NULL,NULL
-9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL
+40,'he',0,43,'e',false,35,36,1.2,37,1970-01-05,'he'
+1,'a',NULL,1,'a',NULL,-1,-2,3,0,1970-01-01,'a'
+2,'you',Infinity,0,'t',false,NULL,-32768,0,0,1970-01-02,'you'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'four',5,6,'f',true,7,8,7.5,9,1970-01-04,'four'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01,''
+5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL,'five'
+6,'',-6,40,'b',NULL,0,0,10,11,1970-01-06,''
+7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07,'seven'
+8,'hello',NULL,2,'NULL',false,NULL,NULL,NULL,NULL,NULL,'hello'
+9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL,'nine'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # SELECT, all cols, multiple rows, no errors
 upsert into table tdata
-select id, valv, valf, vali, name, valb, valt, vals, vald, valdec, valdate from tdata where id % 2 = 0
+select id, valv, valf, vali, name, valb, valt, vals, vald, valdec, valdate, cast(valv as varchar(10)) from tdata where id % 2 = 0
 ---- RUNTIME_PROFILE
 NumModifiedRows: 6
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'e',0,43,'he',false,35,36,1.2,37,1970-01-05
-1,'a',NULL,1,'a',NULL,-1,-2,3,0,1970-01-01
-2,'t',Infinity,0,'you',false,NULL,-32768,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'f',5,6,'four',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01
-5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL
-6,'b',-6,40,'',NULL,0,0,10,11,1970-01-06
-7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07
-8,'NULL',NULL,2,'hello',false,NULL,NULL,NULL,NULL,NULL
-9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL
+40,'e',0,43,'he',false,35,36,1.2,37,1970-01-05,'e'
+1,'a',NULL,1,'a',NULL,-1,-2,3,0,1970-01-01,'a'
+2,'t',Infinity,0,'you',false,NULL,-32768,0,0,1970-01-02,'t'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'f',5,6,'four',true,7,8,7.5,9,1970-01-04,'f'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01,''
+5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL,'five'
+6,'b',-6,40,'',NULL,0,0,10,11,1970-01-06,'b'
+7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07,'seven'
+8,'NULL',NULL,2,'hello',false,NULL,NULL,NULL,NULL,NULL,'NULL'
+9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL,'nine'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # SELECT, subset of cols, single row, no errors
@@ -300,49 +300,49 @@ select int_col, string_col, bigint_col from functional.alltypes where id = 0
 NumModifiedRows: 1
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'e',0,43,'he',false,35,36,1.2,37,1970-01-05
-1,'a',NULL,1,'a',NULL,-1,-2,3,0,1970-01-01
-2,'t',Infinity,0,'you',false,NULL,-32768,0,0,1970-01-02
-3,'todd',1,43,'c',true,3,3,3,3,1970-01-03
-4,'f',5,6,'four',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01
-5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL
-6,'b',-6,40,'',NULL,0,0,10,11,1970-01-06
-7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07
-8,'NULL',NULL,2,'hello',false,NULL,NULL,NULL,NULL,NULL
-9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL
-0,'NULL',NULL,0,'0',NULL,NULL,NULL,NULL,NULL,NULL
+40,'e',0,43,'he',false,35,36,1.2,37,1970-01-05,'e'
+1,'a',NULL,1,'a',NULL,-1,-2,3,0,1970-01-01,'a'
+2,'t',Infinity,0,'you',false,NULL,-32768,0,0,1970-01-02,'t'
+3,'todd',1,43,'c',true,3,3,3,3,1970-01-03,'todd'
+4,'f',5,6,'four',true,7,8,7.5,9,1970-01-04,'f'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01,''
+5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL,'five'
+6,'b',-6,40,'',NULL,0,0,10,11,1970-01-06,'b'
+7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07,'seven'
+8,'NULL',NULL,2,'hello',false,NULL,NULL,NULL,NULL,NULL,'NULL'
+9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL,'nine'
+0,'NULL',NULL,0,'0',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # SELECT, subset of cols, multiple rows, no errors
-upsert into table tdata (id, valb, name, valt)
-select int_col, bool_col, string_col, tinyint_col from functional.alltypes where id < 4
+upsert into table tdata (id, valb, name, valt, valvc)
+select int_col, bool_col, string_col, tinyint_col, cast(string_col as varchar(10)) from functional.alltypes where id < 4
 ---- RUNTIME_PROFILE
 NumModifiedRows: 4
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'e',0,43,'he',false,35,36,1.2,37,1970-01-05
-1,'1',NULL,1,'a',false,1,-2,3,0,1970-01-01
-2,'2',Infinity,0,'you',true,2,-32768,0,0,1970-01-02
-3,'3',1,43,'c',false,3,3,3,3,1970-01-03
-4,'f',5,6,'four',true,7,8,7.5,9,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01
-5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL
-6,'b',-6,40,'',NULL,0,0,10,11,1970-01-06
-7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07
-8,'NULL',NULL,2,'hello',false,NULL,NULL,NULL,NULL,NULL
-9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL
-0,'0',NULL,0,'0',true,0,NULL,NULL,NULL,NULL
+40,'e',0,43,'he',false,35,36,1.2,37,1970-01-05,'e'
+1,'1',NULL,1,'a',false,1,-2,3,0,1970-01-01,'1'
+2,'2',Infinity,0,'you',true,2,-32768,0,0,1970-01-02,'2'
+3,'3',1,43,'c',false,3,3,3,3,1970-01-03,'3'
+4,'f',5,6,'four',true,7,8,7.5,9,1970-01-04,'f'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01,''
+5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL,'five'
+6,'b',-6,40,'',NULL,0,0,10,11,1970-01-06,'b'
+7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,3,1970-01-07,'seven'
+8,'NULL',NULL,2,'hello',false,NULL,NULL,NULL,NULL,NULL,'NULL'
+9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL,'nine'
+0,'0',NULL,0,'0',true,0,NULL,NULL,NULL,NULL,'0'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # SELECT, decimal column, multiple rows, no errors
@@ -352,27 +352,27 @@ select id, cast((valdec * 2) as decimal(9,0)) from tdata where valdec > 0
 NumModifiedRows: 5
 NumRowErrors: 0
 ---- LABELS
-ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE
+ID, NAME, VALF, VALI, VALV, VALB, VALT, VALS, VALD, VALDEC, VALDATE, VALVC
 ---- DML_RESULTS: tdata
-40,'e',0,43,'he',false,35,36,1.2,74,1970-01-05
-1,'1',NULL,1,'a',false,1,-2,3,0,1970-01-01
-2,'2',Infinity,0,'you',true,2,-32768,0,0,1970-01-02
-3,'3',1,43,'c',false,3,3,3,6,1970-01-03
-4,'f',5,6,'four',true,7,8,7.5,18,1970-01-04
-10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL
-2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01
-5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL
-6,'b',-6,40,'',NULL,0,0,10,22,1970-01-06
-7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,6,1970-01-07
-8,'NULL',NULL,2,'hello',false,NULL,NULL,NULL,NULL,NULL
-9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL
-0,'0',NULL,0,'0',true,0,NULL,NULL,NULL,NULL
+40,'e',0,43,'he',false,35,36,1.2,74,1970-01-05,'e'
+1,'1',NULL,1,'a',false,1,-2,3,0,1970-01-01,'1'
+2,'2',Infinity,0,'you',true,2,-32768,0,0,1970-01-02,'2'
+3,'3',1,43,'c',false,3,3,3,6,1970-01-03,'3'
+4,'f',5,6,'four',true,7,8,7.5,18,1970-01-04,'f'
+10,'NULL',NULL,NULL,'NULL',NULL,NULL,NULL,NULL,NULL,NULL,'NULL'
+2147483647,'',-Infinity,9223372036854775807,'',true,-128,32767,NaN,-999999999,0001-01-01,''
+5,'five',0,10,'six',NULL,NULL,NULL,0.5,NULL,NULL,'five'
+6,'b',-6,40,'',NULL,0,0,10,22,1970-01-06,'b'
+7,'seven',0,-9223372036854775808,'NULL',true,7,1,2,6,1970-01-07,'seven'
+8,'NULL',NULL,2,'hello',false,NULL,NULL,NULL,NULL,NULL,'NULL'
+9,'nine',NULL,9,'NULL',true,NULL,NULL,NULL,NULL,NULL,'nine'
+0,'0',NULL,0,'0',true,0,NULL,NULL,NULL,NULL,'0'
 ---- TYPES
-INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE
+INT,STRING,FLOAT,BIGINT,STRING,BOOLEAN,TINYINT,SMALLINT,DOUBLE,DECIMAL,DATE,STRING
 ====
 ---- QUERY
 # VALUES, single row, all cols, null for non-nullable column
-upsert into table tdata values (null, '', 0, 0, cast('' as VARCHAR(20)), false, 0, 0, 0, null, null)
+upsert into table tdata values (null, '', 0, 0, cast('' as VARCHAR(20)), false, 0, 0, 0, null, null, cast('' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 0
 NumRowErrors: 1
@@ -387,10 +387,10 @@ NumRowErrors: 1
 ---- QUERY
 # VALUES, multiple rows, all cols, null for non-nullable column
 upsert into table tdata values
-(3,'todd',1,43,'c',true,3,3,3,null,null),
-(4,'four',5,6,'f',true,7,8,7.5,null,null),
-(6,'',-6,40,'b',NULL,0,0,10,null,null),
-(NULL,'seven',0,0,'NULL',true,7,1,2,null,null)
+(3,'todd',1,43,'c',true,3,3,3,null,null,cast('todd' as varchar(10))),
+(4,'four',5,6,'f',true,7,8,7.5,null,null,cast('four' as varchar(10))),
+(6,'',-6,40,'b',NULL,0,0,10,null,null,cast('' as varchar(10))),
+(NULL,'seven',0,0,'NULL',true,7,1,2,null,null,cast('seven' as varchar(10)))
 ---- RUNTIME_PROFILE
 NumModifiedRows: 3
 NumRowErrors: 1
@@ -407,8 +407,9 @@ NumRowErrors: 1
 ====
 ---- QUERY
 # high cardinality
-upsert into table tdata (id, valb, name, valt)
-select int_col, bool_col, string_col, tinyint_col from functional.alltypes limit 100
+upsert into table tdata (id, valb, name, valt, valvc)
+select int_col, bool_col, string_col, tinyint_col, cast(string_col as varchar(10))
+from functional.alltypes limit 100
 ---- RUNTIME_PROFILE
 NumModifiedRows: 100
 NumRowErrors: 0
diff --git a/tests/query_test/test_kudu.py b/tests/query_test/test_kudu.py
index 7d9ab0b..67436f0 100644
--- a/tests/query_test/test_kudu.py
+++ b/tests/query_test/test_kudu.py
@@ -409,7 +409,7 @@ class TestKuduOperations(KuduTestSuite):
       pytest.skip("Only runs in exhaustive to reduce core time.")
     table_name = "%s.storage_attrs" % unique_database
     types = ['boolean', 'tinyint', 'smallint', 'int', 'bigint', 'float', 'double', \
-        'string', 'timestamp', 'decimal', 'date']
+        'string', 'timestamp', 'decimal', 'date', 'varchar(10)']
     cursor.execute("set kudu_read_mode=READ_AT_SNAPSHOT")
     create_query = "create table %s (id int primary key" % table_name
     for t in types:
@@ -431,7 +431,7 @@ class TestKuduOperations(KuduTestSuite):
             assert "encoding %s not supported for type" % e in str(err)
         cursor.execute("""insert into %s values (%s, true, 0, 0, 0, 0, 0, 0, '0',
             cast('2009-01-01' as timestamp), cast(0 as decimal),
-            cast('2010-01-01' as date))""" % (table_name, i))
+            cast('2010-01-01' as date), cast('' as varchar(10)))""" % (table_name, i))
         cursor.execute("select * from %s where id = %s" % (table_name, i))
         assert cursor.fetchall() == \
             [(i, True, 0, 0, 0, 0, 0.0, 0.0, '0', datetime(2009, 1, 1, 0, 0), 0,