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

stigahuang 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 a5f6c26  IMPALA-2536: Make ColumnType constructor explicit
a5f6c26 is described below

commit a5f6c26044420498ea2e23f143dbef27243f2364
Author: Tim Armstrong <[email protected]>
AuthorDate: Sun Dec 27 23:10:12 2020 -0800

    IMPALA-2536: Make ColumnType constructor explicit
    
    This avoids accidental implicit type conversions from
    the PrimitiveType enum, or worse, integer values via
    the enum.
    
    Testing:
    Ran core tests.
    
    Change-Id: I2fe1d5da051c10904605328607bea78565356ef3
    Reviewed-on: http://gerrit.cloudera.org:8080/16906
    Reviewed-by: Wenzhe Zhou <[email protected]>
    Reviewed-by: Quanlong Huang <[email protected]>
    Tested-by: Impala Public Jenkins <[email protected]>
---
 be/src/benchmarks/hash-benchmark.cc          |   2 +-
 be/src/codegen/llvm-codegen-test.cc          |   2 +-
 be/src/exec/grouping-aggregator.cc           |   2 +-
 be/src/exec/hash-table-test.cc               |   6 +-
 be/src/exec/hash-table.cc                    |   2 +-
 be/src/exec/hdfs-scanner.cc                  |   3 +-
 be/src/exprs/case-expr.cc                    |   3 +-
 be/src/exprs/compound-predicates.cc          |   6 +-
 be/src/exprs/expr-test.cc                    | 192 +++++++++++++++------------
 be/src/exprs/is-not-empty-predicate.cc       |   8 +-
 be/src/exprs/null-literal.h                  |   2 +-
 be/src/exprs/valid-tuple-id.cc               |   2 +-
 be/src/runtime/buffered-tuple-stream-test.cc |   4 +-
 be/src/runtime/data-stream-test.cc           |   5 +-
 be/src/runtime/date-test.cc                  |   8 +-
 be/src/runtime/krpc-data-stream-mgr.cc       |   8 +-
 be/src/runtime/raw-value-test.cc             |  87 ++++++------
 be/src/runtime/row-batch-serialize-test.cc   |  16 +--
 be/src/runtime/timestamp-test.cc             |   8 +-
 be/src/runtime/types.h                       |   2 +-
 be/src/service/hs2-util.cc                   |   7 +-
 be/src/testutil/desc-tbl-builder.h           |   4 +
 be/src/util/avro-util.cc                     |  14 +-
 be/src/util/symbols-util-test.cc             |  42 +++---
 24 files changed, 244 insertions(+), 191 deletions(-)

diff --git a/be/src/benchmarks/hash-benchmark.cc 
b/be/src/benchmarks/hash-benchmark.cc
index 75f620b..562b52f 100644
--- a/be/src/benchmarks/hash-benchmark.cc
+++ b/be/src/benchmarks/hash-benchmark.cc
@@ -442,7 +442,7 @@ llvm::Function* CodegenCrcHash(LlvmCodeGen* codegen, bool 
mixed) {
     llvm::Value* string_data =
         builder.CreateGEP(data, codegen->GetI32Constant(fixed_byte_size));
     llvm::Value* string_val = builder.CreateBitCast(string_data,
-            codegen->GetSlotPtrType(TYPE_STRING));
+            codegen->GetSlotPtrType(ColumnType(TYPE_STRING)));
     llvm::Value* str_ptr = builder.CreateStructGEP(NULL, string_val, 0);
     llvm::Value* str_len = builder.CreateStructGEP(NULL, string_val, 1);
     str_ptr = builder.CreateLoad(str_ptr);
diff --git a/be/src/codegen/llvm-codegen-test.cc 
b/be/src/codegen/llvm-codegen-test.cc
index bd5a247..466090f 100644
--- a/be/src/codegen/llvm-codegen-test.cc
+++ b/be/src/codegen/llvm-codegen-test.cc
@@ -315,7 +315,7 @@ TEST_F(LlvmCodeGenTest, ReplaceFnCall) {
 // }
 llvm::Function* CodegenStringTest(LlvmCodeGen* codegen) {
   llvm::PointerType* string_val_ptr_type =
-      codegen->GetSlotPtrType(TYPE_STRING);
+      codegen->GetSlotPtrType(ColumnType(TYPE_STRING));
   EXPECT_TRUE(string_val_ptr_type != NULL);
 
   LlvmCodeGen::FnPrototype prototype(codegen, "StringTest", 
codegen->i32_type());
diff --git a/be/src/exec/grouping-aggregator.cc 
b/be/src/exec/grouping-aggregator.cc
index b391893..93fc4ab 100644
--- a/be/src/exec/grouping-aggregator.cc
+++ b/be/src/exec/grouping-aggregator.cc
@@ -104,7 +104,7 @@ Status GroupingAggregatorConfig::Init(
     // Hack to avoid TYPE_NULL SlotRefs.
     SlotRef* build_expr = state->obj_pool()->Add(desc->type().type != 
TYPE_NULL ?
             new SlotRef(desc) :
-            new SlotRef(desc, TYPE_BOOLEAN));
+            new SlotRef(desc, ColumnType(TYPE_BOOLEAN)));
     build_exprs_.push_back(build_expr);
     // Not an entry point because all hash table callers support codegen.
     RETURN_IF_ERROR(
diff --git a/be/src/exec/hash-table-test.cc b/be/src/exec/hash-table-test.cc
index 2a0c1ec..456c0f8 100644
--- a/be/src/exec/hash-table-test.cc
+++ b/be/src/exec/hash-table-test.cc
@@ -79,14 +79,16 @@ class HashTableTest : public testing::Test {
     // Not very easy to test complex tuple layouts so this test will use the
     // simplest.  The purpose of these tests is to exercise the hash map
     // internals so a simple build/probe expr is fine.
-    ScalarExpr* build_expr = pool_.Add(new SlotRef(TYPE_INT, 1, true /* 
nullable */));
+    ScalarExpr* build_expr =
+      pool_.Add(new SlotRef(ColumnType(TYPE_INT), 1, true /* nullable */));
     ASSERT_OK(build_expr->Init(desc, true, nullptr));
     build_exprs_.push_back(build_expr);
     ASSERT_OK(ScalarExprEvaluator::Create(build_exprs_, nullptr, &pool_, 
&mem_pool_,
         &mem_pool_, &build_expr_evals_));
     ASSERT_OK(ScalarExprEvaluator::Open(build_expr_evals_, nullptr));
 
-    ScalarExpr* probe_expr = pool_.Add(new SlotRef(TYPE_INT, 1, true /* 
nullable */));
+    ScalarExpr* probe_expr =
+      pool_.Add(new SlotRef(ColumnType(TYPE_INT), 1, true /* nullable */));
     ASSERT_OK(probe_expr->Init(desc, true, nullptr));
     probe_exprs_.push_back(probe_expr);
     ASSERT_OK(ScalarExprEvaluator::Create(probe_exprs_, nullptr, &pool_, 
&mem_pool_,
diff --git a/be/src/exec/hash-table.cc b/be/src/exec/hash-table.cc
index 2e1060c..4605989 100644
--- a/be/src/exec/hash-table.cc
+++ b/be/src/exec/hash-table.cc
@@ -1056,7 +1056,7 @@ Status HashTableCtx::CodegenHashRow(LlvmCodeGen* codegen, 
bool use_murmur,
 
       // Convert expr_values_buffer_ loc to llvm value
       llvm::Value* str_val = builder.CreatePointerCast(
-          llvm_loc, codegen->GetSlotPtrType(TYPE_STRING), "str_val");
+          llvm_loc, codegen->GetSlotPtrType(ColumnType(TYPE_STRING)), 
"str_val");
 
       llvm::Value* ptr = builder.CreateStructGEP(NULL, str_val, 0);
       llvm::Value* len = builder.CreateStructGEP(NULL, str_val, 1);
diff --git a/be/src/exec/hdfs-scanner.cc b/be/src/exec/hdfs-scanner.cc
index 028957d..ec9f644 100644
--- a/be/src/exec/hdfs-scanner.cc
+++ b/be/src/exec/hdfs-scanner.cc
@@ -539,7 +539,8 @@ Status HdfsScanner::CodegenWriteCompleteTuple(const 
HdfsScanPlanNode* node,
 
       llvm::Value* conjunct_args[] = {eval, tuple_row_arg};
       CodegenAnyVal result = CodegenAnyVal::CreateCallWrapped(
-          codegen, &builder, TYPE_BOOLEAN, conjunct_fn, conjunct_args, 
"conjunct_eval");
+          codegen, &builder, ColumnType(TYPE_BOOLEAN), conjunct_fn, 
conjunct_args,
+          "conjunct_eval");
       builder.CreateCondBr(result.GetVal(), parse_block, eval_fail_block);
       builder.SetInsertPoint(parse_block);
     }
diff --git a/be/src/exprs/case-expr.cc b/be/src/exprs/case-expr.cc
index 1aa9975..4698972 100644
--- a/be/src/exprs/case-expr.cc
+++ b/be/src/exprs/case-expr.cc
@@ -57,7 +57,8 @@ Status 
CaseExpr::OpenEvaluator(FunctionContext::FunctionStateScope scope,
   }
   fn_ctx->SetFunctionState(FunctionContext::THREAD_LOCAL, case_state);
 
-  const ColumnType& case_val_type = has_case_expr_ ? GetChild(0)->type() : 
TYPE_BOOLEAN;
+  const ColumnType& case_val_type = has_case_expr_ ? GetChild(0)->type()
+                                                   : ColumnType(TYPE_BOOLEAN);
   RETURN_IF_ERROR(AllocateAnyVal(state, eval->expr_perm_pool(), case_val_type,
       "Could not allocate expression value", &case_state->case_val));
   const ColumnType& when_val_type =
diff --git a/be/src/exprs/compound-predicates.cc 
b/be/src/exprs/compound-predicates.cc
index 7b5f516..5462cdf 100644
--- a/be/src/exprs/compound-predicates.cc
+++ b/be/src/exprs/compound-predicates.cc
@@ -154,10 +154,10 @@ Status CompoundPredicate::CodegenComputeFn(
 
   // Call lhs
   CodegenAnyVal lhs_result = CodegenAnyVal::CreateCallWrapped(
-      codegen, &builder, TYPE_BOOLEAN, lhs_function, args, "lhs_call");
+      codegen, &builder, ColumnType(TYPE_BOOLEAN), lhs_function, args, 
"lhs_call");
   // Call rhs
   CodegenAnyVal rhs_result = CodegenAnyVal::CreateCallWrapped(
-      codegen, &builder, TYPE_BOOLEAN, rhs_function, args, "rhs_call");
+      codegen, &builder, ColumnType(TYPE_BOOLEAN), rhs_function, args, 
"rhs_call");
 
   llvm::Value* lhs_is_null = lhs_result.GetIsNull();
   llvm::Value* rhs_is_null = rhs_result.GetIsNull();
@@ -231,7 +231,7 @@ Status CompoundPredicate::CodegenComputeFn(
   val_phi->addIncoming(codegen->false_value(), null_block);
   val_phi->addIncoming(not_null_phi, not_null_block);
 
-  CodegenAnyVal ret(codegen, &builder, TYPE_BOOLEAN, NULL, "ret");
+  CodegenAnyVal ret(codegen, &builder, ColumnType(TYPE_BOOLEAN), NULL, "ret");
   ret.SetIsNull(is_null_phi);
   ret.SetVal(val_phi);
   builder.CreateRet(ret.GetLoweredValue());
diff --git a/be/src/exprs/expr-test.cc b/be/src/exprs/expr-test.cc
index 024799b..58d98d0 100644
--- a/be/src/exprs/expr-test.cc
+++ b/be/src/exprs/expr-test.cc
@@ -365,7 +365,7 @@ class ExprTest : public 
testing::TestWithParam<std::tuple<bool, bool>> {
   T ConvertValue(const string& value);
 
   void TestStringValue(const string& expr, const string& expected_result) {
-    EXPECT_EQ(expected_result, GetValue(expr, TYPE_STRING)) << expr;
+    EXPECT_EQ(expected_result, GetValue(expr, ColumnType(TYPE_STRING))) << 
expr;
   }
 
   // Tests that DST of the given timezone ends at 3am
@@ -378,7 +378,7 @@ class ExprTest : public 
testing::TestWithParam<std::tuple<bool, bool>> {
   }
 
   string TestStringValueRegex(const string& expr, const string& regex) {
-    const string results = GetValue(expr, TYPE_STRING);
+    const string results = GetValue(expr, ColumnType(TYPE_STRING));
     static const boost::regex e(regex);
     const bool is_regex_match = regex_match(results, e);
     EXPECT_TRUE(is_regex_match);
@@ -591,7 +591,7 @@ class ExprTest : public 
testing::TestWithParam<std::tuple<bool, bool>> {
     } else {
       typeof_query = "typeof(" + query + ")";
     }
-    const string typeof_result = GetValue(typeof_query, TYPE_STRING);
+    const string typeof_result = GetValue(typeof_query, 
ColumnType(TYPE_STRING));
     EXPECT_EQ(expected_type.DebugString(), typeof_result) << typeof_query;
   }
 
@@ -627,6 +627,11 @@ class ExprTest : public 
testing::TestWithParam<std::tuple<bool, bool>> {
     EXPECT_EQ(result, StringParser::PARSE_SUCCESS);
   }
 
+  template <class T> void TestValue(const string& expr, PrimitiveType 
expr_type,
+                                    const T& expected_result) {
+    return TestValue(expr, ColumnType(expr_type), expected_result);
+  }
+
   template <class T> void TestValue(const string& expr, const ColumnType& 
expr_type,
                                     const T& expected_result) {
     const string result = GetValue(expr, expr_type);
@@ -655,7 +660,7 @@ class ExprTest : public 
testing::TestWithParam<std::tuple<bool, bool>> {
         float expected_float;
         expected_float = static_cast<float>(expected_result);
         RawValue::PrintValue(reinterpret_cast<const void*>(&expected_float),
-                             TYPE_FLOAT, -1, &expected_str);
+                             ColumnType(TYPE_FLOAT), -1, &expected_str);
         EXPECT_EQ(expected_str, result) << expr;
         break;
       }
@@ -664,7 +669,7 @@ class ExprTest : public 
testing::TestWithParam<std::tuple<bool, bool>> {
         double expected_double;
         expected_double = static_cast<double>(expected_result);
         RawValue::PrintValue(reinterpret_cast<const void*>(&expected_double),
-                             TYPE_DOUBLE, -1, &expected_str);
+                             ColumnType(TYPE_DOUBLE), -1, &expected_str);
         EXPECT_EQ(expected_str, result) << expr;
         break;
       }
@@ -673,16 +678,24 @@ class ExprTest : public 
testing::TestWithParam<std::tuple<bool, bool>> {
     }
   }
 
+  void TestIsNull(const string& expr, PrimitiveType expr_type) {
+    return TestIsNull(expr, ColumnType(expr_type));
+  }
+
   void TestIsNull(const string& expr, const ColumnType& expr_type) {
     EXPECT_TRUE(GetValue(expr, expr_type) == "NULL") << expr;
   }
 
+  void TestIsNotNull(const string& expr, PrimitiveType expr_type) {
+    return TestIsNotNull(expr, ColumnType(expr_type));
+  }
+
   void TestIsNotNull(const string& expr, const ColumnType& expr_type) {
     EXPECT_TRUE(GetValue(expr, expr_type) != "NULL") << expr;
   }
 
   void TestError(const string& expr) {
-    GetValue(expr, INVALID_TYPE, /* expect_error */ true);
+    GetValue(expr, ColumnType(INVALID_TYPE), /* expect_error */ true);
   }
 
   void TestNonOkStatus(const string& expr) {
@@ -1152,12 +1165,16 @@ class ExprTest : public 
testing::TestWithParam<std::tuple<bool, bool>> {
 
   // Create a Literal expression out of 'str'. Adds the returned literal to 
pool_.
   Literal* CreateLiteral(const ColumnType& type, const string& str);
+  Literal* CreateLiteral(PrimitiveType type, const string& str);
 
   // Helper function for LiteralConstruction test. Creates a Literal expression
   // of 'type' from 'str' and verifies it compares equally to 'value'.
   template <typename T>
   void TestSingleLiteralConstruction(
       const ColumnType& type, const T& value, const string& string_val);
+  template <typename T>
+  void TestSingleLiteralConstruction(
+      PrimitiveType type, const T& value, const string& string_val);
 
   // Test casting stmt to all types.  Expected result is val.
   template<typename T>
@@ -1291,20 +1308,21 @@ DateValue ExprTest::ConvertValue<DateValue>(const 
string& value) {
 // the ambiguity in TimestampValue::operator==, even with the appropriate 
casts.
 void ExprTest::TestTimestampValue(const string& expr, const TimestampValue& 
expected_result) {
   EXPECT_EQ(expected_result,
-      ConvertValue<TimestampValue>(GetValue(expr, TYPE_TIMESTAMP)));
+      ConvertValue<TimestampValue>(GetValue(expr, 
ColumnType(TYPE_TIMESTAMP))));
 }
 
 // Tests whether the returned TimestampValue is valid.
 // We use this function for tests where the expected value is unknown, e.g., 
now().
 void ExprTest::TestValidTimestampValue(const string& expr) {
   EXPECT_TRUE(
-      ConvertValue<TimestampValue>(GetValue(expr, TYPE_TIMESTAMP)).HasDate());
+      ConvertValue<TimestampValue>(GetValue(expr, 
ColumnType(TYPE_TIMESTAMP))).HasDate());
 }
 
 // We can't put this into TestValue() because GTest can't resolve
 // the ambiguity in DateValue::operator==, even with the appropriate casts.
 void ExprTest::TestDateValue(const string& expr, const DateValue& 
expected_result) {
-  EXPECT_EQ(expected_result, ConvertValue<DateValue>(GetValue(expr, 
TYPE_DATE)));
+  EXPECT_EQ(expected_result,
+      ConvertValue<DateValue>(GetValue(expr, ColumnType(TYPE_DATE))));
 }
 
 template<class T>
@@ -1391,6 +1409,9 @@ Literal* ExprTest::CreateLiteral(const ColumnType& type, 
const string& str) {
       return nullptr;
   }
 }
+Literal* ExprTest::CreateLiteral(PrimitiveType type, const string& str) {
+  return CreateLiteral(ColumnType(type), str);
+}
 
 template <typename T>
 void ExprTest::TestSingleLiteralConstruction(
@@ -1413,6 +1434,12 @@ void ExprTest::TestSingleLiteralConstruction(
   state.ReleaseResources();
 }
 
+template <typename T>
+void ExprTest::TestSingleLiteralConstruction(
+    PrimitiveType type, const T& value, const string& string_val) {
+  return TestSingleLiteralConstruction(ColumnType(type), value, string_val);
+}
+
 TEST_P(ExprTest, NullLiteral) {
   for (int type = TYPE_BOOLEAN; type != TYPE_DATE; ++type) {
     RuntimeState state(TQueryCtx(), ExecEnv::GetInstance());
@@ -1490,14 +1517,14 @@ TEST_P(ExprTest, LiteralConstruction) {
 
 
 TEST_P(ExprTest, LiteralExprs) {
-  TestFixedPointLimits<int8_t>(TYPE_TINYINT);
-  TestFixedPointLimits<int16_t>(TYPE_SMALLINT);
-  TestFixedPointLimits<int32_t>(TYPE_INT);
-  TestFixedPointLimits<int64_t>(TYPE_BIGINT);
+  TestFixedPointLimits<int8_t>(ColumnType(TYPE_TINYINT));
+  TestFixedPointLimits<int16_t>(ColumnType(TYPE_SMALLINT));
+  TestFixedPointLimits<int32_t>(ColumnType(TYPE_INT));
+  TestFixedPointLimits<int64_t>(ColumnType(TYPE_BIGINT));
   // The value is not an exact FLOAT so it gets compared as a DOUBLE
   // and fails.  This needs to be researched.
   // TestFloatingPointLimits<float>(TYPE_FLOAT);
-  TestFloatingPointLimits<double>(TYPE_DOUBLE);
+  TestFloatingPointLimits<double>(ColumnType(TYPE_DOUBLE));
 
   TestValue("true", TYPE_BOOLEAN, true);
   TestValue("false", TYPE_BOOLEAN, false);
@@ -1544,104 +1571,104 @@ TEST_P(ExprTest, EscapeStringLiteral) {
 TEST_P(ExprTest, ArithmeticExprs) {
   // Test float ops.
   TestFixedResultTypeOps<float, float, double>(min_float_values_[TYPE_FLOAT],
-      min_float_values_[TYPE_FLOAT], TYPE_DOUBLE);
+      min_float_values_[TYPE_FLOAT], ColumnType(TYPE_DOUBLE));
   TestFixedResultTypeOps<float, double, double>(min_float_values_[TYPE_FLOAT],
-      min_float_values_[TYPE_DOUBLE], TYPE_DOUBLE);
+      min_float_values_[TYPE_DOUBLE], ColumnType(TYPE_DOUBLE));
   TestFixedResultTypeOps<double, double, 
double>(min_float_values_[TYPE_DOUBLE],
-      min_float_values_[TYPE_DOUBLE], TYPE_DOUBLE);
+      min_float_values_[TYPE_DOUBLE], ColumnType(TYPE_DOUBLE));
 
   // Test behavior of float ops at max/min value boundaries.
   // The tests with float type should trivially pass, since their results are 
double.
   TestFixedResultTypeOps<float, float, double>(numeric_limits<float>::min(),
-      numeric_limits<float>::min(), TYPE_DOUBLE);
+      numeric_limits<float>::min(), ColumnType(TYPE_DOUBLE));
   TestFixedResultTypeOps<float, float, double>(numeric_limits<float>::max(),
-      numeric_limits<float>::max(), TYPE_DOUBLE);
+      numeric_limits<float>::max(), ColumnType(TYPE_DOUBLE));
   TestFixedResultTypeOps<float, float, double>(numeric_limits<float>::min(),
-      numeric_limits<float>::max(), TYPE_DOUBLE);
+      numeric_limits<float>::max(), ColumnType(TYPE_DOUBLE));
   TestFixedResultTypeOps<float, float, double>(numeric_limits<float>::max(),
-      numeric_limits<float>::min(), TYPE_DOUBLE);
+      numeric_limits<float>::min(), ColumnType(TYPE_DOUBLE));
   TestFixedResultTypeOps<double, double, double>(numeric_limits<double>::min(),
-      numeric_limits<double>::min(), TYPE_DOUBLE);
+      numeric_limits<double>::min(), ColumnType(TYPE_DOUBLE));
   TestFixedResultTypeOps<double, double, double>(numeric_limits<double>::max(),
-      numeric_limits<double>::max(), TYPE_DOUBLE);
+      numeric_limits<double>::max(), ColumnType(TYPE_DOUBLE));
   TestFixedResultTypeOps<double, double, double>(numeric_limits<double>::min(),
-      numeric_limits<double>::max(), TYPE_DOUBLE);
+      numeric_limits<double>::max(), ColumnType(TYPE_DOUBLE));
   TestFixedResultTypeOps<double, double, double>(numeric_limits<double>::max(),
-      numeric_limits<double>::min(), TYPE_DOUBLE);
+      numeric_limits<double>::min(), ColumnType(TYPE_DOUBLE));
 
   // Test behavior with zero (especially for division by zero).
   TestFixedResultTypeOps<float, float, double>(min_float_values_[TYPE_FLOAT],
-      0.0f, TYPE_DOUBLE);
+      0.0f, ColumnType(TYPE_DOUBLE));
   TestFixedResultTypeOps<double, double, 
double>(min_float_values_[TYPE_DOUBLE],
-      0.0, TYPE_DOUBLE);
+      0.0, ColumnType(TYPE_DOUBLE));
 
   // Test ops that always promote to fixed type (e.g., next higher resolution 
type).
   TestFixedResultTypeOps<int8_t, int8_t, 
int16_t>(min_int_values_[TYPE_TINYINT],
-      min_int_values_[TYPE_TINYINT], TYPE_SMALLINT);
+      min_int_values_[TYPE_TINYINT], ColumnType(TYPE_SMALLINT));
   TestFixedResultTypeOps<int8_t, int16_t, 
int32_t>(min_int_values_[TYPE_TINYINT],
-      min_int_values_[TYPE_SMALLINT], TYPE_INT);
+      min_int_values_[TYPE_SMALLINT], ColumnType(TYPE_INT));
   TestFixedResultTypeOps<int8_t, int32_t, 
int64_t>(min_int_values_[TYPE_TINYINT],
-      min_int_values_[TYPE_INT], TYPE_BIGINT);
+      min_int_values_[TYPE_INT], ColumnType(TYPE_BIGINT));
   TestFixedResultTypeOps<int8_t, int64_t, 
int64_t>(min_int_values_[TYPE_TINYINT],
-      min_int_values_[TYPE_BIGINT], TYPE_BIGINT);
+      min_int_values_[TYPE_BIGINT], ColumnType(TYPE_BIGINT));
   TestFixedResultTypeOps<int16_t, int16_t, 
int32_t>(min_int_values_[TYPE_SMALLINT],
-      min_int_values_[TYPE_SMALLINT], TYPE_INT);
+      min_int_values_[TYPE_SMALLINT], ColumnType(TYPE_INT));
   TestFixedResultTypeOps<int16_t, int32_t, 
int64_t>(min_int_values_[TYPE_SMALLINT],
-      min_int_values_[TYPE_INT], TYPE_BIGINT);
+      min_int_values_[TYPE_INT], ColumnType(TYPE_BIGINT));
   TestFixedResultTypeOps<int16_t, int64_t, 
int64_t>(min_int_values_[TYPE_SMALLINT],
-      min_int_values_[TYPE_BIGINT], TYPE_BIGINT);
+      min_int_values_[TYPE_BIGINT], ColumnType(TYPE_BIGINT));
   TestFixedResultTypeOps<int32_t, int32_t, int64_t>(min_int_values_[TYPE_INT],
-      min_int_values_[TYPE_INT], TYPE_BIGINT);
+      min_int_values_[TYPE_INT], ColumnType(TYPE_BIGINT));
   TestFixedResultTypeOps<int32_t, int64_t, int64_t>(min_int_values_[TYPE_INT],
-      min_int_values_[TYPE_BIGINT], TYPE_BIGINT);
+      min_int_values_[TYPE_BIGINT], ColumnType(TYPE_BIGINT));
   TestFixedResultTypeOps<int64_t, int64_t, 
int64_t>(min_int_values_[TYPE_BIGINT],
-      min_int_values_[TYPE_BIGINT], TYPE_BIGINT);
+      min_int_values_[TYPE_BIGINT], ColumnType(TYPE_BIGINT));
 
   // Test behavior on overflow/underflow.
   TestFixedResultTypeOps<int64_t, int64_t, 
int64_t>(numeric_limits<int64_t>::min()+1,
-      numeric_limits<int64_t>::min()+1, TYPE_BIGINT);
+      numeric_limits<int64_t>::min()+1, ColumnType(TYPE_BIGINT));
   TestFixedResultTypeOps<int64_t, int64_t, 
int64_t>(numeric_limits<int64_t>::max(),
-      numeric_limits<int64_t>::max(), TYPE_BIGINT);
+      numeric_limits<int64_t>::max(), ColumnType(TYPE_BIGINT));
   TestFixedResultTypeOps<int64_t, int64_t, 
int64_t>(numeric_limits<int64_t>::min()+1,
-      numeric_limits<int64_t>::max(), TYPE_BIGINT);
+      numeric_limits<int64_t>::max(), ColumnType(TYPE_BIGINT));
   TestFixedResultTypeOps<int64_t, int64_t, 
int64_t>(numeric_limits<int64_t>::max(),
-      numeric_limits<int64_t>::min()+1, TYPE_BIGINT);
+      numeric_limits<int64_t>::min()+1, ColumnType(TYPE_BIGINT));
 
   // Test behavior with NULLs.
   TestNullOperandFixedResultTypeOps<float, 
double>(min_float_values_[TYPE_FLOAT],
-      TYPE_DOUBLE);
+      ColumnType(TYPE_DOUBLE));
   TestNullOperandFixedResultTypeOps<double, 
double>(min_float_values_[TYPE_DOUBLE],
-      TYPE_DOUBLE);
+      ColumnType(TYPE_DOUBLE));
   TestNullOperandFixedResultTypeOps<int8_t, 
int64_t>(min_int_values_[TYPE_TINYINT],
-      TYPE_SMALLINT);
+      ColumnType(TYPE_SMALLINT));
   TestNullOperandFixedResultTypeOps<int16_t, 
int64_t>(min_int_values_[TYPE_SMALLINT],
-      TYPE_INT);
+      ColumnType(TYPE_INT));
   TestNullOperandFixedResultTypeOps<int32_t, 
int64_t>(min_int_values_[TYPE_INT],
-      TYPE_BIGINT);
+      ColumnType(TYPE_BIGINT));
   TestNullOperandFixedResultTypeOps<int64_t, 
int64_t>(min_int_values_[TYPE_BIGINT],
-      TYPE_BIGINT);
+      ColumnType(TYPE_BIGINT));
 
   // Test int ops that promote to assignment compatible type.
   TestVariableResultTypeIntOps<int8_t, int8_t>(min_int_values_[TYPE_TINYINT],
-      min_int_values_[TYPE_TINYINT], TYPE_TINYINT);
+      min_int_values_[TYPE_TINYINT], ColumnType(TYPE_TINYINT));
   TestVariableResultTypeIntOps<int8_t, int16_t>(min_int_values_[TYPE_TINYINT],
-      min_int_values_[TYPE_SMALLINT], TYPE_SMALLINT);
+      min_int_values_[TYPE_SMALLINT], ColumnType(TYPE_SMALLINT));
   TestVariableResultTypeIntOps<int8_t, int32_t>(min_int_values_[TYPE_TINYINT],
-      min_int_values_[TYPE_INT], TYPE_INT);
+      min_int_values_[TYPE_INT], ColumnType(TYPE_INT));
   TestVariableResultTypeIntOps<int8_t, int64_t>(min_int_values_[TYPE_TINYINT],
-      min_int_values_[TYPE_BIGINT], TYPE_BIGINT);
+      min_int_values_[TYPE_BIGINT], ColumnType(TYPE_BIGINT));
   TestVariableResultTypeIntOps<int16_t, 
int16_t>(min_int_values_[TYPE_SMALLINT],
-      min_int_values_[TYPE_SMALLINT], TYPE_SMALLINT);
+      min_int_values_[TYPE_SMALLINT], ColumnType(TYPE_SMALLINT));
   TestVariableResultTypeIntOps<int16_t, 
int32_t>(min_int_values_[TYPE_SMALLINT],
-      min_int_values_[TYPE_INT],TYPE_INT);
+      min_int_values_[TYPE_INT],ColumnType(TYPE_INT));
   TestVariableResultTypeIntOps<int16_t, 
int64_t>(min_int_values_[TYPE_SMALLINT],
-      min_int_values_[TYPE_BIGINT], TYPE_BIGINT);
+      min_int_values_[TYPE_BIGINT], ColumnType(TYPE_BIGINT));
   TestVariableResultTypeIntOps<int32_t, int32_t>(min_int_values_[TYPE_INT],
-      min_int_values_[TYPE_INT], TYPE_INT);
+      min_int_values_[TYPE_INT], ColumnType(TYPE_INT));
   TestVariableResultTypeIntOps<int32_t, int64_t>(min_int_values_[TYPE_INT],
-      min_int_values_[TYPE_BIGINT], TYPE_BIGINT);
+      min_int_values_[TYPE_BIGINT], ColumnType(TYPE_BIGINT));
   TestVariableResultTypeIntOps<int64_t, int64_t>(min_int_values_[TYPE_BIGINT],
-      min_int_values_[TYPE_BIGINT], TYPE_BIGINT);
+      min_int_values_[TYPE_BIGINT], ColumnType(TYPE_BIGINT));
 
   // Test behavior of INT_DIVIDE and MOD with zero as second argument.
   IntValMap::iterator int_iter;
@@ -1654,13 +1681,13 @@ TEST_P(ExprTest, ArithmeticExprs) {
 
   // Test behavior with NULLs.
   
TestNullOperandVariableResultTypeIntOps<int8_t>(min_int_values_[TYPE_TINYINT],
-      TYPE_TINYINT);
+      ColumnType(TYPE_TINYINT));
   
TestNullOperandVariableResultTypeIntOps<int16_t>(min_int_values_[TYPE_SMALLINT],
-      TYPE_SMALLINT);
+      ColumnType(TYPE_SMALLINT));
   TestNullOperandVariableResultTypeIntOps<int32_t>(min_int_values_[TYPE_INT],
-      TYPE_INT);
+      ColumnType(TYPE_INT));
   
TestNullOperandVariableResultTypeIntOps<int64_t>(min_int_values_[TYPE_BIGINT],
-      TYPE_BIGINT);
+      ColumnType(TYPE_BIGINT));
 
   // Tests for dealing with '-'.
   TestValue("-1", TYPE_TINYINT, -1);
@@ -5509,8 +5536,8 @@ TEST_P(ExprTest, SessionFunctions) {
   map<Session, map<Query, string>> results;
   for (Session session: {S1, S2}) {
     ASSERT_OK(executor_->Setup()); // Starts new session
-    results[session][Q1] = GetValue("current_session()", TYPE_STRING);
-    results[session][Q2] = GetValue("current_sid()", TYPE_STRING);
+    results[session][Q1] = GetValue("current_session()", 
ColumnType(TYPE_STRING));
+    results[session][Q2] = GetValue("current_sid()", ColumnType(TYPE_STRING));
   }
 
   // The sessions IDs from the same session must be the same.
@@ -5934,7 +5961,7 @@ TEST_P(ExprTest, MathFunctions) {
     rand << "rand(" << seed << ")";
     random << "random(" << seed << ")";
     const double expected_result = ConvertValue<double>(GetValue(rand.str(),
-      TYPE_DOUBLE));
+      ColumnType(TYPE_DOUBLE)));
     TestValue(rand.str(), TYPE_DOUBLE, expected_result);
     TestValue(random.str(), TYPE_DOUBLE, expected_result); // Test alias
   }
@@ -7022,7 +7049,7 @@ TEST_P(ExprTest, TimestampFunctions) {
     time_t unix_start_time =
         (posix_time::microsec_clock::local_time() - 
from_time_t(0)).total_seconds();
     int64_t unix_timestamp_result = 
ConvertValue<int64_t>(GetValue("unix_timestamp()",
-        TYPE_BIGINT));
+        ColumnType(TYPE_BIGINT)));
     EXPECT_BETWEEN(unix_start_time, unix_timestamp_result, 
static_cast<int64_t>(
         (posix_time::microsec_clock::local_time() - 
from_time_t(0)).total_seconds()));
 
@@ -7033,7 +7060,7 @@ TEST_P(ExprTest, TimestampFunctions) {
       tm before = to_tm(posix_time::microsec_clock::local_time());
       unix_start_time = mktime(&before);
       unix_timestamp_result = 
ConvertValue<int64_t>(GetValue("unix_timestamp()",
-          TYPE_BIGINT));
+          ColumnType(TYPE_BIGINT)));
       tm after = to_tm(posix_time::microsec_clock::local_time());
       EXPECT_BETWEEN(unix_start_time, unix_timestamp_result,
           static_cast<int64_t>(mktime(&after)));
@@ -7050,11 +7077,11 @@ TEST_P(ExprTest, TimestampFunctions) {
     const TimestampValue start_time =
         TimestampValue::FromUnixTimeMicros(UnixMicros(), &local_tz);
     TimestampValue timestamp_result =
-        ConvertValue<TimestampValue>(GetValue("now()", TYPE_TIMESTAMP));
+        ConvertValue<TimestampValue>(GetValue("now()", 
ColumnType(TYPE_TIMESTAMP)));
     EXPECT_BETWEEN(start_time, timestamp_result,
         TimestampValue::FromUnixTimeMicros(UnixMicros(), &local_tz));
     timestamp_result = 
ConvertValue<TimestampValue>(GetValue("current_timestamp()",
-        TYPE_TIMESTAMP));
+        ColumnType(TYPE_TIMESTAMP)));
     EXPECT_BETWEEN(start_time, timestamp_result,
         TimestampValue::FromUnixTimeMicros(UnixMicros(), &local_tz));
   }
@@ -7062,8 +7089,8 @@ TEST_P(ExprTest, TimestampFunctions) {
   // Test that utc_timestamp() is reasonable.
   const TimestampValue utc_start_time =
       TimestampValue::UtcFromUnixTimeMicros(UnixMicros());
-  TimestampValue timestamp_result =
-      ConvertValue<TimestampValue>(GetValue("utc_timestamp()", 
TYPE_TIMESTAMP));
+  TimestampValue timestamp_result = ConvertValue<TimestampValue>(
+      GetValue("utc_timestamp()", ColumnType(TYPE_TIMESTAMP)));
   EXPECT_BETWEEN(utc_start_time, timestamp_result,
       TimestampValue::UtcFromUnixTimeMicros(UnixMicros()));
 
@@ -7079,7 +7106,7 @@ TEST_P(ExprTest, TimestampFunctions) {
     time_t unix_start_time =
         (posix_time::microsec_clock::local_time() - 
from_time_t(0)).total_seconds();
     TimestampValue timestamp_result = ConvertValue<TimestampValue>(GetValue(
-        "cast(unix_timestamp() as timestamp)", TYPE_TIMESTAMP));
+        "cast(unix_timestamp() as timestamp)", ColumnType(TYPE_TIMESTAMP)));
     EXPECT_BETWEEN(TimestampValue::FromUnixTime(unix_start_time - 1, 
&local_tz),
         timestamp_result,
         TimestampValue::FromUnixTimeMicros(UnixMicros(), &local_tz));
@@ -8229,7 +8256,8 @@ TEST_P(ExprTest, DateFunctions) {
 
     const boost::gregorian::date start_date =
         TimestampValue::FromUnixTimeMicros(UnixMicros(), &local_tz).date();
-    DateValue current_dv = ConvertValue<DateValue>(GetValue("current_date()", 
TYPE_DATE));
+    DateValue current_dv =
+        ConvertValue<DateValue>(GetValue("current_date()", 
ColumnType(TYPE_DATE)));
     const boost::gregorian::date end_date =
         TimestampValue::FromUnixTimeMicros(UnixMicros(), &local_tz).date();
 
@@ -8681,16 +8709,16 @@ TEST_P(ExprTest, ResultsLayoutTest) {
 
   // Test single Expr case
   vector<ColumnType> types;
-  types.push_back(TYPE_BOOLEAN);
-  types.push_back(TYPE_TINYINT);
-  types.push_back(TYPE_SMALLINT);
-  types.push_back(TYPE_INT);
-  types.push_back(TYPE_BIGINT);
-  types.push_back(TYPE_FLOAT);
-  types.push_back(TYPE_DOUBLE);
-  types.push_back(TYPE_TIMESTAMP);
-  types.push_back(TYPE_DATE);
-  types.push_back(TYPE_STRING);
+  types.push_back(ColumnType(TYPE_BOOLEAN));
+  types.push_back(ColumnType(TYPE_TINYINT));
+  types.push_back(ColumnType(TYPE_SMALLINT));
+  types.push_back(ColumnType(TYPE_INT));
+  types.push_back(ColumnType(TYPE_BIGINT));
+  types.push_back(ColumnType(TYPE_FLOAT));
+  types.push_back(ColumnType(TYPE_DOUBLE));
+  types.push_back(ColumnType(TYPE_TIMESTAMP));
+  types.push_back(ColumnType(TYPE_DATE));
+  types.push_back(ColumnType(TYPE_STRING));
 
   types.push_back(ColumnType::CreateDecimalType(1,0));
   types.push_back(ColumnType::CreateDecimalType(8,0));
diff --git a/be/src/exprs/is-not-empty-predicate.cc 
b/be/src/exprs/is-not-empty-predicate.cc
index 7627fdd..f39ea98 100644
--- a/be/src/exprs/is-not-empty-predicate.cc
+++ b/be/src/exprs/is-not-empty-predicate.cc
@@ -111,8 +111,10 @@ Status IsNotEmptyPredicate::GetCodegendComputeFnImpl(
   // Add code to the block that is executed if is_null was true.
   builder.SetInsertPoint(ret_null);
   // allocate a BooleanVal, set null in it, and return it.
-  CodegenAnyVal null_result(codegen, &builder, TYPE_BOOLEAN, nullptr, 
"null_result");
-  builder.CreateRet(null_result.GetNullVal(codegen, TYPE_BOOLEAN));
+  CodegenAnyVal null_result(
+      codegen, &builder, ColumnType(TYPE_BOOLEAN), nullptr, "null_result");
+  builder.CreateRet(
+      null_result.GetNullVal(codegen, ColumnType(TYPE_BOOLEAN)));
 
   // Back to the branch where 'is_null' is false.
   builder.SetInsertPoint(check_count);
@@ -121,7 +123,7 @@ Status IsNotEmptyPredicate::GetCodegendComputeFnImpl(
 
   llvm::Value* has_values = builder.CreateICmpNE(num_tuples, 
codegen->GetI32Constant(0));
   CodegenAnyVal has_values_result(
-      codegen, &builder, TYPE_BOOLEAN, nullptr, "has_values_result");
+      codegen, &builder, ColumnType(TYPE_BOOLEAN), nullptr, 
"has_values_result");
   has_values_result.SetVal(has_values);
   builder.CreateRet(has_values_result.GetLoweredValue());
 
diff --git a/be/src/exprs/null-literal.h b/be/src/exprs/null-literal.h
index a1e3956..c25c161 100644
--- a/be/src/exprs/null-literal.h
+++ b/be/src/exprs/null-literal.h
@@ -46,7 +46,7 @@ class NullLiteral: public ScalarExpr {
   virtual std::string DebugString() const override;
 
   /// Constructor for test.
-  NullLiteral(PrimitiveType type) : ScalarExpr(type, true) { }
+  NullLiteral(PrimitiveType type) : ScalarExpr(ColumnType(type), true) { }
 
   static const char* LLVM_CLASS_NAME;
 
diff --git a/be/src/exprs/valid-tuple-id.cc b/be/src/exprs/valid-tuple-id.cc
index e6fe640..dbfab49 100644
--- a/be/src/exprs/valid-tuple-id.cc
+++ b/be/src/exprs/valid-tuple-id.cc
@@ -147,7 +147,7 @@ Status ValidTupleIdExpr::GetCodegendComputeFnImpl(
     // Add code to the block that is executed if the Tuple* was not a nullptr.
     builder.SetInsertPoint(ret_block);
     // Generate code returning an IntVal containing the tuple id.
-    CodegenAnyVal result(codegen, &builder, TYPE_INT, nullptr, "ret");
+    CodegenAnyVal result(codegen, &builder, ColumnType(TYPE_INT), nullptr, 
"ret");
     llvm::Constant* tuple_id =
         codegen->GetI32Constant(static_cast<uint64_t>(tuple_ids_[i]));
     result.SetVal(tuple_id);
diff --git a/be/src/runtime/buffered-tuple-stream-test.cc 
b/be/src/runtime/buffered-tuple-stream-test.cc
index 776b207..2a0d607 100644
--- a/be/src/runtime/buffered-tuple-stream-test.cc
+++ b/be/src/runtime/buffered-tuple-stream-test.cc
@@ -551,11 +551,11 @@ class ArrayTupleStreamTest : public SimpleTupleStreamTest 
{
     tuple_ids.push_back(static_cast<TTupleId>(1));
     ColumnType string_array_type;
     string_array_type.type = TYPE_ARRAY;
-    string_array_type.children.push_back(TYPE_STRING);
+    string_array_type.children.push_back(ColumnType(TYPE_STRING));
 
     ColumnType int_array_type;
     int_array_type.type = TYPE_ARRAY;
-    int_array_type.children.push_back(TYPE_STRING);
+    int_array_type.children.push_back(ColumnType(TYPE_STRING));
 
     ColumnType nested_array_type;
     nested_array_type.type = TYPE_ARRAY;
diff --git a/be/src/runtime/data-stream-test.cc 
b/be/src/runtime/data-stream-test.cc
index d7f94a9..ec61d5e 100644
--- a/be/src/runtime/data-stream-test.cc
+++ b/be/src/runtime/data-stream-test.cc
@@ -168,7 +168,7 @@ class DataStreamTest : public testing::Test {
 
     CreateRowDesc();
 
-    SlotRef* lhs_slot = obj_pool_.Add(new SlotRef(TYPE_BIGINT, 0));
+    SlotRef* lhs_slot = obj_pool_.Add(new SlotRef(ColumnType(TYPE_BIGINT), 0));
     ASSERT_OK(lhs_slot->Init(RowDescriptor(), true, fragment_state_));
     ordering_exprs_.push_back(lhs_slot);
 
@@ -487,7 +487,8 @@ class DataStreamTest : public testing::Test {
         } else if (stream_type == TPartitionType::HASH_PARTITIONED) {
           // hash-partitioned streams send values to the right partition
           int64_t value = *j;
-          uint64_t hash_val = RawValue::GetHashValueFastHash(&value, 
TYPE_BIGINT,
+          uint64_t hash_val = RawValue::GetHashValueFastHash(
+              &value, ColumnType(TYPE_BIGINT),
               GetExchangeHashSeed(runtime_state_->query_id()));
           EXPECT_EQ(hash_val % receiver_info_.size(), info->receiver_num);
         }
diff --git a/be/src/runtime/date-test.cc b/be/src/runtime/date-test.cc
index 18d65c0..d6fc55a 100644
--- a/be/src/runtime/date-test.cc
+++ b/be/src/runtime/date-test.cc
@@ -74,10 +74,10 @@ TEST(DateTest, ParseDefault) {
   EXPECT_EQ(v3, v4);
   EXPECT_EQ(v3, v5);
 
-  EXPECT_NE(RawValue::GetHashValue(&v1, TYPE_DATE, 0),
-      RawValue::GetHashValue(&v2, TYPE_DATE, 0));
-  EXPECT_EQ(RawValue::GetHashValue(&v3, TYPE_DATE, 0),
-      RawValue::GetHashValue(&v2, TYPE_DATE, 0));
+  EXPECT_NE(RawValue::GetHashValue(&v1, ColumnType(TYPE_DATE), 0),
+      RawValue::GetHashValue(&v2, ColumnType(TYPE_DATE), 0));
+  EXPECT_EQ(RawValue::GetHashValue(&v3, ColumnType(TYPE_DATE), 0),
+      RawValue::GetHashValue(&v2, ColumnType(TYPE_DATE), 0));
 
   // 1-digit months and days are ok in date string.
   ParseValidateDate("2012-1-20", false, 2012, 1, 20);
diff --git a/be/src/runtime/krpc-data-stream-mgr.cc 
b/be/src/runtime/krpc-data-stream-mgr.cc
index 0551a33..7e47fe5 100644
--- a/be/src/runtime/krpc-data-stream-mgr.cc
+++ b/be/src/runtime/krpc-data-stream-mgr.cc
@@ -95,9 +95,11 @@ Status KrpcDataStreamMgr::Init(MemTracker* 
service_mem_tracker) {
 
 inline uint32_t KrpcDataStreamMgr::GetHashValue(
     const TUniqueId& fragment_instance_id, PlanNodeId dest_node_id) {
-  uint32_t value = RawValue::GetHashValue(&fragment_instance_id.lo, 
TYPE_BIGINT, 0);
-  value = RawValue::GetHashValue(&fragment_instance_id.hi, TYPE_BIGINT, value);
-  value = RawValue::GetHashValue(&dest_node_id, TYPE_INT, value);
+  uint32_t value = RawValue::GetHashValue(
+      &fragment_instance_id.lo, ColumnType(TYPE_BIGINT), 0);
+  value = RawValue::GetHashValue(
+      &fragment_instance_id.hi, ColumnType(TYPE_BIGINT), value);
+  value = RawValue::GetHashValue(&dest_node_id, ColumnType(TYPE_INT), value);
   return value;
 }
 
diff --git a/be/src/runtime/raw-value-test.cc b/be/src/runtime/raw-value-test.cc
index 0db8692..090178f 100644
--- a/be/src/runtime/raw-value-test.cc
+++ b/be/src/runtime/raw-value-test.cc
@@ -34,24 +34,24 @@ TEST_F(RawValueTest, Compare) {
   int64_t v1, v2;
   v1 = -2128609280;
   v2 = 9223372036854775807;
-  EXPECT_LT(RawValue::Compare(&v1, &v2, TYPE_BIGINT), 0);
-  EXPECT_GT(RawValue::Compare(&v2, &v1, TYPE_BIGINT), 0);
+  EXPECT_LT(RawValue::Compare(&v1, &v2, ColumnType(TYPE_BIGINT)), 0);
+  EXPECT_GT(RawValue::Compare(&v2, &v1, ColumnType(TYPE_BIGINT)), 0);
 
   int32_t i1, i2;
   i1 = 2147483647;
   i2 = -2147483640;
-  EXPECT_GT(RawValue::Compare(&i1, &i2, TYPE_INT), 0);
-  EXPECT_LT(RawValue::Compare(&i2, &i1, TYPE_INT), 0);
+  EXPECT_GT(RawValue::Compare(&i1, &i2, ColumnType(TYPE_INT)), 0);
+  EXPECT_LT(RawValue::Compare(&i2, &i1, ColumnType(TYPE_INT)), 0);
 
   int16_t s1, s2;
   s1 = 32767;
   s2 = -32767;
-  EXPECT_GT(RawValue::Compare(&s1, &s2, TYPE_SMALLINT), 0);
-  EXPECT_LT(RawValue::Compare(&s2, &s1, TYPE_SMALLINT), 0);
+  EXPECT_GT(RawValue::Compare(&s1, &s2, ColumnType(TYPE_SMALLINT)), 0);
+  EXPECT_LT(RawValue::Compare(&s2, &s1, ColumnType(TYPE_SMALLINT)), 0);
 
   DateValue d1(-719162), d2(719162);
-  EXPECT_LT(RawValue::Compare(&d1, &d2, TYPE_DATE), 0);
-  EXPECT_GT(RawValue::Compare(&d2, &d1, TYPE_DATE), 0);
+  EXPECT_LT(RawValue::Compare(&d1, &d2, ColumnType(TYPE_DATE)), 0);
+  EXPECT_GT(RawValue::Compare(&d2, &d1, ColumnType(TYPE_DATE)), 0);
 }
 
 TEST_F(RawValueTest, TypeChar) {
@@ -85,16 +85,19 @@ TEST_F(RawValueTest, TypeChar) {
 // IMPALA-2270: "", false, and NULL should hash to distinct values.
 TEST_F(RawValueTest, HashEmptyAndNull) {
   uint32_t seed = 12345;
-  uint32_t hash_null = RawValue::GetHashValue(nullptr, TYPE_STRING, seed);
-  uint64_t fast_hash_null = RawValue::GetHashValueFastHash(nullptr, 
TYPE_STRING, seed);
+  uint32_t hash_null =
+    RawValue::GetHashValue(nullptr, ColumnType(TYPE_STRING), seed);
+  uint64_t fast_hash_null =
+    RawValue::GetHashValueFastHash(nullptr, ColumnType(TYPE_STRING), seed);
   StringValue empty(nullptr, 0);
-  uint32_t hash_empty = RawValue::GetHashValue(&empty, TYPE_STRING, seed);
+  uint32_t hash_empty = RawValue::GetHashValue(&empty, 
ColumnType(TYPE_STRING), seed);
   uint64_t fast_hash_empty =
-      RawValue::GetHashValueFastHash(&empty, TYPE_STRING, seed);
+      RawValue::GetHashValueFastHash(&empty, ColumnType(TYPE_STRING), seed);
   bool false_val = false;
-  uint32_t hash_false = RawValue::GetHashValue(&false_val, TYPE_BOOLEAN, seed);
+  uint32_t hash_false =
+      RawValue::GetHashValue(&false_val, ColumnType(TYPE_BOOLEAN), seed);
   uint64_t fast_hash_false =
-      RawValue::GetHashValueFastHash(&false_val, TYPE_BOOLEAN, seed);
+      RawValue::GetHashValueFastHash(&false_val, ColumnType(TYPE_BOOLEAN), 
seed);
   EXPECT_NE(seed, hash_null);
   EXPECT_NE(seed, hash_empty);
   EXPECT_NE(seed, hash_false);
@@ -113,9 +116,9 @@ TEST(HashUtil, IntNullSkew) {
   int num_buckets = 16;
   vector<int> buckets(num_buckets, 0);
   for (int32_t i = 0; i < num_values; ++i) {
-    uint64_t hash = RawValue::GetHashValueFastHash(&i, TYPE_INT, 9999);
+    uint64_t hash = RawValue::GetHashValueFastHash(&i, ColumnType(TYPE_INT), 
9999);
     StringValue empty(nullptr, 0);
-    hash = RawValue::GetHashValueFastHash(&empty, TYPE_STRING, hash);
+    hash = RawValue::GetHashValueFastHash(&empty, ColumnType(TYPE_STRING), 
hash);
     ++buckets[hash % num_buckets];
   }
 
@@ -133,36 +136,43 @@ TEST_F(RawValueTest, TemplatizedHash) {
   uint32_t seed = 12345;
 
   int8_t tinyint_val = 8;
-  EXPECT_EQ(RawValue::GetHashValue<int8_t>(&tinyint_val, TYPE_TINYINT, seed),
-    RawValue::GetHashValue(&tinyint_val, TYPE_TINYINT, seed));
+  EXPECT_EQ(RawValue::GetHashValue<int8_t>(&tinyint_val, 
ColumnType(TYPE_TINYINT), seed),
+    RawValue::GetHashValue(&tinyint_val, ColumnType(TYPE_TINYINT), seed));
 
   int16_t smallint_val = 8;
-  EXPECT_EQ(RawValue::GetHashValue<int16_t>(&smallint_val, TYPE_SMALLINT, 
seed),
-    RawValue::GetHashValue(&smallint_val, TYPE_SMALLINT, seed));
+  EXPECT_EQ(
+      RawValue::GetHashValue<int16_t>(&smallint_val, 
ColumnType(TYPE_SMALLINT), seed),
+      RawValue::GetHashValue(&smallint_val, ColumnType(TYPE_SMALLINT), seed));
 
   int32_t int_val = 8;
-  EXPECT_EQ(RawValue::GetHashValue<int32_t>(&int_val, TYPE_INT, seed),
-    RawValue::GetHashValue(&int_val, TYPE_INT, seed));
+  EXPECT_EQ(
+      RawValue::GetHashValue<int32_t>(&int_val, ColumnType(TYPE_INT), seed),
+      RawValue::GetHashValue(&int_val, ColumnType(TYPE_INT), seed));
 
   int64_t bigint_val = 8;
-  EXPECT_EQ(RawValue::GetHashValue<int64_t>(&bigint_val, TYPE_BIGINT, seed),
-    RawValue::GetHashValue(&bigint_val, TYPE_BIGINT, seed));
+  EXPECT_EQ(
+      RawValue::GetHashValue<int64_t>(&bigint_val, ColumnType(TYPE_BIGINT), 
seed),
+      RawValue::GetHashValue(&bigint_val, ColumnType(TYPE_BIGINT), seed));
 
   float float_val = 8.0f;
-  EXPECT_EQ(RawValue::GetHashValue<float>(&float_val, TYPE_FLOAT, seed),
-    RawValue::GetHashValue(&float_val, TYPE_FLOAT, seed));
+  EXPECT_EQ(
+      RawValue::GetHashValue<float>(&float_val, ColumnType(TYPE_FLOAT), seed),
+      RawValue::GetHashValue(&float_val, ColumnType(TYPE_FLOAT), seed));
 
   double double_val = 8.0;
-  EXPECT_EQ(RawValue::GetHashValue<double>(&double_val, TYPE_DOUBLE, seed),
-    RawValue::GetHashValue(&double_val, TYPE_DOUBLE, seed));
+  EXPECT_EQ(
+      RawValue::GetHashValue<double>(&double_val, ColumnType(TYPE_DOUBLE), 
seed),
+      RawValue::GetHashValue(&double_val, ColumnType(TYPE_DOUBLE), seed));
 
   bool false_val = false;
-  EXPECT_EQ(RawValue::GetHashValue<bool>(&false_val, TYPE_BOOLEAN, seed),
-    RawValue::GetHashValue(&false_val, TYPE_BOOLEAN, seed));
+  EXPECT_EQ(
+      RawValue::GetHashValue<bool>(&false_val, ColumnType(TYPE_BOOLEAN), seed),
+      RawValue::GetHashValue(&false_val, ColumnType(TYPE_BOOLEAN), seed));
 
   bool true_val = true;
-  EXPECT_EQ(RawValue::GetHashValue<bool>(&true_val, TYPE_BOOLEAN, seed),
-    RawValue::GetHashValue(&true_val, TYPE_BOOLEAN, seed));
+  EXPECT_EQ(
+      RawValue::GetHashValue<bool>(&true_val, ColumnType(TYPE_BOOLEAN), seed),
+      RawValue::GetHashValue(&true_val, ColumnType(TYPE_BOOLEAN), seed));
 
   StringValue string_value("aaaaa");
   EXPECT_EQ(RawValue::GetHashValue<impala::StringValue>(
@@ -170,8 +180,8 @@ TEST_F(RawValueTest, TemplatizedHash) {
     RawValue::GetHashValue(&string_value, ColumnType::CreateCharType(10), 
seed));
 
   EXPECT_EQ(RawValue::GetHashValue<impala::StringValue>(
-    &string_value, TYPE_STRING, seed),
-    RawValue::GetHashValue(&string_value, TYPE_STRING, seed));
+    &string_value, ColumnType(TYPE_STRING), seed),
+    RawValue::GetHashValue(&string_value, ColumnType(TYPE_STRING), seed));
 
   EXPECT_EQ(RawValue::GetHashValue<impala::StringValue>(
     &string_value, ColumnType::CreateVarcharType(
@@ -181,8 +191,8 @@ TEST_F(RawValueTest, TemplatizedHash) {
 
   TimestampValue timestamp_value = TimestampValue::FromUnixTime(253433923200, 
UTCPTR);
   EXPECT_EQ(RawValue::GetHashValue<impala::TimestampValue>(
-    &timestamp_value, TYPE_TIMESTAMP, seed),RawValue::GetHashValue(
-    &timestamp_value, TYPE_TIMESTAMP, seed));
+    &timestamp_value, ColumnType(TYPE_TIMESTAMP), seed),RawValue::GetHashValue(
+    &timestamp_value, ColumnType(TYPE_TIMESTAMP), seed));
 
   ColumnType d4_type = ColumnType::CreateDecimalType(9, 1);
   Decimal4Value d4_value(123456789);
@@ -200,8 +210,9 @@ TEST_F(RawValueTest, TemplatizedHash) {
     RawValue::GetHashValue(&d16_value, d16_type, seed));
 
   DateValue date_value(1234567);
-  EXPECT_EQ(RawValue::GetHashValue<impala::DateValue>(&date_value, TYPE_DATE, 
seed),
-    RawValue::GetHashValue(&date_value, TYPE_DATE, seed));
+  EXPECT_EQ(RawValue::GetHashValue<impala::DateValue>(
+        &date_value, ColumnType(TYPE_DATE), seed),
+    RawValue::GetHashValue(&date_value, ColumnType(TYPE_DATE), seed));
 }
 
 }
diff --git a/be/src/runtime/row-batch-serialize-test.cc 
b/be/src/runtime/row-batch-serialize-test.cc
index a67da12..4b99b87 100644
--- a/be/src/runtime/row-batch-serialize-test.cc
+++ b/be/src/runtime/row-batch-serialize-test.cc
@@ -448,7 +448,7 @@ TEST_F(RowBatchSerializeTest, BasicArray) {
   // tuple: (int, string, array<int>)
   ColumnType array_type;
   array_type.type = TYPE_ARRAY;
-  array_type.children.push_back(TYPE_INT);
+  array_type.children.push_back(ColumnType(TYPE_INT));
 
   DescriptorTblBuilder builder(frontend(), &pool_);
   builder.DeclareTuple() << TYPE_INT << TYPE_STRING << array_type;
@@ -467,13 +467,13 @@ TEST_F(RowBatchSerializeTest, StringArray) {
   // tuple: (int, string, array<struct<int, string, string>>)
   ColumnType struct_type;
   struct_type.type = TYPE_STRUCT;
-  struct_type.children.push_back(TYPE_INT);
+  struct_type.children.push_back(ColumnType(TYPE_INT));
   struct_type.field_names.push_back("int1");
   struct_type.field_ids.push_back(-1);
-  struct_type.children.push_back(TYPE_STRING);
+  struct_type.children.push_back(ColumnType(TYPE_STRING));
   struct_type.field_names.push_back("string1");
   struct_type.field_ids.push_back(-1);
-  struct_type.children.push_back(TYPE_STRING);
+  struct_type.children.push_back(ColumnType(TYPE_STRING));
   struct_type.field_names.push_back("string2");
   struct_type.field_ids.push_back(-1);
 
@@ -498,14 +498,14 @@ TEST_F(RowBatchSerializeTest, NestedArrays) {
   // tuple: (array<struct<array<string>, array<string, string>>>)
   ColumnType inner_array_type1;
   inner_array_type1.type = TYPE_ARRAY;
-  inner_array_type1.children.push_back(TYPE_STRING);
+  inner_array_type1.children.push_back(ColumnType(TYPE_STRING));
 
   ColumnType inner_struct_type;
   inner_struct_type.type = TYPE_STRUCT;
-  inner_struct_type.children.push_back(TYPE_STRING);
+  inner_struct_type.children.push_back(ColumnType(TYPE_STRING));
   inner_struct_type.field_names.push_back("string1");
   inner_struct_type.field_ids.push_back(-1);
-  inner_struct_type.children.push_back(TYPE_STRING);
+  inner_struct_type.children.push_back(ColumnType(TYPE_STRING));
   inner_struct_type.field_names.push_back("string2");
   inner_struct_type.field_ids.push_back(-1);
 
@@ -684,7 +684,7 @@ TEST_F(RowBatchSerializeTest, DedupPathologicalFull) {
   // Need 3 tuples + array to enable non-adjacent dedup automatically
   ColumnType array_type;
   array_type.type = TYPE_ARRAY;
-  array_type.children.push_back(TYPE_STRING);
+  array_type.children.push_back(ColumnType(TYPE_STRING));
   DescriptorTblBuilder builder(frontend(), &pool_);
   builder.DeclareTuple() << TYPE_INT;
   builder.DeclareTuple() << TYPE_INT;
diff --git a/be/src/runtime/timestamp-test.cc b/be/src/runtime/timestamp-test.cc
index 813380f..bbed2ea 100644
--- a/be/src/runtime/timestamp-test.cc
+++ b/be/src/runtime/timestamp-test.cc
@@ -356,10 +356,10 @@ TEST(TimestampTest, Basic) {
   EXPECT_GT(v1, v2);
   EXPECT_GE(v2, v3);
 
-  EXPECT_NE(RawValue::GetHashValue(&v1, TYPE_TIMESTAMP, 0),
-            RawValue::GetHashValue(&v2, TYPE_TIMESTAMP, 0));
-  EXPECT_EQ(RawValue::GetHashValue(&v3, TYPE_TIMESTAMP, 0),
-            RawValue::GetHashValue(&v2, TYPE_TIMESTAMP, 0));
+  EXPECT_NE(RawValue::GetHashValue(&v1, ColumnType(TYPE_TIMESTAMP), 0),
+            RawValue::GetHashValue(&v2, ColumnType(TYPE_TIMESTAMP), 0));
+  EXPECT_EQ(RawValue::GetHashValue(&v3, ColumnType(TYPE_TIMESTAMP), 0),
+            RawValue::GetHashValue(&v2, ColumnType(TYPE_TIMESTAMP), 0));
 
   char s4[] = "2012-01-20T01:10:01";
   char s5[] = "1990-10-20T10:10:10.123456789";
diff --git a/be/src/runtime/types.h b/be/src/runtime/types.h
index 49a097b..684c41e 100644
--- a/be/src/runtime/types.h
+++ b/be/src/runtime/types.h
@@ -97,7 +97,7 @@ struct ColumnType {
 
   static const char* LLVM_CLASS_NAME;
 
-  ColumnType(PrimitiveType type = INVALID_TYPE)
+  explicit ColumnType(PrimitiveType type = INVALID_TYPE)
     : type(type), len(-1), precision(-1), scale(-1) {
     DCHECK_NE(type, TYPE_CHAR);
     DCHECK_NE(type, TYPE_VARCHAR);
diff --git a/be/src/service/hs2-util.cc b/be/src/service/hs2-util.cc
index e0baae1..01c7e2e 100644
--- a/be/src/service/hs2-util.cc
+++ b/be/src/service/hs2-util.cc
@@ -242,7 +242,7 @@ static void 
TimestampExprValuesToHS2TColumn(ScalarExprEvaluator* expr_eval,
     if (!val.is_null) {
       TimestampValue value = TimestampValue::FromTimestampVal(val);
       RawValue::PrintValue(
-          &value, TYPE_TIMESTAMP, -1, &(column->stringVal.values.back()));
+          &value, ColumnType(TYPE_TIMESTAMP), -1, 
&(column->stringVal.values.back()));
     }
     SetNullBit(output_row_idx, val.is_null, &column->stringVal.nulls);
     ++output_row_idx;
@@ -260,7 +260,7 @@ static void DateExprValuesToHS2TColumn(ScalarExprEvaluator* 
expr_eval,
     if (!val.is_null) {
       DateValue value = DateValue::FromDateVal(val);
       RawValue::PrintValue(
-          &value, TYPE_DATE, -1, &(column->stringVal.values.back()));
+          &value, ColumnType(TYPE_DATE), -1, 
&(column->stringVal.values.back()));
     }
     SetNullBit(output_row_idx, val.is_null, &column->stringVal.nulls);
     ++output_row_idx;
@@ -545,7 +545,8 @@ void impala::ExprValueToHS2TColumnValue(const void* value, 
const TColumnType& ty
       hs2_col_val->__isset.stringVal = true;
       hs2_col_val->stringVal.__isset.value = not_null;
       if (not_null) {
-        RawValue::PrintValue(value, TYPE_TIMESTAMP, -1, 
&(hs2_col_val->stringVal.value));
+        RawValue::PrintValue(
+            value, ColumnType(TYPE_TIMESTAMP), -1, 
&(hs2_col_val->stringVal.value));
       }
       break;
     case TPrimitiveType::DECIMAL: {
diff --git a/be/src/testutil/desc-tbl-builder.h 
b/be/src/testutil/desc-tbl-builder.h
index 9d27092..f11ef6d 100644
--- a/be/src/testutil/desc-tbl-builder.h
+++ b/be/src/testutil/desc-tbl-builder.h
@@ -69,6 +69,10 @@ class TupleDescBuilder {
     return *this;
   }
 
+  TupleDescBuilder& operator<< (PrimitiveType slot_type) {
+    return *this << ColumnType(slot_type);
+  }
+
   std::vector<ColumnType> slot_types() const { return slot_types_; }
 
  private:
diff --git a/be/src/util/avro-util.cc b/be/src/util/avro-util.cc
index 5b4d6e0..b454890 100644
--- a/be/src/util/avro-util.cc
+++ b/be/src/util/avro-util.cc
@@ -109,25 +109,25 @@ Status AvroSchemaToColumnType(
   switch (schema->type) {
     case AVRO_BYTES:
     case AVRO_STRING:
-      *column_type = TYPE_STRING;
+      *column_type = ColumnType(TYPE_STRING);
       return Status::OK();
     case AVRO_INT32:
-      *column_type = TYPE_INT;
+      *column_type = ColumnType(TYPE_INT);
       return Status::OK();
     case AVRO_DATE:
-      *column_type = TYPE_DATE;
+      *column_type = ColumnType(TYPE_DATE);
       return Status::OK();
     case AVRO_INT64:
-      *column_type = TYPE_BIGINT;
+      *column_type = ColumnType(TYPE_BIGINT);
       return Status::OK();
     case AVRO_FLOAT:
-      *column_type = TYPE_FLOAT;
+      *column_type = ColumnType(TYPE_FLOAT);
       return Status::OK();
     case AVRO_DOUBLE:
-      *column_type = TYPE_DOUBLE;
+      *column_type = ColumnType(TYPE_DOUBLE);
       return Status::OK();
     case AVRO_BOOLEAN:
-      *column_type = TYPE_BOOLEAN;
+      *column_type = ColumnType(TYPE_BOOLEAN);
       return Status::OK();
     case AVRO_DECIMAL: {
       int precision = avro_schema_decimal_precision(schema);
diff --git a/be/src/util/symbols-util-test.cc b/be/src/util/symbols-util-test.cc
index c6ced23..05c148f 100644
--- a/be/src/util/symbols-util-test.cc
+++ b/be/src/util/symbols-util-test.cc
@@ -142,7 +142,7 @@ TEST(SymbolsUtil, Mangling) {
       "A::B::C(impala_udf::FunctionContext*, impala_udf::IntVal*)");
 
   // Try functions with in input INT arg. Then try with varargs and int* 
return arg.
-  args.push_back(TYPE_INT);
+  args.push_back(ColumnType(TYPE_INT));
   TestMangling("F", false, args, NULL,
       "_Z1FPN10impala_udf15FunctionContextERKNS_6IntValE",
       "F(impala_udf::FunctionContext*, impala_udf::IntVal const&)");
@@ -171,7 +171,7 @@ TEST(SymbolsUtil, Mangling) {
           "impala_udf::IntVal*)");
 
   // Try addding some redudant argument types. These should get compressed 
away.
-  args.push_back(TYPE_INT);
+  args.push_back(ColumnType(TYPE_INT));
   TestMangling("F", false, args, NULL,
       "_Z1FPN10impala_udf15FunctionContextERKNS_6IntValES4_",
       "F(impala_udf::FunctionContext*, impala_udf::IntVal const&, "
@@ -193,7 +193,7 @@ TEST(SymbolsUtil, Mangling) {
       "F::B(impala_udf::FunctionContext*, impala_udf::IntVal const&, "
           "impala_udf::IntVal const&)");
 
-  args.push_back(TYPE_INT);
+  args.push_back(ColumnType(TYPE_INT));
   TestMangling("F", false, args, NULL,
       "_Z1FPN10impala_udf15FunctionContextERKNS_6IntValES4_S4_",
       "F(impala_udf::FunctionContext*, impala_udf::IntVal const&, "
@@ -212,10 +212,10 @@ TEST(SymbolsUtil, Mangling) {
   // Try some more complicated cases.
   // fn(double, double, int, int)
   args.clear();
-  args.push_back(TYPE_DOUBLE);
-  args.push_back(TYPE_DOUBLE);
-  args.push_back(TYPE_INT);
-  args.push_back(TYPE_INT);
+  args.push_back(ColumnType(TYPE_DOUBLE));
+  args.push_back(ColumnType(TYPE_DOUBLE));
+  args.push_back(ColumnType(TYPE_INT));
+  args.push_back(ColumnType(TYPE_INT));
   TestMangling("TEST", false, args, NULL,
       
"_Z4TESTPN10impala_udf15FunctionContextERKNS_9DoubleValES4_RKNS_6IntValES7_",
       "TEST(impala_udf::FunctionContext*, impala_udf::DoubleVal const&, "
@@ -239,10 +239,10 @@ TEST(SymbolsUtil, Mangling) {
 
   // fn(int, double, double, int)
   args.clear();
-  args.push_back(TYPE_INT);
-  args.push_back(TYPE_DOUBLE);
-  args.push_back(TYPE_DOUBLE);
-  args.push_back(TYPE_INT);
+  args.push_back(ColumnType(TYPE_INT));
+  args.push_back(ColumnType(TYPE_DOUBLE));
+  args.push_back(ColumnType(TYPE_DOUBLE));
+  args.push_back(ColumnType(TYPE_INT));
   TestMangling("TEST", false, args, NULL,
       
"_Z4TESTPN10impala_udf15FunctionContextERKNS_6IntValERKNS_9DoubleValES7_S4_",
       "TEST(impala_udf::FunctionContext*, impala_udf::IntVal const&, 
impala_udf::"
@@ -255,16 +255,16 @@ TEST(SymbolsUtil, Mangling) {
 
   // All the types.
   args.clear();
-  args.push_back(TYPE_STRING);
-  args.push_back(TYPE_BOOLEAN);
-  args.push_back(TYPE_TINYINT);
-  args.push_back(TYPE_SMALLINT);
-  args.push_back(TYPE_INT);
-  args.push_back(TYPE_BIGINT);
-  args.push_back(TYPE_FLOAT);
-  args.push_back(TYPE_DOUBLE);
-  args.push_back(TYPE_TIMESTAMP);
-  args.push_back(TYPE_DATE);
+  args.push_back(ColumnType(TYPE_STRING));
+  args.push_back(ColumnType(TYPE_BOOLEAN));
+  args.push_back(ColumnType(TYPE_TINYINT));
+  args.push_back(ColumnType(TYPE_SMALLINT));
+  args.push_back(ColumnType(TYPE_INT));
+  args.push_back(ColumnType(TYPE_BIGINT));
+  args.push_back(ColumnType(TYPE_FLOAT));
+  args.push_back(ColumnType(TYPE_DOUBLE));
+  args.push_back(ColumnType(TYPE_TIMESTAMP));
+  args.push_back(ColumnType(TYPE_DATE));
   args.push_back(ColumnType::CreateCharType(10));
   TestMangling("AllTypes", false, args, NULL,
       
"_Z8AllTypesPN10impala_udf15FunctionContextERKNS_9StringValERKNS_10BooleanValE"

Reply via email to