Author: rvesse
Date: Wed Apr 24 21:37:00 2013
New Revision: 1471701

URL: http://svn.apache.org/r1471701
Log:
Lots more metadata implementation work

Added:
    
jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/
    
jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/
    
jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/AbstractDatabaseMetadataTests.java
    
jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/TestMetaResultSet.java
    
jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/metadata/
    
jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/metadata/TestDatasetConnectionMetadata.java
Modified:
    
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/JenaMetadata.java
    
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/MetadataSchema.java
    
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/results/MetaResultSet.java
    
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/metadata/AbstractResultsMetadata.java
    
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/statements/JenaPreparedStatement.java

Modified: 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/JenaMetadata.java
URL: 
http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/JenaMetadata.java?rev=1471701&r1=1471700&r2=1471701&view=diff
==============================================================================
--- 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/JenaMetadata.java
 (original)
+++ 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/JenaMetadata.java
 Wed Apr 24 21:37:00 2013
@@ -20,18 +20,15 @@ package org.apache.jena.jdbc.metadata;
 
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
-import java.sql.Date;
 import java.sql.ResultSet;
 import java.sql.RowIdLifetime;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.sql.Types;
-import java.util.ArrayList;
-import java.util.List;
-
 import org.apache.jena.atlas.lib.StrUtils;
 import org.apache.jena.jdbc.connections.JenaConnection;
 import org.apache.jena.jdbc.metadata.results.MetaResultSet;
+import com.hp.hpl.jena.vocabulary.XSD;
 
 /**
  * Database metadata for Jena JDBC connections
@@ -108,6 +105,10 @@ public abstract class JenaMetadata imple
         this.connection = connection;
     }
 
+    /**
+     * Gets the associated Jena connection instance
+     * @return Jena connection
+     */
     public JenaConnection getJenaConnection() {
         return this.connection;
     }
@@ -519,20 +520,17 @@ public abstract class JenaMetadata imple
 
     @Override
     public ResultSet getTablePrivileges(String arg0, String arg1, String arg2) 
throws SQLException {
-        // TODO Auto-generated method stub
-        return null;
+        return new MetaResultSet(MetadataSchema.getTablePrivilegeColumns());
     }
 
     @Override
     public ResultSet getTableTypes() throws SQLException {
-        // TODO Auto-generated method stub
-        return null;
+        return new MetaResultSet(MetadataSchema.getTableTypeColumns());
     }
 
     @Override
     public ResultSet getTables(String arg0, String arg1, String arg2, String[] 
arg3) throws SQLException {
-        // TODO Auto-generated method stub
-        return null;
+        return new MetaResultSet(MetadataSchema.getTableColumns());
     }
 
     @Override
@@ -570,13 +568,21 @@ public abstract class JenaMetadata imple
         // SQL_DATETIME_SUB int => unused
         // NUM_PREC_RADIX int => usually 2 or 10
         
-        //TODO: Report types we can marshal as appropriate
+        //Report types we can marshal appropriately
         return new MetaResultSet(MetadataSchema.getTypeInfoColumns(), 
                 new Object[][] {
-            { Boolean.class.getName(), Types.BOOLEAN, 0, null, null, null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 0 },
-            { Byte.class.getName(), Types.TINYINT, 0, "\"", "\"", null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 0 },
-            { Date.class.getName(), Types.DATE, 0, "\"", "\"", null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 0 },
-            { String.class.getName(), Types.NVARCHAR, 0, "\"", "\"", null, 
(short)typeNullable, true, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 0 }
+            { XSD.xboolean.toString(), Types.BOOLEAN, 0, null, null, null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 0 },
+            { XSD.xbyte.toString(), Types.TINYINT, 0, "\"", "\"", null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 0 },
+            { XSD.date.toString(), Types.DATE, 0, "\"", "\"", null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 0 },
+            { XSD.dateTime.toString(), Types.DATE, 0, "\"", "\"", null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 0 },
+            { XSD.decimal.toString(), Types.DECIMAL, 16, null, null, null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)16, 0, 0, 10 },
+            { XSD.xdouble.toString(), Types.DOUBLE, 16, null, null, null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)16, 0, 0, 10 },
+            { XSD.xfloat.toString(), Types.FLOAT, 15, null, null, null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)7, 0, 0, 10 },
+            //TODO: Should be covering all the supported XSD integer sub-types 
here
+            { XSD.xshort.toString(), Types.INTEGER, 
Integer.toString(Integer.MAX_VALUE).length(), null, null, null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 10 },
+            { XSD.integer.toString(), Types.BIGINT, 
Long.toString(Long.MAX_VALUE).length(), null, null, null, (short)typeNullable, 
false, (short)typeSearchable, false, false, false, null, (short)0, (short)0, 0, 
0, 10 },
+            { XSD.xstring.toString(), Types.NVARCHAR, 0, "\"", "\"", null, 
(short)typeNullable, true, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 0 },
+            { XSD.time.toString(), Types.TIME, 0, "\"", "\"", null, 
(short)typeNullable, false, (short)typeSearchable, false, false, false, null, 
(short)0, (short)0, 0, 0, 0 },
         });
     }
 
@@ -596,8 +602,7 @@ public abstract class JenaMetadata imple
 
     @Override
     public ResultSet getVersionColumns(String arg0, String arg1, String arg2) 
throws SQLException {
-        // TODO Auto-generated method stub
-        return null;
+        return new MetaResultSet(MetadataSchema.getVersionColumns());
     }
 
     @Override
@@ -619,7 +624,7 @@ public abstract class JenaMetadata imple
 
     @Override
     public boolean locatorsUpdateCopy() throws SQLException {
-        // TODO Auto-generated method stub
+        // SPARQL doesn't support the LOB types so return false
         return false;
     }
 
@@ -1013,21 +1018,22 @@ public abstract class JenaMetadata imple
     }
 
     @Override
-    public boolean supportsResultSetConcurrency(int arg0, int arg1) throws 
SQLException {
-        // TODO Auto-generated method stub
-        return false;
+    public boolean supportsResultSetConcurrency(int type, int concurrency) 
throws SQLException {
+        // We only support read-only result sets
+        if (concurrency != ResultSet.CONCUR_READ_ONLY) return false;
+        return supportsResultSetType(type);
     }
 
     @Override
-    public boolean supportsResultSetHoldability(int arg0) throws SQLException {
+    public boolean supportsResultSetHoldability(int holdability) throws 
SQLException {
         // Both kinds of holdability are supported
         return true;
     }
 
     @Override
-    public boolean supportsResultSetType(int arg0) throws SQLException {
+    public boolean supportsResultSetType(int type) throws SQLException {
         // Currently only FORWARD_ONLY is supported
-        switch (arg0) {
+        switch (type) {
         case ResultSet.TYPE_FORWARD_ONLY:
             return true;
         default:

Modified: 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/MetadataSchema.java
URL: 
http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/MetadataSchema.java?rev=1471701&r1=1471700&r2=1471701&view=diff
==============================================================================
--- 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/MetadataSchema.java
 (original)
+++ 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/MetadataSchema.java
 Wed Apr 24 21:37:00 2013
@@ -23,15 +23,12 @@ import static java.sql.ResultSetMetaData
 import java.sql.DatabaseMetaData;
 import java.sql.SQLException;
 
-import org.apache.http.TruncatedChunkException;
 import org.apache.jena.jdbc.results.metadata.columns.BooleanColumn;
 import org.apache.jena.jdbc.results.metadata.columns.ColumnInfo;
 import org.apache.jena.jdbc.results.metadata.columns.IntegerColumn;
 import org.apache.jena.jdbc.results.metadata.columns.ShortIntegerColumn;
 import org.apache.jena.jdbc.results.metadata.columns.StringColumn;
 
-import com.hp.hpl.jena.sparql.algebra.table.TableN;
-
 /**
  * Helper class containing constants pertaining to the columns returned by
  * various methods of a {@link DatabaseMetaData} implementation
@@ -50,7 +47,8 @@ public class MetadataSchema {
     private static ColumnInfo[] ATTRIBUTE_COLUMNS, 
BEST_ROW_IDENTIFIER_COLUMNS, CATALOG_COLUMNS, CLIENT_INFO_PROPERTY_COLUMNS,
             COLUMN_COLUMNS, COLUMN_PRIVILEGE_COLUMNS, CROSS_REFERENCE_COLUMNS, 
EXPORTED_KEY_COLUMNS, FUNCTION_COLUMN_COLUMNS,
             FUNCTION_COLUMNS, IMPORTED_KEY_COLUMNS, INDEX_INFO_COLUMNS, 
PRIMARY_KEY_COLUMNS, PROCEDURE_COLUMN_COLUMNS,
-            PROCEDURE_COLUMNS, SCHEMA_COLUMNS, SUPER_TABLE_COLUMNS, 
SUPER_TYPE_COLUMNS, TYPE_INFO_COLUMNS, UDT_COLUMNS;
+            PROCEDURE_COLUMNS, SCHEMA_COLUMNS, SUPER_TABLE_COLUMNS, 
SUPER_TYPE_COLUMNS, TABLE_PRIVILEGE_COLUMNS,
+            TABLE_TYPE_COLUMNS, TABLE_COLUMNS, TYPE_INFO_COLUMNS, UDT_COLUMNS, 
VERSION_COLUMNS;
 
     /**
      * Gets the columns for the
@@ -94,71 +92,212 @@ public class MetadataSchema {
         return CLIENT_INFO_PROPERTY_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getColumns(String, String, String, String)}
+     * method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getColumnColumns() {
         return COLUMN_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getColumnPrivileges(String, String, String, 
String)}
+     * method
+     * 
+     * @return Column Information
+     */
     public static ColumnInfo[] getColumnPrivilegeColumns() {
         return COLUMN_PRIVILEGE_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getCrossReference(String, String, String, 
String, String, String)}
+     * method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getCrossReferenceColumns() {
         return CROSS_REFERENCE_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getExportedKeys(String, String, String)} method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getExportedKeyColumns() {
         return EXPORTED_KEY_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getFunctionColumns(String, String, String, 
String)}
+     * method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getFunctionColumnColumns() {
         return FUNCTION_COLUMN_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getFunctions(String, String, String)} method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getFunctionColumns() {
         return FUNCTION_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getImportedKeys(String, String, String)} method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getImportedKeyColumns() {
         return IMPORTED_KEY_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getIndexInfo(String, String, String, boolean, 
boolean)}
+     * method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getIndexInfoColumns() {
         return INDEX_INFO_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getPrimaryKeys(String, String, String)} method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getPrimaryKeyColumns() {
         return PRIMARY_KEY_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getProcedureColumns(String, String, String, 
String)}
+     * method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getProcedureColumnColumns() {
         return PROCEDURE_COLUMN_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getProcedures(String, String, String)} method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getProcedureColumns() {
         return PROCEDURE_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the {@link DatabaseMetaData#getSchemas()} method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getSchemaColumns() {
         return SCHEMA_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getSuperTables(String, String, String)} method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getSuperTableColumns() {
         return SUPER_TABLE_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getSuperTypes(String, String, String)} method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getSuperTypeColumns() {
         return SUPER_TYPE_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getTablePrivileges(String, String, String)}
+     * method
+     * 
+     * @return Column information
+     */
+    public static ColumnInfo[] getTablePrivilegeColumns() {
+        return TABLE_PRIVILEGE_COLUMNS;
+    }
+
+    /**
+     * Gets the columns for the {@link DatabaseMetaData#getTableTypes()} method
+     * 
+     * @return Column information
+     */
+    public static ColumnInfo[] getTableTypeColumns() {
+        return TABLE_TYPE_COLUMNS;
+    }
+
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getTables(String, String, String, String[])}
+     * method
+     * 
+     * @return Column information
+     */
+    public static ColumnInfo[] getTableColumns() {
+        return TABLE_COLUMNS;
+    }
+
+    /**
+     * Gets the columns for the {@link DatabaseMetaData#getTypeInfo()} method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getTypeInfoColumns() {
         return TYPE_INFO_COLUMNS;
     }
 
+    /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getUDTs(String, String, String, int[])} method
+     * 
+     * @return Column information
+     */
     public static ColumnInfo[] getUdtColumns() {
         return UDT_COLUMNS;
     }
 
     /**
+     * Gets the columns for the
+     * {@link DatabaseMetaData#getVersionColumns(String, String, String)} 
method
+     * 
+     * @return Column information
+     */
+    public static ColumnInfo[] getVersionColumns() {
+        return VERSION_COLUMNS;
+    }
+
+    /**
      * Static initializer, calls private synchronized static initializer to
      * avoid multi-threaded race conditions
      */
@@ -188,6 +327,7 @@ public class MetadataSchema {
             ColumnInfo decimalDigits = new IntegerColumn("DECIMAL_DIGITS", 
columnNoNulls, true);
             ColumnInfo numPrecRadix = new IntegerColumn("NUM_PREC_RADIX", 
columnNoNulls, true);
             ColumnInfo nullable = new IntegerColumn("NULLABLE", columnNoNulls, 
true);
+            ColumnInfo shortNullable = new ShortIntegerColumn("NULLABLE", 
columnNoNulls, true);
             ColumnInfo remarks = new StringColumn("REMARKS", columnNullable);
             ColumnInfo attrDef = new StringColumn("ATTR_DEF", columnNullable);
             ColumnInfo sqlDataType = new IntegerColumn("SQL_DATA_TYPE", 
columnNoNulls, true);
@@ -271,6 +411,9 @@ public class MetadataSchema {
             ColumnInfo localTypeName = new StringColumn("LOCAL_TYPE_NAME", 
columnNullable);
             ColumnInfo minScale = new ShortIntegerColumn("MINIMUM_SCALE", 
columnNoNulls, true);
             ColumnInfo maxScale = new ShortIntegerColumn("MAXIMUM_SCALE", 
columnNullable, true);
+            ColumnInfo tableType = new StringColumn("TABLE_TYPE", 
columnNoNulls);
+            ColumnInfo selfRefColName = new 
StringColumn("SELF_REFERENCING_COL_NAME", columnNullable);
+            ColumnInfo refGeneration = new StringColumn("REF_GENERATION", 
columnNullable);
 
             ATTRIBUTE_COLUMNS = new ColumnInfo[] {
                     // TYPE_CAT String => type catalog (may be null)
@@ -658,7 +801,7 @@ public class MetadataSchema {
                     // functionNoNulls - does not allow NULL values
                     // functionNullable - allows NULL values
                     // functionNullableUnknown - nullability unknown
-                    nullable,
+                    shortNullable,
                     // REMARKS String => comment describing column/parameter
                     remarks,
                     // CHAR_OCTET_LENGTH int => the maximum length of binary 
and
@@ -872,7 +1015,7 @@ public class MetadataSchema {
                     // procedureNoNulls - does not allow NULL values
                     // procedureNullable - allows NULL values
                     // procedureNullableUnknown - nullability unknown
-                    nullable,
+                    shortNullable,
                     // REMARKS String => comment describing parameter/column
                     remarks,
                     // COLUMN_DEF String => default value for the column, which
@@ -970,6 +1113,58 @@ public class MetadataSchema {
                     // SUPERTYPE_NAME String => the direct super type's name
                     superTypeName };
 
+            TABLE_PRIVILEGE_COLUMNS = new ColumnInfo[] {
+                    // TABLE_CAT String => table catalog (may be null)
+                    tableCat,
+                    // TABLE_SCHEM String => table schema (may be null)
+                    tableSchema,
+                    // TABLE_NAME String => table name
+                    tableName,
+                    // GRANTOR String => grantor of access (may be null)
+                    grantor,
+                    // GRANTEE String => grantee of access
+                    grantee,
+                    // PRIVILEGE String => name of access (SELECT, INSERT,
+                    // UPDATE, REFRENCES, ...)
+                    privilege,
+                    // IS_GRANTABLE String => "YES" if grantee is permitted to
+                    // grant to others; "NO" if not; null if unknown
+                    isGrantable };
+
+            TABLE_TYPE_COLUMNS = new ColumnInfo[] {
+            // TABLE_TYPE String => table type. Typical types are "TABLE",
+            // "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY",
+            // "ALIAS", "SYNONYM".
+            tableType };
+
+            TABLE_COLUMNS = new ColumnInfo[] {
+                    // TABLE_CAT String => table catalog (may be null)
+                    tableCat,
+                    // TABLE_SCHEM String => table schema (may be null)
+                    tableSchema,
+                    // TABLE_NAME String => table name
+                    tableName,
+                    // TABLE_TYPE String => table type. Typical types are
+                    // "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY",
+                    // "LOCAL TEMPORARY", "ALIAS", "SYNONYM".
+                    tableType,
+                    // REMARKS String => explanatory comment on the table
+                    remarks,
+                    // TYPE_CAT String => the types catalog (may be null)
+                    typeCat,
+                    // TYPE_SCHEM String => the types schema (may be null)
+                    typeSchema,
+                    // TYPE_NAME String => type name (may be null)
+                    typeName,
+                    // SELF_REFERENCING_COL_NAME String => name of the
+                    // designated "identifier" column of a typed table (may be
+                    // null)
+                    selfRefColName,
+                    // REF_GENERATION String => specifies how values in
+                    // SELF_REFERENCING_COL_NAME are created. Values are
+                    // "SYSTEM", "USER", "DERIVED". (may be null)
+                    refGeneration };
+
             TYPE_INFO_COLUMNS = new ColumnInfo[] {
                     // TYPE_NAME String => Type name
                     typeName,
@@ -990,7 +1185,7 @@ public class MetadataSchema {
                     // typeNoNulls - does not allow NULL values
                     // typeNullable - allows NULL values
                     // typeNullableUnknown - nullability unknown
-                    nullable,
+                    shortNullable,
                     // CASE_SENSITIVE boolean=> is it case sensitive.
                     caseSensitive,
                     // SEARCHABLE short => can you use "WHERE" based on this
@@ -1043,6 +1238,29 @@ public class MetadataSchema {
                     // not STRUCT with REFERENCE_GENERATION = USER_DEFINED)
                     baseType };
 
+            VERSION_COLUMNS = new ColumnInfo[] {
+                    // SCOPE short => is not used
+                    scope,
+                    // COLUMN_NAME String => column name
+                    columnName,
+                    // DATA_TYPE int => SQL data type from java.sql.Types
+                    dataType,
+                    // TYPE_NAME String => Data source-dependent type name
+                    typeName,
+                    // COLUMN_SIZE int => precision
+                    columnSize,
+                    // BUFFER_LENGTH int => length of column value in bytes
+                    bufferLength,
+                    // DECIMAL_DIGITS short => scale - Null is returned for 
data
+                    // types where DECIMAL_DIGITS is not applicable.
+                    decimalDigits,
+                    // PSEUDO_COLUMN short => whether this is pseudo column 
like
+                    // an Oracle ROWID
+                    // versionColumnUnknown - may or may not be pseudo column
+                    // versionColumnNotPseudo - is NOT a pseudo column
+                    // versionColumnPseudo - is a pseudo column
+                    psuedoColumn };
+
         } catch (SQLException e) {
             throw new Error("Fatal error initializing JDBC metadata schema 
information");
         }

Modified: 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/results/MetaResultSet.java
URL: 
http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/results/MetaResultSet.java?rev=1471701&r1=1471700&r2=1471701&view=diff
==============================================================================
--- 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/results/MetaResultSet.java
 (original)
+++ 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/metadata/results/MetaResultSet.java
 Wed Apr 24 21:37:00 2013
@@ -86,8 +86,8 @@ public class MetaResultSet implements Re
         this.metadata = new MetaResultSetMetadata(this, this.columns);
         
         // Validate row widths if any rows
-        for (Object[] row : rows) {
-            if (row.length != this.columns.length) throw new SQLException("One 
of the rows given does not have the expected number of columns");
+        for (int i = 0; i < rows.length; i++) {
+            if (rows[i].length != this.columns.length) throw new 
SQLException("Row " + (i+1) + " does not have the expected number of columns");
         }
     }
 
@@ -221,15 +221,16 @@ public class MetaResultSet implements Re
                 // appropriately
                 if (targetType.isAssignableFrom(obj.getClass())) {
                     try {
-                        return targetType.cast(obj);
+                        Object temp = targetType.cast(obj);
+                        return temp;
                     } catch (ClassCastException e) {
-                        throw new SQLException("Value for this column (Index " 
+ columnIndex + ") in the current row is not valid for the column type");
+                        throw new SQLException("Value for this column (Row " + 
(currRow+1) + " Column " + columnIndex + ") is not valid for the columns 
declared type", e);
                     }
                 } else {
-                    throw new SQLException("Value for this column (Index " + 
columnIndex + ") in the current row is not valid for the column type");
+                    throw new SQLException("Value for this column (Row " + 
(currRow+1) + " Column " + columnIndex + ") is not valid for the columns 
declared type");
                 }
             } else {
-                throw new SQLException("Given column (Index " + columnIndex + 
") does not contain appropriately typed values");
+                throw new SQLException("Given column (Row " + (currRow+1) + " 
Column " + columnIndex + ") does not contain appropriately typed values.  
Column type declared as " + info.getType() + " but expected type for this 
lookup is " + expectedType);
             }
         } else {
             throw new SQLException("Column index is out of bounds");
@@ -310,7 +311,7 @@ public class MetaResultSet implements Re
 
     @Override
     public byte getByte(int columnIndex) throws SQLException {
-        return (Byte) this.getValue(columnIndex, Types.TINYINT, Byte.class, 
0x0);
+        return (Byte) this.getValue(columnIndex, Types.TINYINT, Byte.class, 
(byte)0x0);
     }
 
     @Override

Modified: 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/metadata/AbstractResultsMetadata.java
URL: 
http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/metadata/AbstractResultsMetadata.java?rev=1471701&r1=1471700&r2=1471701&view=diff
==============================================================================
--- 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/metadata/AbstractResultsMetadata.java
 (original)
+++ 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/metadata/AbstractResultsMetadata.java
 Wed Apr 24 21:37:00 2013
@@ -36,6 +36,12 @@ public class AbstractResultsMetadata imp
     protected ResultSet results;
     protected List<ColumnInfo> columns = new ArrayList<ColumnInfo>();
 
+    /**
+     * Abstract implementation of result set metadata
+     * @param results Result Set
+     * @param columns Column information
+     * @throws SQLException Thrown if metadata cannot be created
+     */
     public AbstractResultsMetadata(ResultSet results, ColumnInfo[] columns) 
throws SQLException {
         if (results == null)
             throw new SQLException("Result Set cannot be null");

Modified: 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/statements/JenaPreparedStatement.java
URL: 
http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/statements/JenaPreparedStatement.java?rev=1471701&r1=1471700&r2=1471701&view=diff
==============================================================================
--- 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/statements/JenaPreparedStatement.java
 (original)
+++ 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/statements/JenaPreparedStatement.java
 Wed Apr 24 21:37:00 2013
@@ -52,6 +52,16 @@ public abstract class JenaPreparedStatem
     
     private ParameterizedSparqlString sparqlStr = new 
ParameterizedSparqlString();
 
+    /**
+     * Creates a new prepared statement
+     * @param connection
+     * @param fetchDir
+     * @param fetchSize
+     * @param holdability
+     * @param autoCommit
+     * @param transactionLevel
+     * @throws SQLException
+     */
     public JenaPreparedStatement(JenaConnection connection, int fetchDir, int 
fetchSize, int holdability, boolean autoCommit,
             int transactionLevel) throws SQLException {
         super(connection, fetchDir, fetchSize, holdability, autoCommit, 
transactionLevel);

Added: 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/AbstractDatabaseMetadataTests.java
URL: 
http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/AbstractDatabaseMetadataTests.java?rev=1471701&view=auto
==============================================================================
--- 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/AbstractDatabaseMetadataTests.java
 (added)
+++ 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/AbstractDatabaseMetadataTests.java
 Wed Apr 24 21:37:00 2013
@@ -0,0 +1,75 @@
+/**
+ * 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.jena.jdbc.metadata.results;
+
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.jena.jdbc.connections.JenaConnection;
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.hp.hpl.jena.query.ARQ;
+
+/**
+ * Tests that inspect the information provided by {@link JenaConnection}
+ * implementations in response to the {@link JenaConnection#getMetaData()}
+ * method
+ * 
+ */
+public abstract class AbstractDatabaseMetadataTests {
+
+    protected abstract JenaConnection getConnection() throws SQLException;
+
+    static {
+        // Init Log4j
+        BasicConfigurator.resetConfiguration();
+        BasicConfigurator.configure();
+        Logger.getRootLogger().setLevel(Level.INFO);
+
+        // Init ARQ
+        ARQ.init();
+    }
+
+    /**
+     * Get type info and check the nullable column (regression for an issue 
encountered during debugging)
+     * @throws SQLException
+     */
+    @Test
+    public void metadata_type_info() throws SQLException {
+        JenaConnection conn = this.getConnection();
+
+        DatabaseMetaData metadata = conn.getMetaData();
+        ResultSet typeInfo = metadata.getTypeInfo();
+
+        while (typeInfo.next()) {
+            typeInfo.getShort("NULLABLE");
+        }
+
+        Assert.assertTrue(typeInfo.isAfterLast());
+        typeInfo.close();
+        Assert.assertTrue(typeInfo.isClosed());
+        conn.close();
+        Assert.assertTrue(typeInfo.isClosed());
+    }
+}

Added: 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/TestMetaResultSet.java
URL: 
http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/TestMetaResultSet.java?rev=1471701&view=auto
==============================================================================
--- 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/TestMetaResultSet.java
 (added)
+++ 
jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/metadata/results/TestMetaResultSet.java
 Wed Apr 24 21:37:00 2013
@@ -0,0 +1,495 @@
+/**
+ * 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.jena.jdbc.metadata.results;
+
+import java.math.BigDecimal;
+import java.sql.Date;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Time;
+
+import org.apache.jena.jdbc.metadata.results.MetaResultSet;
+import org.apache.jena.jdbc.results.metadata.columns.BooleanColumn;
+import org.apache.jena.jdbc.results.metadata.columns.ByteColumn;
+import org.apache.jena.jdbc.results.metadata.columns.ColumnInfo;
+import org.apache.jena.jdbc.results.metadata.columns.DateColumn;
+import org.apache.jena.jdbc.results.metadata.columns.DecimalColumn;
+import org.apache.jena.jdbc.results.metadata.columns.DoubleColumn;
+import org.apache.jena.jdbc.results.metadata.columns.FloatColumn;
+import org.apache.jena.jdbc.results.metadata.columns.IntegerColumn;
+import org.apache.jena.jdbc.results.metadata.columns.LongIntegerColumn;
+import org.apache.jena.jdbc.results.metadata.columns.ShortIntegerColumn;
+import org.apache.jena.jdbc.results.metadata.columns.StringColumn;
+import org.apache.jena.jdbc.results.metadata.columns.TimeColumn;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests for the {@link MetaResultSet}
+ *
+ */
+public class TestMetaResultSet {
+    
+    /**
+     * Check empty meta result set
+     * @throws SQLException
+     */
+    @Test
+    public void empty_meta_result_set_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[0]);
+        
+        //Check results metadata
+        ResultSetMetaData metadata = results.getMetaData();
+        Assert.assertEquals(0, metadata.getColumnCount());
+        
+        //Check results
+        Assert.assertTrue(results.isBeforeFirst());
+        Assert.assertFalse(results.next());
+        Assert.assertTrue(results.isAfterLast());
+        
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Check empty meta result set with a single column
+     * @throws SQLException
+     */
+    @Test
+    public void empty_meta_result_set_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
StringColumn("Test", ResultSetMetaData.columnNullable) });
+        
+        //Check results metadata
+        ResultSetMetaData metadata = results.getMetaData();
+        Assert.assertEquals(1, metadata.getColumnCount());
+        
+        //Check results
+        Assert.assertTrue(results.isBeforeFirst());
+        Assert.assertFalse(results.next());
+        Assert.assertTrue(results.isAfterLast());
+        
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Trying to create a meta result set with bad data is an error
+     * @throws SQLException
+     */
+    @Test(expected=SQLException.class)
+    public void meta_result_set_bad_01() throws SQLException {
+        // Every row must have the correct number of columns
+        new MetaResultSet(new ColumnInfo[] { new StringColumn("Test", 
ResultSetMetaData.columnNullable) }, new Object[][] { { } });
+    }
+       
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_string_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
StringColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { 
"value" } });
+        
+        Assert.assertTrue(results.next());
+        String value = results.getString(1);
+        Assert.assertEquals("value", value);
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_string_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
StringColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { 
null } });
+        
+        Assert.assertTrue(results.next());
+        String value = results.getString(1);
+        Assert.assertEquals(null, value);
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_boolean_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
BooleanColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { 
true } });
+        
+        Assert.assertTrue(results.next());
+        Assert.assertTrue(results.getBoolean(1));
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_boolean_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
BooleanColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { 
null } });
+        
+        Assert.assertTrue(results.next());
+        Assert.assertFalse(results.getBoolean(1));
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_byte_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
ByteColumn("Test", ResultSetMetaData.columnNullable, true) }, new Object[][] { 
{ (byte)0x10 } });
+        
+        Assert.assertTrue(results.next());
+        byte value = results.getByte(1);
+        Assert.assertEquals(0x10, value);
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_byte_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
ByteColumn("Test", ResultSetMetaData.columnNullable, true) }, new Object[][] { 
{ null } });
+        
+        Assert.assertTrue(results.next());
+        byte value = results.getByte(1);
+        Assert.assertEquals(0x0, value);
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @SuppressWarnings("deprecation")
+    @Test
+    public void meta_result_set_date_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
DateColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { new 
Date(2013, 4, 24) } });
+        
+        Assert.assertTrue(results.next());
+        Date value = results.getDate(1);
+        Assert.assertEquals(new Date(2013, 4, 24), value);
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_date_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
DateColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { null 
} });
+        
+        Assert.assertTrue(results.next());
+        Date value = results.getDate(1);
+        Assert.assertEquals(null, value);
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_time_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
TimeColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { new 
Time(0) } });
+        
+        Assert.assertTrue(results.next());
+        Time value = results.getTime(1);
+        Assert.assertEquals(new Time(0), value);
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_time_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
TimeColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { null 
} });
+        
+        Assert.assertTrue(results.next());
+        Time value = results.getTime(1);
+        Assert.assertEquals(null, value);
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_decimal_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
DecimalColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { 
new BigDecimal("123.4") } });
+        
+        Assert.assertTrue(results.next());
+        BigDecimal value = results.getBigDecimal(1);
+        Assert.assertEquals(new BigDecimal("123.4"), value);
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_decimal_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
DecimalColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { 
null } });
+        
+        Assert.assertTrue(results.next());
+        BigDecimal value = results.getBigDecimal(1);
+        Assert.assertEquals(null, value);
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_double_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
DoubleColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { 
0.123d } });
+        
+        Assert.assertTrue(results.next());
+        double value = results.getDouble(1);
+        Assert.assertEquals(0.123d, value, 0d);
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_double_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
ByteColumn("Test", ResultSetMetaData.columnNullable, true) }, new Object[][] { 
{ null } });
+        
+        Assert.assertTrue(results.next());
+        double value = results.getDouble(1);
+        Assert.assertEquals(0d, value, 0d);
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_float_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
FloatColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { 
0.123f } });
+        
+        Assert.assertTrue(results.next());
+        float value = results.getFloat(1);
+        Assert.assertEquals(0.123f, value, 0f);
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_float_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
FloatColumn("Test", ResultSetMetaData.columnNullable) }, new Object[][] { { 
null } });
+        
+        Assert.assertTrue(results.next());
+        float value = results.getFloat(1);
+        Assert.assertEquals(0f, value, 0f);
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_integer_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
IntegerColumn("Test", ResultSetMetaData.columnNullable, true) }, new Object[][] 
{ { 1234 } });
+        
+        Assert.assertTrue(results.next());
+        int value = results.getInt(1);
+        Assert.assertEquals(1234, value);
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_integer_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
IntegerColumn("Test", ResultSetMetaData.columnNullable, true) }, new Object[][] 
{ { null } });
+        
+        Assert.assertTrue(results.next());
+        int value = results.getInt(1);
+        Assert.assertEquals(0, value);
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_long_integer_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
LongIntegerColumn("Test", ResultSetMetaData.columnNullable, true) }, new 
Object[][] { { 1234l } });
+        
+        Assert.assertTrue(results.next());
+        long value = results.getLong(1);
+        Assert.assertEquals(1234, value);
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_long_integer_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
LongIntegerColumn("Test", ResultSetMetaData.columnNullable, true) }, new 
Object[][] { { null } });
+        
+        Assert.assertTrue(results.next());
+        long value = results.getLong(1);
+        Assert.assertEquals(0, value);
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_short_integer_01() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
ShortIntegerColumn("Test", ResultSetMetaData.columnNullable, true) }, new 
Object[][] { { (short)1234 } });
+        
+        Assert.assertTrue(results.next());
+        short value = results.getShort(1);
+        Assert.assertEquals((short)1234, value);
+        Assert.assertFalse(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+    
+    /**
+     * Test retrieving meta column values
+     * @throws SQLException
+     */
+    @Test
+    public void meta_result_set_short_integer_02() throws SQLException {
+        MetaResultSet results = new MetaResultSet(new ColumnInfo[] { new 
ShortIntegerColumn("Test", ResultSetMetaData.columnNullable, true) }, new 
Object[][] { { null } });
+        
+        Assert.assertTrue(results.next());
+        short value = results.getShort(1);
+        Assert.assertEquals((short)0, value);
+        Assert.assertTrue(results.wasNull());
+        
+        Assert.assertFalse(results.next());
+        results.close();
+        Assert.assertTrue(results.isClosed());
+    }
+}

Added: 
jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/metadata/TestDatasetConnectionMetadata.java
URL: 
http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/metadata/TestDatasetConnectionMetadata.java?rev=1471701&view=auto
==============================================================================
--- 
jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/metadata/TestDatasetConnectionMetadata.java
 (added)
+++ 
jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/metadata/TestDatasetConnectionMetadata.java
 Wed Apr 24 21:37:00 2013
@@ -0,0 +1,42 @@
+/**
+ * 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.jena.jdbc.mem.metadata;
+
+import java.sql.SQLException;
+
+import org.apache.jena.jdbc.JdbcCompatibility;
+import org.apache.jena.jdbc.connections.JenaConnection;
+import org.apache.jena.jdbc.mem.connections.MemConnection;
+import org.apache.jena.jdbc.metadata.results.AbstractDatabaseMetadataTests;
+
+import com.hp.hpl.jena.query.DatasetFactory;
+
+/**
+ * Database metadata tests for {@link MemConnection} implementation
+ *
+ */
+public class TestDatasetConnectionMetadata extends 
AbstractDatabaseMetadataTests {
+
+    @Override
+    protected JenaConnection getConnection() throws SQLException {
+        return new MemConnection(DatasetFactory.createMem(), 
JenaConnection.DEFAULT_HOLDABILITY,
+                JenaConnection.DEFAULT_AUTO_COMMIT, 
JenaConnection.DEFAULT_ISOLATION_LEVEL, JdbcCompatibility.DEFAULT);
+    }
+
+}


Reply via email to