You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by xu...@apache.org on 2014/04/12 19:34:24 UTC
svn commit: r1586882 - in /hive/trunk:
itests/hive-unit/src/test/java/org/apache/hive/jdbc/
jdbc/src/java/org/apache/hive/jdbc/
service/src/java/org/apache/hive/service/cli/
service/src/java/org/apache/hive/service/cli/operation/
Author: xuefu
Date: Sat Apr 12 17:34:24 2014
New Revision: 1586882
URL: http://svn.apache.org/r1586882
Log:
HIVE-5847: DatabaseMetadata.getColumns() doesn't show correct column size for char/varchar/decimal (Jason via Xuefu)
Modified:
hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java
hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java
hive/trunk/service/src/java/org/apache/hive/service/cli/Type.java
hive/trunk/service/src/java/org/apache/hive/service/cli/TypeDescriptor.java
hive/trunk/service/src/java/org/apache/hive/service/cli/operation/GetColumnsOperation.java
hive/trunk/service/src/java/org/apache/hive/service/cli/operation/GetTypeInfoOperation.java
Modified: hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java
URL: http://svn.apache.org/viewvc/hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java?rev=1586882&r1=1586881&r2=1586882&view=diff
==============================================================================
--- hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java (original)
+++ hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java Sat Apr 12 17:34:24 2014
@@ -1557,6 +1557,13 @@ public class TestJdbcDriver2 {
assertEquals(Integer.MAX_VALUE, meta.getPrecision(14));
assertEquals(0, meta.getScale(14));
+ // Move the result of getColumns() forward to match the columns of the query
+ assertTrue(colRS.next()); // c13
+ assertTrue(colRS.next()); // c14
+ assertTrue(colRS.next()); // c15
+ assertTrue(colRS.next()); // c16
+ assertTrue(colRS.next()); // c17
+
assertEquals("c17", meta.getColumnName(15));
assertEquals(Types.TIMESTAMP, meta.getColumnType(15));
assertEquals("timestamp", meta.getColumnTypeName(15));
@@ -1564,6 +1571,14 @@ public class TestJdbcDriver2 {
assertEquals(29, meta.getPrecision(15));
assertEquals(9, meta.getScale(15));
+ assertEquals("c17", colRS.getString("COLUMN_NAME"));
+ assertEquals(Types.TIMESTAMP, colRS.getInt("DATA_TYPE"));
+ assertEquals("timestamp", colRS.getString("TYPE_NAME").toLowerCase());
+ assertEquals(meta.getPrecision(15), colRS.getInt("COLUMN_SIZE"));
+ assertEquals(meta.getScale(15), colRS.getInt("DECIMAL_DIGITS"));
+
+ assertTrue(colRS.next());
+
assertEquals("c18", meta.getColumnName(16));
assertEquals(Types.DECIMAL, meta.getColumnType(16));
assertEquals("decimal", meta.getColumnTypeName(16));
@@ -1571,6 +1586,15 @@ public class TestJdbcDriver2 {
assertEquals(16, meta.getPrecision(16));
assertEquals(7, meta.getScale(16));
+ assertEquals("c18", colRS.getString("COLUMN_NAME"));
+ assertEquals(Types.DECIMAL, colRS.getInt("DATA_TYPE"));
+ assertEquals("decimal", colRS.getString("TYPE_NAME").toLowerCase());
+ assertEquals(meta.getPrecision(16), colRS.getInt("COLUMN_SIZE"));
+ assertEquals(meta.getScale(16), colRS.getInt("DECIMAL_DIGITS"));
+
+ assertTrue(colRS.next()); // skip c19, since not selected by query
+ assertTrue(colRS.next());
+
assertEquals("c20", meta.getColumnName(17));
assertEquals(Types.DATE, meta.getColumnType(17));
assertEquals("date", meta.getColumnTypeName(17));
@@ -1578,6 +1602,14 @@ public class TestJdbcDriver2 {
assertEquals(10, meta.getPrecision(17));
assertEquals(0, meta.getScale(17));
+ assertEquals("c20", colRS.getString("COLUMN_NAME"));
+ assertEquals(Types.DATE, colRS.getInt("DATA_TYPE"));
+ assertEquals("date", colRS.getString("TYPE_NAME").toLowerCase());
+ assertEquals(meta.getPrecision(17), colRS.getInt("COLUMN_SIZE"));
+ assertEquals(meta.getScale(17), colRS.getInt("DECIMAL_DIGITS"));
+
+ assertTrue(colRS.next());
+
assertEquals("c21", meta.getColumnName(18));
assertEquals(Types.VARCHAR, meta.getColumnType(18));
assertEquals("varchar", meta.getColumnTypeName(18));
@@ -1586,6 +1618,14 @@ public class TestJdbcDriver2 {
assertEquals(20, meta.getPrecision(18));
assertEquals(0, meta.getScale(18));
+ assertEquals("c21", colRS.getString("COLUMN_NAME"));
+ assertEquals(Types.VARCHAR, colRS.getInt("DATA_TYPE"));
+ assertEquals("varchar", colRS.getString("TYPE_NAME").toLowerCase());
+ assertEquals(meta.getPrecision(18), colRS.getInt("COLUMN_SIZE"));
+ assertEquals(meta.getScale(18), colRS.getInt("DECIMAL_DIGITS"));
+
+ assertTrue(colRS.next());
+
assertEquals("c22", meta.getColumnName(19));
assertEquals(Types.CHAR, meta.getColumnType(19));
assertEquals("char", meta.getColumnTypeName(19));
@@ -1601,6 +1641,12 @@ public class TestJdbcDriver2 {
assertEquals(Integer.MAX_VALUE, meta.getPrecision(20));
assertEquals(0, meta.getScale(20));
+ assertEquals("c22", colRS.getString("COLUMN_NAME"));
+ assertEquals(Types.CHAR, colRS.getInt("DATA_TYPE"));
+ assertEquals("char", colRS.getString("TYPE_NAME").toLowerCase());
+ assertEquals(meta.getPrecision(19), colRS.getInt("COLUMN_SIZE"));
+ assertEquals(meta.getScale(19), colRS.getInt("DECIMAL_DIGITS"));
+
for (int i = 1; i <= meta.getColumnCount(); i++) {
assertFalse(meta.isAutoIncrement(i));
assertFalse(meta.isCurrency(i));
Modified: hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java
URL: http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java?rev=1586882&r1=1586881&r2=1586882&view=diff
==============================================================================
--- hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java (original)
+++ hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java Sat Apr 12 17:34:24 2014
@@ -305,9 +305,9 @@ public class JdbcColumn {
} else if (type.equalsIgnoreCase("bigint")) {
return 10;
} else if (type.equalsIgnoreCase("float")) {
- return 2;
+ return 10;
} else if (type.equalsIgnoreCase("double")) {
- return 2;
+ return 10;
} else if (type.equalsIgnoreCase("decimal")) {
return 10;
} else { // anything else including boolean and string is null
Modified: hive/trunk/service/src/java/org/apache/hive/service/cli/Type.java
URL: http://svn.apache.org/viewvc/hive/trunk/service/src/java/org/apache/hive/service/cli/Type.java?rev=1586882&r1=1586881&r2=1586882&view=diff
==============================================================================
--- hive/trunk/service/src/java/org/apache/hive/service/cli/Type.java (original)
+++ hive/trunk/service/src/java/org/apache/hive/service/cli/Type.java Sat Apr 12 17:34:24 2014
@@ -20,6 +20,7 @@ package org.apache.hive.service.cli;
import java.sql.DatabaseMetaData;
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hive.service.cli.thrift.TTypeId;
/**
@@ -166,40 +167,10 @@ public enum Type {
* Null is returned for data types where this is not applicable.
*/
public Integer getNumPrecRadix() {
- switch (this) {
- case TINYINT_TYPE:
- case SMALLINT_TYPE:
- case INT_TYPE:
- case BIGINT_TYPE:
+ if (this.isNumericType()) {
return 10;
- case FLOAT_TYPE:
- case DOUBLE_TYPE:
- return 2;
- default:
- // everything else (including boolean and string) is null
- return null;
- }
- }
-
- /**
- * The number of fractional digits for this type.
- * Null is returned for data types where this is not applicable.
- */
- public Integer getDecimalDigits() {
- switch (this) {
- case BOOLEAN_TYPE:
- case TINYINT_TYPE:
- case SMALLINT_TYPE:
- case INT_TYPE:
- case BIGINT_TYPE:
- return 0;
- case FLOAT_TYPE:
- return 7;
- case DOUBLE_TYPE:
- return 15;
- default:
- return null;
}
+ return null;
}
/**
@@ -207,7 +178,7 @@ public enum Type {
* Returns null for non-numeric types.
* @return
*/
- public Integer getPrecision() {
+ public Integer getMaxPrecision() {
switch (this) {
case TINYINT_TYPE:
return 3;
@@ -221,57 +192,8 @@ public enum Type {
return 7;
case DOUBLE_TYPE:
return 15;
- default:
- return null;
- }
- }
-
- /**
- * Scale for this type.
- */
- public Integer getScale() {
- switch (this) {
- case BOOLEAN_TYPE:
- case STRING_TYPE:
- case DATE_TYPE:
- case TIMESTAMP_TYPE:
- case TINYINT_TYPE:
- case SMALLINT_TYPE:
- case INT_TYPE:
- case BIGINT_TYPE:
- return 0;
- case FLOAT_TYPE:
- return 7;
- case DOUBLE_TYPE:
- return 15;
case DECIMAL_TYPE:
- return Integer.MAX_VALUE;
- default:
- return null;
- }
- }
-
- /**
- * The column size for this type.
- * For numeric data this is the maximum precision.
- * For character data this is the length in characters.
- * For datetime types this is the length in characters of the String representation
- * (assuming the maximum allowed precision of the fractional seconds component).
- * For binary data this is the length in bytes.
- * Null is returned for for data types where the column size is not applicable.
- */
- public Integer getColumnSize() {
- if (isNumericType()) {
- return getPrecision();
- }
- switch (this) {
- case STRING_TYPE:
- case BINARY_TYPE:
- return Integer.MAX_VALUE;
- case DATE_TYPE:
- return 10;
- case TIMESTAMP_TYPE:
- return 30;
+ return HiveDecimal.MAX_PRECISION;
default:
return null;
}
Modified: hive/trunk/service/src/java/org/apache/hive/service/cli/TypeDescriptor.java
URL: http://svn.apache.org/viewvc/hive/trunk/service/src/java/org/apache/hive/service/cli/TypeDescriptor.java?rev=1586882&r1=1586881&r2=1586882&view=diff
==============================================================================
--- hive/trunk/service/src/java/org/apache/hive/service/cli/TypeDescriptor.java (original)
+++ hive/trunk/service/src/java/org/apache/hive/service/cli/TypeDescriptor.java Sat Apr 12 17:34:24 2014
@@ -90,4 +90,70 @@ public class TypeDescriptor {
public void setTypeQualifiers(TypeQualifiers typeQualifiers) {
this.typeQualifiers = typeQualifiers;
}
+
+ /**
+ * The column size for this type.
+ * For numeric data this is the maximum precision.
+ * For character data this is the length in characters.
+ * For datetime types this is the length in characters of the String representation
+ * (assuming the maximum allowed precision of the fractional seconds component).
+ * For binary data this is the length in bytes.
+ * Null is returned for for data types where the column size is not applicable.
+ */
+ public Integer getColumnSize() {
+ if (type.isNumericType()) {
+ return getPrecision();
+ }
+ switch (type) {
+ case STRING_TYPE:
+ case BINARY_TYPE:
+ return Integer.MAX_VALUE;
+ case CHAR_TYPE:
+ case VARCHAR_TYPE:
+ return typeQualifiers.getCharacterMaximumLength();
+ case DATE_TYPE:
+ return 10;
+ case TIMESTAMP_TYPE:
+ return 29;
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Maximum precision for numeric types.
+ * Returns null for non-numeric types.
+ * @return
+ */
+ public Integer getPrecision() {
+ if (this.type == Type.DECIMAL_TYPE) {
+ return typeQualifiers.getPrecision();
+ }
+ return this.type.getMaxPrecision();
+ }
+
+ /**
+ * The number of fractional digits for this type.
+ * Null is returned for data types where this is not applicable.
+ */
+ public Integer getDecimalDigits() {
+ switch (this.type) {
+ case BOOLEAN_TYPE:
+ case TINYINT_TYPE:
+ case SMALLINT_TYPE:
+ case INT_TYPE:
+ case BIGINT_TYPE:
+ return 0;
+ case FLOAT_TYPE:
+ return 7;
+ case DOUBLE_TYPE:
+ return 15;
+ case DECIMAL_TYPE:
+ return typeQualifiers.getScale();
+ case TIMESTAMP_TYPE:
+ return 9;
+ default:
+ return null;
+ }
+ }
}
Modified: hive/trunk/service/src/java/org/apache/hive/service/cli/operation/GetColumnsOperation.java
URL: http://svn.apache.org/viewvc/hive/trunk/service/src/java/org/apache/hive/service/cli/operation/GetColumnsOperation.java?rev=1586882&r1=1586881&r2=1586882&view=diff
==============================================================================
--- hive/trunk/service/src/java/org/apache/hive/service/cli/operation/GetColumnsOperation.java (original)
+++ hive/trunk/service/src/java/org/apache/hive/service/cli/operation/GetColumnsOperation.java Sat Apr 12 17:34:24 2014
@@ -148,9 +148,9 @@ public class GetColumnsOperation extends
column.getName(), // COLUMN_NAME
column.getType().toJavaSQLType(), // DATA_TYPE
column.getTypeName(), // TYPE_NAME
- column.getType().getColumnSize(), // COLUMN_SIZE
+ column.getTypeDescriptor().getColumnSize(), // COLUMN_SIZE
null, // BUFFER_LENGTH, unused
- column.getType().getDecimalDigits(), // DECIMAL_DIGITS
+ column.getTypeDescriptor().getDecimalDigits(), // DECIMAL_DIGITS
column.getType().getNumPrecRadix(), // NUM_PREC_RADIX
DatabaseMetaData.columnNullable, // NULLABLE
column.getComment(), // REMARKS
Modified: hive/trunk/service/src/java/org/apache/hive/service/cli/operation/GetTypeInfoOperation.java
URL: http://svn.apache.org/viewvc/hive/trunk/service/src/java/org/apache/hive/service/cli/operation/GetTypeInfoOperation.java?rev=1586882&r1=1586881&r2=1586882&view=diff
==============================================================================
--- hive/trunk/service/src/java/org/apache/hive/service/cli/operation/GetTypeInfoOperation.java (original)
+++ hive/trunk/service/src/java/org/apache/hive/service/cli/operation/GetTypeInfoOperation.java Sat Apr 12 17:34:24 2014
@@ -90,7 +90,7 @@ public class GetTypeInfoOperation extend
Object[] rowData = new Object[] {
type.getName(), // TYPE_NAME
type.toJavaSQLType(), // DATA_TYPE
- type.getPrecision(), // PRECISION
+ type.getMaxPrecision(), // PRECISION
type.getLiteralPrefix(), // LITERAL_PREFIX
type.getLiteralSuffix(), // LITERAL_SUFFIX
type.getCreateParams(), // CREATE_PARAMS