diff --git metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java index 43c412d..767cffc 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java @@ -309,7 +309,7 @@ private boolean isViewTable(String dbName, String tblName) throws MetaException StringBuilder partSb = new StringBuilder(sbCapacity); // Assume db and table names are the same for all partition, that's what we're selecting for. for (Object partitionId : sqlResult) { - partSb.append(extractSqlLong(partitionId)).append(","); + partSb.append(StatObjectConverter.extractSqlLong(partitionId)).append(","); } String partIds = trimCommaList(partSb); timingTrace(doTrace, queryText, start, queryTime); @@ -346,10 +346,10 @@ private boolean isViewTable(String dbName, String tblName) throws MetaException dbName = dbName.toLowerCase(); for (Object[] fields : sqlResult2) { // Here comes the ugly part... - long partitionId = extractSqlLong(fields[0]); - Long sdId = extractSqlLong(fields[1]); - Long colId = extractSqlLong(fields[2]); - Long serdeId = extractSqlLong(fields[3]); + long partitionId = StatObjectConverter.extractSqlLong(fields[0]); + Long sdId = StatObjectConverter.extractSqlLong(fields[1]); + Long colId = StatObjectConverter.extractSqlLong(fields[2]); + Long serdeId = StatObjectConverter.extractSqlLong(fields[3]); // A partition must have either everything set, or nothing set if it's a view. if (sdId == null || colId == null || serdeId == null) { if (isView == null) { @@ -518,7 +518,7 @@ public void apply(StorageDescriptor t, Object[] fields) throws MetaException { currentListId = null; t.getSkewedInfo().addToSkewedColValues(new ArrayList()); } else { - long fieldsListId = extractSqlLong(fields[1]); + long fieldsListId = StatObjectConverter.extractSqlLong(fields[1]); if (currentListId == null || fieldsListId != currentListId) { currentList = new ArrayList(); currentListId = fieldsListId; @@ -560,7 +560,7 @@ public void apply(StorageDescriptor t, Object[] fields) throws MetaException { currentList = new ArrayList(); // left outer join produced a list with no values currentListId = null; } else { - long fieldsListId = extractSqlLong(fields[1]); + long fieldsListId = StatObjectConverter.extractSqlLong(fields[1]); if (currentListId == null || fieldsListId != currentListId) { currentList = new ArrayList(); currentListId = fieldsListId; @@ -599,14 +599,6 @@ public void apply(SerDeInfo t, Object[] fields) { return orderedResult; } - private Long extractSqlLong(Object obj) throws MetaException { - if (obj == null) return null; - if (!(obj instanceof Number)) { - throw new MetaException("Expected numeric type but got " + obj.getClass().getName()); - } - return ((Number)obj).longValue(); - } - private void timingTrace(boolean doTrace, String queryText, long start, long queryTime) { if (!doTrace) return; LOG.debug("Direct SQL query in " + (queryTime - start) / 1000000.0 + "ms + " + @@ -674,7 +666,7 @@ private static String trimCommaList(StringBuilder sb) { if (fields == null) { fields = iter.next(); } - long nestedId = extractSqlLong(fields[keyIndex]); + long nestedId = StatObjectConverter.extractSqlLong(fields[keyIndex]); if (nestedId < id) throw new MetaException("Found entries for unknown ID " + nestedId); if (nestedId > id) break; // fields belong to one of the next entries func.apply(entry.getValue(), fields); @@ -930,7 +922,7 @@ public ColumnStatistics getTableStats( return colStats; } - private ColumnStatisticsObj prepareCSObj (Object[] row, int i) { + private ColumnStatisticsObj prepareCSObj (Object[] row, int i) throws MetaException { ColumnStatisticsData data = new ColumnStatisticsData(); ColumnStatisticsObj cso = new ColumnStatisticsObj((String)row[i++], (String)row[i++], data); Object llow = row[i++], lhigh = row[i++], dlow = row[i++], dhigh = row[i++], @@ -1017,8 +1009,8 @@ private ColumnStatistics makeColumnStats( // LastAnalyzed is stored per column but thrift has it per several; // get the lowest for now as nobody actually uses this field. Object laObj = row[offset + 14]; - if (laObj != null && (!csd.isSetLastAnalyzed() || csd.getLastAnalyzed() > extractSqlLong(laObj))) { - csd.setLastAnalyzed(extractSqlLong(laObj)); + if (laObj != null && (!csd.isSetLastAnalyzed() || csd.getLastAnalyzed() > StatObjectConverter.extractSqlLong(laObj))) { + csd.setLastAnalyzed(StatObjectConverter.extractSqlLong(laObj)); } csos.add(prepareCSObj(row, offset)); } diff --git metastore/src/java/org/apache/hadoop/hive/metastore/StatObjectConverter.java metastore/src/java/org/apache/hadoop/hive/metastore/StatObjectConverter.java index c3e2820..a5f40b1 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/StatObjectConverter.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/StatObjectConverter.java @@ -352,61 +352,61 @@ public static ColumnStatisticsDesc getPartitionColumnStatisticsDesc( // SQL public static void fillColumnStatisticsData(String colType, ColumnStatisticsData data, Object llow, Object lhigh, Object dlow, Object dhigh, Object declow, Object dechigh, - Object nulls, Object dist, Object avglen, Object maxlen, Object trues, Object falses) { + Object nulls, Object dist, Object avglen, Object maxlen, Object trues, Object falses) throws MetaException { if (colType.equals("boolean")) { BooleanColumnStatsData boolStats = new BooleanColumnStatsData(); - boolStats.setNumFalses((Long)falses); - boolStats.setNumTrues((Long)trues); - boolStats.setNumNulls((Long)nulls); + boolStats.setNumFalses(extractSqlLong(falses)); + boolStats.setNumTrues(extractSqlLong(trues)); + boolStats.setNumNulls(extractSqlLong(nulls)); data.setBooleanStats(boolStats); } else if (colType.equals("string") || colType.startsWith("varchar") || colType.startsWith("char")) { StringColumnStatsData stringStats = new StringColumnStatsData(); - stringStats.setNumNulls((Long)nulls); + stringStats.setNumNulls(extractSqlLong(nulls)); stringStats.setAvgColLen((Double)avglen); - stringStats.setMaxColLen((Long)maxlen); - stringStats.setNumDVs((Long)dist); + stringStats.setMaxColLen(extractSqlLong(maxlen)); + stringStats.setNumDVs(extractSqlLong(dist)); data.setStringStats(stringStats); } else if (colType.equals("binary")) { BinaryColumnStatsData binaryStats = new BinaryColumnStatsData(); - binaryStats.setNumNulls((Long)nulls); + binaryStats.setNumNulls(extractSqlLong(nulls)); binaryStats.setAvgColLen((Double)avglen); - binaryStats.setMaxColLen((Long)maxlen); + binaryStats.setMaxColLen(extractSqlLong(maxlen)); data.setBinaryStats(binaryStats); } else if (colType.equals("bigint") || colType.equals("int") || colType.equals("smallint") || colType.equals("tinyint") || colType.equals("timestamp")) { LongColumnStatsData longStats = new LongColumnStatsData(); - longStats.setNumNulls((Long)nulls); + longStats.setNumNulls(extractSqlLong(nulls)); if (lhigh != null) { - longStats.setHighValue((Long)lhigh); + longStats.setHighValue(extractSqlLong(lhigh)); } if (llow != null) { - longStats.setLowValue((Long)llow); + longStats.setLowValue(extractSqlLong(llow)); } - longStats.setNumDVs((Long)dist); + longStats.setNumDVs(extractSqlLong(dist)); data.setLongStats(longStats); } else if (colType.equals("double") || colType.equals("float")) { DoubleColumnStatsData doubleStats = new DoubleColumnStatsData(); - doubleStats.setNumNulls((Long)nulls); + doubleStats.setNumNulls(extractSqlLong(nulls)); if (dhigh != null) { doubleStats.setHighValue((Double)dhigh); } if (dlow != null) { doubleStats.setLowValue((Double)dlow); } - doubleStats.setNumDVs((Long)dist); + doubleStats.setNumDVs(extractSqlLong(dist)); data.setDoubleStats(doubleStats); } else if (colType.startsWith("decimal")) { DecimalColumnStatsData decimalStats = new DecimalColumnStatsData(); - decimalStats.setNumNulls((Long)nulls); + decimalStats.setNumNulls(extractSqlLong(nulls)); if (dechigh != null) { decimalStats.setHighValue(createThriftDecimal((String)dechigh)); } if (declow != null) { decimalStats.setLowValue(createThriftDecimal((String)declow)); } - decimalStats.setNumDVs((Long)dist); + decimalStats.setNumDVs(extractSqlLong(dist)); data.setDecimalStats(decimalStats); } } @@ -419,4 +419,12 @@ private static Decimal createThriftDecimal(String s) { private static String createJdoDecimalString(Decimal d) { return new BigDecimal(new BigInteger(d.getUnscaled()), d.getScale()).toString(); } + + static Long extractSqlLong(Object obj) throws MetaException { + if (obj == null) return null; + if (!(obj instanceof Number)) { + throw new MetaException("Expected numeric type but got " + obj.getClass().getName()); + } + return ((Number)obj).longValue(); + } }