Changeset: 03e42371b6fa for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=03e42371b6fa
Modified Files:
java/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
java/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java
Branch: Jun2016
Log Message:
Improved ResultSetMetaData methods: isAutoIncrement(), isSigned(),
getSchemaName() and getTableName().
Removed throwing AssertionError() in methods getSchemaName() and getTableName().
Instead return "" as defined in the JDBC spec.
diffs (241 lines):
diff --git a/java/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
b/java/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
--- a/java/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
+++ b/java/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
@@ -294,8 +294,8 @@ public class MonetPreparedStatement
}
/**
- * Returns the index in the backing arrays for the given
- * resultset column number
+ * Returns the index (0..size-1) in the backing arrays for the given
+ * resultset column number or an SQLException when not found
*/
private int getColumnIdx(int colnr) throws SQLException {
int curcol = 0;
@@ -309,8 +309,8 @@ public class MonetPreparedStatement
throw new SQLException("No such column with index: " + colnr,
"M1M05");
}
/**
- * Returns the index in the backing arrays for the given
- * parameter number
+ * Returns the index (0..size-1) in the backing arrays for the given
+ * parameter number or an SQLException when not found
*/
private int getParamIdx(int paramnr) throws SQLException {
int curparam = 0;
@@ -367,29 +367,25 @@ public class MonetPreparedStatement
}
/**
- * Indicates whether the designated column is
automatically
- * numbered, thus read-only.
- *
+ * Indicates whether the designated column is
automatically numbered.
+ *
* @param column the first column is 1, the second is
2, ...
* @return true if so; false otherwise
* @throws SQLException if a database access error
occurs
*/
@Override
public boolean isAutoIncrement(int column) throws
SQLException {
- // the only column I know of is a 'secret'
column called rowid
- // with datatype oid
- // avoid nullpointer exception here
- if
("oid".equals(monetdbType[getColumnIdx(column)])) {
- return true;
- } else {
- return false;
- }
+ /* TODO: in MonetDB only numeric (int, decimal)
columns could be autoincrement/serial
+ * This however requires an expensive
dbmd.getColumns(null, schema, table, column)
+ * query call to pull the IS_AUTOINCREMENT
value for this column.
+ * See also ResultSetMetaData.isAutoIncrement()
+ */
+ // For now we simply allways return false.
+ return false;
}
/**
- * Indicates whether a column's case matters. This
holds for all
- * columns in MonetDB resultsets since the mapping is
done case
- * insensitive, therefore this method will always
return false.
+ * Indicates whether a column's case matters.
*
* @param column the first column is 1, the second is
2, ...
* @returns false
@@ -410,11 +406,8 @@ public class MonetPreparedStatement
/**
* Indicates whether the designated column can be used
in a
* where clause.
- * It is unknown to me what kind ot columns they regard
to,
- * as I think all columns are useable in a where clause.
- * Returning true for all here, for the time being.
- * Possible thought; maybe they want to know here if
it's a
- * real column existing in a table or not...
+ *
+ * Returning true for all here, even for CLOB, BLOB.
*
* @param column the first column is 1, the second is
2, ...
* @returns true
@@ -442,13 +435,19 @@ public class MonetPreparedStatement
/**
* Indicates whether values in the designated column
are signed
* numbers.
- * Within MonetDB all numeric types are signed.
+ * Within MonetDB all numeric types (except oid and
ptr) are signed.
*
* @param column the first column is 1, the second is
2, ...
* @return true if so; false otherwise
*/
@Override
public boolean isSigned(int column) throws SQLException
{
+ String monettype = getColumnTypeName(column);
+ if (monettype != null) {
+ if ("oid".equals(monettype)
+ || "ptr".equals(monettype))
+ return false;
+ }
// we can hardcode this, based on the colum type
switch (javaType[getColumnIdx(column)]) {
case Types.NUMERIC:
diff --git a/java/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java
b/java/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java
--- a/java/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java
+++ b/java/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java
@@ -1146,13 +1146,14 @@ public class MonetResultSet extends Mone
private int[] _precision = new
int[columns.length +1];
private int[] _scale = new
int[columns.length +1];
private int[] _isNullable = new
int[columns.length +1];
+ private boolean[] _isAutoincrement = new
boolean[columns.length +1];
private Connection conn = null;
private DatabaseMetaData dbmd = null;
/**
- * A private method to fetch the precision, scale and
isNuallble value for a fully qualified column.
+ * A private method to fetch the precision, scale,
isNullable and isAutoincrement value for a fully qualified column.
* As md.getColumns() is an expensive method we call it
only once per column
- * and cache the precision, scale and isNullable values
in the above array chaches.
+ * and cache the precision, scale, isNullable and
isAutoincrement values in the above array chaches.
* Also we only call md.getColumns() when we have a non
empty schema name and table name and column name.
*/
private void fetchColumnInfo(int column) throws
SQLException
@@ -1164,6 +1165,7 @@ public class MonetResultSet extends Mone
_precision[column] = 0;
_scale[column] = 0;
_isNullable[column] = columnNullableUnknown;
+ _isAutoincrement[column] = false;
// we can only call dbmd.getColumns() when we
have a specific schema name and table name and column name
String schName = getSchemaName(column);
@@ -1184,7 +1186,7 @@ public class MonetResultSet extends Mone
dbmd =
conn.getMetaData();
}
if (dbmd != null) {
- // for
precision, scale and isNullable we query the information from data dictionary
+ // for
precision, scale, isNullable and isAutoincrement we query the information from
data dictionary
ResultSet
colInfo = dbmd.getColumns(null, schName, tblName, colName);
if (colInfo !=
null) {
// we
expect exactly one row in the resultset
@@ -1192,6 +1194,9 @@ public class MonetResultSet extends Mone
_precision[column] = colInfo.getInt(7); // col 7 is "COLUMN_SIZE"
_scale[column] = colInfo.getInt(9); // col 9 is "DECIMAL_DIGITS"
_isNullable[column] = colInfo.getInt(11); // col 11 is "NULLABLE"
+
String strVal = colInfo.getString(23); // col 23 is "IS_AUTOINCREMENT"
+
if (strVal != null && "YES".equals(strVal))
+
_isAutoincrement[column] = true;
}
colInfo.close(); // close the resultset to release resources
}
@@ -1220,14 +1225,10 @@ public class MonetResultSet extends Mone
*/
@Override
public boolean isAutoIncrement(int column) throws
SQLException {
- // the only column I know of is a 'secret'
column called rowid
- // with datatype oid
- // avoid nullpointer exception here
- if ("oid".equals(getColumnTypeName(column))) {
- return true;
- } else {
- return false;
+ if (_is_fetched[column] != true) {
+ fetchColumnInfo(column);
}
+ return _isAutoincrement[column];
}
/**
@@ -1284,13 +1285,19 @@ public class MonetResultSet extends Mone
/**
* Indicates whether values in the designated column
are signed
* numbers.
- * Within MonetDB all numeric types are signed.
+ * Within MonetDB all numeric types (except oid and
ptr) are signed.
*
* @param column the first column is 1, the second is
2, ...
* @return true if so; false otherwise
*/
@Override
public boolean isSigned(int column) throws SQLException
{
+ String monettype = getColumnTypeName(column);
+ if (monettype != null) {
+ if ("oid".equals(monettype)
+ || "ptr".equals(monettype))
+ return false;
+ }
// we can hardcode this, based on the colum type
switch (getColumnType(column)) {
case Types.NUMERIC:
@@ -1339,7 +1346,7 @@ public class MonetResultSet extends Mone
}
/**
- * Get the designated column's table's schema.
+ * Get the designated column's schema name.
*
* @param column the first column is 1, the second is
2, ...
* @return schema name or "" if not applicable
@@ -1355,17 +1362,15 @@ public class MonetResultSet extends Mone
// figure the name out
try {
schema = header.getTableNames()[column
- 1];
+ if (schema != null) {
+ int dot = schema.indexOf(".");
+ return (dot >= 0) ?
schema.substring(0, dot) : "";
+ }
} catch (IndexOutOfBoundsException e) {
throw new SQLException("No such column
" + column, "M1M05");
}
- if (schema == null) throw
- new AssertionError("table_name header
is empty!");
- int dot = schema.indexOf(".");
- if (dot == -1) throw
- new AssertionError("table_name is not
fully qualified! (" + schema + ")");
-
- return schema.substring(0, dot);
+ return "";
}
/**
@@ -1384,17 +1389,15 @@ public class MonetResultSet extends Mone
// figure the name out
try {
table = header.getTableNames()[column -
1];
+ if (table != null) {
+ int dot = table.indexOf(".");
+ return (dot >= 0) ?
table.substring(dot + 1) : table;
+ }
} catch (IndexOutOfBoundsException e) {
throw new SQLException("No such column
" + column, "M1M05");
}
- if (table == null) throw
- new AssertionError("table_name header
is empty!");
- int dot = table.indexOf(".");
- if (dot == -1) throw
- new AssertionError("table_name is not
fully qualified! (" + table + ")");
-
- return table.substring(dot + 1);
+ return "";
}
/**
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list