You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by se...@apache.org on 2018/07/25 18:27:15 UTC

[06/50] [abbrv] hive git commit: HIVE-19416 : merge master into branch (Sergey Shelukhin) 0719

http://git-wip-us.apache.org/repos/asf/hive/blob/651e7950/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/InjectableBehaviourObjectStore.java
----------------------------------------------------------------------
diff --cc standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/InjectableBehaviourObjectStore.java
index 0000000,abbcda3..c5977b2
mode 000000,100644..100644
--- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/InjectableBehaviourObjectStore.java
+++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/InjectableBehaviourObjectStore.java
@@@ -1,0 -1,211 +1,218 @@@
+ /*
+  * 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.
+  */
+ 
+ package org.apache.hadoop.hive.metastore;
+ 
+ import java.util.List;
++
+ import org.apache.hadoop.hive.metastore.api.Function;
+ import org.apache.hadoop.hive.metastore.api.InvalidObjectException;
+ import org.apache.hadoop.hive.metastore.api.MetaException;
+ import org.apache.hadoop.hive.metastore.api.NotificationEventRequest;
+ import org.apache.hadoop.hive.metastore.api.NotificationEventResponse;
+ import org.apache.hadoop.hive.metastore.api.NoSuchObjectException;
+ import org.apache.hadoop.hive.metastore.api.Partition;
+ import org.apache.hadoop.hive.metastore.api.SQLForeignKey;
+ import org.apache.hadoop.hive.metastore.api.SQLPrimaryKey;
+ import org.apache.hadoop.hive.metastore.api.Table;
+ 
+ import static org.junit.Assert.assertEquals;
+ 
+ 
+ /**
+  * A wrapper around {@link ObjectStore} that allows us to inject custom behaviour
+  * on to some of the methods for testing.
+  */
+ public class InjectableBehaviourObjectStore extends ObjectStore {
+   public InjectableBehaviourObjectStore() {
+     super();
+   }
+ 
+   /**
+    * A utility class that allows people injecting behaviour to determine if their injections occurred.
+    */
+   public static abstract class BehaviourInjection<T, F>
+       implements com.google.common.base.Function<T, F>{
+     protected boolean injectionPathCalled = false;
+     protected boolean nonInjectedPathCalled = false;
+ 
+     public void assertInjectionsPerformed(
+         boolean expectedInjectionCalled, boolean expectedNonInjectedPathCalled){
+       assertEquals(expectedInjectionCalled, injectionPathCalled);
+       assertEquals(expectedNonInjectedPathCalled, nonInjectedPathCalled);
+     }
+   }
+ 
+   /**
+    * A utility class to pass the arguments of the caller to the stub method.
+    */
+   public class CallerArguments {
+     public String dbName;
+     public String tblName;
+     public String funcName;
+     public String constraintTblName;
+ 
+     public CallerArguments(String dbName) {
+       this.dbName = dbName;
+     }
+   }
+ 
+   private static com.google.common.base.Function<Table, Table> getTableModifier =
+       com.google.common.base.Functions.identity();
+   private static com.google.common.base.Function<Partition, Partition> getPartitionModifier =
+           com.google.common.base.Functions.identity();
+   private static com.google.common.base.Function<List<String>, List<String>> listPartitionNamesModifier =
+           com.google.common.base.Functions.identity();
+   private static com.google.common.base.Function<NotificationEventResponse, NotificationEventResponse>
+           getNextNotificationModifier = com.google.common.base.Functions.identity();
+ 
+   private static com.google.common.base.Function<CallerArguments, Boolean> callerVerifier = null;
+ 
+   // Methods to set/reset getTable modifier
+   public static void setGetTableBehaviour(com.google.common.base.Function<Table, Table> modifier){
+     getTableModifier = (modifier == null) ? com.google.common.base.Functions.identity() : modifier;
+   }
+ 
+   public static void resetGetTableBehaviour(){
+     setGetTableBehaviour(null);
+   }
+ 
+   // Methods to set/reset getPartition modifier
+   public static void setGetPartitionBehaviour(com.google.common.base.Function<Partition, Partition> modifier){
+     getPartitionModifier = (modifier == null) ? com.google.common.base.Functions.identity() : modifier;
+   }
+ 
+   public static void resetGetPartitionBehaviour(){
+     setGetPartitionBehaviour(null);
+   }
+ 
+   // Methods to set/reset listPartitionNames modifier
+   public static void setListPartitionNamesBehaviour(com.google.common.base.Function<List<String>, List<String>> modifier){
+     listPartitionNamesModifier = (modifier == null)? com.google.common.base.Functions.identity() : modifier;
+   }
+ 
+   public static void resetListPartitionNamesBehaviour(){
+     setListPartitionNamesBehaviour(null);
+   }
+ 
+   // Methods to set/reset getNextNotification modifier
+   public static void setGetNextNotificationBehaviour(
+           com.google.common.base.Function<NotificationEventResponse,NotificationEventResponse> modifier){
+     getNextNotificationModifier = (modifier == null)? com.google.common.base.Functions.identity() : modifier;
+   }
+ 
+   public static void resetGetNextNotificationBehaviour(){
+     setGetNextNotificationBehaviour(null);
+   }
+ 
+   // Methods to set/reset caller checker
+   public static void setCallerVerifier(com.google.common.base.Function<CallerArguments, Boolean> verifier){
+     callerVerifier = verifier;
+   }
+ 
+   public static void resetCallerVerifier(){
+     setCallerVerifier(null);
+   }
+ 
+   // ObjectStore methods to be overridden with injected behavior
+   @Override
+   public Table getTable(String catName, String dbName, String tableName) throws MetaException {
+     return getTableModifier.apply(super.getTable(catName, dbName, tableName));
+   }
+ 
+   @Override
++  public Table getTable(String catName, String dbName, String tableName,
++      long txnId, String writeIdList) throws MetaException {
++    return getTableModifier.apply(super.getTable(catName, dbName, tableName, txnId, writeIdList));
++  }
++
++  @Override
+   public Partition getPartition(String catName, String dbName, String tableName,
+                                 List<String> partVals) throws NoSuchObjectException, MetaException {
+     return getPartitionModifier.apply(super.getPartition(catName, dbName, tableName, partVals));
+   }
+ 
+   @Override
+   public List<String> listPartitionNames(String catName, String dbName, String tableName, short max)
+           throws MetaException {
+     return listPartitionNamesModifier.apply(super.listPartitionNames(catName, dbName, tableName, max));
+   }
+ 
+   @Override
+   public NotificationEventResponse getNextNotification(NotificationEventRequest rqst) {
+     return getNextNotificationModifier.apply(super.getNextNotification(rqst));
+   }
+ 
+   @Override
+   public void createTable(Table tbl) throws InvalidObjectException, MetaException {
+     if (callerVerifier != null) {
+       CallerArguments args = new CallerArguments(tbl.getDbName());
+       args.tblName = tbl.getTableName();
+       Boolean success = callerVerifier.apply(args);
+       if ((success != null) && !success) {
+         throw new MetaException("InjectableBehaviourObjectStore: Invalid Create Table operation on DB: "
+                 + args.dbName + " table: " + args.tblName);
+       }
+     }
+     super.createTable(tbl);
+   }
+ 
+   @Override
+   public void createFunction(Function func) throws InvalidObjectException, MetaException {
+     if (callerVerifier != null) {
+       CallerArguments args = new CallerArguments(func.getDbName());
+       args.funcName = func.getFunctionName();
+       Boolean success = callerVerifier.apply(args);
+       if ((success != null) && !success) {
+         throw new MetaException("InjectableBehaviourObjectStore: Invalid Create Function operation on DB: "
+                 + args.dbName + " function: " + args.funcName);
+       }
+     }
+     super.createFunction(func);
+   }
+ 
+   @Override
+   public List<String> addPrimaryKeys(List<SQLPrimaryKey> pks) throws InvalidObjectException,
+           MetaException {
+     if (callerVerifier != null) {
+       CallerArguments args = new CallerArguments(pks.get(0).getTable_db());
+       args.constraintTblName = pks.get(0).getTable_name();
+       Boolean success = callerVerifier.apply(args);
+       if ((success != null) && !success) {
+         throw new MetaException("InjectableBehaviourObjectStore: Invalid Add Primary Key operation on DB: "
+                 + args.dbName + " table: " + args.constraintTblName);
+       }
+     }
+     return super.addPrimaryKeys(pks);
+   }
+ 
+   @Override
+   public List<String> addForeignKeys(List<SQLForeignKey> fks) throws InvalidObjectException,
+           MetaException {
+     if (callerVerifier != null) {
+       CallerArguments args = new CallerArguments(fks.get(0).getFktable_db());
+       args.constraintTblName = fks.get(0).getFktable_name();
+       Boolean success = callerVerifier.apply(args);
+       if ((success != null) && !success) {
+         throw new MetaException("InjectableBehaviourObjectStore: Invalid Add Foreign Key operation on DB: "
+                 + args.dbName + " table: " + args.constraintTblName);
+       }
+     }
+     return super.addForeignKeys(fks);
+   }
+ }

http://git-wip-us.apache.org/repos/asf/hive/blob/651e7950/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveAlterHandler.java
----------------------------------------------------------------------
diff --cc standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveAlterHandler.java
index 0000000,adc82b0..533cabb
mode 000000,100644..100644
--- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveAlterHandler.java
+++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveAlterHandler.java
@@@ -1,0 -1,121 +1,121 @@@
+ /*
+  * 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.
+  */
+ 
+ package org.apache.hadoop.hive.metastore;
+ 
+ import org.apache.hadoop.conf.Configuration;
+ import org.apache.hadoop.hive.metastore.annotation.MetastoreUnitTest;
+ import org.apache.hadoop.hive.metastore.api.*;
+ import org.apache.hadoop.hive.metastore.conf.MetastoreConf;
+ import org.apache.hadoop.hive.metastore.utils.MetaStoreUtils;
+ import org.junit.Test;
+ import org.junit.experimental.categories.Category;
+ import org.mockito.Mockito;
+ 
+ import java.util.Arrays;
+ 
+ import static org.apache.hadoop.hive.metastore.utils.MetaStoreUtils.getDefaultCatalog;
+ 
+ @Category(MetastoreUnitTest.class)
+ public class TestHiveAlterHandler {
+ 
+   private Configuration conf = MetastoreConf.newMetastoreConf();
+ 
+   @Test
+   public void testAlterTableAddColNotUpdateStats() throws MetaException, InvalidObjectException, NoSuchObjectException {
+     FieldSchema col1 = new FieldSchema("col1", "string", "col1 comment");
+     FieldSchema col2 = new FieldSchema("col2", "string", "col2 comment");
+     FieldSchema col3 = new FieldSchema("col3", "string", "col3 comment");
+     FieldSchema col4 = new FieldSchema("col4", "string", "col4 comment");
+ 
+     StorageDescriptor oldSd = new StorageDescriptor();
+     oldSd.setCols(Arrays.asList(col1, col2, col3));
+     Table oldTable = new Table();
+     oldTable.setDbName("default");
+     oldTable.setTableName("test_table");
+     oldTable.setSd(oldSd);
+ 
+     StorageDescriptor newSd = new StorageDescriptor(oldSd);
+     newSd.setCols(Arrays.asList(col1, col2, col3, col4));
+     Table newTable = new Table(oldTable);
+     newTable.setSd(newSd);
+ 
+     RawStore msdb = Mockito.mock(RawStore.class);
+     Mockito.doThrow(new RuntimeException("shouldn't be called")).when(msdb).getTableColumnStatistics(
+         getDefaultCatalog(conf), oldTable.getDbName(), oldTable.getTableName(), Arrays.asList("col1", "col2", "col3"));
+     HiveAlterHandler handler = new HiveAlterHandler();
+     handler.setConf(conf);
 -    handler.alterTableUpdateTableColumnStats(msdb, oldTable, newTable);
++    handler.alterTableUpdateTableColumnStats(msdb, oldTable, newTable, null, -1, null);
+   }
+ 
+   @Test
+   public void testAlterTableDelColUpdateStats() throws MetaException, InvalidObjectException, NoSuchObjectException {
+     FieldSchema col1 = new FieldSchema("col1", "string", "col1 comment");
+     FieldSchema col2 = new FieldSchema("col2", "string", "col2 comment");
+     FieldSchema col3 = new FieldSchema("col3", "string", "col3 comment");
+     FieldSchema col4 = new FieldSchema("col4", "string", "col4 comment");
+ 
+     StorageDescriptor oldSd = new StorageDescriptor();
+     oldSd.setCols(Arrays.asList(col1, col2, col3, col4));
+     Table oldTable = new Table();
+     oldTable.setDbName("default");
+     oldTable.setTableName("test_table");
+     oldTable.setSd(oldSd);
+ 
+     StorageDescriptor newSd = new StorageDescriptor(oldSd);
+     newSd.setCols(Arrays.asList(col1, col2, col3));
+     Table newTable = new Table(oldTable);
+     newTable.setSd(newSd);
+ 
+     RawStore msdb = Mockito.mock(RawStore.class);
+     HiveAlterHandler handler = new HiveAlterHandler();
+     handler.setConf(conf);
 -    handler.alterTableUpdateTableColumnStats(msdb, oldTable, newTable);
++    handler.alterTableUpdateTableColumnStats(msdb, oldTable, newTable, null, -1, null);
+     Mockito.verify(msdb, Mockito.times(1)).getTableColumnStatistics(
+         getDefaultCatalog(conf), oldTable.getDbName(), oldTable.getTableName(), Arrays.asList("col1", "col2", "col3", "col4")
+     );
+   }
+ 
+   @Test
+   public void testAlterTableChangePosNotUpdateStats() throws MetaException, InvalidObjectException, NoSuchObjectException {
+     FieldSchema col1 = new FieldSchema("col1", "string", "col1 comment");
+     FieldSchema col2 = new FieldSchema("col2", "string", "col2 comment");
+     FieldSchema col3 = new FieldSchema("col3", "string", "col3 comment");
+     FieldSchema col4 = new FieldSchema("col4", "string", "col4 comment");
+ 
+     StorageDescriptor oldSd = new StorageDescriptor();
+     oldSd.setCols(Arrays.asList(col1, col2, col3, col4));
+     Table oldTable = new Table();
+     oldTable.setDbName("default");
+     oldTable.setTableName("test_table");
+     oldTable.setSd(oldSd);
+ 
+     StorageDescriptor newSd = new StorageDescriptor(oldSd);
+     newSd.setCols(Arrays.asList(col1, col4, col2, col3));
+     Table newTable = new Table(oldTable);
+     newTable.setSd(newSd);
+ 
+     RawStore msdb = Mockito.mock(RawStore.class);
+     Mockito.doThrow(new RuntimeException("shouldn't be called")).when(msdb).getTableColumnStatistics(
+         getDefaultCatalog(conf), oldTable.getDbName(), oldTable.getTableName(), Arrays.asList("col1", "col2", "col3", "col4"));
+     HiveAlterHandler handler = new HiveAlterHandler();
+     handler.setConf(conf);
 -    handler.alterTableUpdateTableColumnStats(msdb, oldTable, newTable);
++    handler.alterTableUpdateTableColumnStats(msdb, oldTable, newTable, null, -1, null);
+   }
+ 
+ }