You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by jn...@apache.org on 2017/03/02 20:59:36 UTC

[09/27] drill git commit: DRILL-5301: Add C++ client support for Server metadata API

http://git-wip-us.apache.org/repos/asf/drill/blob/d3238b1b/contrib/native/client/src/clientlib/metadata.cpp
----------------------------------------------------------------------
diff --git a/contrib/native/client/src/clientlib/metadata.cpp b/contrib/native/client/src/clientlib/metadata.cpp
index 0364c7d..7c2a7a8 100644
--- a/contrib/native/client/src/clientlib/metadata.cpp
+++ b/contrib/native/client/src/clientlib/metadata.cpp
@@ -26,11 +26,18 @@
 const std::string Drill::meta::DrillMetadata::s_connectorName(DRILL_CONNECTOR_NAME);
 const std::string Drill::meta::DrillMetadata::s_connectorVersion(DRILL_VERSION_STRING);
 
-const std::string Drill::meta::DrillMetadata::s_catalogSeparator(".");
-const std::string Drill::meta::DrillMetadata::s_catalogTerm("catalog");
-const std::string Drill::meta::DrillMetadata::s_identifierQuoteString("`");
+namespace Drill {
+namespace meta {
+namespace { // Anonymous namespace
+using boost::assign::list_of;
+
+// Default values based on Drill 1.8 support
+static const std::size_t s_maxIdentifierSize = 1024;
+static const std::string s_catalogSeparator(".");
+static const std::string s_catalogTerm("catalog");
+static const std::string s_identifierQuoteString("`");
 
-const std::vector<std::string> Drill::meta::DrillMetadata::s_sqlKeywords = boost::assign::list_of
+static const std::vector<std::string> s_sqlKeywords = boost::assign::list_of
 		("ABS")("ALLOW")("ARRAY")("ASENSITIVE")("ASYMMETRIC")("ATOMIC")("BIGINT")("BINARY")("BLOB")
 		("BOOLEAN")("CALL")("CALLED")("CARDINALITY")("CEIL")("CEILING")("CLOB")("COLLECT")("CONDITION")
 		("CORR")("COVAR_POP")("COVAR_SAMP")("CUBE")("CUME_DIST")("CURRENT_CATALOG")
@@ -51,643 +58,1070 @@ const std::vector<std::string> Drill::meta::DrillMetadata::s_sqlKeywords = boost
 		("UESCAPE")("UNNEST")("UPSERT")("USE")("VARBINARY")("VAR_POP")("VAR_SAMP")("WIDTH_BUCKET")
 		("WINDOW")("WITHIN")("WITHOUT");
 
-const std::vector<std::string> Drill::meta::DrillMetadata::s_numericFunctions = boost::assign::list_of
-		("ABS")("ACOS")("ASIN")("ATAN")("ATAN2")("CEILING")("COS")("COT")
-		("DEGREES")("EXP")("FLOOR")("LOG")("LOG10")("MOD")("PI")
-		("POWER")("RADIANS")("RAND")("ROUND")("SIGN")("SIN")("SQRT")
-		("TAN")("TRUNCATE");
+static const std::vector<std::string> s_numericFunctions = boost::assign::list_of
+		("ABS")("EXP")("LOG")("LOG10")("MOD")("POWER");
 
-const std::string Drill::meta::DrillMetadata::s_schemaTerm("schema");
-const std::string Drill::meta::DrillMetadata::s_searchEscapeString("\\");
-const std::string Drill::meta::DrillMetadata::s_specialCharacters;
+static const std::string s_schemaTerm("schema");
+static const std::string s_searchEscapeString("\\");
+static const std::string s_specialCharacters;
 
-const std::vector<std::string> Drill::meta::DrillMetadata::s_stringFunctions = boost::assign::list_of
-		("ASCII")("CHAR")("CONCAT")("DIFFERENCE")("INSERT")("LCASE")
-		("LEFT")("LENGTH")("LOCATE")("LTRIM")("REPEAT")("REPLACE")
-		("RIGHT")("RTRIM")("SOUNDEX")("SPACE")("SUBSTRING")("UCASE");
+static const std::vector<std::string> s_stringFunctions = boost::assign::list_of
+		("CONCAT")("INSERT")("LCASE")("LENGTH")("LOCATE")("LTRIM")("RTRIM")("SUBSTRING")("UCASE");
 
-const std::vector<std::string> Drill::meta::DrillMetadata::s_systemFunctions = boost::assign::list_of
-		("DATABASE")("IFNULL")("USER");
+static const std::vector<std::string> s_systemFunctions;
 
-const std::string Drill::meta::DrillMetadata::s_tableTerm("table");
+static const std::string s_tableTerm("table");
 
-const std::vector<std::string> Drill::meta::DrillMetadata::s_dateTimeFunctions = boost::assign::list_of
-		("CURDATE")("CURTIME")("DAYNAME")("DAYOFMONTH")("DAYOFWEEK")
-		("DAYOFYEAR")("HOUR")("MINUTE")("MONTH")("MONTHNAME")("NOW")
-		("QUARTER")("SECOND")("TIMESTAMPADD")("TIMESTAMPDIFF")("WEEK")("YEAR");
+static const std::vector<std::string> s_dateTimeFunctions = boost::assign::list_of
+		("CURDATE")("CURTIME")("NOW")("QUARTER");
 
-namespace Drill {
-namespace meta {
-namespace {
-using boost::assign::list_of;
+static const std::vector<exec::user::DateTimeLiteralsSupport> s_dateTimeLiterals = boost::assign::list_of
+		(exec::user::DL_DATE)(exec::user::DL_TIME)(exec::user::DL_TIMESTAMP)(exec::user::DL_INTERVAL_YEAR)
+		(exec::user::DL_INTERVAL_MONTH)(exec::user::DL_INTERVAL_DAY)(exec::user::DL_INTERVAL_HOUR)
+		(exec::user::DL_INTERVAL_MINUTE)(exec::user::DL_INTERVAL_SECOND)(exec::user::DL_INTERVAL_YEAR_TO_MONTH)
+		(exec::user::DL_INTERVAL_DAY_TO_HOUR)(exec::user::DL_INTERVAL_DAY_TO_MINUTE)
+		(exec::user::DL_INTERVAL_DAY_TO_SECOND)(exec::user::DL_INTERVAL_HOUR_TO_MINUTE)
+		(exec::user::DL_INTERVAL_HOUR_TO_SECOND)(exec::user::DL_INTERVAL_MINUTE_TO_SECOND);
+
+static const std::vector<exec::user::OrderBySupport> s_orderBySupport = boost::assign::list_of
+		(exec::user::OB_UNRELATED)(exec::user::OB_EXPRESSION);
+
+static const std::vector<exec::user::OuterJoinSupport> s_outerJoinSupport = boost::assign::list_of
+		(exec::user::OJ_LEFT)(exec::user::OJ_RIGHT)(exec::user::OJ_FULL);
+
+static const std::vector<exec::user::SubQuerySupport> s_subQuerySupport = boost::assign::list_of
+		(exec::user::SQ_CORRELATED)(exec::user::SQ_IN_COMPARISON)(exec::user::SQ_IN_EXISTS)
+		(exec::user::SQ_IN_QUANTIFIED);
+
+static const std::vector<exec::user::UnionSupport> s_unionSupport = boost::assign::list_of
+		(exec::user::U_UNION)(exec::user::U_UNION_ALL);
+
+static exec::user::ConvertSupport ConvertSupport(common::MinorType from, common::MinorType to) {
+	exec::user::ConvertSupport convertSupport;
+	convertSupport.set_from(from);
+	convertSupport.set_to(to);
+
+	return convertSupport;
+}
+
+static const convert_support_set s_convertMap = boost::assign::list_of
+		(ConvertSupport(common::TINYINT, common::INT))
+		(ConvertSupport(common::TINYINT, common::BIGINT))
+		(ConvertSupport(common::TINYINT, common::DECIMAL9))
+		(ConvertSupport(common::TINYINT, common::DECIMAL18))
+		(ConvertSupport(common::TINYINT, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::TINYINT, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::TINYINT, common::DATE))
+		(ConvertSupport(common::TINYINT, common::TIME))
+		(ConvertSupport(common::TINYINT, common::TIMESTAMP))
+		(ConvertSupport(common::TINYINT, common::INTERVAL))
+		(ConvertSupport(common::TINYINT, common::FLOAT4))
+		(ConvertSupport(common::TINYINT, common::FLOAT8))
+		(ConvertSupport(common::TINYINT, common::BIT))
+		(ConvertSupport(common::TINYINT, common::VARCHAR))
+		(ConvertSupport(common::TINYINT, common::VAR16CHAR))
+		(ConvertSupport(common::TINYINT, common::VARBINARY))
+		(ConvertSupport(common::TINYINT, common::INTERVALYEAR))
+		(ConvertSupport(common::TINYINT, common::INTERVALDAY))
+		(ConvertSupport(common::SMALLINT, common::INT))
+		(ConvertSupport(common::SMALLINT, common::BIGINT))
+		(ConvertSupport(common::SMALLINT, common::DECIMAL9))
+		(ConvertSupport(common::SMALLINT, common::DECIMAL18))
+		(ConvertSupport(common::SMALLINT, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::SMALLINT, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::SMALLINT, common::DATE))
+		(ConvertSupport(common::SMALLINT, common::TIME))
+		(ConvertSupport(common::SMALLINT, common::TIMESTAMP))
+		(ConvertSupport(common::SMALLINT, common::INTERVAL))
+		(ConvertSupport(common::SMALLINT, common::FLOAT4))
+		(ConvertSupport(common::SMALLINT, common::FLOAT8))
+		(ConvertSupport(common::SMALLINT, common::BIT))
+		(ConvertSupport(common::SMALLINT, common::VARCHAR))
+		(ConvertSupport(common::SMALLINT, common::VAR16CHAR))
+		(ConvertSupport(common::SMALLINT, common::VARBINARY))
+		(ConvertSupport(common::SMALLINT, common::INTERVALYEAR))
+		(ConvertSupport(common::SMALLINT, common::INTERVALDAY))
+		(ConvertSupport(common::INT, common::INT))
+		(ConvertSupport(common::INT, common::BIGINT))
+		(ConvertSupport(common::INT, common::DECIMAL9))
+		(ConvertSupport(common::INT, common::DECIMAL18))
+		(ConvertSupport(common::INT, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::INT, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::INT, common::DATE))
+		(ConvertSupport(common::INT, common::TIME))
+		(ConvertSupport(common::INT, common::TIMESTAMP))
+		(ConvertSupport(common::INT, common::INTERVAL))
+		(ConvertSupport(common::INT, common::FLOAT4))
+		(ConvertSupport(common::INT, common::FLOAT8))
+		(ConvertSupport(common::INT, common::BIT))
+		(ConvertSupport(common::INT, common::VARCHAR))
+		(ConvertSupport(common::INT, common::VAR16CHAR))
+		(ConvertSupport(common::INT, common::VARBINARY))
+		(ConvertSupport(common::INT, common::INTERVALYEAR))
+		(ConvertSupport(common::INT, common::INTERVALDAY))
+		(ConvertSupport(common::BIGINT, common::INT))
+		(ConvertSupport(common::BIGINT, common::BIGINT))
+		(ConvertSupport(common::BIGINT, common::DECIMAL9))
+		(ConvertSupport(common::BIGINT, common::DECIMAL18))
+		(ConvertSupport(common::BIGINT, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::BIGINT, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::BIGINT, common::DATE))
+		(ConvertSupport(common::BIGINT, common::TIME))
+		(ConvertSupport(common::BIGINT, common::TIMESTAMP))
+		(ConvertSupport(common::BIGINT, common::INTERVAL))
+		(ConvertSupport(common::BIGINT, common::FLOAT4))
+		(ConvertSupport(common::BIGINT, common::FLOAT8))
+		(ConvertSupport(common::BIGINT, common::BIT))
+		(ConvertSupport(common::BIGINT, common::VARCHAR))
+		(ConvertSupport(common::BIGINT, common::VAR16CHAR))
+		(ConvertSupport(common::BIGINT, common::VARBINARY))
+		(ConvertSupport(common::BIGINT, common::INTERVALYEAR))
+		(ConvertSupport(common::BIGINT, common::INTERVALDAY))
+		(ConvertSupport(common::DECIMAL9, common::INT))
+		(ConvertSupport(common::DECIMAL9, common::BIGINT))
+		(ConvertSupport(common::DECIMAL9, common::DECIMAL9))
+		(ConvertSupport(common::DECIMAL9, common::DECIMAL18))
+		(ConvertSupport(common::DECIMAL9, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::DECIMAL9, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::DECIMAL9, common::DATE))
+		(ConvertSupport(common::DECIMAL9, common::TIME))
+		(ConvertSupport(common::DECIMAL9, common::TIMESTAMP))
+		(ConvertSupport(common::DECIMAL9, common::INTERVAL))
+		(ConvertSupport(common::DECIMAL9, common::FLOAT4))
+		(ConvertSupport(common::DECIMAL9, common::FLOAT8))
+		(ConvertSupport(common::DECIMAL9, common::BIT))
+		(ConvertSupport(common::DECIMAL9, common::VARCHAR))
+		(ConvertSupport(common::DECIMAL9, common::VAR16CHAR))
+		(ConvertSupport(common::DECIMAL9, common::VARBINARY))
+		(ConvertSupport(common::DECIMAL9, common::INTERVALYEAR))
+		(ConvertSupport(common::DECIMAL9, common::INTERVALDAY))
+		(ConvertSupport(common::DECIMAL18, common::INT))
+		(ConvertSupport(common::DECIMAL18, common::BIGINT))
+		(ConvertSupport(common::DECIMAL18, common::DECIMAL9))
+		(ConvertSupport(common::DECIMAL18, common::DECIMAL18))
+		(ConvertSupport(common::DECIMAL18, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::DECIMAL18, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::DECIMAL18, common::DATE))
+		(ConvertSupport(common::DECIMAL18, common::TIME))
+		(ConvertSupport(common::DECIMAL18, common::TIMESTAMP))
+		(ConvertSupport(common::DECIMAL18, common::INTERVAL))
+		(ConvertSupport(common::DECIMAL18, common::FLOAT4))
+		(ConvertSupport(common::DECIMAL18, common::FLOAT8))
+		(ConvertSupport(common::DECIMAL18, common::BIT))
+		(ConvertSupport(common::DECIMAL18, common::VARCHAR))
+		(ConvertSupport(common::DECIMAL18, common::VAR16CHAR))
+		(ConvertSupport(common::DECIMAL18, common::VARBINARY))
+		(ConvertSupport(common::DECIMAL18, common::INTERVALYEAR))
+		(ConvertSupport(common::DECIMAL18, common::INTERVALDAY))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::INT))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::BIGINT))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::DECIMAL9))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::DECIMAL18))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::DATE))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::TIME))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::TIMESTAMP))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::INTERVAL))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::FLOAT4))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::FLOAT8))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::BIT))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::VARCHAR))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::VAR16CHAR))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::VARBINARY))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::INTERVALYEAR))
+		(ConvertSupport(common::DECIMAL28SPARSE, common::INTERVALDAY))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::INT))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::BIGINT))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::DECIMAL9))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::DECIMAL18))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::DATE))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::TIME))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::TIMESTAMP))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::INTERVAL))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::FLOAT4))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::FLOAT8))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::BIT))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::VARCHAR))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::VAR16CHAR))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::VARBINARY))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::INTERVALYEAR))
+		(ConvertSupport(common::DECIMAL38SPARSE, common::INTERVALDAY))
+		(ConvertSupport(common::MONEY, common::INT))
+		(ConvertSupport(common::MONEY, common::BIGINT))
+		(ConvertSupport(common::MONEY, common::DECIMAL9))
+		(ConvertSupport(common::MONEY, common::DECIMAL18))
+		(ConvertSupport(common::MONEY, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::MONEY, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::MONEY, common::DATE))
+		(ConvertSupport(common::MONEY, common::TIME))
+		(ConvertSupport(common::MONEY, common::TIMESTAMP))
+		(ConvertSupport(common::MONEY, common::INTERVAL))
+		(ConvertSupport(common::MONEY, common::FLOAT4))
+		(ConvertSupport(common::MONEY, common::FLOAT8))
+		(ConvertSupport(common::MONEY, common::BIT))
+		(ConvertSupport(common::MONEY, common::VARCHAR))
+		(ConvertSupport(common::MONEY, common::VAR16CHAR))
+		(ConvertSupport(common::MONEY, common::VARBINARY))
+		(ConvertSupport(common::MONEY, common::INTERVALYEAR))
+		(ConvertSupport(common::MONEY, common::INTERVALDAY))
+		(ConvertSupport(common::DATE, common::INT))
+		(ConvertSupport(common::DATE, common::BIGINT))
+		(ConvertSupport(common::DATE, common::DECIMAL9))
+		(ConvertSupport(common::DATE, common::DECIMAL18))
+		(ConvertSupport(common::DATE, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::DATE, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::DATE, common::DATE))
+		(ConvertSupport(common::DATE, common::TIME))
+		(ConvertSupport(common::DATE, common::TIMESTAMP))
+		(ConvertSupport(common::DATE, common::INTERVAL))
+		(ConvertSupport(common::DATE, common::FLOAT4))
+		(ConvertSupport(common::DATE, common::FLOAT8))
+		(ConvertSupport(common::DATE, common::BIT))
+		(ConvertSupport(common::DATE, common::VARCHAR))
+		(ConvertSupport(common::DATE, common::VAR16CHAR))
+		(ConvertSupport(common::DATE, common::VARBINARY))
+		(ConvertSupport(common::DATE, common::INTERVALYEAR))
+		(ConvertSupport(common::DATE, common::INTERVALDAY))
+		(ConvertSupport(common::TIME, common::INT))
+		(ConvertSupport(common::TIME, common::BIGINT))
+		(ConvertSupport(common::TIME, common::DECIMAL9))
+		(ConvertSupport(common::TIME, common::DECIMAL18))
+		(ConvertSupport(common::TIME, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::TIME, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::TIME, common::DATE))
+		(ConvertSupport(common::TIME, common::TIME))
+		(ConvertSupport(common::TIME, common::TIMESTAMP))
+		(ConvertSupport(common::TIME, common::INTERVAL))
+		(ConvertSupport(common::TIME, common::FLOAT4))
+		(ConvertSupport(common::TIME, common::FLOAT8))
+		(ConvertSupport(common::TIME, common::BIT))
+		(ConvertSupport(common::TIME, common::VARCHAR))
+		(ConvertSupport(common::TIME, common::VAR16CHAR))
+		(ConvertSupport(common::TIME, common::VARBINARY))
+		(ConvertSupport(common::TIME, common::INTERVALYEAR))
+		(ConvertSupport(common::TIME, common::INTERVALDAY))
+		(ConvertSupport(common::TIMESTAMPTZ, common::INT))
+		(ConvertSupport(common::TIMESTAMPTZ, common::BIGINT))
+		(ConvertSupport(common::TIMESTAMPTZ, common::DECIMAL9))
+		(ConvertSupport(common::TIMESTAMPTZ, common::DECIMAL18))
+		(ConvertSupport(common::TIMESTAMPTZ, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::TIMESTAMPTZ, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::TIMESTAMPTZ, common::DATE))
+		(ConvertSupport(common::TIMESTAMPTZ, common::TIME))
+		(ConvertSupport(common::TIMESTAMPTZ, common::TIMESTAMP))
+		(ConvertSupport(common::TIMESTAMPTZ, common::INTERVAL))
+		(ConvertSupport(common::TIMESTAMPTZ, common::FLOAT4))
+		(ConvertSupport(common::TIMESTAMPTZ, common::FLOAT8))
+		(ConvertSupport(common::TIMESTAMPTZ, common::BIT))
+		(ConvertSupport(common::TIMESTAMPTZ, common::VARCHAR))
+		(ConvertSupport(common::TIMESTAMPTZ, common::VAR16CHAR))
+		(ConvertSupport(common::TIMESTAMPTZ, common::VARBINARY))
+		(ConvertSupport(common::TIMESTAMPTZ, common::INTERVALYEAR))
+		(ConvertSupport(common::TIMESTAMPTZ, common::INTERVALDAY))
+		(ConvertSupport(common::TIMESTAMP, common::INT))
+		(ConvertSupport(common::TIMESTAMP, common::BIGINT))
+		(ConvertSupport(common::TIMESTAMP, common::DECIMAL9))
+		(ConvertSupport(common::TIMESTAMP, common::DECIMAL18))
+		(ConvertSupport(common::TIMESTAMP, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::TIMESTAMP, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::TIMESTAMP, common::DATE))
+		(ConvertSupport(common::TIMESTAMP, common::TIME))
+		(ConvertSupport(common::TIMESTAMP, common::TIMESTAMP))
+		(ConvertSupport(common::TIMESTAMP, common::INTERVAL))
+		(ConvertSupport(common::TIMESTAMP, common::FLOAT4))
+		(ConvertSupport(common::TIMESTAMP, common::FLOAT8))
+		(ConvertSupport(common::TIMESTAMP, common::BIT))
+		(ConvertSupport(common::TIMESTAMP, common::VARCHAR))
+		(ConvertSupport(common::TIMESTAMP, common::VAR16CHAR))
+		(ConvertSupport(common::TIMESTAMP, common::VARBINARY))
+		(ConvertSupport(common::TIMESTAMP, common::INTERVALYEAR))
+		(ConvertSupport(common::TIMESTAMP, common::INTERVALDAY))
+		(ConvertSupport(common::INTERVAL, common::INT))
+		(ConvertSupport(common::INTERVAL, common::BIGINT))
+		(ConvertSupport(common::INTERVAL, common::DECIMAL9))
+		(ConvertSupport(common::INTERVAL, common::DECIMAL18))
+		(ConvertSupport(common::INTERVAL, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::INTERVAL, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::INTERVAL, common::DATE))
+		(ConvertSupport(common::INTERVAL, common::TIME))
+		(ConvertSupport(common::INTERVAL, common::TIMESTAMP))
+		(ConvertSupport(common::INTERVAL, common::INTERVAL))
+		(ConvertSupport(common::INTERVAL, common::FLOAT4))
+		(ConvertSupport(common::INTERVAL, common::FLOAT8))
+		(ConvertSupport(common::INTERVAL, common::BIT))
+		(ConvertSupport(common::INTERVAL, common::VARCHAR))
+		(ConvertSupport(common::INTERVAL, common::VAR16CHAR))
+		(ConvertSupport(common::INTERVAL, common::VARBINARY))
+		(ConvertSupport(common::INTERVAL, common::INTERVALYEAR))
+		(ConvertSupport(common::INTERVAL, common::INTERVALDAY))
+		(ConvertSupport(common::FLOAT4, common::INT))
+		(ConvertSupport(common::FLOAT4, common::BIGINT))
+		(ConvertSupport(common::FLOAT4, common::DECIMAL9))
+		(ConvertSupport(common::FLOAT4, common::DECIMAL18))
+		(ConvertSupport(common::FLOAT4, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::FLOAT4, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::FLOAT4, common::DATE))
+		(ConvertSupport(common::FLOAT4, common::TIME))
+		(ConvertSupport(common::FLOAT4, common::TIMESTAMP))
+		(ConvertSupport(common::FLOAT4, common::INTERVAL))
+		(ConvertSupport(common::FLOAT4, common::FLOAT4))
+		(ConvertSupport(common::FLOAT4, common::FLOAT8))
+		(ConvertSupport(common::FLOAT4, common::BIT))
+		(ConvertSupport(common::FLOAT4, common::VARCHAR))
+		(ConvertSupport(common::FLOAT4, common::VAR16CHAR))
+		(ConvertSupport(common::FLOAT4, common::VARBINARY))
+		(ConvertSupport(common::FLOAT4, common::INTERVALYEAR))
+		(ConvertSupport(common::FLOAT4, common::INTERVALDAY))
+		(ConvertSupport(common::FLOAT8, common::INT))
+		(ConvertSupport(common::FLOAT8, common::BIGINT))
+		(ConvertSupport(common::FLOAT8, common::DECIMAL9))
+		(ConvertSupport(common::FLOAT8, common::DECIMAL18))
+		(ConvertSupport(common::FLOAT8, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::FLOAT8, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::FLOAT8, common::DATE))
+		(ConvertSupport(common::FLOAT8, common::TIME))
+		(ConvertSupport(common::FLOAT8, common::TIMESTAMP))
+		(ConvertSupport(common::FLOAT8, common::INTERVAL))
+		(ConvertSupport(common::FLOAT8, common::FLOAT4))
+		(ConvertSupport(common::FLOAT8, common::FLOAT8))
+		(ConvertSupport(common::FLOAT8, common::BIT))
+		(ConvertSupport(common::FLOAT8, common::VARCHAR))
+		(ConvertSupport(common::FLOAT8, common::VAR16CHAR))
+		(ConvertSupport(common::FLOAT8, common::VARBINARY))
+		(ConvertSupport(common::FLOAT8, common::INTERVALYEAR))
+		(ConvertSupport(common::FLOAT8, common::INTERVALDAY))
+		(ConvertSupport(common::BIT, common::TINYINT))
+		(ConvertSupport(common::BIT, common::INT))
+		(ConvertSupport(common::BIT, common::BIGINT))
+		(ConvertSupport(common::BIT, common::DECIMAL9))
+		(ConvertSupport(common::BIT, common::DECIMAL18))
+		(ConvertSupport(common::BIT, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::BIT, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::BIT, common::DATE))
+		(ConvertSupport(common::BIT, common::TIME))
+		(ConvertSupport(common::BIT, common::TIMESTAMP))
+		(ConvertSupport(common::BIT, common::INTERVAL))
+		(ConvertSupport(common::BIT, common::FLOAT4))
+		(ConvertSupport(common::BIT, common::FLOAT8))
+		(ConvertSupport(common::BIT, common::BIT))
+		(ConvertSupport(common::BIT, common::VARCHAR))
+		(ConvertSupport(common::BIT, common::VAR16CHAR))
+		(ConvertSupport(common::BIT, common::VARBINARY))
+		(ConvertSupport(common::BIT, common::INTERVALYEAR))
+		(ConvertSupport(common::BIT, common::INTERVALDAY))
+		(ConvertSupport(common::FIXEDCHAR, common::TINYINT))
+		(ConvertSupport(common::FIXEDCHAR, common::INT))
+		(ConvertSupport(common::FIXEDCHAR, common::BIGINT))
+		(ConvertSupport(common::FIXEDCHAR, common::DECIMAL9))
+		(ConvertSupport(common::FIXEDCHAR, common::DECIMAL18))
+		(ConvertSupport(common::FIXEDCHAR, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::FIXEDCHAR, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::FIXEDCHAR, common::DATE))
+		(ConvertSupport(common::FIXEDCHAR, common::TIME))
+		(ConvertSupport(common::FIXEDCHAR, common::TIMESTAMP))
+		(ConvertSupport(common::FIXEDCHAR, common::INTERVAL))
+		(ConvertSupport(common::FIXEDCHAR, common::FLOAT4))
+		(ConvertSupport(common::FIXEDCHAR, common::FLOAT8))
+		(ConvertSupport(common::FIXEDCHAR, common::BIT))
+		(ConvertSupport(common::FIXEDCHAR, common::VARCHAR))
+		(ConvertSupport(common::FIXEDCHAR, common::VAR16CHAR))
+		(ConvertSupport(common::FIXEDCHAR, common::VARBINARY))
+		(ConvertSupport(common::FIXEDCHAR, common::INTERVALYEAR))
+		(ConvertSupport(common::FIXEDCHAR, common::INTERVALDAY))
+		(ConvertSupport(common::FIXED16CHAR, common::TINYINT))
+		(ConvertSupport(common::FIXED16CHAR, common::INT))
+		(ConvertSupport(common::FIXED16CHAR, common::BIGINT))
+		(ConvertSupport(common::FIXED16CHAR, common::DECIMAL9))
+		(ConvertSupport(common::FIXED16CHAR, common::DECIMAL18))
+		(ConvertSupport(common::FIXED16CHAR, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::FIXED16CHAR, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::FIXED16CHAR, common::DATE))
+		(ConvertSupport(common::FIXED16CHAR, common::TIME))
+		(ConvertSupport(common::FIXED16CHAR, common::TIMESTAMP))
+		(ConvertSupport(common::FIXED16CHAR, common::INTERVAL))
+		(ConvertSupport(common::FIXED16CHAR, common::FLOAT4))
+		(ConvertSupport(common::FIXED16CHAR, common::FLOAT8))
+		(ConvertSupport(common::FIXED16CHAR, common::BIT))
+		(ConvertSupport(common::FIXED16CHAR, common::VARCHAR))
+		(ConvertSupport(common::FIXED16CHAR, common::VAR16CHAR))
+		(ConvertSupport(common::FIXED16CHAR, common::VARBINARY))
+		(ConvertSupport(common::FIXED16CHAR, common::INTERVALYEAR))
+		(ConvertSupport(common::FIXED16CHAR, common::INTERVALDAY))
+		(ConvertSupport(common::FIXEDBINARY, common::INT))
+		(ConvertSupport(common::FIXEDBINARY, common::BIGINT))
+		(ConvertSupport(common::FIXEDBINARY, common::DECIMAL9))
+		(ConvertSupport(common::FIXEDBINARY, common::DECIMAL18))
+		(ConvertSupport(common::FIXEDBINARY, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::FIXEDBINARY, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::FIXEDBINARY, common::DATE))
+		(ConvertSupport(common::FIXEDBINARY, common::TIME))
+		(ConvertSupport(common::FIXEDBINARY, common::TIMESTAMP))
+		(ConvertSupport(common::FIXEDBINARY, common::INTERVAL))
+		(ConvertSupport(common::FIXEDBINARY, common::FLOAT4))
+		(ConvertSupport(common::FIXEDBINARY, common::FLOAT8))
+		(ConvertSupport(common::FIXEDBINARY, common::BIT))
+		(ConvertSupport(common::FIXEDBINARY, common::VARCHAR))
+		(ConvertSupport(common::FIXEDBINARY, common::VAR16CHAR))
+		(ConvertSupport(common::FIXEDBINARY, common::VARBINARY))
+		(ConvertSupport(common::FIXEDBINARY, common::INTERVALYEAR))
+		(ConvertSupport(common::FIXEDBINARY, common::INTERVALDAY))
+		(ConvertSupport(common::VARCHAR, common::TINYINT))
+		(ConvertSupport(common::VARCHAR, common::INT))
+		(ConvertSupport(common::VARCHAR, common::BIGINT))
+		(ConvertSupport(common::VARCHAR, common::DECIMAL9))
+		(ConvertSupport(common::VARCHAR, common::DECIMAL18))
+		(ConvertSupport(common::VARCHAR, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::VARCHAR, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::VARCHAR, common::DATE))
+		(ConvertSupport(common::VARCHAR, common::TIME))
+		(ConvertSupport(common::VARCHAR, common::TIMESTAMP))
+		(ConvertSupport(common::VARCHAR, common::INTERVAL))
+		(ConvertSupport(common::VARCHAR, common::FLOAT4))
+		(ConvertSupport(common::VARCHAR, common::FLOAT8))
+		(ConvertSupport(common::VARCHAR, common::BIT))
+		(ConvertSupport(common::VARCHAR, common::VARCHAR))
+		(ConvertSupport(common::VARCHAR, common::VAR16CHAR))
+		(ConvertSupport(common::VARCHAR, common::VARBINARY))
+		(ConvertSupport(common::VARCHAR, common::INTERVALYEAR))
+		(ConvertSupport(common::VARCHAR, common::INTERVALDAY))
+		(ConvertSupport(common::VAR16CHAR, common::TINYINT))
+		(ConvertSupport(common::VAR16CHAR, common::INT))
+		(ConvertSupport(common::VAR16CHAR, common::BIGINT))
+		(ConvertSupport(common::VAR16CHAR, common::DECIMAL9))
+		(ConvertSupport(common::VAR16CHAR, common::DECIMAL18))
+		(ConvertSupport(common::VAR16CHAR, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::VAR16CHAR, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::VAR16CHAR, common::DATE))
+		(ConvertSupport(common::VAR16CHAR, common::TIME))
+		(ConvertSupport(common::VAR16CHAR, common::TIMESTAMP))
+		(ConvertSupport(common::VAR16CHAR, common::INTERVAL))
+		(ConvertSupport(common::VAR16CHAR, common::FLOAT4))
+		(ConvertSupport(common::VAR16CHAR, common::FLOAT8))
+		(ConvertSupport(common::VAR16CHAR, common::BIT))
+		(ConvertSupport(common::VAR16CHAR, common::VARCHAR))
+		(ConvertSupport(common::VAR16CHAR, common::VARBINARY))
+		(ConvertSupport(common::VAR16CHAR, common::INTERVALYEAR))
+		(ConvertSupport(common::VAR16CHAR, common::INTERVALDAY))
+		(ConvertSupport(common::VARBINARY, common::TINYINT))
+		(ConvertSupport(common::VARBINARY, common::INT))
+		(ConvertSupport(common::VARBINARY, common::BIGINT))
+		(ConvertSupport(common::VARBINARY, common::DECIMAL9))
+		(ConvertSupport(common::VARBINARY, common::DECIMAL18))
+		(ConvertSupport(common::VARBINARY, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::VARBINARY, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::VARBINARY, common::DATE))
+		(ConvertSupport(common::VARBINARY, common::TIME))
+		(ConvertSupport(common::VARBINARY, common::TIMESTAMP))
+		(ConvertSupport(common::VARBINARY, common::INTERVAL))
+		(ConvertSupport(common::VARBINARY, common::FLOAT4))
+		(ConvertSupport(common::VARBINARY, common::FLOAT8))
+		(ConvertSupport(common::VARBINARY, common::BIT))
+		(ConvertSupport(common::VARBINARY, common::VARCHAR))
+		(ConvertSupport(common::VARBINARY, common::VAR16CHAR))
+		(ConvertSupport(common::VARBINARY, common::VARBINARY))
+		(ConvertSupport(common::VARBINARY, common::INTERVALYEAR))
+		(ConvertSupport(common::VARBINARY, common::INTERVALDAY))
+		(ConvertSupport(common::UINT1, common::INT))
+		(ConvertSupport(common::UINT1, common::BIGINT))
+		(ConvertSupport(common::UINT1, common::DECIMAL9))
+		(ConvertSupport(common::UINT1, common::DECIMAL18))
+		(ConvertSupport(common::UINT1, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::UINT1, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::UINT1, common::DATE))
+		(ConvertSupport(common::UINT1, common::TIME))
+		(ConvertSupport(common::UINT1, common::TIMESTAMP))
+		(ConvertSupport(common::UINT1, common::INTERVAL))
+		(ConvertSupport(common::UINT1, common::FLOAT4))
+		(ConvertSupport(common::UINT1, common::FLOAT8))
+		(ConvertSupport(common::UINT1, common::BIT))
+		(ConvertSupport(common::UINT1, common::VARCHAR))
+		(ConvertSupport(common::UINT1, common::VAR16CHAR))
+		(ConvertSupport(common::UINT1, common::VARBINARY))
+		(ConvertSupport(common::UINT1, common::INTERVALYEAR))
+		(ConvertSupport(common::UINT1, common::INTERVALDAY))
+		(ConvertSupport(common::UINT2, common::INT))
+		(ConvertSupport(common::UINT2, common::BIGINT))
+		(ConvertSupport(common::UINT2, common::DECIMAL9))
+		(ConvertSupport(common::UINT2, common::DECIMAL18))
+		(ConvertSupport(common::UINT2, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::UINT2, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::UINT2, common::DATE))
+		(ConvertSupport(common::UINT2, common::TIME))
+		(ConvertSupport(common::UINT2, common::TIMESTAMP))
+		(ConvertSupport(common::UINT2, common::INTERVAL))
+		(ConvertSupport(common::UINT2, common::FLOAT4))
+		(ConvertSupport(common::UINT2, common::FLOAT8))
+		(ConvertSupport(common::UINT2, common::BIT))
+		(ConvertSupport(common::UINT2, common::VARCHAR))
+		(ConvertSupport(common::UINT2, common::VAR16CHAR))
+		(ConvertSupport(common::UINT2, common::VARBINARY))
+		(ConvertSupport(common::UINT2, common::INTERVALYEAR))
+		(ConvertSupport(common::UINT2, common::INTERVALDAY))
+		(ConvertSupport(common::UINT4, common::INT))
+		(ConvertSupport(common::UINT4, common::BIGINT))
+		(ConvertSupport(common::UINT4, common::DECIMAL9))
+		(ConvertSupport(common::UINT4, common::DECIMAL18))
+		(ConvertSupport(common::UINT4, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::UINT4, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::UINT4, common::DATE))
+		(ConvertSupport(common::UINT4, common::TIME))
+		(ConvertSupport(common::UINT4, common::TIMESTAMP))
+		(ConvertSupport(common::UINT4, common::INTERVAL))
+		(ConvertSupport(common::UINT4, common::FLOAT4))
+		(ConvertSupport(common::UINT4, common::FLOAT8))
+		(ConvertSupport(common::UINT4, common::BIT))
+		(ConvertSupport(common::UINT4, common::VARCHAR))
+		(ConvertSupport(common::UINT4, common::VAR16CHAR))
+		(ConvertSupport(common::UINT4, common::VARBINARY))
+		(ConvertSupport(common::UINT4, common::INTERVALYEAR))
+		(ConvertSupport(common::UINT4, common::INTERVALDAY))
+		(ConvertSupport(common::UINT8, common::INT))
+		(ConvertSupport(common::UINT8, common::BIGINT))
+		(ConvertSupport(common::UINT8, common::DECIMAL9))
+		(ConvertSupport(common::UINT8, common::DECIMAL18))
+		(ConvertSupport(common::UINT8, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::UINT8, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::UINT8, common::DATE))
+		(ConvertSupport(common::UINT8, common::TIME))
+		(ConvertSupport(common::UINT8, common::TIMESTAMP))
+		(ConvertSupport(common::UINT8, common::INTERVAL))
+		(ConvertSupport(common::UINT8, common::FLOAT4))
+		(ConvertSupport(common::UINT8, common::FLOAT8))
+		(ConvertSupport(common::UINT8, common::BIT))
+		(ConvertSupport(common::UINT8, common::VARCHAR))
+		(ConvertSupport(common::UINT8, common::VAR16CHAR))
+		(ConvertSupport(common::UINT8, common::VARBINARY))
+		(ConvertSupport(common::UINT8, common::INTERVALYEAR))
+		(ConvertSupport(common::UINT8, common::INTERVALDAY))
+		(ConvertSupport(common::DECIMAL28DENSE, common::INT))
+		(ConvertSupport(common::DECIMAL28DENSE, common::BIGINT))
+		(ConvertSupport(common::DECIMAL28DENSE, common::DECIMAL9))
+		(ConvertSupport(common::DECIMAL28DENSE, common::DECIMAL18))
+		(ConvertSupport(common::DECIMAL28DENSE, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::DECIMAL28DENSE, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::DECIMAL28DENSE, common::DATE))
+		(ConvertSupport(common::DECIMAL28DENSE, common::TIME))
+		(ConvertSupport(common::DECIMAL28DENSE, common::TIMESTAMP))
+		(ConvertSupport(common::DECIMAL28DENSE, common::INTERVAL))
+		(ConvertSupport(common::DECIMAL28DENSE, common::FLOAT4))
+		(ConvertSupport(common::DECIMAL28DENSE, common::FLOAT8))
+		(ConvertSupport(common::DECIMAL28DENSE, common::BIT))
+		(ConvertSupport(common::DECIMAL28DENSE, common::VARCHAR))
+		(ConvertSupport(common::DECIMAL28DENSE, common::VAR16CHAR))
+		(ConvertSupport(common::DECIMAL28DENSE, common::VARBINARY))
+		(ConvertSupport(common::DECIMAL28DENSE, common::INTERVALYEAR))
+		(ConvertSupport(common::DECIMAL28DENSE, common::INTERVALDAY))
+		(ConvertSupport(common::DECIMAL38DENSE, common::INT))
+		(ConvertSupport(common::DECIMAL38DENSE, common::BIGINT))
+		(ConvertSupport(common::DECIMAL38DENSE, common::DECIMAL9))
+		(ConvertSupport(common::DECIMAL38DENSE, common::DECIMAL18))
+		(ConvertSupport(common::DECIMAL38DENSE, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::DECIMAL38DENSE, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::DECIMAL38DENSE, common::DATE))
+		(ConvertSupport(common::DECIMAL38DENSE, common::TIME))
+		(ConvertSupport(common::DECIMAL38DENSE, common::TIMESTAMP))
+		(ConvertSupport(common::DECIMAL38DENSE, common::INTERVAL))
+		(ConvertSupport(common::DECIMAL38DENSE, common::FLOAT4))
+		(ConvertSupport(common::DECIMAL38DENSE, common::FLOAT8))
+		(ConvertSupport(common::DECIMAL38DENSE, common::BIT))
+		(ConvertSupport(common::DECIMAL38DENSE, common::VARCHAR))
+		(ConvertSupport(common::DECIMAL38DENSE, common::VAR16CHAR))
+		(ConvertSupport(common::DECIMAL38DENSE, common::VARBINARY))
+		(ConvertSupport(common::DECIMAL38DENSE, common::INTERVALYEAR))
+		(ConvertSupport(common::DECIMAL38DENSE, common::INTERVALDAY))
+		(ConvertSupport(common::DM_UNKNOWN, common::TINYINT))
+		(ConvertSupport(common::DM_UNKNOWN, common::INT))
+		(ConvertSupport(common::DM_UNKNOWN, common::BIGINT))
+		(ConvertSupport(common::DM_UNKNOWN, common::DECIMAL9))
+		(ConvertSupport(common::DM_UNKNOWN, common::DECIMAL18))
+		(ConvertSupport(common::DM_UNKNOWN, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::DM_UNKNOWN, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::DM_UNKNOWN, common::DATE))
+		(ConvertSupport(common::DM_UNKNOWN, common::TIME))
+		(ConvertSupport(common::DM_UNKNOWN, common::TIMESTAMP))
+		(ConvertSupport(common::DM_UNKNOWN, common::INTERVAL))
+		(ConvertSupport(common::DM_UNKNOWN, common::FLOAT4))
+		(ConvertSupport(common::DM_UNKNOWN, common::FLOAT8))
+		(ConvertSupport(common::DM_UNKNOWN, common::BIT))
+		(ConvertSupport(common::DM_UNKNOWN, common::VARCHAR))
+		(ConvertSupport(common::DM_UNKNOWN, common::VAR16CHAR))
+		(ConvertSupport(common::DM_UNKNOWN, common::VARBINARY))
+		(ConvertSupport(common::DM_UNKNOWN, common::INTERVALYEAR))
+		(ConvertSupport(common::DM_UNKNOWN, common::INTERVALDAY))
+		(ConvertSupport(common::INTERVALYEAR, common::INT))
+		(ConvertSupport(common::INTERVALYEAR, common::BIGINT))
+		(ConvertSupport(common::INTERVALYEAR, common::DECIMAL9))
+		(ConvertSupport(common::INTERVALYEAR, common::DECIMAL18))
+		(ConvertSupport(common::INTERVALYEAR, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::INTERVALYEAR, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::INTERVALYEAR, common::DATE))
+		(ConvertSupport(common::INTERVALYEAR, common::TIME))
+		(ConvertSupport(common::INTERVALYEAR, common::TIMESTAMP))
+		(ConvertSupport(common::INTERVALYEAR, common::INTERVAL))
+		(ConvertSupport(common::INTERVALYEAR, common::FLOAT4))
+		(ConvertSupport(common::INTERVALYEAR, common::FLOAT8))
+		(ConvertSupport(common::INTERVALYEAR, common::BIT))
+		(ConvertSupport(common::INTERVALYEAR, common::VARCHAR))
+		(ConvertSupport(common::INTERVALYEAR, common::VAR16CHAR))
+		(ConvertSupport(common::INTERVALYEAR, common::VARBINARY))
+		(ConvertSupport(common::INTERVALYEAR, common::INTERVALYEAR))
+		(ConvertSupport(common::INTERVALYEAR, common::INTERVALDAY))
+		(ConvertSupport(common::INTERVALDAY, common::INT))
+		(ConvertSupport(common::INTERVALDAY, common::BIGINT))
+		(ConvertSupport(common::INTERVALDAY, common::DECIMAL9))
+		(ConvertSupport(common::INTERVALDAY, common::DECIMAL18))
+		(ConvertSupport(common::INTERVALDAY, common::DECIMAL28SPARSE))
+		(ConvertSupport(common::INTERVALDAY, common::DECIMAL38SPARSE))
+		(ConvertSupport(common::INTERVALDAY, common::DATE))
+		(ConvertSupport(common::INTERVALDAY, common::TIME))
+		(ConvertSupport(common::INTERVALDAY, common::TIMESTAMP))
+		(ConvertSupport(common::INTERVALDAY, common::INTERVAL))
+		(ConvertSupport(common::INTERVALDAY, common::FLOAT4))
+		(ConvertSupport(common::INTERVALDAY, common::FLOAT8))
+		(ConvertSupport(common::INTERVALDAY, common::BIT))
+		(ConvertSupport(common::INTERVALDAY, common::VARCHAR))
+		(ConvertSupport(common::INTERVALDAY, common::VAR16CHAR))
+		(ConvertSupport(common::INTERVALDAY, common::VARBINARY))
+		(ConvertSupport(common::INTERVALDAY, common::INTERVALYEAR))
+		(ConvertSupport(common::INTERVALDAY, common::INTERVALDAY));
+
+static exec::user::ServerMeta createDefaultServerMeta() {
+	exec::user::ServerMeta result;
+
+	result.set_all_tables_selectable(false);
+	result.set_blob_included_in_max_row_size(true);
+	result.set_catalog_at_start(true);
+	result.set_catalog_separator(s_catalogSeparator);
+	result.set_catalog_term(s_catalogTerm);
+	result.set_column_aliasing_supported(true);
+	std::copy(s_convertMap.begin(), s_convertMap.end(),
+	          google::protobuf::RepeatedFieldBackInserter(result.mutable_convert_support()));
+	result.set_correlation_names_support(exec::user::CN_ANY);
+	std::copy(s_dateTimeFunctions.begin(), s_dateTimeFunctions.end(),
+			  google::protobuf::RepeatedFieldBackInserter(result.mutable_date_time_functions()));
+	std::copy(s_dateTimeLiterals.begin(), s_dateTimeLiterals.end(),
+			  google::protobuf::RepeatedFieldBackInserter(result.mutable_date_time_literals_support()));
+	result.set_group_by_support(exec::user::GB_UNRELATED);
+	result.set_identifier_casing(exec::user::IC_STORES_MIXED);
+	result.set_identifier_quote_string(s_identifierQuoteString);
+	result.set_like_escape_clause_supported(true);
+	result.set_max_catalog_name_length(s_maxIdentifierSize);
+	result.set_max_column_name_length(s_maxIdentifierSize);
+	result.set_max_cursor_name_length(s_maxIdentifierSize);
+	result.set_max_schema_name_length(s_maxIdentifierSize);
+	result.set_max_table_name_length(s_maxIdentifierSize);
+	result.set_max_user_name_length(s_maxIdentifierSize);
+	result.set_null_collation(exec::user::NC_AT_END);
+	result.set_null_plus_non_null_equals_null(true);
+	std::copy(s_numericFunctions.begin(), s_numericFunctions.end(),
+			  google::protobuf::RepeatedFieldBackInserter(result.mutable_numeric_functions()));
+	std::copy(s_orderBySupport.begin(), s_orderBySupport.end(),
+			  google::protobuf::RepeatedFieldBackInserter(result.mutable_order_by_support()));
+	std::copy(s_outerJoinSupport.begin(), s_outerJoinSupport.end(),
+			  google::protobuf::RepeatedFieldBackInserter(result.mutable_outer_join_support()));
+	result.set_quoted_identifier_casing(exec::user::IC_STORES_MIXED);
+	result.set_read_only(false);
+	result.set_schema_term(s_schemaTerm);
+	result.set_search_escape_string(s_searchEscapeString);
+	result.set_special_characters(s_specialCharacters);
+	std::copy(s_sqlKeywords.begin(), s_sqlKeywords.end(),
+			  google::protobuf::RepeatedFieldBackInserter(result.mutable_sql_keywords()));
+	std::copy(s_stringFunctions.begin(), s_stringFunctions.end(),
+			  google::protobuf::RepeatedFieldBackInserter(result.mutable_string_functions()));
+	std::copy(s_subQuerySupport.begin(), s_subQuerySupport.end(),
+			google::protobuf::RepeatedFieldBackInserter(result.mutable_subquery_support()));
+	std::copy(s_systemFunctions.begin(), s_systemFunctions.end(),
+			  google::protobuf::RepeatedFieldBackInserter(result.mutable_system_functions()));
+	result.set_table_term(s_tableTerm);
+	std::copy(s_unionSupport.begin(), s_unionSupport.end(),
+			  google::protobuf::RepeatedFieldBackInserter(result.mutable_union_support()));
+
+	return result;
+}
+
+static Drill::meta::CollateSupport collateSupport(const google::protobuf::RepeatedField<google::protobuf::int32>& collateSupportList) {
+	Drill::meta::CollateSupport result(Drill::meta::C_NONE);
+
+	for(google::protobuf::RepeatedField<google::protobuf::int32>::const_iterator it = collateSupportList.begin();
+		it != collateSupportList.end();
+		++it) {
+		switch(static_cast<exec::user::CollateSupport>(*it)) {
+		case exec::user::CS_GROUP_BY:
+			result |= Drill::meta::C_GROUPBY;
+			break;
+
+		// ignore unknown
+		case exec::user::CS_UNKNOWN:
+		default:
+			break;
+		}
+	}
+	return result;
+}
+
+static Drill::meta::CorrelationNamesSupport correlationNames(exec::user::CorrelationNamesSupport correlatioNamesSupport) {
+	switch(correlatioNamesSupport) {
+	case exec::user::CN_DIFFERENT_NAMES:
+		return Drill::meta::CN_DIFFERENT_NAMES;
+
+	case exec::user::CN_ANY:
+		return Drill::meta::CN_ANY_NAMES;
+
+	case exec::user::CN_NONE:
+	default:
+		// unknown value
+		return CN_NONE;
+	}
+}
+
+static Drill::meta::DateTimeLiteralSupport dateTimeLiteralsSupport(const google::protobuf::RepeatedField<google::protobuf::int32>& dateTimeLiteralsSupportList) {
+	Drill::meta::DateTimeLiteralSupport result(Drill::meta::DL_NONE);
+
+	for(google::protobuf::RepeatedField<google::protobuf::int32>::const_iterator it = dateTimeLiteralsSupportList.begin();
+			it != dateTimeLiteralsSupportList.end();
+			++it) {
+			switch(static_cast<exec::user::DateTimeLiteralsSupport>(*it)) {
+			case exec::user::DL_DATE:
+				result |= Drill::meta::DL_DATE;
+				break;
+
+			case exec::user::DL_TIME:
+				result |= Drill::meta::DL_TIME;
+				break;
+
+			case exec::user::DL_TIMESTAMP:
+				result |= Drill::meta::DL_TIMESTAMP;
+				break;
+
+			case exec::user::DL_INTERVAL_YEAR:
+				result |= Drill::meta::DL_INTERVAL_YEAR;
+				break;
+
+			case exec::user::DL_INTERVAL_YEAR_TO_MONTH:
+				result |= Drill::meta::DL_INTERVAL_YEAR_TO_MONTH;
+				break;
+
+			case exec::user::DL_INTERVAL_MONTH:
+				result |= Drill::meta::DL_INTERVAL_MONTH;
+				break;
+
+			case exec::user::DL_INTERVAL_DAY:
+				result |= Drill::meta::DL_INTERVAL_DAY;
+				break;
+
+			case exec::user::DL_INTERVAL_DAY_TO_HOUR:
+				result |= Drill::meta::DL_INTERVAL_DAY_TO_HOUR;
+				break;
+
+			case exec::user::DL_INTERVAL_DAY_TO_MINUTE:
+				result |= Drill::meta::DL_INTERVAL_DAY_TO_MINUTE;
+				break;
+
+			case exec::user::DL_INTERVAL_DAY_TO_SECOND:
+				result |= Drill::meta::DL_INTERVAL_DAY_TO_SECOND;
+				break;
+
+			case exec::user::DL_INTERVAL_HOUR:
+				result |= Drill::meta::DL_INTERVAL_HOUR;
+				break;
+
+			case exec::user::DL_INTERVAL_HOUR_TO_MINUTE:
+				result |= Drill::meta::DL_INTERVAL_HOUR_TO_MINUTE;
+				break;
+
+			case exec::user::DL_INTERVAL_HOUR_TO_SECOND:
+				result |= Drill::meta::DL_INTERVAL_HOUR_TO_SECOND;
+				break;
+
+			case exec::user::DL_INTERVAL_MINUTE:
+				result |= Drill::meta::DL_TIMESTAMP;
+				break;
+
+			case exec::user::DL_INTERVAL_MINUTE_TO_SECOND:
+				result |= Drill::meta::DL_TIMESTAMP;
+				break;
+
+			case exec::user::DL_INTERVAL_SECOND:
+				result |= Drill::meta::DL_INTERVAL_SECOND;
+				break;
+
+			// ignore unknown
+			case exec::user::DL_UNKNOWN:
+			default:
+				break;
+			}
+		}
+
+	return result;
+}
+
+static Drill::meta::GroupBySupport groupBySupport(exec::user::GroupBySupport groupBySupport) {
+	switch(groupBySupport) {
+	case exec::user::GB_SELECT_ONLY:
+		return Drill::meta::GB_SELECT_ONLY;
 
-struct FromTo {
-	FromTo(common::MinorType from, common::MinorType to): m_from(from), m_to(to) {}
+	case exec::user::GB_BEYOND_SELECT:
+		return Drill::meta::GB_BEYOND_SELECT;
 
-	common::MinorType m_from;
-	common::MinorType m_to;
-};
+	case exec::user::GB_NONE:
+	default:
+		// unknown value
+		return Drill::meta::GB_NONE;
+	}
+}
+
+static Drill::meta::IdentifierCase identifierCase(exec::user::IdentifierCasing identifierCasing) {
+	switch(identifierCasing) {
+	case exec::user::IC_STORES_LOWER:
+		return Drill::meta::IC_STORES_LOWER;
+
+	case exec::user::IC_STORES_MIXED:
+		return Drill::meta::IC_STORES_MIXED;
+
+	case exec::user::IC_STORES_UPPER:
+		return Drill::meta::IC_STORES_UPPER;
+
+	case exec::user::IC_SUPPORTS_MIXED:
+		return Drill::meta::IC_SUPPORTS_MIXED;
+
+	case exec::user::IC_UNKNOWN:
+	default:
+		// unknown value
+		return Drill::meta::IC_UNKNOWN;
+	}
+}
+
+static Drill::meta::NullCollation nullCollation(exec::user::NullCollation nullCollation) {
+	switch(nullCollation) {
+	case exec::user::NC_AT_END:
+		return Drill::meta::NC_AT_END;
+
+	case exec::user::NC_AT_START:
+		return Drill::meta::NC_AT_START;
+
+	case exec::user::NC_HIGH:
+		return Drill::meta::NC_HIGH;
+
+	case exec::user::NC_LOW:
+		return Drill::meta::NC_LOW;
+
+	case exec::user::NC_UNKNOWN:
+	default:
+		// unknown value
+		return Drill::meta::NC_UNKNOWN;
+	}
+}
+
+static Drill::meta::OuterJoinSupport outerJoinSupport(const google::protobuf::RepeatedField<google::protobuf::int32>& outerJoinSupportList) {
+	Drill::meta::OuterJoinSupport result(Drill::meta::OJ_NONE);
+
+	for(google::protobuf::RepeatedField<google::protobuf::int32>::const_iterator it = outerJoinSupportList.begin();
+			it != outerJoinSupportList.end();
+			++it) {
+			switch(static_cast<exec::user::OuterJoinSupport>(*it)) {
+			case exec::user::OJ_LEFT:
+				result |= Drill::meta::OJ_LEFT;
+				break;
+
+			case exec::user::OJ_RIGHT:
+				result |= Drill::meta::OJ_RIGHT;
+				break;
+
+			case exec::user::OJ_FULL:
+				result |= Drill::meta::OJ_FULL;
+				break;
+
+			case exec::user::OJ_NESTED:
+				result |= Drill::meta::OJ_NESTED;
+				break;
+
+			case exec::user::OJ_INNER:
+				result |= Drill::meta::OJ_INNER;
+				break;
+
+			case exec::user::OJ_NOT_ORDERED:
+				result |= Drill::meta::OJ_NOT_ORDERED;
+				break;
+
+			case exec::user::OJ_ALL_COMPARISON_OPS:
+				result |= Drill::meta::OJ_ALL_COMPARISON_OPS;
+				break;
+
+			// ignore unknown
+			case exec::user::OJ_UNKNOWN:
+			default:
+				break;
+			}
+		}
 
-bool operator==(FromTo const& ft1, FromTo const& ft2) {
-	return ft1.m_from == ft2.m_from && ft1.m_to == ft2.m_to;
+	return result;
 }
 
-std::size_t hash_value(FromTo const& ft) {
-	std::size_t hash = 0;
-	boost::hash_combine(hash, ft.m_from);
-	boost::hash_combine(hash, ft.m_to);
+static Drill::meta::QuotedIdentifierCase quotedIdentifierCase(exec::user::IdentifierCasing identifierCasing) {
+	switch(identifierCasing) {
+	case exec::user::IC_STORES_LOWER:
+		return Drill::meta::QIC_STORES_LOWER;
 
-	return hash;
+	case exec::user::IC_STORES_MIXED:
+		return Drill::meta::QIC_STORES_MIXED;
+
+	case exec::user::IC_STORES_UPPER:
+		return Drill::meta::QIC_STORES_UPPER;
+
+	case exec::user::IC_SUPPORTS_MIXED:
+		return Drill::meta::QIC_SUPPORTS_MIXED;
+
+	case exec::user::IC_UNKNOWN:
+	default:
+		// unknown value
+		return Drill::meta::QIC_UNKNOWN;
+	}
+}
+
+static Drill::meta::SubQuerySupport subQuerySupport(const google::protobuf::RepeatedField<google::protobuf::int32>& subQuerySupportList) {
+	Drill::meta::SubQuerySupport result(Drill::meta::SQ_NONE);
+
+	for(google::protobuf::RepeatedField<google::protobuf::int32>::const_iterator it = subQuerySupportList.begin();
+			it != subQuerySupportList.end();
+			++it) {
+			switch(static_cast<exec::user::SubQuerySupport>(*it)) {
+			case exec::user::SQ_CORRELATED:
+				result |= Drill::meta::SQ_CORRELATED;
+				break;
+
+			case exec::user::SQ_IN_COMPARISON:
+				result |= Drill::meta::SQ_IN_COMPARISON;
+				break;
+
+			case exec::user::SQ_IN_EXISTS:
+				result |= Drill::meta::SQ_IN_EXISTS;
+				break;
+
+			case exec::user::SQ_IN_INSERT:
+				result |= Drill::meta::SQ_IN_INSERT;
+				break;
+
+			case exec::user::SQ_IN_QUANTIFIED:
+				result |= Drill::meta::SQ_IN_QUANTIFIED;
+				break;
+
+			// ignore unknown
+			case exec::user::SQ_UNKNOWN:
+			default:
+				break;
+			}
+		}
+
+	return result;
 }
 
-static boost::unordered_set<FromTo> s_convertMap = boost::assign::list_of
-		(FromTo(common::TINYINT, common::INT))
-		(FromTo(common::TINYINT, common::BIGINT))
-		(FromTo(common::TINYINT, common::DECIMAL9))
-		(FromTo(common::TINYINT, common::DECIMAL18))
-		(FromTo(common::TINYINT, common::DECIMAL28SPARSE))
-		(FromTo(common::TINYINT, common::DECIMAL38SPARSE))
-		(FromTo(common::TINYINT, common::DATE))
-		(FromTo(common::TINYINT, common::TIME))
-		(FromTo(common::TINYINT, common::TIMESTAMP))
-		(FromTo(common::TINYINT, common::INTERVAL))
-		(FromTo(common::TINYINT, common::FLOAT4))
-		(FromTo(common::TINYINT, common::FLOAT8))
-		(FromTo(common::TINYINT, common::BIT))
-		(FromTo(common::TINYINT, common::VARCHAR))
-		(FromTo(common::TINYINT, common::VAR16CHAR))
-		(FromTo(common::TINYINT, common::VARBINARY))
-		(FromTo(common::TINYINT, common::INTERVALYEAR))
-		(FromTo(common::TINYINT, common::INTERVALDAY))
-		(FromTo(common::SMALLINT, common::INT))
-		(FromTo(common::SMALLINT, common::BIGINT))
-		(FromTo(common::SMALLINT, common::DECIMAL9))
-		(FromTo(common::SMALLINT, common::DECIMAL18))
-		(FromTo(common::SMALLINT, common::DECIMAL28SPARSE))
-		(FromTo(common::SMALLINT, common::DECIMAL38SPARSE))
-		(FromTo(common::SMALLINT, common::DATE))
-		(FromTo(common::SMALLINT, common::TIME))
-		(FromTo(common::SMALLINT, common::TIMESTAMP))
-		(FromTo(common::SMALLINT, common::INTERVAL))
-		(FromTo(common::SMALLINT, common::FLOAT4))
-		(FromTo(common::SMALLINT, common::FLOAT8))
-		(FromTo(common::SMALLINT, common::BIT))
-		(FromTo(common::SMALLINT, common::VARCHAR))
-		(FromTo(common::SMALLINT, common::VAR16CHAR))
-		(FromTo(common::SMALLINT, common::VARBINARY))
-		(FromTo(common::SMALLINT, common::INTERVALYEAR))
-		(FromTo(common::SMALLINT, common::INTERVALDAY))
-		(FromTo(common::INT, common::INT))
-		(FromTo(common::INT, common::BIGINT))
-		(FromTo(common::INT, common::DECIMAL9))
-		(FromTo(common::INT, common::DECIMAL18))
-		(FromTo(common::INT, common::DECIMAL28SPARSE))
-		(FromTo(common::INT, common::DECIMAL38SPARSE))
-		(FromTo(common::INT, common::DATE))
-		(FromTo(common::INT, common::TIME))
-		(FromTo(common::INT, common::TIMESTAMP))
-		(FromTo(common::INT, common::INTERVAL))
-		(FromTo(common::INT, common::FLOAT4))
-		(FromTo(common::INT, common::FLOAT8))
-		(FromTo(common::INT, common::BIT))
-		(FromTo(common::INT, common::VARCHAR))
-		(FromTo(common::INT, common::VAR16CHAR))
-		(FromTo(common::INT, common::VARBINARY))
-		(FromTo(common::INT, common::INTERVALYEAR))
-		(FromTo(common::INT, common::INTERVALDAY))
-		(FromTo(common::BIGINT, common::INT))
-		(FromTo(common::BIGINT, common::BIGINT))
-		(FromTo(common::BIGINT, common::DECIMAL9))
-		(FromTo(common::BIGINT, common::DECIMAL18))
-		(FromTo(common::BIGINT, common::DECIMAL28SPARSE))
-		(FromTo(common::BIGINT, common::DECIMAL38SPARSE))
-		(FromTo(common::BIGINT, common::DATE))
-		(FromTo(common::BIGINT, common::TIME))
-		(FromTo(common::BIGINT, common::TIMESTAMP))
-		(FromTo(common::BIGINT, common::INTERVAL))
-		(FromTo(common::BIGINT, common::FLOAT4))
-		(FromTo(common::BIGINT, common::FLOAT8))
-		(FromTo(common::BIGINT, common::BIT))
-		(FromTo(common::BIGINT, common::VARCHAR))
-		(FromTo(common::BIGINT, common::VAR16CHAR))
-		(FromTo(common::BIGINT, common::VARBINARY))
-		(FromTo(common::BIGINT, common::INTERVALYEAR))
-		(FromTo(common::BIGINT, common::INTERVALDAY))
-		(FromTo(common::DECIMAL9, common::INT))
-		(FromTo(common::DECIMAL9, common::BIGINT))
-		(FromTo(common::DECIMAL9, common::DECIMAL9))
-		(FromTo(common::DECIMAL9, common::DECIMAL18))
-		(FromTo(common::DECIMAL9, common::DECIMAL28SPARSE))
-		(FromTo(common::DECIMAL9, common::DECIMAL38SPARSE))
-		(FromTo(common::DECIMAL9, common::DATE))
-		(FromTo(common::DECIMAL9, common::TIME))
-		(FromTo(common::DECIMAL9, common::TIMESTAMP))
-		(FromTo(common::DECIMAL9, common::INTERVAL))
-		(FromTo(common::DECIMAL9, common::FLOAT4))
-		(FromTo(common::DECIMAL9, common::FLOAT8))
-		(FromTo(common::DECIMAL9, common::BIT))
-		(FromTo(common::DECIMAL9, common::VARCHAR))
-		(FromTo(common::DECIMAL9, common::VAR16CHAR))
-		(FromTo(common::DECIMAL9, common::VARBINARY))
-		(FromTo(common::DECIMAL9, common::INTERVALYEAR))
-		(FromTo(common::DECIMAL9, common::INTERVALDAY))
-		(FromTo(common::DECIMAL18, common::INT))
-		(FromTo(common::DECIMAL18, common::BIGINT))
-		(FromTo(common::DECIMAL18, common::DECIMAL9))
-		(FromTo(common::DECIMAL18, common::DECIMAL18))
-		(FromTo(common::DECIMAL18, common::DECIMAL28SPARSE))
-		(FromTo(common::DECIMAL18, common::DECIMAL38SPARSE))
-		(FromTo(common::DECIMAL18, common::DATE))
-		(FromTo(common::DECIMAL18, common::TIME))
-		(FromTo(common::DECIMAL18, common::TIMESTAMP))
-		(FromTo(common::DECIMAL18, common::INTERVAL))
-		(FromTo(common::DECIMAL18, common::FLOAT4))
-		(FromTo(common::DECIMAL18, common::FLOAT8))
-		(FromTo(common::DECIMAL18, common::BIT))
-		(FromTo(common::DECIMAL18, common::VARCHAR))
-		(FromTo(common::DECIMAL18, common::VAR16CHAR))
-		(FromTo(common::DECIMAL18, common::VARBINARY))
-		(FromTo(common::DECIMAL18, common::INTERVALYEAR))
-		(FromTo(common::DECIMAL18, common::INTERVALDAY))
-		(FromTo(common::DECIMAL28SPARSE, common::INT))
-		(FromTo(common::DECIMAL28SPARSE, common::BIGINT))
-		(FromTo(common::DECIMAL28SPARSE, common::DECIMAL9))
-		(FromTo(common::DECIMAL28SPARSE, common::DECIMAL18))
-		(FromTo(common::DECIMAL28SPARSE, common::DECIMAL28SPARSE))
-		(FromTo(common::DECIMAL28SPARSE, common::DECIMAL38SPARSE))
-		(FromTo(common::DECIMAL28SPARSE, common::DATE))
-		(FromTo(common::DECIMAL28SPARSE, common::TIME))
-		(FromTo(common::DECIMAL28SPARSE, common::TIMESTAMP))
-		(FromTo(common::DECIMAL28SPARSE, common::INTERVAL))
-		(FromTo(common::DECIMAL28SPARSE, common::FLOAT4))
-		(FromTo(common::DECIMAL28SPARSE, common::FLOAT8))
-		(FromTo(common::DECIMAL28SPARSE, common::BIT))
-		(FromTo(common::DECIMAL28SPARSE, common::VARCHAR))
-		(FromTo(common::DECIMAL28SPARSE, common::VAR16CHAR))
-		(FromTo(common::DECIMAL28SPARSE, common::VARBINARY))
-		(FromTo(common::DECIMAL28SPARSE, common::INTERVALYEAR))
-		(FromTo(common::DECIMAL28SPARSE, common::INTERVALDAY))
-		(FromTo(common::DECIMAL38SPARSE, common::INT))
-		(FromTo(common::DECIMAL38SPARSE, common::BIGINT))
-		(FromTo(common::DECIMAL38SPARSE, common::DECIMAL9))
-		(FromTo(common::DECIMAL38SPARSE, common::DECIMAL18))
-		(FromTo(common::DECIMAL38SPARSE, common::DECIMAL28SPARSE))
-		(FromTo(common::DECIMAL38SPARSE, common::DECIMAL38SPARSE))
-		(FromTo(common::DECIMAL38SPARSE, common::DATE))
-		(FromTo(common::DECIMAL38SPARSE, common::TIME))
-		(FromTo(common::DECIMAL38SPARSE, common::TIMESTAMP))
-		(FromTo(common::DECIMAL38SPARSE, common::INTERVAL))
-		(FromTo(common::DECIMAL38SPARSE, common::FLOAT4))
-		(FromTo(common::DECIMAL38SPARSE, common::FLOAT8))
-		(FromTo(common::DECIMAL38SPARSE, common::BIT))
-		(FromTo(common::DECIMAL38SPARSE, common::VARCHAR))
-		(FromTo(common::DECIMAL38SPARSE, common::VAR16CHAR))
-		(FromTo(common::DECIMAL38SPARSE, common::VARBINARY))
-		(FromTo(common::DECIMAL38SPARSE, common::INTERVALYEAR))
-		(FromTo(common::DECIMAL38SPARSE, common::INTERVALDAY))
-		(FromTo(common::MONEY, common::INT))
-		(FromTo(common::MONEY, common::BIGINT))
-		(FromTo(common::MONEY, common::DECIMAL9))
-		(FromTo(common::MONEY, common::DECIMAL18))
-		(FromTo(common::MONEY, common::DECIMAL28SPARSE))
-		(FromTo(common::MONEY, common::DECIMAL38SPARSE))
-		(FromTo(common::MONEY, common::DATE))
-		(FromTo(common::MONEY, common::TIME))
-		(FromTo(common::MONEY, common::TIMESTAMP))
-		(FromTo(common::MONEY, common::INTERVAL))
-		(FromTo(common::MONEY, common::FLOAT4))
-		(FromTo(common::MONEY, common::FLOAT8))
-		(FromTo(common::MONEY, common::BIT))
-		(FromTo(common::MONEY, common::VARCHAR))
-		(FromTo(common::MONEY, common::VAR16CHAR))
-		(FromTo(common::MONEY, common::VARBINARY))
-		(FromTo(common::MONEY, common::INTERVALYEAR))
-		(FromTo(common::MONEY, common::INTERVALDAY))
-		(FromTo(common::DATE, common::INT))
-		(FromTo(common::DATE, common::BIGINT))
-		(FromTo(common::DATE, common::DECIMAL9))
-		(FromTo(common::DATE, common::DECIMAL18))
-		(FromTo(common::DATE, common::DECIMAL28SPARSE))
-		(FromTo(common::DATE, common::DECIMAL38SPARSE))
-		(FromTo(common::DATE, common::DATE))
-		(FromTo(common::DATE, common::TIME))
-		(FromTo(common::DATE, common::TIMESTAMP))
-		(FromTo(common::DATE, common::INTERVAL))
-		(FromTo(common::DATE, common::FLOAT4))
-		(FromTo(common::DATE, common::FLOAT8))
-		(FromTo(common::DATE, common::BIT))
-		(FromTo(common::DATE, common::VARCHAR))
-		(FromTo(common::DATE, common::VAR16CHAR))
-		(FromTo(common::DATE, common::VARBINARY))
-		(FromTo(common::DATE, common::INTERVALYEAR))
-		(FromTo(common::DATE, common::INTERVALDAY))
-		(FromTo(common::TIME, common::INT))
-		(FromTo(common::TIME, common::BIGINT))
-		(FromTo(common::TIME, common::DECIMAL9))
-		(FromTo(common::TIME, common::DECIMAL18))
-		(FromTo(common::TIME, common::DECIMAL28SPARSE))
-		(FromTo(common::TIME, common::DECIMAL38SPARSE))
-		(FromTo(common::TIME, common::DATE))
-		(FromTo(common::TIME, common::TIME))
-		(FromTo(common::TIME, common::TIMESTAMP))
-		(FromTo(common::TIME, common::INTERVAL))
-		(FromTo(common::TIME, common::FLOAT4))
-		(FromTo(common::TIME, common::FLOAT8))
-		(FromTo(common::TIME, common::BIT))
-		(FromTo(common::TIME, common::VARCHAR))
-		(FromTo(common::TIME, common::VAR16CHAR))
-		(FromTo(common::TIME, common::VARBINARY))
-		(FromTo(common::TIME, common::INTERVALYEAR))
-		(FromTo(common::TIME, common::INTERVALDAY))
-		(FromTo(common::TIMESTAMPTZ, common::INT))
-		(FromTo(common::TIMESTAMPTZ, common::BIGINT))
-		(FromTo(common::TIMESTAMPTZ, common::DECIMAL9))
-		(FromTo(common::TIMESTAMPTZ, common::DECIMAL18))
-		(FromTo(common::TIMESTAMPTZ, common::DECIMAL28SPARSE))
-		(FromTo(common::TIMESTAMPTZ, common::DECIMAL38SPARSE))
-		(FromTo(common::TIMESTAMPTZ, common::DATE))
-		(FromTo(common::TIMESTAMPTZ, common::TIME))
-		(FromTo(common::TIMESTAMPTZ, common::TIMESTAMP))
-		(FromTo(common::TIMESTAMPTZ, common::INTERVAL))
-		(FromTo(common::TIMESTAMPTZ, common::FLOAT4))
-		(FromTo(common::TIMESTAMPTZ, common::FLOAT8))
-		(FromTo(common::TIMESTAMPTZ, common::BIT))
-		(FromTo(common::TIMESTAMPTZ, common::VARCHAR))
-		(FromTo(common::TIMESTAMPTZ, common::VAR16CHAR))
-		(FromTo(common::TIMESTAMPTZ, common::VARBINARY))
-		(FromTo(common::TIMESTAMPTZ, common::INTERVALYEAR))
-		(FromTo(common::TIMESTAMPTZ, common::INTERVALDAY))
-		(FromTo(common::TIMESTAMP, common::INT))
-		(FromTo(common::TIMESTAMP, common::BIGINT))
-		(FromTo(common::TIMESTAMP, common::DECIMAL9))
-		(FromTo(common::TIMESTAMP, common::DECIMAL18))
-		(FromTo(common::TIMESTAMP, common::DECIMAL28SPARSE))
-		(FromTo(common::TIMESTAMP, common::DECIMAL38SPARSE))
-		(FromTo(common::TIMESTAMP, common::DATE))
-		(FromTo(common::TIMESTAMP, common::TIME))
-		(FromTo(common::TIMESTAMP, common::TIMESTAMP))
-		(FromTo(common::TIMESTAMP, common::INTERVAL))
-		(FromTo(common::TIMESTAMP, common::FLOAT4))
-		(FromTo(common::TIMESTAMP, common::FLOAT8))
-		(FromTo(common::TIMESTAMP, common::BIT))
-		(FromTo(common::TIMESTAMP, common::VARCHAR))
-		(FromTo(common::TIMESTAMP, common::VAR16CHAR))
-		(FromTo(common::TIMESTAMP, common::VARBINARY))
-		(FromTo(common::TIMESTAMP, common::INTERVALYEAR))
-		(FromTo(common::TIMESTAMP, common::INTERVALDAY))
-		(FromTo(common::INTERVAL, common::INT))
-		(FromTo(common::INTERVAL, common::BIGINT))
-		(FromTo(common::INTERVAL, common::DECIMAL9))
-		(FromTo(common::INTERVAL, common::DECIMAL18))
-		(FromTo(common::INTERVAL, common::DECIMAL28SPARSE))
-		(FromTo(common::INTERVAL, common::DECIMAL38SPARSE))
-		(FromTo(common::INTERVAL, common::DATE))
-		(FromTo(common::INTERVAL, common::TIME))
-		(FromTo(common::INTERVAL, common::TIMESTAMP))
-		(FromTo(common::INTERVAL, common::INTERVAL))
-		(FromTo(common::INTERVAL, common::FLOAT4))
-		(FromTo(common::INTERVAL, common::FLOAT8))
-		(FromTo(common::INTERVAL, common::BIT))
-		(FromTo(common::INTERVAL, common::VARCHAR))
-		(FromTo(common::INTERVAL, common::VAR16CHAR))
-		(FromTo(common::INTERVAL, common::VARBINARY))
-		(FromTo(common::INTERVAL, common::INTERVALYEAR))
-		(FromTo(common::INTERVAL, common::INTERVALDAY))
-		(FromTo(common::FLOAT4, common::INT))
-		(FromTo(common::FLOAT4, common::BIGINT))
-		(FromTo(common::FLOAT4, common::DECIMAL9))
-		(FromTo(common::FLOAT4, common::DECIMAL18))
-		(FromTo(common::FLOAT4, common::DECIMAL28SPARSE))
-		(FromTo(common::FLOAT4, common::DECIMAL38SPARSE))
-		(FromTo(common::FLOAT4, common::DATE))
-		(FromTo(common::FLOAT4, common::TIME))
-		(FromTo(common::FLOAT4, common::TIMESTAMP))
-		(FromTo(common::FLOAT4, common::INTERVAL))
-		(FromTo(common::FLOAT4, common::FLOAT4))
-		(FromTo(common::FLOAT4, common::FLOAT8))
-		(FromTo(common::FLOAT4, common::BIT))
-		(FromTo(common::FLOAT4, common::VARCHAR))
-		(FromTo(common::FLOAT4, common::VAR16CHAR))
-		(FromTo(common::FLOAT4, common::VARBINARY))
-		(FromTo(common::FLOAT4, common::INTERVALYEAR))
-		(FromTo(common::FLOAT4, common::INTERVALDAY))
-		(FromTo(common::FLOAT8, common::INT))
-		(FromTo(common::FLOAT8, common::BIGINT))
-		(FromTo(common::FLOAT8, common::DECIMAL9))
-		(FromTo(common::FLOAT8, common::DECIMAL18))
-		(FromTo(common::FLOAT8, common::DECIMAL28SPARSE))
-		(FromTo(common::FLOAT8, common::DECIMAL38SPARSE))
-		(FromTo(common::FLOAT8, common::DATE))
-		(FromTo(common::FLOAT8, common::TIME))
-		(FromTo(common::FLOAT8, common::TIMESTAMP))
-		(FromTo(common::FLOAT8, common::INTERVAL))
-		(FromTo(common::FLOAT8, common::FLOAT4))
-		(FromTo(common::FLOAT8, common::FLOAT8))
-		(FromTo(common::FLOAT8, common::BIT))
-		(FromTo(common::FLOAT8, common::VARCHAR))
-		(FromTo(common::FLOAT8, common::VAR16CHAR))
-		(FromTo(common::FLOAT8, common::VARBINARY))
-		(FromTo(common::FLOAT8, common::INTERVALYEAR))
-		(FromTo(common::FLOAT8, common::INTERVALDAY))
-		(FromTo(common::BIT, common::TINYINT))
-		(FromTo(common::BIT, common::INT))
-		(FromTo(common::BIT, common::BIGINT))
-		(FromTo(common::BIT, common::DECIMAL9))
-		(FromTo(common::BIT, common::DECIMAL18))
-		(FromTo(common::BIT, common::DECIMAL28SPARSE))
-		(FromTo(common::BIT, common::DECIMAL38SPARSE))
-		(FromTo(common::BIT, common::DATE))
-		(FromTo(common::BIT, common::TIME))
-		(FromTo(common::BIT, common::TIMESTAMP))
-		(FromTo(common::BIT, common::INTERVAL))
-		(FromTo(common::BIT, common::FLOAT4))
-		(FromTo(common::BIT, common::FLOAT8))
-		(FromTo(common::BIT, common::BIT))
-		(FromTo(common::BIT, common::VARCHAR))
-		(FromTo(common::BIT, common::VAR16CHAR))
-		(FromTo(common::BIT, common::VARBINARY))
-		(FromTo(common::BIT, common::INTERVALYEAR))
-		(FromTo(common::BIT, common::INTERVALDAY))
-		(FromTo(common::FIXEDCHAR, common::TINYINT))
-		(FromTo(common::FIXEDCHAR, common::INT))
-		(FromTo(common::FIXEDCHAR, common::BIGINT))
-		(FromTo(common::FIXEDCHAR, common::DECIMAL9))
-		(FromTo(common::FIXEDCHAR, common::DECIMAL18))
-		(FromTo(common::FIXEDCHAR, common::DECIMAL28SPARSE))
-		(FromTo(common::FIXEDCHAR, common::DECIMAL38SPARSE))
-		(FromTo(common::FIXEDCHAR, common::DATE))
-		(FromTo(common::FIXEDCHAR, common::TIME))
-		(FromTo(common::FIXEDCHAR, common::TIMESTAMP))
-		(FromTo(common::FIXEDCHAR, common::INTERVAL))
-		(FromTo(common::FIXEDCHAR, common::FLOAT4))
-		(FromTo(common::FIXEDCHAR, common::FLOAT8))
-		(FromTo(common::FIXEDCHAR, common::BIT))
-		(FromTo(common::FIXEDCHAR, common::VARCHAR))
-		(FromTo(common::FIXEDCHAR, common::VAR16CHAR))
-		(FromTo(common::FIXEDCHAR, common::VARBINARY))
-		(FromTo(common::FIXEDCHAR, common::INTERVALYEAR))
-		(FromTo(common::FIXEDCHAR, common::INTERVALDAY))
-		(FromTo(common::FIXED16CHAR, common::TINYINT))
-		(FromTo(common::FIXED16CHAR, common::INT))
-		(FromTo(common::FIXED16CHAR, common::BIGINT))
-		(FromTo(common::FIXED16CHAR, common::DECIMAL9))
-		(FromTo(common::FIXED16CHAR, common::DECIMAL18))
-		(FromTo(common::FIXED16CHAR, common::DECIMAL28SPARSE))
-		(FromTo(common::FIXED16CHAR, common::DECIMAL38SPARSE))
-		(FromTo(common::FIXED16CHAR, common::DATE))
-		(FromTo(common::FIXED16CHAR, common::TIME))
-		(FromTo(common::FIXED16CHAR, common::TIMESTAMP))
-		(FromTo(common::FIXED16CHAR, common::INTERVAL))
-		(FromTo(common::FIXED16CHAR, common::FLOAT4))
-		(FromTo(common::FIXED16CHAR, common::FLOAT8))
-		(FromTo(common::FIXED16CHAR, common::BIT))
-		(FromTo(common::FIXED16CHAR, common::VARCHAR))
-		(FromTo(common::FIXED16CHAR, common::VAR16CHAR))
-		(FromTo(common::FIXED16CHAR, common::VARBINARY))
-		(FromTo(common::FIXED16CHAR, common::INTERVALYEAR))
-		(FromTo(common::FIXED16CHAR, common::INTERVALDAY))
-		(FromTo(common::FIXEDBINARY, common::INT))
-		(FromTo(common::FIXEDBINARY, common::BIGINT))
-		(FromTo(common::FIXEDBINARY, common::DECIMAL9))
-		(FromTo(common::FIXEDBINARY, common::DECIMAL18))
-		(FromTo(common::FIXEDBINARY, common::DECIMAL28SPARSE))
-		(FromTo(common::FIXEDBINARY, common::DECIMAL38SPARSE))
-		(FromTo(common::FIXEDBINARY, common::DATE))
-		(FromTo(common::FIXEDBINARY, common::TIME))
-		(FromTo(common::FIXEDBINARY, common::TIMESTAMP))
-		(FromTo(common::FIXEDBINARY, common::INTERVAL))
-		(FromTo(common::FIXEDBINARY, common::FLOAT4))
-		(FromTo(common::FIXEDBINARY, common::FLOAT8))
-		(FromTo(common::FIXEDBINARY, common::BIT))
-		(FromTo(common::FIXEDBINARY, common::VARCHAR))
-		(FromTo(common::FIXEDBINARY, common::VAR16CHAR))
-		(FromTo(common::FIXEDBINARY, common::VARBINARY))
-		(FromTo(common::FIXEDBINARY, common::INTERVALYEAR))
-		(FromTo(common::FIXEDBINARY, common::INTERVALDAY))
-		(FromTo(common::VARCHAR, common::TINYINT))
-		(FromTo(common::VARCHAR, common::INT))
-		(FromTo(common::VARCHAR, common::BIGINT))
-		(FromTo(common::VARCHAR, common::DECIMAL9))
-		(FromTo(common::VARCHAR, common::DECIMAL18))
-		(FromTo(common::VARCHAR, common::DECIMAL28SPARSE))
-		(FromTo(common::VARCHAR, common::DECIMAL38SPARSE))
-		(FromTo(common::VARCHAR, common::DATE))
-		(FromTo(common::VARCHAR, common::TIME))
-		(FromTo(common::VARCHAR, common::TIMESTAMP))
-		(FromTo(common::VARCHAR, common::INTERVAL))
-		(FromTo(common::VARCHAR, common::FLOAT4))
-		(FromTo(common::VARCHAR, common::FLOAT8))
-		(FromTo(common::VARCHAR, common::BIT))
-		(FromTo(common::VARCHAR, common::VARCHAR))
-		(FromTo(common::VARCHAR, common::VAR16CHAR))
-		(FromTo(common::VARCHAR, common::VARBINARY))
-		(FromTo(common::VARCHAR, common::INTERVALYEAR))
-		(FromTo(common::VARCHAR, common::INTERVALDAY))
-		(FromTo(common::VAR16CHAR, common::TINYINT))
-		(FromTo(common::VAR16CHAR, common::INT))
-		(FromTo(common::VAR16CHAR, common::BIGINT))
-		(FromTo(common::VAR16CHAR, common::DECIMAL9))
-		(FromTo(common::VAR16CHAR, common::DECIMAL18))
-		(FromTo(common::VAR16CHAR, common::DECIMAL28SPARSE))
-		(FromTo(common::VAR16CHAR, common::DECIMAL38SPARSE))
-		(FromTo(common::VAR16CHAR, common::DATE))
-		(FromTo(common::VAR16CHAR, common::TIME))
-		(FromTo(common::VAR16CHAR, common::TIMESTAMP))
-		(FromTo(common::VAR16CHAR, common::INTERVAL))
-		(FromTo(common::VAR16CHAR, common::FLOAT4))
-		(FromTo(common::VAR16CHAR, common::FLOAT8))
-		(FromTo(common::VAR16CHAR, common::BIT))
-		(FromTo(common::VAR16CHAR, common::VARCHAR))
-		(FromTo(common::VAR16CHAR, common::VARBINARY))
-		(FromTo(common::VAR16CHAR, common::INTERVALYEAR))
-		(FromTo(common::VAR16CHAR, common::INTERVALDAY))
-		(FromTo(common::VARBINARY, common::TINYINT))
-		(FromTo(common::VARBINARY, common::INT))
-		(FromTo(common::VARBINARY, common::BIGINT))
-		(FromTo(common::VARBINARY, common::DECIMAL9))
-		(FromTo(common::VARBINARY, common::DECIMAL18))
-		(FromTo(common::VARBINARY, common::DECIMAL28SPARSE))
-		(FromTo(common::VARBINARY, common::DECIMAL38SPARSE))
-		(FromTo(common::VARBINARY, common::DATE))
-		(FromTo(common::VARBINARY, common::TIME))
-		(FromTo(common::VARBINARY, common::TIMESTAMP))
-		(FromTo(common::VARBINARY, common::INTERVAL))
-		(FromTo(common::VARBINARY, common::FLOAT4))
-		(FromTo(common::VARBINARY, common::FLOAT8))
-		(FromTo(common::VARBINARY, common::BIT))
-		(FromTo(common::VARBINARY, common::VARCHAR))
-		(FromTo(common::VARBINARY, common::VAR16CHAR))
-		(FromTo(common::VARBINARY, common::VARBINARY))
-		(FromTo(common::VARBINARY, common::INTERVALYEAR))
-		(FromTo(common::VARBINARY, common::INTERVALDAY))
-		(FromTo(common::UINT1, common::INT))
-		(FromTo(common::UINT1, common::BIGINT))
-		(FromTo(common::UINT1, common::DECIMAL9))
-		(FromTo(common::UINT1, common::DECIMAL18))
-		(FromTo(common::UINT1, common::DECIMAL28SPARSE))
-		(FromTo(common::UINT1, common::DECIMAL38SPARSE))
-		(FromTo(common::UINT1, common::DATE))
-		(FromTo(common::UINT1, common::TIME))
-		(FromTo(common::UINT1, common::TIMESTAMP))
-		(FromTo(common::UINT1, common::INTERVAL))
-		(FromTo(common::UINT1, common::FLOAT4))
-		(FromTo(common::UINT1, common::FLOAT8))
-		(FromTo(common::UINT1, common::BIT))
-		(FromTo(common::UINT1, common::VARCHAR))
-		(FromTo(common::UINT1, common::VAR16CHAR))
-		(FromTo(common::UINT1, common::VARBINARY))
-		(FromTo(common::UINT1, common::INTERVALYEAR))
-		(FromTo(common::UINT1, common::INTERVALDAY))
-		(FromTo(common::UINT2, common::INT))
-		(FromTo(common::UINT2, common::BIGINT))
-		(FromTo(common::UINT2, common::DECIMAL9))
-		(FromTo(common::UINT2, common::DECIMAL18))
-		(FromTo(common::UINT2, common::DECIMAL28SPARSE))
-		(FromTo(common::UINT2, common::DECIMAL38SPARSE))
-		(FromTo(common::UINT2, common::DATE))
-		(FromTo(common::UINT2, common::TIME))
-		(FromTo(common::UINT2, common::TIMESTAMP))
-		(FromTo(common::UINT2, common::INTERVAL))
-		(FromTo(common::UINT2, common::FLOAT4))
-		(FromTo(common::UINT2, common::FLOAT8))
-		(FromTo(common::UINT2, common::BIT))
-		(FromTo(common::UINT2, common::VARCHAR))
-		(FromTo(common::UINT2, common::VAR16CHAR))
-		(FromTo(common::UINT2, common::VARBINARY))
-		(FromTo(common::UINT2, common::INTERVALYEAR))
-		(FromTo(common::UINT2, common::INTERVALDAY))
-		(FromTo(common::UINT4, common::INT))
-		(FromTo(common::UINT4, common::BIGINT))
-		(FromTo(common::UINT4, common::DECIMAL9))
-		(FromTo(common::UINT4, common::DECIMAL18))
-		(FromTo(common::UINT4, common::DECIMAL28SPARSE))
-		(FromTo(common::UINT4, common::DECIMAL38SPARSE))
-		(FromTo(common::UINT4, common::DATE))
-		(FromTo(common::UINT4, common::TIME))
-		(FromTo(common::UINT4, common::TIMESTAMP))
-		(FromTo(common::UINT4, common::INTERVAL))
-		(FromTo(common::UINT4, common::FLOAT4))
-		(FromTo(common::UINT4, common::FLOAT8))
-		(FromTo(common::UINT4, common::BIT))
-		(FromTo(common::UINT4, common::VARCHAR))
-		(FromTo(common::UINT4, common::VAR16CHAR))
-		(FromTo(common::UINT4, common::VARBINARY))
-		(FromTo(common::UINT4, common::INTERVALYEAR))
-		(FromTo(common::UINT4, common::INTERVALDAY))
-		(FromTo(common::UINT8, common::INT))
-		(FromTo(common::UINT8, common::BIGINT))
-		(FromTo(common::UINT8, common::DECIMAL9))
-		(FromTo(common::UINT8, common::DECIMAL18))
-		(FromTo(common::UINT8, common::DECIMAL28SPARSE))
-		(FromTo(common::UINT8, common::DECIMAL38SPARSE))
-		(FromTo(common::UINT8, common::DATE))
-		(FromTo(common::UINT8, common::TIME))
-		(FromTo(common::UINT8, common::TIMESTAMP))
-		(FromTo(common::UINT8, common::INTERVAL))
-		(FromTo(common::UINT8, common::FLOAT4))
-		(FromTo(common::UINT8, common::FLOAT8))
-		(FromTo(common::UINT8, common::BIT))
-		(FromTo(common::UINT8, common::VARCHAR))
-		(FromTo(common::UINT8, common::VAR16CHAR))
-		(FromTo(common::UINT8, common::VARBINARY))
-		(FromTo(common::UINT8, common::INTERVALYEAR))
-		(FromTo(common::UINT8, common::INTERVALDAY))
-		(FromTo(common::DECIMAL28DENSE, common::INT))
-		(FromTo(common::DECIMAL28DENSE, common::BIGINT))
-		(FromTo(common::DECIMAL28DENSE, common::DECIMAL9))
-		(FromTo(common::DECIMAL28DENSE, common::DECIMAL18))
-		(FromTo(common::DECIMAL28DENSE, common::DECIMAL28SPARSE))
-		(FromTo(common::DECIMAL28DENSE, common::DECIMAL38SPARSE))
-		(FromTo(common::DECIMAL28DENSE, common::DATE))
-		(FromTo(common::DECIMAL28DENSE, common::TIME))
-		(FromTo(common::DECIMAL28DENSE, common::TIMESTAMP))
-		(FromTo(common::DECIMAL28DENSE, common::INTERVAL))
-		(FromTo(common::DECIMAL28DENSE, common::FLOAT4))
-		(FromTo(common::DECIMAL28DENSE, common::FLOAT8))
-		(FromTo(common::DECIMAL28DENSE, common::BIT))
-		(FromTo(common::DECIMAL28DENSE, common::VARCHAR))
-		(FromTo(common::DECIMAL28DENSE, common::VAR16CHAR))
-		(FromTo(common::DECIMAL28DENSE, common::VARBINARY))
-		(FromTo(common::DECIMAL28DENSE, common::INTERVALYEAR))
-		(FromTo(common::DECIMAL28DENSE, common::INTERVALDAY))
-		(FromTo(common::DECIMAL38DENSE, common::INT))
-		(FromTo(common::DECIMAL38DENSE, common::BIGINT))
-		(FromTo(common::DECIMAL38DENSE, common::DECIMAL9))
-		(FromTo(common::DECIMAL38DENSE, common::DECIMAL18))
-		(FromTo(common::DECIMAL38DENSE, common::DECIMAL28SPARSE))
-		(FromTo(common::DECIMAL38DENSE, common::DECIMAL38SPARSE))
-		(FromTo(common::DECIMAL38DENSE, common::DATE))
-		(FromTo(common::DECIMAL38DENSE, common::TIME))
-		(FromTo(common::DECIMAL38DENSE, common::TIMESTAMP))
-		(FromTo(common::DECIMAL38DENSE, common::INTERVAL))
-		(FromTo(common::DECIMAL38DENSE, common::FLOAT4))
-		(FromTo(common::DECIMAL38DENSE, common::FLOAT8))
-		(FromTo(common::DECIMAL38DENSE, common::BIT))
-		(FromTo(common::DECIMAL38DENSE, common::VARCHAR))
-		(FromTo(common::DECIMAL38DENSE, common::VAR16CHAR))
-		(FromTo(common::DECIMAL38DENSE, common::VARBINARY))
-		(FromTo(common::DECIMAL38DENSE, common::INTERVALYEAR))
-		(FromTo(common::DECIMAL38DENSE, common::INTERVALDAY))
-		(FromTo(common::DM_UNKNOWN, common::TINYINT))
-		(FromTo(common::DM_UNKNOWN, common::INT))
-		(FromTo(common::DM_UNKNOWN, common::BIGINT))
-		(FromTo(common::DM_UNKNOWN, common::DECIMAL9))
-		(FromTo(common::DM_UNKNOWN, common::DECIMAL18))
-		(FromTo(common::DM_UNKNOWN, common::DECIMAL28SPARSE))
-		(FromTo(common::DM_UNKNOWN, common::DECIMAL38SPARSE))
-		(FromTo(common::DM_UNKNOWN, common::DATE))
-		(FromTo(common::DM_UNKNOWN, common::TIME))
-		(FromTo(common::DM_UNKNOWN, common::TIMESTAMP))
-		(FromTo(common::DM_UNKNOWN, common::INTERVAL))
-		(FromTo(common::DM_UNKNOWN, common::FLOAT4))
-		(FromTo(common::DM_UNKNOWN, common::FLOAT8))
-		(FromTo(common::DM_UNKNOWN, common::BIT))
-		(FromTo(common::DM_UNKNOWN, common::VARCHAR))
-		(FromTo(common::DM_UNKNOWN, common::VAR16CHAR))
-		(FromTo(common::DM_UNKNOWN, common::VARBINARY))
-		(FromTo(common::DM_UNKNOWN, common::INTERVALYEAR))
-		(FromTo(common::DM_UNKNOWN, common::INTERVALDAY))
-		(FromTo(common::INTERVALYEAR, common::INT))
-		(FromTo(common::INTERVALYEAR, common::BIGINT))
-		(FromTo(common::INTERVALYEAR, common::DECIMAL9))
-		(FromTo(common::INTERVALYEAR, common::DECIMAL18))
-		(FromTo(common::INTERVALYEAR, common::DECIMAL28SPARSE))
-		(FromTo(common::INTERVALYEAR, common::DECIMAL38SPARSE))
-		(FromTo(common::INTERVALYEAR, common::DATE))
-		(FromTo(common::INTERVALYEAR, common::TIME))
-		(FromTo(common::INTERVALYEAR, common::TIMESTAMP))
-		(FromTo(common::INTERVALYEAR, common::INTERVAL))
-		(FromTo(common::INTERVALYEAR, common::FLOAT4))
-		(FromTo(common::INTERVALYEAR, common::FLOAT8))
-		(FromTo(common::INTERVALYEAR, common::BIT))
-		(FromTo(common::INTERVALYEAR, common::VARCHAR))
-		(FromTo(common::INTERVALYEAR, common::VAR16CHAR))
-		(FromTo(common::INTERVALYEAR, common::VARBINARY))
-		(FromTo(common::INTERVALYEAR, common::INTERVALYEAR))
-		(FromTo(common::INTERVALYEAR, common::INTERVALDAY))
-		(FromTo(common::INTERVALDAY, common::INT))
-		(FromTo(common::INTERVALDAY, common::BIGINT))
-		(FromTo(common::INTERVALDAY, common::DECIMAL9))
-		(FromTo(common::INTERVALDAY, common::DECIMAL18))
-		(FromTo(common::INTERVALDAY, common::DECIMAL28SPARSE))
-		(FromTo(common::INTERVALDAY, common::DECIMAL38SPARSE))
-		(FromTo(common::INTERVALDAY, common::DATE))
-		(FromTo(common::INTERVALDAY, common::TIME))
-		(FromTo(common::INTERVALDAY, common::TIMESTAMP))
-		(FromTo(common::INTERVALDAY, common::INTERVAL))
-		(FromTo(common::INTERVALDAY, common::FLOAT4))
-		(FromTo(common::INTERVALDAY, common::FLOAT8))
-		(FromTo(common::INTERVALDAY, common::BIT))
-		(FromTo(common::INTERVALDAY, common::VARCHAR))
-		(FromTo(common::INTERVALDAY, common::VAR16CHAR))
-		(FromTo(common::INTERVALDAY, common::VARBINARY))
-		(FromTo(common::INTERVALDAY, common::INTERVALYEAR))
-		(FromTo(common::INTERVALDAY, common::INTERVALDAY));
+static Drill::meta::UnionSupport unionSupport(const google::protobuf::RepeatedField<google::protobuf::int32>& unionSupportList) {
+	Drill::meta::UnionSupport result(Drill::meta::U_NONE);
+
+	for(google::protobuf::RepeatedField<google::protobuf::int32>::const_iterator it = unionSupportList.begin();
+			it != unionSupportList.end();
+			++it) {
+			switch(static_cast<exec::user::UnionSupport>(*it)) {
+			case exec::user::U_UNION:
+				result |= Drill::meta::U_UNION;
+				break;
+
+			case exec::user::U_UNION_ALL:
+				result |= Drill::meta::U_UNION_ALL;
+				break;
+
+			// ignore unknown
+			case exec::user::U_UNKNOWN:
+			default:
+				break;
+			}
+		}
+
+	return result;
+}
+
+static bool unrelatedColumnsInOrderBySupported(const google::protobuf::RepeatedField<google::protobuf::int32>& orderBySupportList) {
+	for(google::protobuf::RepeatedField<google::protobuf::int32>::const_iterator it = orderBySupportList.begin();
+			it != orderBySupportList.end();
+			++it) {
+			switch(static_cast<exec::user::OrderBySupport>(*it)) {
+			case exec::user::OB_UNRELATED:
+				return true;
+				break;
+
+			case exec::user::OB_EXPRESSION:
+			// ignore unknown
+			case exec::user::OB_UNKNOWN:
+			default:
+				break;
+			}
+		}
+
+	return false;
+}
 } // anonymous namespace
 
+const exec::user::ServerMeta DrillMetadata::s_defaultServerMeta = createDefaultServerMeta();
+
+DrillMetadata::DrillMetadata(DrillClientImpl& client, const exec::user::ServerMeta&  serverMeta): Metadata(), m_client(client),
+		m_allTablesSelectable(serverMeta.all_tables_selectable()),
+		m_blobIncludedInMaxRowSize(serverMeta.blob_included_in_max_row_size()),
+		m_catalogAtStart(serverMeta.catalog_at_start()),
+		m_catalogSeparator(serverMeta.catalog_separator()),
+		m_catalogTerm(serverMeta.catalog_term()),
+		m_collateSupport(collateSupport(serverMeta.collate_support())),
+		m_columnAliasingSupported(serverMeta.column_aliasing_supported()),
+		m_correlationNamesSupport(correlationNames(serverMeta.correlation_names_support())),
+		m_convertSupport(serverMeta.convert_support().begin(), serverMeta.convert_support().end()),
+		m_dateTimeFunctions(serverMeta.date_time_functions().begin(), serverMeta.date_time_functions().end()),
+		m_dateTimeLiteralsSupport(dateTimeLiteralsSupport(serverMeta.date_time_literals_support())),
+		m_groupBySupport(groupBySupport(serverMeta.group_by_support())),
+		m_identifierCase(identifierCase(serverMeta.identifier_casing())),
+		m_identifierQuoteString(serverMeta.identifier_quote_string()),
+		m_likeEscapeClauseSupported(serverMeta.like_escape_clause_supported()),
+		m_maxBinaryLiteralLength(serverMeta.max_binary_literal_length()),
+		m_maxCatalogNameLength(serverMeta.max_catalog_name_length()),
+		m_maxCharLIteralLength(serverMeta.max_char_literal_length()),
+		m_maxColumnNameLength(serverMeta.max_column_name_length()),
+		m_maxColumnsInGroupBy(serverMeta.max_column_name_length()),
+		m_maxColumnsInOrderBy(serverMeta.max_columns_in_order_by()),
+		m_maxColumnsInSelect(serverMeta.max_columns_in_select()),
+		m_maxCursorNameLength(serverMeta.max_cursor_name_length()),
+		m_maxLogicalLobSize(serverMeta.max_logical_lob_size()),
+		m_maxRowSize(serverMeta.max_row_size()),
+		m_maxSchemaNameLength(serverMeta.max_schema_name_length()),
+		m_maxStatementLength(serverMeta.max_statement_length()),
+		m_maxStatements(serverMeta.max_statements()),
+		m_maxTableNameLength(serverMeta.max_table_name_length()),
+		m_maxTablesInSelectLength(serverMeta.max_tables_in_select()),
+		m_maxUserNameLength(serverMeta.max_user_name_length()),
+		m_nullCollation(nullCollation(serverMeta.null_collation())),
+		m_nullPlusNonNullEqualsNull(serverMeta.null_plus_non_null_equals_null()),
+		m_numericFunctions(serverMeta.numeric_functions().begin(), serverMeta.numeric_functions().end()),
+		m_outerJoinSupport(outerJoinSupport(serverMeta.outer_join_support())),
+		m_quotedIdentifierCase(quotedIdentifierCase(serverMeta.quoted_identifier_casing())),
+		m_readOnly(serverMeta.read_only()),
+		m_schemaTerm(serverMeta.schema_term()),
+		m_searchEscapeString(serverMeta.search_escape_string()),
+		m_selectForUpdateSupported(serverMeta.select_for_update_supported()),
+		m_specialCharacters(serverMeta.special_characters()),
+		m_sqlKeywords(serverMeta.sql_keywords().begin(), serverMeta.sql_keywords().end()),
+		m_stringFunctions(serverMeta.string_functions().begin(), serverMeta.string_functions().end()),
+		m_subQuerySupport(subQuerySupport(serverMeta.subquery_support())),
+		m_systemFunctions(serverMeta.system_functions().begin(), serverMeta.system_functions().end()),
+		m_tableTerm(serverMeta.table_term()),
+		m_transactionSupported(serverMeta.transaction_supported()),
+		m_unionSupport(unionSupport(serverMeta.union_support())),
+		m_unrelatedColumnsInOrderBySupported(unrelatedColumnsInOrderBySupported(serverMeta.order_by_support()))
+{
+}
+
 // Conversion scalar function support
 bool DrillMetadata::isConvertSupported(common::MinorType from, common::MinorType to) const {
-	return s_convertMap.find(FromTo(from,to)) != s_convertMap.end();
+	return m_convertSupport.find(ConvertSupport(from,to)) != m_convertSupport.end();
 }
 
 const std::string& DrillMetadata::getServerName() const {