http://git-wip-us.apache.org/repos/asf/hive/blob/93b9cdd6/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift
----------------------------------------------------------------------
diff --cc 
standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift
index 0000000,1ca6454..1b4f01a
mode 000000,100644..100644
--- 
a/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift
+++ 
b/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift
@@@ -1,0 -1,2275 +1,2318 @@@
+ #!/usr/local/bin/thrift -java
+ 
+ /**
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
+  *
+  *     http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ 
+ #
+ # Thrift Service that the MetaStore is built on
+ #
+ 
+ include "share/fb303/if/fb303.thrift"
+ 
+ namespace java org.apache.hadoop.hive.metastore.api
+ namespace php metastore
+ namespace cpp Apache.Hadoop.Hive
+ 
+ const string DDL_TIME = "transient_lastDdlTime"
+ 
+ struct Version {
+   1: string version,
+   2: string comments
+ }
+ 
+ struct FieldSchema {
+   1: string name, // name of the field
+   2: string type, // type of the field. primitive types defined above, 
specify list<TYPE_NAME>, map<TYPE_NAME, TYPE_NAME> for lists & maps
+   3: string comment
+ }
+ 
+ struct SQLPrimaryKey {
+   1: string table_db,    // table schema
+   2: string table_name,  // table name
+   3: string column_name, // column name
+   4: i32 key_seq,        // sequence number within primary key
+   5: string pk_name,     // primary key name
+   6: bool enable_cstr,   // Enable/Disable
+   7: bool validate_cstr, // Validate/No validate
+   8: bool rely_cstr,     // Rely/No Rely
+   9: optional string catName
+ }
+ 
+ struct SQLForeignKey {
+   1: string pktable_db,    // primary key table schema
+   2: string pktable_name,  // primary key table name
+   3: string pkcolumn_name, // primary key column name
+   4: string fktable_db,    // foreign key table schema
+   5: string fktable_name,  // foreign key table name
+   6: string fkcolumn_name, // foreign key column name
+   7: i32 key_seq,          // sequence within foreign key
+   8: i32 update_rule,      // what happens to foreign key when parent key is 
updated
+   9: i32 delete_rule,      // what happens to foreign key when parent key is 
deleted
+   10: string fk_name,      // foreign key name
+   11: string pk_name,      // primary key name
+   12: bool enable_cstr,    // Enable/Disable
+   13: bool validate_cstr,  // Validate/No validate
+   14: bool rely_cstr,      // Rely/No Rely
+   15: optional string catName
+ }
+ 
+ struct SQLUniqueConstraint {
+   1: string catName,     // table catalog
+   2: string table_db,    // table schema
+   3: string table_name,  // table name
+   4: string column_name, // column name
+   5: i32 key_seq,        // sequence number within unique constraint
+   6: string uk_name,     // unique key name
+   7: bool enable_cstr,   // Enable/Disable
+   8: bool validate_cstr, // Validate/No validate
+   9: bool rely_cstr,     // Rely/No Rely
+ }
+ 
+ struct SQLNotNullConstraint {
+   1: string catName,     // table catalog
+   2: string table_db,    // table schema
+   3: string table_name,  // table name
+   4: string column_name, // column name
+   5: string nn_name,     // not null name
+   6: bool enable_cstr,   // Enable/Disable
+   7: bool validate_cstr, // Validate/No validate
+   8: bool rely_cstr,     // Rely/No Rely
+ }
+ 
+ struct SQLDefaultConstraint {
+   1: string catName,     // catalog name
+   2: string table_db,    // table schema
+   3: string table_name,  // table name
+   4: string column_name, // column name
+   5: string default_value,// default value
+   6: string dc_name,     // default name
+   7: bool enable_cstr,   // Enable/Disable
+   8: bool validate_cstr, // Validate/No validate
+   9: bool rely_cstr      // Rely/No Rely
+ }
+ 
+ struct SQLCheckConstraint {
+   1: string catName,     // catalog name
+   2: string table_db,    // table schema
+   3: string table_name,  // table name
+   4: string column_name, // column name
+   5: string check_expression,// check expression
+   6: string dc_name,     // default name
+   7: bool enable_cstr,   // Enable/Disable
+   8: bool validate_cstr, // Validate/No validate
+   9: bool rely_cstr      // Rely/No Rely
+ }
+ 
+ struct Type {
+   1: string          name,             // one of the types in PrimitiveTypes 
or CollectionTypes or User defined types
+   2: optional string type1,            // object type if the name is 'list' 
(LIST_TYPE), key type if the name is 'map' (MAP_TYPE)
+   3: optional string type2,            // val type if the name is 'map' 
(MAP_TYPE)
+   4: optional list<FieldSchema> fields // if the name is one of the user 
defined types
+ }
+ 
+ enum HiveObjectType {
+   GLOBAL = 1,
+   DATABASE = 2,
+   TABLE = 3,
+   PARTITION = 4,
+   COLUMN = 5,
+ }
+ 
+ enum PrincipalType {
+   USER = 1,
+   ROLE = 2,
+   GROUP = 3,
+ }
+ 
+ const string HIVE_FILTER_FIELD_OWNER = "hive_filter_field_owner__"
+ const string HIVE_FILTER_FIELD_PARAMS = "hive_filter_field_params__"
+ const string HIVE_FILTER_FIELD_LAST_ACCESS = "hive_filter_field_last_access__"
+ 
+ enum PartitionEventType {
+   LOAD_DONE = 1,
+ }
+ 
+ // Enums for transaction and lock management 
+ enum TxnState {
+     COMMITTED = 1,
+     ABORTED = 2,
+     OPEN = 3,
+ }
+ 
+ enum LockLevel {
+     DB = 1,
+     TABLE = 2,
+     PARTITION = 3,
+ }
+ 
+ enum LockState {
+     ACQUIRED = 1,       // requester has the lock
+     WAITING = 2,        // requester is waiting for the lock and should call 
checklock at a later point to see if the lock has been obtained.
+     ABORT = 3,          // the lock has been aborted, most likely due to 
timeout
+     NOT_ACQUIRED = 4,   // returned only with lockNoWait, indicates the lock 
was not available and was not acquired
+ }
+ 
+ enum LockType {
+     SHARED_READ = 1,
+     SHARED_WRITE = 2,
+     EXCLUSIVE = 3,
+ }
+ 
+ enum CompactionType {
+     MINOR = 1,
+     MAJOR = 2,
+ }
+ 
+ enum GrantRevokeType {
+     GRANT = 1,
+     REVOKE = 2,
+ }
+ 
+ enum DataOperationType {
+     SELECT = 1,
+     INSERT = 2
+     UPDATE = 3,
+     DELETE = 4,
+     UNSET = 5,//this is the default to distinguish from NULL from old clients
+     NO_TXN = 6,//drop table, insert overwrite, etc - something 
non-transactional
+ }
+ 
+ // Types of events the client can request that the metastore fire.  For now 
just support DML operations, as the metastore knows
+ // about DDL operations and there's no reason for the client to request such 
an event.
+ enum EventRequestType {
+     INSERT = 1,
+     UPDATE = 2,
+     DELETE = 3,
+ }
+ 
+ enum SerdeType {
+   HIVE = 1,
+   SCHEMA_REGISTRY = 2,
+ }
+ 
+ enum SchemaType {
+   HIVE = 1,
+   AVRO = 2,
+ }
+ 
+ enum SchemaCompatibility {
+   NONE = 1,
+   BACKWARD = 2,
+   FORWARD = 3,
+   BOTH = 4
+ }
+ 
+ enum SchemaValidation {
+   LATEST = 1,
+   ALL = 2
+ }
+ 
+ enum SchemaVersionState {
+   INITIATED = 1,
+   START_REVIEW = 2,
+   CHANGES_REQUIRED = 3,
+   REVIEWED = 4,
+   ENABLED = 5,
+   DISABLED = 6,
+   ARCHIVED = 7,
+   DELETED = 8
+ }
+ 
+ struct HiveObjectRef{
+   1: HiveObjectType objectType,
+   2: string dbName,
+   3: string objectName,
+   4: list<string> partValues,
+   5: string columnName,
+   6: optional string catName
+ }
+ 
+ struct PrivilegeGrantInfo {
+   1: string privilege,
+   2: i32 createTime,
+   3: string grantor,
+   4: PrincipalType grantorType,
+   5: bool grantOption,
+ }
+ 
+ struct HiveObjectPrivilege {
+   1: HiveObjectRef  hiveObject,
+   2: string principalName,
+   3: PrincipalType principalType,
+   4: PrivilegeGrantInfo grantInfo,
+   5: string authorizer,
+ }
+ 
+ struct PrivilegeBag {
+   1: list<HiveObjectPrivilege> privileges,
+ }
+ 
+ struct PrincipalPrivilegeSet {
+   1: map<string, list<PrivilegeGrantInfo>> userPrivileges, // user name -> 
privilege grant info
+   2: map<string, list<PrivilegeGrantInfo>> groupPrivileges, // group name -> 
privilege grant info
+   3: map<string, list<PrivilegeGrantInfo>> rolePrivileges, //role name -> 
privilege grant info
+ }
+ 
+ struct GrantRevokePrivilegeRequest {
+   1: GrantRevokeType requestType;
+   2: PrivilegeBag privileges;
+   3: optional bool revokeGrantOption;  // Only for revoke request
+ }
+ 
+ struct GrantRevokePrivilegeResponse {
+   1: optional bool success;
+ }
+ 
+ struct Role {
+   1: string roleName,
+   2: i32 createTime,
+   3: string ownerName,
+ }
+ 
+ // Representation of a grant for a principal to a role
+ struct RolePrincipalGrant {
+   1: string roleName,
+   2: string principalName,
+   3: PrincipalType principalType,
+   4: bool grantOption,
+   5: i32 grantTime,
+   6: string grantorName,
+   7: PrincipalType grantorPrincipalType
+ }
+ 
+ struct GetRoleGrantsForPrincipalRequest {
+   1: required string principal_name,
+   2: required PrincipalType principal_type
+ }
+ 
+ struct GetRoleGrantsForPrincipalResponse {
+   1: required list<RolePrincipalGrant> principalGrants;
+ }
+ 
+ struct GetPrincipalsInRoleRequest {
+   1: required string roleName;
+ }
+ 
+ struct GetPrincipalsInRoleResponse {
+   1: required list<RolePrincipalGrant> principalGrants;
+ }
+ 
+ struct GrantRevokeRoleRequest {
+   1: GrantRevokeType requestType;
+   2: string roleName;
+   3: string principalName;
+   4: PrincipalType principalType;
+   5: optional string grantor;            // Needed for grant
+   6: optional PrincipalType grantorType; // Needed for grant
+   7: optional bool grantOption;
+ }
+ 
+ struct GrantRevokeRoleResponse {
+   1: optional bool success;
+ }
+ 
+ struct Catalog {
+   1: string name,                    // Name of the catalog
+   2: optional string description,    // description of the catalog
+   3: string locationUri              // default storage location.  When 
databases are created in
+                                      // this catalog, if they do not specify 
a location, they will
+                                      // be placed in this location.
+ }
+ 
+ struct CreateCatalogRequest {
+   1: Catalog catalog
+ }
+ 
+ struct AlterCatalogRequest {
+   1: string name,
+   2: Catalog newCat
+ }
+ 
+ struct GetCatalogRequest {
+   1: string name
+ }
+ 
+ struct GetCatalogResponse {
+   1: Catalog catalog
+ }
+ 
+ struct GetCatalogsResponse {
+   1: list<string> names
+ }
+ 
+ struct DropCatalogRequest {
+   1: string name
+ }
+ 
+ // namespace for tables
+ struct Database {
+   1: string name,
+   2: string description,
+   3: string locationUri,
+   4: map<string, string> parameters, // properties associated with the 
database
+   5: optional PrincipalPrivilegeSet privileges,
+   6: optional string ownerName,
+   7: optional PrincipalType ownerType,
+   8: optional string catalogName
+ }
+ 
+ // This object holds the information needed by SerDes
+ struct SerDeInfo {
+   1: string name,                   // name of the serde, table name by 
default
+   2: string serializationLib,       // usually the class that implements the 
extractor & loader
+   3: map<string, string> parameters, // initialization parameters
+   4: optional string description,
+   5: optional string serializerClass,
+   6: optional string deserializerClass,
+   7: optional SerdeType serdeType
+ }
+ 
+ // sort order of a column (column name along with asc(1)/desc(0))
+ struct Order {
+   1: string col,      // sort column name
+   2: i32    order     // asc(1) or desc(0)
+ }
+ 
+ // this object holds all the information about skewed table
+ struct SkewedInfo {
+   1: list<string> skewedColNames, // skewed column names
+   2: list<list<string>> skewedColValues, //skewed values
+   3: map<list<string>, string> skewedColValueLocationMaps, //skewed value to 
location mappings
+ }
+ 
+ // this object holds all the information about physical storage of the data 
belonging to a table
+ struct StorageDescriptor {
+   1: list<FieldSchema> cols,  // required (refer to types defined above)
+   2: string location,         // defaults to <warehouse loc>/<db 
loc>/tablename
+   3: string inputFormat,      // SequenceFileInputFormat (binary) or 
TextInputFormat`  or custom format
+   4: string outputFormat,     // SequenceFileOutputFormat (binary) or 
IgnoreKeyTextOutputFormat or custom format
+   5: bool   compressed,       // compressed or not
+   6: i32    numBuckets,       // this must be specified if there are any 
dimension columns
+   7: SerDeInfo    serdeInfo,  // serialization and deserialization information
+   8: list<string> bucketCols, // reducer grouping columns and clustering 
columns and bucketing columns`
+   9: list<Order>  sortCols,   // sort order of the data in each bucket
+   10: map<string, string> parameters, // any user supplied key value hash
+   11: optional SkewedInfo skewedInfo, // skewed information
+   12: optional bool   storedAsSubDirectories       // stored as 
subdirectories or not
+ }
+ 
+ // table information
+ struct Table {
+   1: string tableName,                // name of the table
+   2: string dbName,                   // database name ('default')
+   3: string owner,                    // owner of this table
+   4: i32    createTime,               // creation time of the table
+   5: i32    lastAccessTime,           // last access time (usually this will 
be filled from HDFS and shouldn't be relied on)
+   6: i32    retention,                // retention time
+   7: StorageDescriptor sd,            // storage descriptor of the table
+   8: list<FieldSchema> partitionKeys, // partition keys of the table. only 
primitive types are supported
+   9: map<string, string> parameters,   // to store comments or any other user 
level parameters
+   10: string viewOriginalText,         // original view text, null for 
non-view
+   11: string viewExpandedText,         // expanded view text, null for 
non-view
+   12: string tableType,                // table type enum, e.g. EXTERNAL_TABLE
+   13: optional PrincipalPrivilegeSet privileges,
+   14: optional bool temporary=false,
+   15: optional bool rewriteEnabled,     // rewrite enabled or not
+   16: optional CreationMetadata creationMetadata,   // only for MVs, it 
stores table names used and txn list at MV creation
+   17: optional string catName,          // Name of the catalog the table is in
 -  18: optional PrincipalType ownerType = PrincipalType.USER // owner type of 
this table (default to USER for backward compatibility)
++  18: optional PrincipalType ownerType = PrincipalType.USER, // owner type of 
this table (default to USER for backward compatibility)
++  19: optional i64 writeId=-1,
++  20: optional bool isStatsCompliant
+ }
+ 
+ struct Partition {
+   1: list<string> values // string value is converted to appropriate 
partition key type
+   2: string       dbName,
+   3: string       tableName,
+   4: i32          createTime,
+   5: i32          lastAccessTime,
+   6: StorageDescriptor   sd,
+   7: map<string, string> parameters,
+   8: optional PrincipalPrivilegeSet privileges,
 -  9: optional string catName
++  9: optional string catName,
++  10: optional i64 writeId=-1,
++  11: optional bool isStatsCompliant
+ }
+ 
+ struct PartitionWithoutSD {
+   1: list<string> values // string value is converted to appropriate 
partition key type
+   2: i32          createTime,
+   3: i32          lastAccessTime,
+   4: string       relativePath,
+   5: map<string, string> parameters,
+   6: optional PrincipalPrivilegeSet privileges
+ }
+ 
+ struct PartitionSpecWithSharedSD {
+   1: list<PartitionWithoutSD> partitions,
+   2: StorageDescriptor sd,
+ }
+ 
+ struct PartitionListComposingSpec {
+   1: list<Partition> partitions
+ }
+ 
+ struct PartitionSpec {
+   1: string dbName,
+   2: string tableName,
+   3: string rootPath,
+   4: optional PartitionSpecWithSharedSD sharedSDPartitionSpec,
+   5: optional PartitionListComposingSpec partitionList,
 -  6: optional string catName
++  6: optional string catName,
++  7: optional i64 writeId=-1,
++  8: optional bool isStatsCompliant
+ }
+ 
+ // column statistics
+ struct BooleanColumnStatsData {
+ 1: required i64 numTrues,
+ 2: required i64 numFalses,
+ 3: required i64 numNulls,
+ 4: optional binary bitVectors
+ }
+ 
+ struct DoubleColumnStatsData {
+ 1: optional double lowValue,
+ 2: optional double highValue,
+ 3: required i64 numNulls,
+ 4: required i64 numDVs,
+ 5: optional binary bitVectors
+ }
+ 
+ struct LongColumnStatsData {
+ 1: optional i64 lowValue,
+ 2: optional i64 highValue,
+ 3: required i64 numNulls,
+ 4: required i64 numDVs,
+ 5: optional binary bitVectors
+ }
+ 
+ struct StringColumnStatsData {
+ 1: required i64 maxColLen,
+ 2: required double avgColLen,
+ 3: required i64 numNulls,
+ 4: required i64 numDVs,
+ 5: optional binary bitVectors
+ }
+ 
+ struct BinaryColumnStatsData {
+ 1: required i64 maxColLen,
+ 2: required double avgColLen,
+ 3: required i64 numNulls,
+ 4: optional binary bitVectors
+ }
+ 
+ 
+ struct Decimal {
+ 3: required i16 scale, // force using scale first in Decimal.compareTo
+ 1: required binary unscaled
+ }
+ 
+ struct DecimalColumnStatsData {
+ 1: optional Decimal lowValue,
+ 2: optional Decimal highValue,
+ 3: required i64 numNulls,
+ 4: required i64 numDVs,
+ 5: optional binary bitVectors
+ }
+ 
+ struct Date {
+ 1: required i64 daysSinceEpoch
+ }
+ 
+ struct DateColumnStatsData {
+ 1: optional Date lowValue,
+ 2: optional Date highValue,
+ 3: required i64 numNulls,
+ 4: required i64 numDVs,
+ 5: optional binary bitVectors
+ }
+ 
+ union ColumnStatisticsData {
+ 1: BooleanColumnStatsData booleanStats,
+ 2: LongColumnStatsData longStats,
+ 3: DoubleColumnStatsData doubleStats,
+ 4: StringColumnStatsData stringStats,
+ 5: BinaryColumnStatsData binaryStats,
+ 6: DecimalColumnStatsData decimalStats,
+ 7: DateColumnStatsData dateStats
+ }
+ 
+ struct ColumnStatisticsObj {
+ 1: required string colName,
+ 2: required string colType,
+ 3: required ColumnStatisticsData statsData
+ }
+ 
+ struct ColumnStatisticsDesc {
+ 1: required bool isTblLevel,
+ 2: required string dbName,
+ 3: required string tableName,
+ 4: optional string partName,
+ 5: optional i64 lastAnalyzed,
+ 6: optional string catName
+ }
+ 
+ struct ColumnStatistics {
+ 1: required ColumnStatisticsDesc statsDesc,
 -2: required list<ColumnStatisticsObj> statsObj;
++2: required list<ColumnStatisticsObj> statsObj,
++3: optional i64 txnId=-1,            // transaction id of the query that 
sends this structure TODO## needed?
++4: optional string validWriteIdList, // valid write id list for the table for 
which this struct is being sent
++5: optional bool isStatsCompliant // Are the stats isolation-level-compliant 
with the
++                                                      // the calling query?
+ }
+ 
+ struct AggrStats {
+ 1: required list<ColumnStatisticsObj> colStats,
 -2: required i64 partsFound // number of partitions for which stats were found
++2: required i64 partsFound, // number of partitions for which stats were found
++3: optional bool isStatsCompliant
+ }
+ 
+ struct SetPartitionsStatsRequest {
+ 1: required list<ColumnStatistics> colStats,
 -2: optional bool needMerge //stats need to be merged with the existing stats
++2: optional bool needMerge, //stats need to be merged with the existing stats
++3: optional i64 txnId=-1,   // transaction id of the query that sends this 
structure
++4: optional i64 writeId=-1,         // writeId for the current query that 
updates the stats
++5: optional string validWriteIdList // valid write id list for the table for 
which this struct is being sent
+ }
+ 
+ // schema of the table/query results etc.
+ struct Schema {
+  // column names, types, comments
+  1: list<FieldSchema> fieldSchemas,  // delimiters etc
+  2: map<string, string> properties
+ }
+ 
+ // Key-value store to be used with selected
+ // Metastore APIs (create, alter methods).
+ // The client can pass environment properties / configs that can be
+ // accessed in hooks.
+ struct EnvironmentContext {
+   1: map<string, string> properties
+ }
+ 
+ struct PrimaryKeysRequest {
+   1: required string db_name,
+   2: required string tbl_name,
+   3: optional string catName
+ }
+ 
+ struct PrimaryKeysResponse {
+   1: required list<SQLPrimaryKey> primaryKeys
+ }
+ 
+ struct ForeignKeysRequest {
+   1: string parent_db_name,
+   2: string parent_tbl_name,
+   3: string foreign_db_name,
+   4: string foreign_tbl_name
+   5: optional string catName          // No cross catalog constraints
+ }
+ 
+ struct ForeignKeysResponse {
+   1: required list<SQLForeignKey> foreignKeys
+ }
+ 
+ struct UniqueConstraintsRequest {
+   1: required string catName,
+   2: required string db_name,
+   3: required string tbl_name,
+ }
+ 
+ struct UniqueConstraintsResponse {
+   1: required list<SQLUniqueConstraint> uniqueConstraints
+ }
+ 
+ struct NotNullConstraintsRequest {
+   1: required string catName,
+   2: required string db_name,
+   3: required string tbl_name,
+ }
+ 
+ struct NotNullConstraintsResponse {
+   1: required list<SQLNotNullConstraint> notNullConstraints
+ }
+ 
+ struct DefaultConstraintsRequest {
+   1: required string catName,
+   2: required string db_name,
+   3: required string tbl_name
+ }
+ 
+ struct DefaultConstraintsResponse {
+   1: required list<SQLDefaultConstraint> defaultConstraints
+ }
+ 
+ struct CheckConstraintsRequest {
+   1: required string catName,
+   2: required string db_name,
+   3: required string tbl_name
+ }
+ 
+ struct CheckConstraintsResponse {
+   1: required list<SQLCheckConstraint> checkConstraints
+ }
+ 
+ 
+ struct DropConstraintRequest {
+   1: required string dbname, 
+   2: required string tablename,
+   3: required string constraintname,
+   4: optional string catName
+ }
+ 
+ struct AddPrimaryKeyRequest {
+   1: required list<SQLPrimaryKey> primaryKeyCols
+ }
+ 
+ struct AddForeignKeyRequest {
+   1: required list<SQLForeignKey> foreignKeyCols
+ }
+ 
+ struct AddUniqueConstraintRequest {
+   1: required list<SQLUniqueConstraint> uniqueConstraintCols
+ }
+ 
+ struct AddNotNullConstraintRequest {
+   1: required list<SQLNotNullConstraint> notNullConstraintCols
+ }
+ 
+ struct AddDefaultConstraintRequest {
+   1: required list<SQLDefaultConstraint> defaultConstraintCols
+ }
+ 
+ struct AddCheckConstraintRequest {
+   1: required list<SQLCheckConstraint> checkConstraintCols
+ }
+ 
+ // Return type for get_partitions_by_expr
+ struct PartitionsByExprResult {
+   1: required list<Partition> partitions,
+   // Whether the results has any (currently, all) partitions which may or may 
not match
+   2: required bool hasUnknownPartitions
+ }
+ 
+ struct PartitionsByExprRequest {
+   1: required string dbName,
+   2: required string tblName,
+   3: required binary expr,
+   4: optional string defaultPartitionName,
+   5: optional i16 maxParts=-1
+   6: optional string catName
+ }
+ 
+ struct TableStatsResult {
 -  1: required list<ColumnStatisticsObj> tableStats
++  1: required list<ColumnStatisticsObj> tableStats,
++  2: optional bool isStatsCompliant
+ }
+ 
+ struct PartitionsStatsResult {
 -  1: required map<string, list<ColumnStatisticsObj>> partStats
++  1: required map<string, list<ColumnStatisticsObj>> partStats,
++  2: optional bool isStatsCompliant
+ }
+ 
+ struct TableStatsRequest {
+  1: required string dbName,
+  2: required string tblName,
+  3: required list<string> colNames
 - 4: optional string catName
++ 4: optional string catName,
++ 5: optional i64 txnId=-1,            // transaction id of the query that 
sends this structure
++ 6: optional string validWriteIdList  // valid write id list for the table 
for which this struct is being sent
+ }
+ 
+ struct PartitionsStatsRequest {
+  1: required string dbName,
+  2: required string tblName,
+  3: required list<string> colNames,
+  4: required list<string> partNames,
 - 5: optional string catName
++ 5: optional string catName,
++ 6: optional i64 txnId=-1,           // transaction id of the query that 
sends this structure
++ 7: optional string validWriteIdList // valid write id list for the table for 
which this struct is being sent
+ }
+ 
+ // Return type for add_partitions_req
+ struct AddPartitionsResult {
+   1: optional list<Partition> partitions,
++  2: optional bool isStatsCompliant
+ }
+ 
+ // Request type for add_partitions_req
+ struct AddPartitionsRequest {
+   1: required string dbName,
+   2: required string tblName,
+   3: required list<Partition> parts,
+   4: required bool ifNotExists,
+   5: optional bool needResult=true,
 -  6: optional string catName
++  6: optional string catName,
++  7: optional i64 txnId=-1,
++  8: optional string validWriteIdList
+ }
+ 
+ // Return type for drop_partitions_req
+ struct DropPartitionsResult {
+   1: optional list<Partition> partitions,
+ }
+ 
+ struct DropPartitionsExpr {
+   1: required binary expr;
+   2: optional i32 partArchiveLevel;
+ }
+ 
+ union RequestPartsSpec {
+   1: list<string> names;
+   2: list<DropPartitionsExpr> exprs;
+ }
+ 
+ // Request type for drop_partitions_req
+ // TODO: we might want to add "bestEffort" flag; where a subset can fail
+ struct DropPartitionsRequest {
+   1: required string dbName,
+   2: required string tblName,
+   3: required RequestPartsSpec parts,
+   4: optional bool deleteData,
+   5: optional bool ifExists=true, // currently verified on client
+   6: optional bool ignoreProtection,
+   7: optional EnvironmentContext environmentContext,
+   8: optional bool needResult=true,
+   9: optional string catName
+ }
+ 
+ struct PartitionValuesRequest {
+   1: required string dbName,
+   2: required string tblName,
+   3: required list<FieldSchema> partitionKeys;
+   4: optional bool applyDistinct = true;
+   5: optional string filter;
+   6: optional list<FieldSchema> partitionOrder;
+   7: optional bool ascending = true;
+   8: optional i64 maxParts = -1;
+   9: optional string catName
+ }
+ 
+ struct PartitionValuesRow {
+   1: required list<string> row;
+ }
+ 
+ struct PartitionValuesResponse {
+   1: required list<PartitionValuesRow> partitionValues;
+ }
+ 
+ enum FunctionType {
+   JAVA = 1,
+ }
+ 
+ enum ResourceType {
+   JAR     = 1,
+   FILE    = 2,
+   ARCHIVE = 3,
+ }
+ 
+ struct ResourceUri {
+   1: ResourceType resourceType,
+   2: string       uri,
+ }
+ 
+ // User-defined function
+ struct Function {
+   1: string           functionName,
+   2: string           dbName,
+   3: string           className,
+   4: string           ownerName,
+   5: PrincipalType    ownerType,
+   6: i32              createTime,
+   7: FunctionType     functionType,
+   8: list<ResourceUri> resourceUris,
+   9: optional string  catName
+ }
+ 
+ // Structs for transaction and locks
+ struct TxnInfo {
+     1: required i64 id,
+     2: required TxnState state,
+     3: required string user,        // used in 'show transactions' to help 
admins find who has open transactions
+     4: required string hostname,    // used in 'show transactions' to help 
admins find who has open transactions
+     5: optional string agentInfo = "Unknown",
+     6: optional i32 heartbeatCount=0,
+     7: optional string metaInfo,
+     8: optional i64 startedTime,
+     9: optional i64 lastHeartbeatTime,
+ }
+ 
+ struct GetOpenTxnsInfoResponse {
+     1: required i64 txn_high_water_mark,
+     2: required list<TxnInfo> open_txns,
+ }
+ 
+ struct GetOpenTxnsResponse {
+     1: required i64 txn_high_water_mark,
+     2: required list<i64> open_txns,  // set<i64> changed to list<i64> since 
3.0
+     3: optional i64 min_open_txn, //since 1.3,2.2
+     4: required binary abortedBits,   // since 3.0
+ }
+ 
+ struct OpenTxnRequest {
+     1: required i32 num_txns,
+     2: required string user,
+     3: required string hostname,
+     4: optional string agentInfo = "Unknown",
+     5: optional string replPolicy,
+     6: optional list<i64> replSrcTxnIds,
+ }
+ 
+ struct OpenTxnsResponse {
+     1: required list<i64> txn_ids,
+ }
+ 
+ struct AbortTxnRequest {
+     1: required i64 txnid,
+     2: optional string replPolicy,
+ }
+ 
+ struct AbortTxnsRequest {
+     1: required list<i64> txn_ids,
+ }
+ 
+ struct CommitTxnRequest {
+     1: required i64 txnid,
+     2: optional string replPolicy,
+     // Information related to write operations done in this transaction.
+     3: optional list<WriteEventInfo> writeEventInfos,
+ }
+ 
+ struct WriteEventInfo {
+     1: required i64    writeId,
+     2: required string database,
+     3: required string table,
+     4: required string files,
+     5: optional string partition,
+     6: optional string tableObj, // repl txn task does not need table object 
for commit
+     7: optional string partitionObj,
+ }
+ 
+ struct ReplTblWriteIdStateRequest {
+     1: required string validWriteIdlist,
+     2: required string user,
+     3: required string hostName,
+     4: required string dbName,
+     5: required string tableName,
+     6: optional list<string> partNames,
+ }
+ 
+ // Request msg to get the valid write ids list for the given list of tables 
wrt to input validTxnList
+ struct GetValidWriteIdsRequest {
+     1: required list<string> fullTableNames, // Full table names of format 
<db_name>.<table_name>
+     2: required string validTxnList, // Valid txn list string wrt the current 
txn of the caller
+ }
+ 
+ // Valid Write ID list of one table wrt to current txn
+ struct TableValidWriteIds {
+     1: required string fullTableName,  // Full table name of format 
<db_name>.<table_name>
+     2: required i64 writeIdHighWaterMark, // The highest write id valid for 
this table wrt given txn
+     3: required list<i64> invalidWriteIds, // List of open and aborted writes 
ids in the table
+     4: optional i64 minOpenWriteId, // Minimum write id which maps to a 
opened txn
+     5: required binary abortedBits, // Bit array to identify the aborted 
write ids in invalidWriteIds list
+ }
+ 
+ // Valid Write ID list for all the input tables wrt to current txn
+ struct GetValidWriteIdsResponse {
+     1: required list<TableValidWriteIds> tblValidWriteIds,
+ }
+ 
+ // Request msg to allocate table write ids for the given list of txns
+ struct AllocateTableWriteIdsRequest {
+     1: required string dbName,
+     2: required string tableName,
+     // Either txnIds or replPolicy+srcTxnToWriteIdList can exist in a call. 
txnIds is used by normal flow and
+     // replPolicy+srcTxnToWriteIdList is used by replication task.
+     3: optional list<i64> txnIds,
+     4: optional string replPolicy,
+     // The list is assumed to be sorted by both txnids and write ids. The 
write id list is assumed to be contiguous.
+     5: optional list<TxnToWriteId> srcTxnToWriteIdList,
+ }
+ 
+ // Map for allocated write id against the txn for which it is allocated
+ struct TxnToWriteId {
+     1: required i64 txnId,
+     2: required i64 writeId,
+ }
+ 
+ struct AllocateTableWriteIdsResponse {
+     1: required list<TxnToWriteId> txnToWriteIds,
+ }
+ 
+ struct LockComponent {
+     1: required LockType type,
+     2: required LockLevel level,
+     3: required string dbname,
+     4: optional string tablename,
+     5: optional string partitionname,
+     6: optional DataOperationType operationType = DataOperationType.UNSET,
+     7: optional bool isTransactional = false,
+     8: optional bool isDynamicPartitionWrite = false
+ }
+ 
+ struct LockRequest {
+     1: required list<LockComponent> component,
+     2: optional i64 txnid,
+     3: required string user,     // used in 'show locks' to help admins find 
who has open locks
+     4: required string hostname, // used in 'show locks' to help admins find 
who has open locks
+     5: optional string agentInfo = "Unknown",
+ }
+ 
+ struct LockResponse {
+     1: required i64 lockid,
+     2: required LockState state,
+ }
+ 
+ struct CheckLockRequest {
+     1: required i64 lockid,
+     2: optional i64 txnid,
+     3: optional i64 elapsed_ms,
+ }
+ 
+ struct UnlockRequest {
+     1: required i64 lockid,
+ }
+ 
+ struct ShowLocksRequest {
+     1: optional string dbname,
+     2: optional string tablename,
+     3: optional string partname,
+     4: optional bool isExtended=false,
+ }
+ 
+ struct ShowLocksResponseElement {
+     1: required i64 lockid,
+     2: required string dbname,
+     3: optional string tablename,
+     4: optional string partname,
+     5: required LockState state,
+     6: required LockType type,
+     7: optional i64 txnid,
+     8: required i64 lastheartbeat,
+     9: optional i64 acquiredat,
+     10: required string user,
+     11: required string hostname,
+     12: optional i32 heartbeatCount = 0,
+     13: optional string agentInfo,
+     14: optional i64 blockedByExtId,
+     15: optional i64 blockedByIntId,
+     16: optional i64 lockIdInternal,
+ }
+ 
+ struct ShowLocksResponse {
+     1: list<ShowLocksResponseElement> locks,
+ }
+ 
+ struct HeartbeatRequest {
+     1: optional i64 lockid,
+     2: optional i64 txnid
+ }
+ 
+ struct HeartbeatTxnRangeRequest {
+     1: required i64 min,
+     2: required i64 max
+ }
+ 
+ struct HeartbeatTxnRangeResponse {
+     1: required set<i64> aborted,
+     2: required set<i64> nosuch
+ }
+ 
+ struct CompactionRequest {
+     1: required string dbname,
+     2: required string tablename,
+     3: optional string partitionname,
+     4: required CompactionType type,
+     5: optional string runas,
+     6: optional map<string, string> properties
+ }
+ 
+ struct CompactionResponse {
+     1: required i64 id,
+     2: required string state,
+     3: required bool accepted
+ }
+ 
+ struct ShowCompactRequest {
+ }
+ 
+ struct ShowCompactResponseElement {
+     1: required string dbname,
+     2: required string tablename,
+     3: optional string partitionname,
+     4: required CompactionType type,
+     5: required string state,
+     6: optional string workerid,
+     7: optional i64 start,
+     8: optional string runAs,
+     9: optional i64 hightestTxnId, // Highest Txn ID handled by this 
compaction
+     10: optional string metaInfo,
+     11: optional i64 endTime,
+     12: optional string hadoopJobId = "None",
+     13: optional i64 id,
+ }
+ 
+ struct ShowCompactResponse {
+     1: required list<ShowCompactResponseElement> compacts,
+ }
+ 
+ struct AddDynamicPartitions {
+     1: required i64 txnid,
+     2: required i64 writeid,
+     3: required string dbname,
+     4: required string tablename,
+     5: required list<string> partitionnames,
+     6: optional DataOperationType operationType = DataOperationType.UNSET
+ }
+ 
+ struct BasicTxnInfo {
+     1: required bool isnull,
+     2: optional i64 time,
+     3: optional i64 txnid,
+     4: optional string dbname,
+     5: optional string tablename,
+     6: optional string partitionname
+ }
+ 
+ struct CreationMetadata {
+     1: required string catName
+     2: required string dbName,
+     3: required string tblName,
+     4: required set<string> tablesUsed,
+     5: optional string validTxnList,
+ }
+ 
+ struct NotificationEventRequest {
+     1: required i64 lastEvent,
+     2: optional i32 maxEvents,
+ }
+ 
+ struct NotificationEvent {
+     1: required i64 eventId,
+     2: required i32 eventTime,
+     3: required string eventType,
+     4: optional string dbName,
+     5: optional string tableName,
+     6: required string message,
+     7: optional string messageFormat,
+     8: optional string catName
+ }
+ 
+ struct NotificationEventResponse {
+     1: required list<NotificationEvent> events,
+ }
+ 
+ struct CurrentNotificationEventId {
+     1: required i64 eventId,
+ }
+ 
+ struct NotificationEventsCountRequest {
+     1: required i64 fromEventId,
+     2: required string dbName,
+     3: optional string catName
+ }
+ 
+ struct NotificationEventsCountResponse {
+     1: required i64 eventsCount,
+ }
+ 
+ struct InsertEventRequestData {
+     1: optional bool replace,
+     2: required list<string> filesAdded,
+     // Checksum of files (hex string of checksum byte payload)
+     3: optional list<string> filesAddedChecksum,
+     // Used by acid operation to create the sub directory
+     4: optional list<string> subDirectoryList,
+ }
+ 
+ union FireEventRequestData {
+     1: InsertEventRequestData insertData
+ }
+ 
+ struct FireEventRequest {
+     1: required bool successful,
+     2: required FireEventRequestData data
+     // dbname, tablename, and partition vals are included as optional in the 
top level event rather than placed in each type of
+     // subevent as I assume they'll be used across most event types.
+     3: optional string dbName,
+     4: optional string tableName,
+     5: optional list<string> partitionVals,
+     6: optional string catName,
+ }
+ 
+ struct FireEventResponse {
+     // NOP for now, this is just a place holder for future responses
+ }
+ 
+ struct WriteNotificationLogRequest {
+     1: required i64 txnId,
+     2: required i64 writeId,
+     3: required string db,
+     4: required string table,
+     5: required InsertEventRequestData fileInfo,
+     6: optional list<string> partitionVals,
+ }
+ 
+ struct WriteNotificationLogResponse {
+     // NOP for now, this is just a place holder for future responses
+ }
+ 
+ struct MetadataPpdResult {
+   1: optional binary metadata,
+   2: optional binary includeBitset
+ }
+ 
+ // Return type for get_file_metadata_by_expr
+ struct GetFileMetadataByExprResult {
+   1: required map<i64, MetadataPpdResult> metadata,
+   2: required bool isSupported
+ }
+ 
+ enum FileMetadataExprType {
+   ORC_SARG = 1
+ }
+ 
+ 
+ // Request type for get_file_metadata_by_expr
+ struct GetFileMetadataByExprRequest {
+   1: required list<i64> fileIds,
+   2: required binary expr,
+   3: optional bool doGetFooters,
+   4: optional FileMetadataExprType type
+ }
+ 
+ // Return type for get_file_metadata
+ struct GetFileMetadataResult {
+   1: required map<i64, binary> metadata,
+   2: required bool isSupported
+ }
+ 
+ // Request type for get_file_metadata
+ struct GetFileMetadataRequest {
+   1: required list<i64> fileIds
+ }
+ 
+ // Return type for put_file_metadata
+ struct PutFileMetadataResult {
+ }
+ 
+ // Request type for put_file_metadata
+ struct PutFileMetadataRequest {
+   1: required list<i64> fileIds,
+   2: required list<binary> metadata,
+   3: optional FileMetadataExprType type
+ }
+ 
+ // Return type for clear_file_metadata
+ struct ClearFileMetadataResult {
+ }
+ 
+ // Request type for clear_file_metadata
+ struct ClearFileMetadataRequest {
+   1: required list<i64> fileIds
+ }
+ 
+ // Return type for cache_file_metadata
+ struct CacheFileMetadataResult {
+   1: required bool isSupported
+ }
+ 
+ // Request type for cache_file_metadata
+ struct CacheFileMetadataRequest {
+   1: required string dbName,
+   2: required string tblName,
+   3: optional string partName,
+   4: optional bool isAllParts
+ }
+ 
+ struct GetAllFunctionsResponse {
+   1: optional list<Function> functions
+ }
+ 
+ enum ClientCapability {
+   TEST_CAPABILITY = 1,
+   INSERT_ONLY_TABLES = 2
+ }
+ 
+ 
+ struct ClientCapabilities {
+   1: required list<ClientCapability> values
+ }
+ 
+ struct GetTableRequest {
+   1: required string dbName,
+   2: required string tblName,
+   3: optional ClientCapabilities capabilities,
 -  4: optional string catName
++  4: optional string catName,
++  5: optional i64 txnId=-1,
++  6: optional string validWriteIdList
+ }
+ 
+ struct GetTableResult {
 -  1: required Table table
++  1: required Table table,
++  2: optional bool isStatsCompliant
+ }
+ 
+ struct GetTablesRequest {
+   1: required string dbName,
+   2: optional list<string> tblNames,
+   3: optional ClientCapabilities capabilities,
+   4: optional string catName
+ }
+ 
+ struct GetTablesResult {
+   1: required list<Table> tables
+ }
+ 
+ // Request type for cm_recycle
+ struct CmRecycleRequest {
+   1: required string dataPath,
+   2: required bool purge
+ }
+ 
+ // Response type for cm_recycle
+ struct CmRecycleResponse {
+ }
+ 
+ struct TableMeta {
+   1: required string dbName;
+   2: required string tableName;
+   3: required string tableType;
+   4: optional string comments;
+   5: optional string catName;
+ }
+ 
+ struct Materialization {
+   1: required set<string> tablesUsed;
+   2: optional string validTxnList
+   3: optional i64 invalidationTime;
+   4: optional bool sourceTablesUpdateDeleteModified;
+ }
+ 
+ // Data types for workload management.
+ 
+ enum WMResourcePlanStatus {
+   ACTIVE = 1,
+   ENABLED = 2,
+   DISABLED = 3
+ }
+ 
+ enum  WMPoolSchedulingPolicy {
+   FAIR = 1,
+   FIFO = 2
+ }
+ 
+ struct WMResourcePlan {
+   1: required string name;
+   2: optional WMResourcePlanStatus status;
+   3: optional i32 queryParallelism;
+   4: optional string defaultPoolPath;
+ }
+ 
+ struct WMNullableResourcePlan {
+   1: optional string name;
+   2: optional WMResourcePlanStatus status;
+   4: optional i32 queryParallelism;
+   5: optional bool isSetQueryParallelism;
+   6: optional string defaultPoolPath;
+   7: optional bool isSetDefaultPoolPath;
+ }
+ 
+ struct WMPool {
+   1: required string resourcePlanName;
+   2: required string poolPath;
+   3: optional double allocFraction;
+   4: optional i32 queryParallelism;
+   5: optional string schedulingPolicy;
+ }
+ 
+ 
+ struct WMNullablePool {
+   1: required string resourcePlanName;
+   2: required string poolPath;
+   3: optional double allocFraction;
+   4: optional i32 queryParallelism;
+   5: optional string schedulingPolicy;
+   6: optional bool isSetSchedulingPolicy;
+ }
+ 
+ struct WMTrigger {
+   1: required string resourcePlanName;
+   2: required string triggerName;
+   3: optional string triggerExpression;
+   4: optional string actionExpression;
+   5: optional bool isInUnmanaged;
+ }
+ 
+ struct WMMapping {
+   1: required string resourcePlanName;
+   2: required string entityType;
+   3: required string entityName;
+   4: optional string poolPath;
+   5: optional i32 ordering;
+ }
+ 
+ struct WMPoolTrigger {
+   1: required string pool;
+   2: required string trigger;
+ }
+ 
+ struct WMFullResourcePlan {
+   1: required WMResourcePlan plan;
+   2: required list<WMPool> pools;
+   3: optional list<WMMapping> mappings;
+   4: optional list<WMTrigger> triggers;
+   5: optional list<WMPoolTrigger> poolTriggers;
+ }
+ 
+ // Request response for workload management API's.
+ 
+ struct WMCreateResourcePlanRequest {
+   1: optional WMResourcePlan resourcePlan;
+   2: optional string copyFrom;
+ }
+ 
+ struct WMCreateResourcePlanResponse {
+ }
+ 
+ struct WMGetActiveResourcePlanRequest {
+ }
+ 
+ struct WMGetActiveResourcePlanResponse {
+   1: optional WMFullResourcePlan resourcePlan;
+ }
+ 
+ struct WMGetResourcePlanRequest {
+   1: optional string resourcePlanName;
+ }
+ 
+ struct WMGetResourcePlanResponse {
+   1: optional WMFullResourcePlan resourcePlan;
+ }
+ 
+ struct WMGetAllResourcePlanRequest {
+ }
+ 
+ struct WMGetAllResourcePlanResponse {
+   1: optional list<WMResourcePlan> resourcePlans;
+ }
+ 
+ struct WMAlterResourcePlanRequest {
+   1: optional string resourcePlanName;
+   2: optional WMNullableResourcePlan resourcePlan;
+   3: optional bool isEnableAndActivate;
+   4: optional bool isForceDeactivate;
+   5: optional bool isReplace;
+ }
+ 
+ struct WMAlterResourcePlanResponse {
+   1: optional WMFullResourcePlan fullResourcePlan;
+ }
+ 
+ struct WMValidateResourcePlanRequest {
+   1: optional string resourcePlanName;
+ }
+ 
+ struct WMValidateResourcePlanResponse {
+   1: optional list<string> errors;
+   2: optional list<string> warnings;
+ }
+ 
+ struct WMDropResourcePlanRequest {
+   1: optional string resourcePlanName;
+ }
+ 
+ struct WMDropResourcePlanResponse {
+ }
+ 
+ struct WMCreateTriggerRequest {
+   1: optional WMTrigger trigger;
+ }
+ 
+ struct WMCreateTriggerResponse {
+ }
+ 
+ struct WMAlterTriggerRequest {
+   1: optional WMTrigger trigger;
+ }
+ 
+ struct WMAlterTriggerResponse {
+ }
+ 
+ struct WMDropTriggerRequest {
+   1: optional string resourcePlanName;
+   2: optional string triggerName;
+ }
+ 
+ struct WMDropTriggerResponse {
+ }
+ 
+ struct WMGetTriggersForResourePlanRequest {
+   1: optional string resourcePlanName;
+ }
+ 
+ struct WMGetTriggersForResourePlanResponse {
+   1: optional list<WMTrigger> triggers;
+ }
+ 
+ struct WMCreatePoolRequest {
+   1: optional WMPool pool;
+ }
+ 
+ struct WMCreatePoolResponse {
+ }
+ 
+ struct WMAlterPoolRequest {
+   1: optional WMNullablePool pool;
+   2: optional string poolPath;
+ }
+ 
+ struct WMAlterPoolResponse {
+ }
+ 
+ struct WMDropPoolRequest {
+   1: optional string resourcePlanName;
+   2: optional string poolPath;
+ }
+ 
+ struct WMDropPoolResponse {
+ }
+ 
+ struct WMCreateOrUpdateMappingRequest {
+   1: optional WMMapping mapping;
+   2: optional bool update;
+ }
+ 
+ struct WMCreateOrUpdateMappingResponse {
+ }
+ 
+ struct WMDropMappingRequest {
+   1: optional WMMapping mapping;
+ }
+ 
+ struct WMDropMappingResponse {
+ }
+ 
+ struct WMCreateOrDropTriggerToPoolMappingRequest {
+   1: optional string resourcePlanName;
+   2: optional string triggerName;
+   3: optional string poolPath;
+   4: optional bool drop;
+ }
+ 
+ struct WMCreateOrDropTriggerToPoolMappingResponse {
+ }
+ 
+ // Schema objects
+ // Schema is already taken, so for the moment I'm calling it an ISchema for 
Independent Schema
+ struct ISchema {
+   1: SchemaType schemaType,
+   2: string name,
+   3: string catName,
+   4: string dbName,
+   5: SchemaCompatibility compatibility,
+   6: SchemaValidation validationLevel,
+   7: bool canEvolve,
+   8: optional string schemaGroup,
+   9: optional string description
+ }
+ 
+ struct ISchemaName {
+   1: string catName,
+   2: string dbName,
+   3: string schemaName
+ }
+ 
+ struct AlterISchemaRequest {
+   1: ISchemaName name,
+   3: ISchema newSchema
+ }
+ 
+ struct SchemaVersion {
+   1:  ISchemaName schema,
+   2:  i32 version,
+   3:  i64 createdAt,
+   4:  list<FieldSchema> cols,
+   5:  optional SchemaVersionState state,
+   6:  optional string description,
+   7:  optional string schemaText,
+   8:  optional string fingerprint,
+   9:  optional string name,
+   10: optional SerDeInfo serDe
+ }
+ 
+ struct SchemaVersionDescriptor {
+   1: ISchemaName schema,
+   2: i32 version
+ }
+ 
+ struct FindSchemasByColsRqst {
+   1: optional string colName,
+   2: optional string colNamespace,
+   3: optional string type
+ }
+ 
+ struct FindSchemasByColsResp {
+   1: list<SchemaVersionDescriptor> schemaVersions
+ }
+ 
+ struct MapSchemaVersionToSerdeRequest {
+   1: SchemaVersionDescriptor schemaVersion,
+   2: string serdeName
+ }
+ 
+ struct SetSchemaVersionStateRequest {
+   1: SchemaVersionDescriptor schemaVersion,
+   2: SchemaVersionState state
+ }
+ 
+ struct GetSerdeRequest {
+   1: string serdeName
+ }
+ 
+ struct RuntimeStat {
+   1: optional i32 createTime,
+   2: required i32 weight,
+   3: required binary payload
+ }
+ 
+ struct GetRuntimeStatsRequest {
+   1: required i32 maxWeight,
+   2: required i32 maxCreateTime
+ }
+ 
++struct AlterPartitionsRequest {
++  1: required string dbName,
++  2: required string tableName,
++  3: required list<Partition> partitions,
++  4: required EnvironmentContext environmentContext,
++  5: optional i64 txnId=-1,
++  6: optional i64 writeId=-1,
++  7: optional string validWriteIdList
++}
++
++struct AlterPartitionsResponse {
++}
++
+ // Exceptions.
+ 
+ exception MetaException {
+   1: string message
+ }
+ 
+ exception UnknownTableException {
+   1: string message
+ }
+ 
+ exception UnknownDBException {
+   1: string message
+ }
+ 
+ exception AlreadyExistsException {
+   1: string message
+ }
+ 
+ exception InvalidPartitionException {
+   1: string message
+ }
+ 
+ exception UnknownPartitionException {
+   1: string message
+ }
+ 
+ exception InvalidObjectException {
+   1: string message
+ }
+ 
+ exception NoSuchObjectException {
+   1: string message
+ }
+ 
+ exception InvalidOperationException {
+   1: string message
+ }
+ 
+ exception ConfigValSecurityException {
+   1: string message
+ }
+ 
+ exception InvalidInputException {
+   1: string message
+ }
+ 
+ // Transaction and lock exceptions
+ exception NoSuchTxnException {
+     1: string message
+ }
+ 
+ exception TxnAbortedException {
+     1: string message
+ }
+ 
+ exception TxnOpenException {
+     1: string message
+ }
+ 
+ exception NoSuchLockException {
+     1: string message
+ }
+ 
+ /**
+ * This interface is live.
+ */
+ service ThriftHiveMetastore extends fb303.FacebookService
+ {
+   string getMetaConf(1:string key) throws(1:MetaException o1)
+   void setMetaConf(1:string key, 2:string value) throws(1:MetaException o1)
+ 
+   void create_catalog(1: CreateCatalogRequest catalog) throws 
(1:AlreadyExistsException o1, 2:InvalidObjectException o2, 3: MetaException o3)
+   void alter_catalog(1: AlterCatalogRequest rqst) throws 
(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 3:MetaException o3)
+   GetCatalogResponse get_catalog(1: GetCatalogRequest catName) throws 
(1:NoSuchObjectException o1, 2:MetaException o2)
+   GetCatalogsResponse get_catalogs() throws (1:MetaException o1)
+   void drop_catalog(1: DropCatalogRequest catName) throws 
(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 3:MetaException o3)
+ 
+   void create_database(1:Database database) throws(1:AlreadyExistsException 
o1, 2:InvalidObjectException o2, 3:MetaException o3)
+   Database get_database(1:string name) throws(1:NoSuchObjectException o1, 
2:MetaException o2)
+   void drop_database(1:string name, 2:bool deleteData, 3:bool cascade) 
throws(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 
3:MetaException o3)
+   list<string> get_databases(1:string pattern) throws(1:MetaException o1)
+   list<string> get_all_databases() throws(1:MetaException o1)
+   void alter_database(1:string dbname, 2:Database db) throws(1:MetaException 
o1, 2:NoSuchObjectException o2)
+ 
+   // returns the type with given name (make seperate calls for the dependent 
types if needed)
+   Type get_type(1:string name)  throws(1:MetaException o1, 
2:NoSuchObjectException o2)
+   bool create_type(1:Type type) throws(1:AlreadyExistsException o1, 
2:InvalidObjectException o2, 3:MetaException o3)
+   bool drop_type(1:string type) throws(1:MetaException o1, 
2:NoSuchObjectException o2)
+   map<string, Type> get_type_all(1:string name)
+                                 throws(1:MetaException o2)
+ 
+   // Gets a list of FieldSchemas describing the columns of a particular table
+   list<FieldSchema> get_fields(1: string db_name, 2: string table_name) 
throws (1: MetaException o1, 2: UnknownTableException o2, 3: UnknownDBException 
o3),
+   list<FieldSchema> get_fields_with_environment_context(1: string db_name, 2: 
string table_name, 3:EnvironmentContext environment_context) throws (1: 
MetaException o1, 2: UnknownTableException o2, 3: UnknownDBException o3)
+ 
+   // Gets a list of FieldSchemas describing both the columns and the 
partition keys of a particular table
+   list<FieldSchema> get_schema(1: string db_name, 2: string table_name) 
throws (1: MetaException o1, 2: UnknownTableException o2, 3: UnknownDBException 
o3)
+   list<FieldSchema> get_schema_with_environment_context(1: string db_name, 2: 
string table_name, 3:EnvironmentContext environment_context) throws (1: 
MetaException o1, 2: UnknownTableException o2, 3: UnknownDBException o3)
+ 
+   // create a Hive table. Following fields must be set
+   // tableName
+   // database        (only 'default' for now until Hive QL supports databases)
+   // owner           (not needed, but good to have for tracking purposes)
+   // sd.cols         (list of field schemas)
+   // sd.inputFormat  (SequenceFileInputFormat (binary like falcon tables or 
u_full) or TextInputFormat)
+   // sd.outputFormat (SequenceFileInputFormat (binary) or TextInputFormat)
+   // sd.serdeInfo.serializationLib (SerDe class name eg 
org.apache.hadoop.hive.serde.simple_meta.MetadataTypedColumnsetSerDe
+   // * See notes on DDL_TIME
+   void create_table(1:Table tbl) throws(1:AlreadyExistsException o1, 
2:InvalidObjectException o2, 3:MetaException o3, 4:NoSuchObjectException o4)
+   void create_table_with_environment_context(1:Table tbl,
+       2:EnvironmentContext environment_context)
+       throws (1:AlreadyExistsException o1,
+               2:InvalidObjectException o2, 3:MetaException o3,
+               4:NoSuchObjectException o4)
+   void create_table_with_constraints(1:Table tbl, 2: list<SQLPrimaryKey> 
primaryKeys, 3: list<SQLForeignKey> foreignKeys,
+   4: list<SQLUniqueConstraint> uniqueConstraints, 5: 
list<SQLNotNullConstraint> notNullConstraints,
+   6: list<SQLDefaultConstraint> defaultConstraints, 7: 
list<SQLCheckConstraint> checkConstraints)
+       throws (1:AlreadyExistsException o1,
+               2:InvalidObjectException o2, 3:MetaException o3,
+               4:NoSuchObjectException o4)
+   void drop_constraint(1:DropConstraintRequest req)
+       throws(1:NoSuchObjectException o1, 2:MetaException o3)
+   void add_primary_key(1:AddPrimaryKeyRequest req)
+       throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   void add_foreign_key(1:AddForeignKeyRequest req)
+       throws(1:NoSuchObjectException o1, 2:MetaException o2)  
+   void add_unique_constraint(1:AddUniqueConstraintRequest req)
+       throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   void add_not_null_constraint(1:AddNotNullConstraintRequest req)
+       throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   void add_default_constraint(1:AddDefaultConstraintRequest req)
+       throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   void add_check_constraint(1:AddCheckConstraintRequest req)
+       throws(1:NoSuchObjectException o1, 2:MetaException o2)
+ 
+   // drops the table and all the partitions associated with it if the table 
has partitions
+   // delete data (including partitions) if deleteData is set to true
+   void drop_table(1:string dbname, 2:string name, 3:bool deleteData)
+                        throws(1:NoSuchObjectException o1, 2:MetaException o3)
+   void drop_table_with_environment_context(1:string dbname, 2:string name, 
3:bool deleteData,
+       4:EnvironmentContext environment_context)
+                        throws(1:NoSuchObjectException o1, 2:MetaException o3)
+   void truncate_table(1:string dbName, 2:string tableName, 3:list<string> 
partNames)
+                           throws(1:MetaException o1)
+   list<string> get_tables(1: string db_name, 2: string pattern) throws (1: 
MetaException o1)
+   list<string> get_tables_by_type(1: string db_name, 2: string pattern, 3: 
string tableType) throws (1: MetaException o1)
+   list<string> get_materialized_views_for_rewriting(1: string db_name) throws 
(1: MetaException o1)
+   list<TableMeta> get_table_meta(1: string db_patterns, 2: string 
tbl_patterns, 3: list<string> tbl_types)
+                        throws (1: MetaException o1)
+   list<string> get_all_tables(1: string db_name) throws (1: MetaException o1)
+ 
+   Table get_table(1:string dbname, 2:string tbl_name)
+                        throws (1:MetaException o1, 2:NoSuchObjectException o2)
+   list<Table> get_table_objects_by_name(1:string dbname, 2:list<string> 
tbl_names)
+   GetTableResult get_table_req(1:GetTableRequest req) throws (1:MetaException 
o1, 2:NoSuchObjectException o2)
+   GetTablesResult get_table_objects_by_name_req(1:GetTablesRequest req)
+                                  throws (1:MetaException o1, 
2:InvalidOperationException o2, 3:UnknownDBException o3)
+   map<string, Materialization> get_materialization_invalidation_info(1:string 
dbname, 2:list<string> tbl_names)
+                                  throws (1:MetaException o1, 
2:InvalidOperationException o2, 3:UnknownDBException o3)
+   void update_creation_metadata(1: string catName, 2:string dbname, 3:string 
tbl_name, 4:CreationMetadata creation_metadata)
+                    throws (1:MetaException o1, 2:InvalidOperationException 
o2, 3:UnknownDBException o3)
+ 
+   // Get a list of table names that match a filter.
+   // The filter operators are LIKE, <, <=, >, >=, =, <>
+   //
+   // In the filter statement, values interpreted as strings must be enclosed 
in quotes,
+   // while values interpreted as integers should not be.  Strings and 
integers are the only
+   // supported value types.
+   //
+   // The currently supported key names in the filter are:
+   // Constants.HIVE_FILTER_FIELD_OWNER, which filters on the tables' owner's 
name
+   //   and supports all filter operators
+   // Constants.HIVE_FILTER_FIELD_LAST_ACCESS, which filters on the last 
access times
+   //   and supports all filter operators except LIKE
+   // Constants.HIVE_FILTER_FIELD_PARAMS, which filters on the tables' 
parameter keys and values
+   //   and only supports the filter operators = and <>.
+   //   Append the parameter key name to HIVE_FILTER_FIELD_PARAMS in the 
filter statement.
+   //   For example, to filter on parameter keys called "retention", the key 
name in the filter
+   //   statement should be Constants.HIVE_FILTER_FIELD_PARAMS + "retention"
+   //   Also, = and <> only work for keys that exist
+   //   in the tables. E.g., if you are looking for tables where key1 <> 
value, it will only
+   //   look at tables that have a value for the parameter key1.
+   // Some example filter statements include:
+   // filter = Constants.HIVE_FILTER_FIELD_OWNER + " like \".*test.*\" and " +
+   //   Constants.HIVE_FILTER_FIELD_LAST_ACCESS + " = 0";
+   // filter = Constants.HIVE_FILTER_FIELD_PARAMS + "retention = \"30\" or " +
+   //   Constants.HIVE_FILTER_FIELD_PARAMS + "retention = \"90\""
+   // @param dbName
+   //          The name of the database from which you will retrieve the table 
names
+   // @param filterType
+   //          The type of filter
+   // @param filter
+   //          The filter string
+   // @param max_tables
+   //          The maximum number of tables returned
+   // @return  A list of table names that match the desired filter
+   list<string> get_table_names_by_filter(1:string dbname, 2:string filter, 
3:i16 max_tables=-1)
+                        throws (1:MetaException o1, 
2:InvalidOperationException o2, 3:UnknownDBException o3)
+ 
+   // alter table applies to only future partitions not for existing partitions
+   // * See notes on DDL_TIME
+   void alter_table(1:string dbname, 2:string tbl_name, 3:Table new_tbl)
+                        throws (1:InvalidOperationException o1, 
2:MetaException o2)
+   void alter_table_with_environment_context(1:string dbname, 2:string 
tbl_name,
+       3:Table new_tbl, 4:EnvironmentContext environment_context)
+       throws (1:InvalidOperationException o1, 2:MetaException o2)
+   // alter table not only applies to future partitions but also cascade to 
existing partitions
+   void alter_table_with_cascade(1:string dbname, 2:string tbl_name, 3:Table 
new_tbl, 4:bool cascade)
+                        throws (1:InvalidOperationException o1, 
2:MetaException o2)
+   // the following applies to only tables that have partitions
+   // * See notes on DDL_TIME
+   Partition add_partition(1:Partition new_part)
+                        throws(1:InvalidObjectException o1, 
2:AlreadyExistsException o2, 3:MetaException o3)
+   Partition add_partition_with_environment_context(1:Partition new_part,
+       2:EnvironmentContext environment_context)
+       throws (1:InvalidObjectException o1, 2:AlreadyExistsException o2,
+       3:MetaException o3)
+   i32 add_partitions(1:list<Partition> new_parts)
+                        throws(1:InvalidObjectException o1, 
2:AlreadyExistsException o2, 3:MetaException o3)
+   i32 add_partitions_pspec(1:list<PartitionSpec> new_parts)
+                        throws(1:InvalidObjectException o1, 
2:AlreadyExistsException o2, 3:MetaException o3)
+   Partition append_partition(1:string db_name, 2:string tbl_name, 
3:list<string> part_vals)
+                        throws (1:InvalidObjectException o1, 
2:AlreadyExistsException o2, 3:MetaException o3)
+   AddPartitionsResult add_partitions_req(1:AddPartitionsRequest request)
+                        throws(1:InvalidObjectException o1, 
2:AlreadyExistsException o2, 3:MetaException o3)
+   Partition append_partition_with_environment_context(1:string db_name, 
2:string tbl_name,
+       3:list<string> part_vals, 4:EnvironmentContext environment_context)
+                        throws (1:InvalidObjectException o1, 
2:AlreadyExistsException o2, 3:MetaException o3)
+   Partition append_partition_by_name(1:string db_name, 2:string tbl_name, 
3:string part_name)
+                        throws (1:InvalidObjectException o1, 
2:AlreadyExistsException o2, 3:MetaException o3)
+   Partition append_partition_by_name_with_environment_context(1:string 
db_name, 2:string tbl_name,
+       3:string part_name, 4:EnvironmentContext environment_context)
+                        throws (1:InvalidObjectException o1, 
2:AlreadyExistsException o2, 3:MetaException o3)
+   bool drop_partition(1:string db_name, 2:string tbl_name, 3:list<string> 
part_vals, 4:bool deleteData)
+                        throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   bool drop_partition_with_environment_context(1:string db_name, 2:string 
tbl_name,
+       3:list<string> part_vals, 4:bool deleteData, 5:EnvironmentContext 
environment_context)
+                        throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   bool drop_partition_by_name(1:string db_name, 2:string tbl_name, 3:string 
part_name, 4:bool deleteData)
+                        throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   bool drop_partition_by_name_with_environment_context(1:string db_name, 
2:string tbl_name,
+       3:string part_name, 4:bool deleteData, 5:EnvironmentContext 
environment_context)
+                        throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   DropPartitionsResult drop_partitions_req(1: DropPartitionsRequest req)
+                        throws(1:NoSuchObjectException o1, 2:MetaException o2)
+ 
+   Partition get_partition(1:string db_name, 2:string tbl_name, 3:list<string> 
part_vals)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+   Partition exchange_partition(1:map<string, string> partitionSpecs, 2:string 
source_db,
+       3:string source_table_name, 4:string dest_db, 5:string dest_table_name)
+       throws(1:MetaException o1, 2:NoSuchObjectException o2, 
3:InvalidObjectException o3,
+       4:InvalidInputException o4)
+ 
+   list<Partition> exchange_partitions(1:map<string, string> partitionSpecs, 
2:string source_db,
+       3:string source_table_name, 4:string dest_db, 5:string dest_table_name)
+       throws(1:MetaException o1, 2:NoSuchObjectException o2, 
3:InvalidObjectException o3,
+       4:InvalidInputException o4)
+ 
+   Partition get_partition_with_auth(1:string db_name, 2:string tbl_name, 
3:list<string> part_vals,
+       4: string user_name, 5: list<string> group_names) 
throws(1:MetaException o1, 2:NoSuchObjectException o2)
+ 
+   Partition get_partition_by_name(1:string db_name 2:string tbl_name, 
3:string part_name)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+ 
+   // returns all the partitions for this table in reverse chronological order.
+   // If max parts is given then it will return only that many.
+   list<Partition> get_partitions(1:string db_name, 2:string tbl_name, 3:i16 
max_parts=-1)
+                        throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   list<Partition> get_partitions_with_auth(1:string db_name, 2:string 
tbl_name, 3:i16 max_parts=-1,
+      4: string user_name, 5: list<string> group_names) 
throws(1:NoSuchObjectException o1, 2:MetaException o2)
+ 
+   list<PartitionSpec> get_partitions_pspec(1:string db_name, 2:string 
tbl_name, 3:i32 max_parts=-1)
+                        throws(1:NoSuchObjectException o1, 2:MetaException o2)
+ 
+   list<string> get_partition_names(1:string db_name, 2:string tbl_name, 3:i16 
max_parts=-1)
+                        throws(1:NoSuchObjectException o1, 2:MetaException o2)
+ 
+   PartitionValuesResponse get_partition_values(1:PartitionValuesRequest 
request)
+     throws(1:MetaException o1, 2:NoSuchObjectException o2);
+ 
+   // get_partition*_ps methods allow filtering by a partial partition 
specification,
+   // as needed for dynamic partitions. The values that are not restricted 
should
+   // be empty strings. Nulls were considered (instead of "") but caused 
errors in
+   // generated Python code. The size of part_vals may be smaller than the
+   // number of partition columns - the unspecified values are considered the 
same
+   // as "".
+   list<Partition> get_partitions_ps(1:string db_name 2:string tbl_name
+       3:list<string> part_vals, 4:i16 max_parts=-1)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+   list<Partition> get_partitions_ps_with_auth(1:string db_name, 2:string 
tbl_name, 3:list<string> part_vals, 4:i16 max_parts=-1,
+      5: string user_name, 6: list<string> group_names) 
throws(1:NoSuchObjectException o1, 2:MetaException o2)
+ 
+   list<string> get_partition_names_ps(1:string db_name,
+       2:string tbl_name, 3:list<string> part_vals, 4:i16 max_parts=-1)
+                          throws(1:MetaException o1, 2:NoSuchObjectException 
o2)
+ 
+   // get the partitions matching the given partition filter
+   list<Partition> get_partitions_by_filter(1:string db_name 2:string tbl_name
+     3:string filter, 4:i16 max_parts=-1)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+ 
+   // List partitions as PartitionSpec instances.
+   list<PartitionSpec> get_part_specs_by_filter(1:string db_name 2:string 
tbl_name
+     3:string filter, 4:i32 max_parts=-1)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+ 
+   // get the partitions matching the given partition filter
+   // unlike get_partitions_by_filter, takes serialized hive expression, and 
with that can work
+   // with any filter (get_partitions_by_filter only works if the filter can 
be pushed down to JDOQL.
+   PartitionsByExprResult get_partitions_by_expr(1:PartitionsByExprRequest req)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+ 
+   // get the partitions matching the given partition filter
+   i32 get_num_partitions_by_filter(1:string db_name 2:string tbl_name 
3:string filter)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+ 
+   // get partitions give a list of partition names
+   list<Partition> get_partitions_by_names(1:string db_name 2:string tbl_name 
3:list<string> names)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+ 
+   // changes the partition to the new partition object. partition is 
identified from the part values
+   // in the new_part
+   // * See notes on DDL_TIME
+   void alter_partition(1:string db_name, 2:string tbl_name, 3:Partition 
new_part)
+                        throws (1:InvalidOperationException o1, 
2:MetaException o2)
+ 
+   // change a list of partitions. All partitions are altered atomically and 
all
+   // prehooks are fired together followed by all post hooks
+   void alter_partitions(1:string db_name, 2:string tbl_name, 
3:list<Partition> new_parts)
+                        throws (1:InvalidOperationException o1, 
2:MetaException o2)
++
+   void alter_partitions_with_environment_context(1:string db_name, 2:string 
tbl_name, 3:list<Partition> new_parts, 4:EnvironmentContext 
environment_context) throws (1:InvalidOperationException o1, 2:MetaException o2)
+ 
++  AlterPartitionsResponse 
alter_partitions_with_environment_context_req(1:AlterPartitionsRequest req)
++      throws (1:InvalidOperationException o1, 2:MetaException o2)
++
+   void alter_partition_with_environment_context(1:string db_name,
+       2:string tbl_name, 3:Partition new_part,
+       4:EnvironmentContext environment_context)
+       throws (1:InvalidOperationException o1, 2:MetaException o2)
+ 
+   // rename the old partition to the new partition object by changing old 
part values to the part values
+   // in the new_part. old partition is identified from part_vals.
+   // partition keys in new_part should be the same as those in old partition.
+   void rename_partition(1:string db_name, 2:string tbl_name, 3:list<string> 
part_vals, 4:Partition new_part)
+                        throws (1:InvalidOperationException o1, 
2:MetaException o2)
+ 
+   // returns whether or not the partition name is valid based on the value of 
the config
+   // hive.metastore.partition.name.whitelist.pattern
+   bool partition_name_has_valid_characters(1:list<string> part_vals, 2:bool 
throw_exception)
+       throws(1: MetaException o1)
+ 
+   // gets the value of the configuration key in the metastore server. returns
+   // defaultValue if the key does not exist. if the configuration key does not
+   // begin with "hive", "mapred", or "hdfs", a ConfigValSecurityException is
+   // thrown.
+   string get_config_value(1:string name, 2:string defaultValue)
+                           throws(1:ConfigValSecurityException o1)
+ 
+   // converts a partition name into a partition values array
+   list<string> partition_name_to_vals(1: string part_name)
+                           throws(1: MetaException o1)
+   // converts a partition name into a partition specification (a mapping from
+   // the partition cols to the values)
+   map<string, string> partition_name_to_spec(1: string part_name)
+                           throws(1: MetaException o1)
+ 
+   void markPartitionForEvent(1:string db_name, 2:string tbl_name, 
3:map<string,string> part_vals,
+                   4:PartitionEventType eventType) throws (1: MetaException 
o1, 2: NoSuchObjectException o2,
+                   3: UnknownDBException o3, 4: UnknownTableException o4, 5: 
UnknownPartitionException o5,
+                   6: InvalidPartitionException o6)
+   bool isPartitionMarkedForEvent(1:string db_name, 2:string tbl_name, 
3:map<string,string> part_vals,
+                   4: PartitionEventType eventType) throws (1: MetaException 
o1, 2:NoSuchObjectException o2,
+                   3: UnknownDBException o3, 4: UnknownTableException o4, 5: 
UnknownPartitionException o5,
+                   6: InvalidPartitionException o6)
+ 
+   //primary keys and foreign keys
+   PrimaryKeysResponse get_primary_keys(1:PrimaryKeysRequest request)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+   ForeignKeysResponse get_foreign_keys(1:ForeignKeysRequest request)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+   // other constraints
+   UniqueConstraintsResponse get_unique_constraints(1:UniqueConstraintsRequest 
request)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+   NotNullConstraintsResponse 
get_not_null_constraints(1:NotNullConstraintsRequest request)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+   DefaultConstraintsResponse 
get_default_constraints(1:DefaultConstraintsRequest request)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+   CheckConstraintsResponse get_check_constraints(1:CheckConstraintsRequest 
request)
+                        throws(1:MetaException o1, 2:NoSuchObjectException o2)
+ 
+   // column statistics interfaces
+ 
+   // update APIs persist the column statistics object(s) that are passed in. 
If statistics already
+   // exists for one or more columns, the existing statistics will be 
overwritten. The update APIs
+   // validate that the dbName, tableName, partName, colName[] passed in as 
part of the ColumnStatistics
+   // struct are valid, throws InvalidInputException/NoSuchObjectException if 
found to be invalid
+   bool update_table_column_statistics(1:ColumnStatistics stats_obj) throws 
(1:NoSuchObjectException o1,
+               2:InvalidObjectException o2, 3:MetaException o3, 
4:InvalidInputException o4)
+   bool update_partition_column_statistics(1:ColumnStatistics stats_obj) 
throws (1:NoSuchObjectException o1,
+               2:InvalidObjectException o2, 3:MetaException o3, 
4:InvalidInputException o4)
+ 
+   // get APIs return the column statistics corresponding to db_name, 
tbl_name, [part_name], col_name if
+   // such statistics exists. If the required statistics doesn't exist, get 
APIs throw NoSuchObjectException
+   // For instance, if get_table_column_statistics is called on a partitioned 
table for which only
+   // partition level column stats exist, get_table_column_statistics will 
throw NoSuchObjectException
+   ColumnStatistics get_table_column_statistics(1:string db_name, 2:string 
tbl_name, 3:string col_name) throws
+               (1:NoSuchObjectException o1, 2:MetaException o2, 
3:InvalidInputException o3, 4:InvalidObjectException o4)
+   ColumnStatistics get_partition_column_statistics(1:string db_name, 2:string 
tbl_name, 3:string part_name,
+                4:string col_name) throws (1:NoSuchObjectException o1, 
2:MetaException o2,
+                3:InvalidInputException o3, 4:InvalidObjectException o4)
+   TableStatsResult get_table_statistics_req(1:TableStatsRequest request) 
throws
+               (1:NoSuchObjectException o1, 2:MetaException o2)
+   PartitionsStatsResult 
get_partitions_statistics_req(1:PartitionsStatsRequest request) throws
+               (1:NoSuchObjectException o1, 2:MetaException o2)
+   AggrStats get_aggr_stats_for(1:PartitionsStatsRequest request) throws
+               (1:NoSuchObjectException o1, 2:MetaException o2)
+   bool set_aggr_stats_for(1:SetPartitionsStatsRequest request) throws
+               (1:NoSuchObjectException o1, 2:InvalidObjectException o2, 
3:MetaException o3, 4:InvalidInputException o4)
+ 
+ 
+   // delete APIs attempt to delete column statistics, if found, associated 
with a given db_name, tbl_name, [part_name]
+   // and col_name. If the delete API doesn't find the statistics record in 
the metastore, throws NoSuchObjectException
+   // Delete API validates the input and if the input is invalid throws 
InvalidInputException/InvalidObjectException.
+   bool delete_partition_column_statistics(1:string db_name, 2:string 
tbl_name, 3:string part_name, 4:string col_name) throws
+               (1:NoSuchObjectException o1, 2:MetaException o2, 
3:InvalidObjectException o3,
+                4:InvalidInputException o4)
+   bool delete_table_column_statistics(1:string db_name, 2:string tbl_name, 
3:string col_name) throws
+               (1:NoSuchObjectException o1, 2:MetaException o2, 
3:InvalidObjectException o3,
+                4:InvalidInputException o4)
+ 
+   //
+   // user-defined functions
+   //
+ 
+   void create_function(1:Function func)
+       throws (1:AlreadyExistsException o1,
+               2:InvalidObjectException o2,
+               3:MetaException o3,
+               4:NoSuchObjectException o4)
+ 
+   void drop_function(1:string dbName, 2:string funcName)
+       throws (1:NoSuchObjectException o1, 2:MetaException o3)
+ 
+   void alter_function(1:string dbName, 2:string funcName, 3:Function newFunc)
+       throws (1:InvalidOperationException o1, 2:MetaException o2)
+ 
+   list<string> get_functions(1:string dbName, 2:string pattern)
+       throws (1:MetaException o1)
+   Function get_function(1:string dbName, 2:string funcName)
+       throws (1:MetaException o1, 2:NoSuchObjectException o2)
+ 
+   GetAllFunctionsResponse get_all_functions() throws (1:MetaException o1)
+ 
+   //authorization privileges
+ 
+   bool create_role(1:Role role) throws(1:MetaException o1)
+   bool drop_role(1:string role_name) throws(1:MetaException o1)
+   list<string> get_role_names() throws(1:MetaException o1)
+   // Deprecated, use grant_revoke_role()
+   bool grant_role(1:string role_name, 2:string principal_name, 
3:PrincipalType principal_type,
+     4:string grantor, 5:PrincipalType grantorType, 6:bool grant_option) 
throws(1:MetaException o1)
+   // Deprecated, use grant_revoke_role()
+   bool revoke_role(1:string role_name, 2:string principal_name, 
3:PrincipalType principal_type)
+                         throws(1:MetaException o1)
+   list<Role> list_roles(1:string principal_name, 2:PrincipalType 
principal_type) throws(1:MetaException o1)
+   GrantRevokeRoleResponse grant_revoke_role(1:GrantRevokeRoleRequest request) 
throws(1:MetaException o1)
+ 
+   // get all role-grants for users/roles that have been granted the given role
+   // Note that in the returned list of RolePrincipalGrants, the roleName is
+   // redundant as it would match the role_name argument of this function
+   GetPrincipalsInRoleResponse get_principals_in_role(1: 
GetPrincipalsInRoleRequest request) throws(1:MetaException o1)
+ 
+   // get grant information of all roles granted to the given principal
+   // Note that in the returned list of RolePrincipalGrants, the principal 
name,type is
+   // redundant as it would match the principal name,type arguments of this 
function
+   GetRoleGrantsForPrincipalResponse get_role_grants_for_principal(1: 
GetRoleGrantsForPrincipalRequest request) throws(1:MetaException o1)
+ 
+   PrincipalPrivilegeSet get_privilege_set(1:HiveObjectRef hiveObject, 
2:string user_name,
+     3: list<string> group_names) throws(1:MetaException o1)
+   list<HiveObjectPrivilege> list_privileges(1:string principal_name, 
2:PrincipalType principal_type,
+     3: HiveObjectRef hiveObject) throws(1:MetaException o1)
+ 
+   // Deprecated, use grant_revoke_privileges()
+   bool grant_privileges(1:PrivilegeBag privileges) throws(1:MetaException o1)
+   // Deprecated, use grant_revoke_privileges()
+   bool revoke_privileges(1:PrivilegeBag privileges) throws(1:MetaException o1)
+   GrantRevokePrivilegeResponse 
grant_revoke_privileges(1:GrantRevokePrivilegeRequest request) 
throws(1:MetaException o1);
+   // Revokes all privileges for the object and adds the newly granted 
privileges for it.
+   GrantRevokePrivilegeResponse refresh_privileges(1:HiveObjectRef 
objToRefresh, 2:string authorizer, 3:GrantRevokePrivilegeRequest grantRequest) 
throws(1:MetaException o1);
+ 
+   // this is used by metastore client to send UGI information to metastore 
server immediately
+   // after setting up a connection.
+   list<string> set_ugi(1:string user_name, 2:list<string> group_names) throws 
(1:MetaException o1)
+ 
+   //Authentication (delegation token) interfaces
+ 
+   // get metastore server delegation token for use from the map/reduce tasks 
to authenticate
+   // to metastore server
+   string get_delegation_token(1:string token_owner, 2:string 
renewer_kerberos_principal_name)
+     throws (1:MetaException o1)
+ 
+   // method to renew delegation token obtained from metastore server
+   i64 renew_delegation_token(1:string token_str_form) throws (1:MetaException 
o1)
+ 
+   // method to cancel delegation token obtained from metastore server
+   void cancel_delegation_token(1:string token_str_form) throws 
(1:MetaException o1)
+ 
+   // add a delegation token
+   bool add_token(1:string token_identifier, 2:string delegation_token)
+ 
+   // remove a delegation token
+   bool remove_token(1:string token_identifier)
+ 
+   // get a delegation token by identifier
+   string get_token(1:string token_identifier)
+ 
+   // get all delegation token identifiers
+   list<string> get_all_token_identifiers()
+ 
+   // add master key
+   i32 add_master_key(1:string key) throws (1:MetaException o1)
+ 
+   // update master key
+   void update_master_key(1:i32 seq_number, 2:string key) throws 
(1:NoSuchObjectException o1, 2:MetaException o2)
+ 
+   // remove master key
+   bool remove_master_key(1:i32 key_seq)
+ 
+   // get master keys
+   list<string> get_master_keys()
+ 
+   // Transaction and lock management calls
+   // Get just list of open transactions
+   GetOpenTxnsResponse get_open_txns()
+   // Get list of open transactions with state (open, aborted)
+   GetOpenTxnsInfoResponse get_open_txns_info()
+   OpenTxnsResponse open_txns(1:OpenTxnRequest rqst)
+   void abort_txn(1:AbortTxnRequest rqst) throws (1:NoSuchTxnException o1)
+   void abort_txns(1:AbortTxnsRequest rqst) throws (1:NoSuchTxnException o1)
+   void commit_txn(1:CommitTxnRequest rqst) throws (1:NoSuchTxnException o1, 
2:TxnAbortedException o2)
+   void repl_tbl_writeid_state(1: ReplTblWriteIdStateRequest rqst)
+   GetValidWriteIdsResponse get_valid_write_ids(1:GetValidWriteIdsRequest rqst)
+       throws (1:NoSuchTxnException o1, 2:MetaException o2)
+   AllocateTableWriteIdsResponse 
allocate_table_write_ids(1:AllocateTableWriteIdsRequest rqst)
+     throws (1:NoSuchTxnException o1, 2:TxnAbortedException o2, 
3:MetaException o3)
+   LockResponse lock(1:LockRequest rqst) throws (1:NoSuchTxnException o1, 
2:TxnAbortedException o2)
+   LockResponse check_lock(1:CheckLockRequest rqst)
+     throws (1:NoSuchTxnException o1, 2:TxnAbortedException o2, 
3:NoSuchLockException o3)
+   void unlock(1:UnlockRequest rqst) throws (1:NoSuchLockException o1, 
2:TxnOpenException o2)
+   ShowLocksResponse show_locks(1:ShowLocksRequest rqst)
+   void heartbeat(1:HeartbeatRequest ids) throws (1:NoSuchLockException o1, 
2:NoSuchTxnException o2, 3:TxnAbortedException o3)
+   HeartbeatTxnRangeResponse heartbeat_txn_range(1:HeartbeatTxnRangeRequest 
txns)
+   void compact(1:CompactionRequest rqst) 
+   CompactionResponse compact2(1:CompactionRequest rqst) 
+   ShowCompactResponse show_compact(1:ShowCompactRequest rqst)
+   void add_dynamic_partitions(1:AddDynamicPartitions rqst) throws 
(1:NoSuchTxnException o1, 2:TxnAbortedException o2)
+ 
+   // Notification logging calls
+   NotificationEventResponse get_next_notification(1:NotificationEventRequest 
rqst) 
+   CurrentNotificationEventId get_current_notificationEventId()
+   NotificationEventsCountResponse 
get_notification_events_count(1:NotificationEventsCountRequest rqst)
+   FireEventResponse fire_listener_event(1:FireEventRequest rqst)
+   void flushCache()
+   WriteNotificationLogResponse 
add_write_notification_log(WriteNotificationLogRequest rqst)
+ 
+   // Repl Change Management api
+   CmRecycleResponse cm_recycle(1:CmRecycleRequest request) 
throws(1:MetaException o1)
+ 
+   GetFileMetadataByExprResult 
get_file_metadata_by_expr(1:GetFileMetadataByExprRequest req)
+   GetFileMetadataResult get_file_metadata(1:GetFileMetadataRequest req)
+   PutFileMetadataResult put_file_metadata(1:PutFileMetadataRequest req)
+   ClearFileMetadataResult clear_file_metadata(1:ClearFileMetadataRequest req)
+   CacheFileMetadataResult cache_file_metadata(1:CacheFileMetadataRequest req)
+ 
+   // Metastore DB properties
+   string get_metastore_db_uuid() throws (1:MetaException o1)
+ 
+   // Workload management API's
+   WMCreateResourcePlanResponse 
create_resource_plan(1:WMCreateResourcePlanRequest request)
+       throws(1:AlreadyExistsException o1, 2:InvalidObjectException o2, 
3:MetaException o3)
+ 
+   WMGetResourcePlanResponse get_resource_plan(1:WMGetResourcePlanRequest 
request)
+       throws(1:NoSuchObjectException o1, 2:MetaException o2)
+ 
+   WMGetActiveResourcePlanResponse 
get_active_resource_plan(1:WMGetActiveResourcePlanRequest request)
+       throws(1:MetaException o2)
+ 
+   WMGetAllResourcePlanResponse 
get_all_resource_plans(1:WMGetAllResourcePlanRequest request)
+       throws(1:MetaException o1)
+ 
+   WMAlterResourcePlanResponse 
alter_resource_plan(1:WMAlterResourcePlanRequest request)
+       throws(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 
3:MetaException o3)
+ 
+   WMValidateResourcePlanResponse 
validate_resource_plan(1:WMValidateResourcePlanRequest request)
+       throws(1:NoSuchObjectException o1, 2:MetaException o2)
+ 
+   WMDropResourcePlanResponse drop_resource_plan(1:WMDropResourcePlanRequest 
request)
+       throws(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 
3:MetaException o3)
+ 
+   WMCreateTriggerResponse create_wm_trigger(1:WMCreateTriggerRequest request)
+       throws(1:AlreadyExistsException o1, 2:NoSuchObjectException o2, 
3:InvalidObjectException o3, 4:MetaException o4)
+ 
+   WMAlterTriggerResponse alter_wm_trigger(1:WMAlterTriggerRequest request)
+       throws(1:NoSuchObjectException o1, 2:InvalidObjectException o2, 
3:MetaException o3)
+ 
+   WMDropTriggerResponse drop_wm_trigger(1:WMDropTriggerRequest request)
+       throws(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 
3:MetaException o3)
+ 
+   WMGetTriggersForResourePlanResponse 
get_triggers_for_resourceplan(1:WMGetTriggersForResourePlanRequest request)
+       throws(1:NoSuchObjectException o1, 2:MetaException o2)
+ 
+   WMCreatePoolResponse create_wm_pool(1:WMCreatePoolRequest request)
+       throws(1:AlreadyExistsException o1, 2:NoSuchObjectException o2, 
3:InvalidObjectException o3, 4:MetaException o4)
+ 
+   WMAlterPoolResponse alter_wm_pool(1:WMAlterPoolRequest request)
+       throws(1:AlreadyExistsException o1, 2:NoSuchObjectException o2, 
3:InvalidObjectException o3, 4:MetaException o4)
+ 
+   WMDropPoolResponse drop_wm_pool(1:WMDropPoolRequest request)
+       throws(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 
3:MetaException o3)
+ 
+   WMCreateOrUpdateMappingResponse 
create_or_update_wm_mapping(1:WMCreateOrUpdateMappingRequest request)
+       throws(1:AlreadyExistsException o1, 2:NoSuchObjectException o2, 
3:InvalidObjectException o3, 4:MetaException o4)
+ 
+   WMDropMappingResponse drop_wm_mapping(1:WMDropMappingRequest request)
+       throws(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 
3:MetaException o3)
+ 
+   WMCreateOrDropTriggerToPoolMappingResponse 
create_or_drop_wm_trigger_to_pool_mapping(1:WMCreateOrDropTriggerToPoolMappingRequest
 request)
+       throws(1:AlreadyExistsException o1, 2:NoSuchObjectException o2, 
3:InvalidObjectException o3, 4:MetaException o4)
+ 
+   // Schema calls
+   void create_ischema(1:ISchema schema) throws(1:AlreadyExistsException o1,
+         NoSuchObjectException o2, 3:MetaException o3)
+   void alter_ischema(1:AlterISchemaRequest rqst)
+         throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   ISchema get_ischema(1:ISchemaName name) throws (1:NoSuchObjectException o1, 
2:MetaException o2)
+   void drop_ischema(1:ISchemaName name)
+         throws(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 
3:MetaException o3)
+ 
+   void add_schema_version(1:SchemaVersion schemaVersion)
+         throws(1:AlreadyExistsException o1, 2:NoSuchObjectException o2, 
3:MetaException o3)
+   SchemaVersion get_schema_version(1: SchemaVersionDescriptor schemaVersion)
+         throws (1:NoSuchObjectException o1, 2:MetaException o2)
+   SchemaVersion get_schema_latest_version(1: ISchemaName schemaName)
+         throws (1:NoSuchObjectException o1, 2:MetaException o2)
+   list<SchemaVersion> get_schema_all_versions(1: ISchemaName schemaName)
+         throws (1:NoSuchObjectException o1, 2:MetaException o2)
+   void drop_schema_version(1: SchemaVersionDescriptor schemaVersion)
+         throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   FindSchemasByColsResp get_schemas_by_cols(1: FindSchemasByColsRqst rqst)
+         throws(1:MetaException o1)
+   // There is no blanket update of SchemaVersion since it is (mostly) 
immutable.  The only
+   // updates are the specific ones to associate a version with a serde and to 
change its state
+   void map_schema_version_to_serde(1: MapSchemaVersionToSerdeRequest rqst)
+         throws(1:NoSuchObjectException o1, 2:MetaException o2)
+   void set_schema_version_state(1: SetSchemaVersionStateRequest rqst)
+         throws(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 
3:MetaException o3)
+ 
+   void add_serde(1: SerDeInfo serde) throws(1:AlreadyExistsException o1, 
2:MetaException o2)
+   SerDeInfo get_serde(1: GetSerdeRequest rqst) throws(1:NoSuchObjectException 
o1, 2:MetaException o2)
+ 
+   LockResponse get_lock_materialization_rebuild(1: string dbName, 2: string 
tableName, 3: i64 txnId)
+   bool heartbeat_lock_materialization_rebuild(1: string dbName, 2: string 
tableName, 3: i64 txnId)
+   
+   void add_runtime_stats(1: RuntimeStat stat) throws(1:MetaException o1)
+   list<RuntimeStat> get_runtime_stats(1: GetRuntimeStatsRequest rqst) 
throws(1:MetaException o1)
+ }
+ 
+ // * Note about the DDL_TIME: When creating or altering a table or a 
partition,
+ // if the DDL_TIME is not set, the current time will be used.
+ 
+ // For storing info about archived partitions in parameters
+ 
+ // Whether the partition is archived
+ const string IS_ARCHIVED = "is_archived",
+ // The original location of the partition, before archiving. After archiving,
+ // this directory will contain the archive. When the partition
+ // is dropped, this directory will be deleted
+ const string ORIGINAL_LOCATION = "original_location",
+ 
+ // Whether or not the table is considered immutable - immutable tables can 
only be
+ // overwritten or created if unpartitioned, or if partitioned, partitions 
inside them
+ // can only be overwritt

<TRUNCATED>

Reply via email to