You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by fu...@apache.org on 2006/08/10 00:53:55 UTC

svn commit: r430177 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/jdbc/ testing/org/apache/derbyTesting/functionTests/master/ testing/org/apache/derbyTesting/functionTests/master/DerbyNet/ testing/org/apache/derbyTesting/functionTests/ma...

Author: fuzzylogic
Date: Wed Aug  9 15:53:53 2006
New Revision: 430177

URL: http://svn.apache.org/viewvc?rev=430177&view=rev
Log:
DERBY-1146: Add SHOW TABLES and DESCRIBE commands to ij.

Committed for Havard Mork <ha...@gmail.com>

Added:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out   (with props)
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql   (with props)
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties   (with props)
    db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java   (with props)
Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall
    db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj
    db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java
    db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java
    db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java
    db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java
    db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java
    db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties
    db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java Wed Aug  9 15:53:53 2006
@@ -283,7 +283,7 @@
 	public String getDatabaseProductVersion() {
 		ProductVersionHolder myPVH = Monitor.getMonitor().getEngineVersion();
 
-		return myPVH.getVersionBuildString(false);
+		return myPVH.getVersionBuildString(true);
 	}
 
     /**

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties Wed Aug  9 15:53:53 2006
@@ -133,8 +133,8 @@
 	FROM \
 		 SYS.SYSTABLES, \
 	     SYS.SYSSCHEMAS, \
-	     (VALUES ('T','TABLE'), \
-			('S','SYSTEM TABLE'), ('V', 'VIEW')) T(TTABBREV,TABLE_TYPE) \
+	     (VALUES ('T','TABLE'), ('S','SYSTEM TABLE'), \
+			('V', 'VIEW'), ('A', 'SYNONYM')) T(TTABBREV,TABLE_TYPE) \
 	WHERE (TTABBREV=TABLETYPE 	\
 	  AND (SYS.SYSTABLES.SCHEMAID = SYS.SYSSCHEMAS.SCHEMAID) \
 	  AND ((1=1) OR ? IS NOT NULL) \
@@ -272,7 +272,8 @@
 # so we wrap the values in a select to name it.
 getTableTypes=\
 	SELECT CAST (RTRIM(TABLE_TYPE) AS VARCHAR(12)) AS TABLE_TYPE \
-	FROM (VALUES 'SYSTEM TABLE', 'TABLE', 'VIEW') TABLETYPES(TABLE_TYPE) \
+	FROM (VALUES 'SYNONYM', 'SYSTEM TABLE', 'TABLE', 'VIEW') \
+		TABLETYPES(TABLE_TYPE) \
 	ORDER BY TABLE_TYPE
 
 # parameter 1 = pattern for catalog name

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out Wed Aug  9 15:53:53 2006
@@ -284,6 +284,7 @@
 ,APP,SCREWIE,VIEW,,null,null,null,null,null
 getTableTypes():
 TABLE_TYPE[VARCHAR]
+SYNONYM
 SYSTEM TABLE
 TABLE
 VIEW

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out Wed Aug  9 15:53:53 2006
@@ -314,6 +314,7 @@
 ,APP,SCREWIE,VIEW,,null,null,null,null,null
 getTableTypes():
 TABLE_TYPE[VARCHAR]
+SYNONYM
 SYSTEM TABLE
 TABLE
 VIEW

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out Wed Aug  9 15:53:53 2006
@@ -377,6 +377,7 @@
 ,APP,SCREWIE,VIEW,,null,null,null,null,null
 getTableTypes():
 TABLE_TYPE[VARCHAR]
+SYNONYM
 SYSTEM TABLE
 TABLE
 VIEW

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out Wed Aug  9 15:53:53 2006
@@ -377,6 +377,7 @@
 ,APP,SCREWIE,VIEW,,null,null,null,null,null
 getTableTypes():
 TABLE_TYPE[VARCHAR]
+SYNONYM
 SYSTEM TABLE
 TABLE
 VIEW

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out Wed Aug  9 15:53:53 2006
@@ -407,6 +407,7 @@
 ,APP,SCREWIE,VIEW,,null,null,null,null,null
 getTableTypes():
 TABLE_TYPE[VARCHAR]
+SYNONYM
 SYSTEM TABLE
 TABLE
 VIEW

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out Wed Aug  9 15:53:53 2006
@@ -1106,6 +1106,7 @@
 ,APP,SCREWIE,VIEW,,null,null,null,null,null
 getTableTypes():
 TABLE_TYPE[VARCHAR]
+SYNONYM
 SYSTEM TABLE
 TABLE
 VIEW
@@ -2597,6 +2598,7 @@
 ,APP,SCREWIE,VIEW,,null,null,null,null,null
 getTableTypes():
 TABLE_TYPE[VARCHAR]
+SYNONYM
 SYSTEM TABLE
 TABLE
 VIEW

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out Wed Aug  9 15:53:53 2006
@@ -49,6 +49,12 @@
   DISCONNECT [ CURRENT | connectionName | ALL ];
                                -- drop current, named, or all connections;
                                -- the default is CURRENT
+  SHOW SCHEMAS;                -- lists all schemas in the current database
+  SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema };
+                               -- lists tables, views, procedures or synonyms
+  SHOW INDEXES { IN schema | FROM table };
+                               -- lists indexes in a schema, or for a table
+  DESCRIBE name;               -- lists columns in the named table
   COMMIT;                      -- commits the current transaction
   ROLLBACK;                    -- rolls back the current transaction
   PREPARE name AS 'SQL-J text'; -- prepares the SQL-J text

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out?rev=430177&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out Wed Aug  9 15:53:53 2006
@@ -0,0 +1,89 @@
+ij> -- This test will cover SHOW TABLES, SHOW SCHEMAS, etc.
+-- and the DESCRIBE command.
+connect 'jdbc:derby:wombat;create=true';
+ij> SET SCHEMA = APP;
+0 rows inserted/updated/deleted
+ij> CREATE TABLE t1 (i int generated always as identity, d DECIMAL(5,2), test VARCHAR(20));
+0 rows inserted/updated/deleted
+ij> CREATE SCHEMA USER1;
+0 rows inserted/updated/deleted
+ij> SET SCHEMA = USER1;
+0 rows inserted/updated/deleted
+ij> CREATE TABLE t2 (i int);
+0 rows inserted/updated/deleted
+ij> CREATE SYNONYM USER1.T3 FOR USER1.T2;
+0 rows inserted/updated/deleted
+ij> CREATE VIEW v1 AS SELECT * from app.t1;
+0 rows inserted/updated/deleted
+ij> CREATE INDEX idx1 ON APP.t1 (test ASC);
+0 rows inserted/updated/deleted
+ij> CREATE PROCEDURE APP.PROCTEST(IN A INTEGER, OUT B DECIMAL(10,2))
+PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA 
+EXTERNAL NAME 'a.b.c.d.e';
+0 rows inserted/updated/deleted
+ij> -- first display all tables, then display tables in one schema
+SHOW TABLES;
+TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
+------------------------------------------------------------------------
+APP                 |T1                            |                    
+USER1               |T2                            |                    
+2 rows selected
+ij> SHOW TABLES IN APP;
+TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
+------------------------------------------------------------------------
+APP                 |T1                            |                    
+1 row selected
+ij> -- 'describe t1' will give error, as not in current schema
+DESCRIBE t1;
+IJ ERROR: No table exists with the name T1
+ij> DESCRIBE APP.t1;
+COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
+------------------------------------------------------------------------------
+I                   |INTEGER  |0   |10  |10    |AUTOINCRE&|NULL      |NO      
+D                   |DECIMAL  |2   |10  |5     |NULL      |NULL      |YES     
+TEST                |VARCHAR  |NULL|NULL|20    |NULL      |40        |YES     
+3 rows selected
+ij> DESCRIBE v1;
+COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
+------------------------------------------------------------------------------
+I                   |INTEGER  |0   |10  |10    |NULL      |NULL      |NO      
+D                   |DECIMAL  |2   |10  |5     |NULL      |NULL      |YES     
+TEST                |VARCHAR  |NULL|NULL|20    |NULL      |40        |YES     
+3 rows selected
+ij> SHOW SCHEMAS;
+TABLE_SCHEM                   
+------------------------------
+APP                           
+NULLID                        
+SQLJ                          
+SYS                           
+SYSCAT                        
+SYSCS_DIAG                    
+SYSCS_UTIL                    
+SYSFUN                        
+SYSIBM                        
+SYSPROC                       
+SYSSTAT                       
+USER1                         
+12 rows selected
+ij> SHOW VIEWS IN USER1;
+TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
+------------------------------------------------------------------------
+USER1               |V1                            |                    
+1 row selected
+ij> SHOW PROCEDURES IN APP;
+PROCEDURE_SCHEM     |PROCEDURE_NAME                |REMARKS             
+------------------------------------------------------------------------
+APP                 |PROCTEST                      |a.b.c.d.e           
+1 row selected
+ij> SHOW SYNONYMS IN USER1;
+TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
+------------------------------------------------------------------------
+USER1               |T3                            |                    
+1 row selected
+ij> SHOW INDEXES FROM APP.t1;
+TABLE_NAME          |COLUMN_NAME         |NON_U&|TYPE|ASC&|CARDINA&|PAGES   
+----------------------------------------------------------------------------
+T1                  |TEST                |true  |3   |A   |NULL    |NULL    
+1 row selected
+ij> 

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out Wed Aug  9 15:53:53 2006
@@ -49,6 +49,12 @@
   DISCONNECT [ CURRENT | connectionName | ALL ];
                                -- drop current, named, or all connections;
                                -- the default is CURRENT
+  SHOW SCHEMAS;                -- lists all schemas in the current database
+  SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema };
+                               -- lists tables, views, procedures or synonyms
+  SHOW INDEXES { IN schema | FROM table };
+                               -- lists indexes in a schema, or for a table
+  DESCRIBE name;               -- lists columns in the named table
   COMMIT;                      -- commits the current transaction
   ROLLBACK;                    -- rolls back the current transaction
   PREPARE name AS 'SQL-J text'; -- prepares the SQL-J text

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out Wed Aug  9 15:53:53 2006
@@ -377,6 +377,7 @@
 ,APP,SCREWIE,VIEW,,null,null,null,null,null
 getTableTypes():
 TABLE_TYPE[VARCHAR]
+SYNONYM
 SYSTEM TABLE
 TABLE
 VIEW

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out Wed Aug  9 15:53:53 2006
@@ -407,6 +407,7 @@
 ,APP,SCREWIE,VIEW,,null,null,null,null,null
 getTableTypes():
 TABLE_TYPE[VARCHAR]
+SYNONYM
 SYSTEM TABLE
 TABLE
 VIEW

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall Wed Aug  9 15:53:53 2006
@@ -10,5 +10,6 @@
 tools/ij4.sql
 tools/ij5.sql
 tools/ij6.sql
+tools/ij7.sql
 tools/ijConnName.sql
 tools/URLCheck.sql

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql?rev=430177&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql Wed Aug  9 15:53:53 2006
@@ -0,0 +1,35 @@
+
+-- This test will cover SHOW TABLES, SHOW SCHEMAS, etc.
+-- and the DESCRIBE command.
+
+connect 'jdbc:derby:wombat;create=true';
+
+SET SCHEMA = APP;
+CREATE TABLE t1 (i int generated always as identity, d DECIMAL(5,2), test VARCHAR(20));
+
+CREATE SCHEMA USER1;
+SET SCHEMA = USER1;
+CREATE TABLE t2 (i int);
+
+CREATE SYNONYM USER1.T3 FOR USER1.T2;
+CREATE VIEW v1 AS SELECT * from app.t1;
+CREATE INDEX idx1 ON APP.t1 (test ASC);
+CREATE PROCEDURE APP.PROCTEST(IN A INTEGER, OUT B DECIMAL(10,2))
+PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA 
+EXTERNAL NAME 'a.b.c.d.e';
+
+-- first display all tables, then display tables in one schema
+SHOW TABLES;
+SHOW TABLES IN APP;
+
+-- 'describe t1' will give error, as not in current schema
+DESCRIBE t1;
+DESCRIBE APP.t1;
+DESCRIBE v1;
+
+SHOW SCHEMAS;
+SHOW VIEWS IN USER1;
+SHOW PROCEDURES IN APP;
+SHOW SYNONYMS IN USER1;
+SHOW INDEXES FROM APP.t1;
+

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql
------------------------------------------------------------------------------
    svn:eol-style = native

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties?rev=430177&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties Wed Aug  9 15:53:53 2006
@@ -0,0 +1,4 @@
+ij.showNoConnectionsAtStart=false
+
+#Exclude for J2ME/Foundation - need to look into reason for failure
+runwithfoundation=false
\ No newline at end of file

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj (original)
+++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj Wed Aug  9 15:53:53 2006
@@ -551,6 +551,240 @@
 	  	return new ijVectorResult(v,w);
 	}
 
+	/**
+	   Returns a subset of the input integer array
+	   
+	   @param input The input integer array
+	   @param start Starting index, inclusive
+	   @param end   Ending index, exclusive
+	 */
+	public static int[] intArraySubset(final int[] input, int start, int end) {
+		int[] res = new int[end-start];
+		System.arraycopy(input, start, res, 0, end-start);
+		return res;
+	}
+
+	/**
+	   Verify that a table exists within a schema. Throws an exception
+	   if table does not exist.
+	   
+	   @param schema Schema for the table
+	   @param table  Name of table to check for existence of
+	 */
+	public void verifyTableExists(String schema, String table) 
+	throws SQLException {
+		if(schema == null)
+			return;
+
+		ResultSet rs = null;
+		try {
+			DatabaseMetaData dbmd = theConnection.getMetaData();
+			rs = dbmd.getTables(null,schema,table,null);
+			if(!rs.next())
+				throw ijException.noSuchTable(table);
+		} finally {
+			if(rs!=null)
+				rs.close();
+		}
+	}
+
+	/**
+	   Return a resultset of tables (or views, procs...) in the given schema. 
+
+	   @param schema  Schema to get tables for, or null for search 
+	                  in all schemas.
+	   @param tableType Types of tables to return, see
+	                  {@link java.sql.DatabaseMetaData#getTableTypes}
+	 */
+	public ijResult showTables(String schema, String[] tableType) throws SQLException {
+		ResultSet rs = null;
+		try {
+			haveConnection();
+
+			DatabaseMetaData dbmd = theConnection.getMetaData();
+			rs = dbmd.getTables(null,schema,null,tableType);
+
+			int[] displayColumns = new int[] {
+				rs.findColumn("TABLE_SCHEM"),
+				rs.findColumn("TABLE_NAME"),
+				rs.findColumn("REMARKS"),
+			};
+			int[] columnWidths = new int[] {
+				20,
+				30,
+				20,
+			};
+
+			return new ijResultSetResult(rs, displayColumns, columnWidths);
+		} catch (SQLException e) {
+			if(rs!=null)
+				rs.close();
+			throw e;
+		}
+	}
+
+	/**
+	   Return a resultset of indexes for the given table or schema
+
+	   @param schema  schema to find indexes for
+	   @param table   table to find indexes for
+	 */
+	public ijResult showIndexes(String schema, String table) throws SQLException {
+		ResultSet rs = null;
+		try {
+			haveConnection();
+			verifyTableExists(schema, table);
+
+			DatabaseMetaData dbmd = theConnection.getMetaData();
+			rs = dbmd.getIndexInfo(null, schema, table, false, true);
+
+			int[] displayColumns = new int[] {
+				rs.findColumn("TABLE_SCHEM"),
+				rs.findColumn("TABLE_NAME"),
+				rs.findColumn("COLUMN_NAME"),
+				rs.findColumn("NON_UNIQUE"),
+				rs.findColumn("TYPE"),
+				rs.findColumn("ASC_OR_DESC"),
+				rs.findColumn("CARDINALITY"),
+				rs.findColumn("PAGES"),
+			};
+			int[] columnWidths = new int[] {
+				20,
+				20,
+				20,
+				6,
+				4,
+				4,
+				8,
+				8,
+			};
+
+			if(schema!=null) {
+				displayColumns = intArraySubset(displayColumns, 1, 
+												displayColumns.length);
+				columnWidths   = intArraySubset(columnWidths, 1, 
+												columnWidths.length);
+			}
+			return new ijResultSetResult(rs, displayColumns, columnWidths);
+		} catch (SQLException e) {
+			if(rs!=null)
+				rs.close();
+			throw e;
+		}
+	}
+
+	/**
+	   Return a resultset of procedures from database metadata
+	 */
+	public ijResult showProcedures(String schema) throws SQLException {
+		ResultSet rs = null;
+		try {
+			haveConnection();
+
+			DatabaseMetaData dbmd = theConnection.getMetaData();
+			rs = dbmd.getProcedures(null,schema,null);
+
+			int[] displayColumns = new int[] {
+				rs.findColumn("PROCEDURE_SCHEM"),
+				rs.findColumn("PROCEDURE_NAME"),
+				rs.findColumn("REMARKS"),
+			};
+			int[] columnWidths = new int[] {
+				20,
+				30,
+				20,
+			};
+
+			return new ijResultSetResult(rs, displayColumns, columnWidths);
+		} catch (SQLException e) {
+			if(rs!=null)
+				rs.close();
+			throw e;
+		}
+	}
+
+	/**
+	   Return a resultset of schemas from database metadata
+	 */
+	public ijResult showSchemas() throws SQLException {
+		ResultSet rs = null;
+		try {
+			haveConnection();
+
+			DatabaseMetaData dbmd = theConnection.getMetaData();
+			rs = dbmd.getSchemas();
+
+			int[] displayColumns = new int[] {
+				rs.findColumn("TABLE_SCHEM")
+			};
+			int[] columnWidths = new int[] {
+				30
+			};
+
+			return new ijResultSetResult(rs, displayColumns, columnWidths);
+		} catch (SQLException e) {
+			if(rs!=null)
+				rs.close();
+			throw e;
+		}
+	}
+
+	/**
+	   Outputs the names of all fields of given table. Outputs field
+	   names and data type.
+	 */
+	public ijResult describeTable(String schema, String table) throws SQLException {
+		ResultSet rs = null;
+		try {
+			haveConnection();
+			verifyTableExists(schema,table);
+
+			DatabaseMetaData dbmd = theConnection.getMetaData();
+			rs = dbmd.getColumns(null,schema,table,null);
+
+			int[] displayColumns = new int[] {
+				rs.findColumn("TABLE_SCHEM"),
+				rs.findColumn("TABLE_NAME"),
+				rs.findColumn("COLUMN_NAME"),
+				rs.findColumn("TYPE_NAME"),
+				rs.findColumn("DECIMAL_DIGITS"),
+				rs.findColumn("NUM_PREC_RADIX"),
+				rs.findColumn("COLUMN_SIZE"),
+				rs.findColumn("COLUMN_DEF"),
+				rs.findColumn("CHAR_OCTET_LENGTH"),
+				rs.findColumn("IS_NULLABLE"),
+			};
+			int[] columnWidths = new int[] {
+				20,
+				20,
+				20,
+				9,
+				4,
+				4,
+				6,
+				10,
+				10,
+				8
+			};
+
+			//
+			// If schema is specified (if util.getSelectedSchema in
+			// DescTableStatement() returns correct value), then we
+			// don't need to output schema and table names.
+			if(schema!=null) {
+				displayColumns = intArraySubset(displayColumns, 2, 
+												displayColumns.length);
+				columnWidths   = intArraySubset(columnWidths, 2, 
+												columnWidths.length);
+			}
+
+			return new ijResultSetResult(rs, displayColumns, columnWidths);
+		} catch (SQLException e) {
+			if(rs!=null)
+				rs.close();
+			throw e;
+		}
+	}
 
 	private Object makeXid(int xid)
 	{
@@ -589,6 +823,7 @@
 {	/* ij Keywords */
 	<ABSOLUTE: "absolute">
 |	<AFTER: "after">
+|	<ALIASES: "aliases">
 |	<ALL: "all">
 |	<AS: "as">
 |	<ASYNC: "async">
@@ -603,6 +838,7 @@
 | 	<CONNECTIONS: "connections">
 |	<CURRENT: "current">
 |	<CURSOR: "cursor">
+|	<DESCRIBE: "describe">
 |	<DISCONNECT: "disconnect">
 |	<DRIVER: "driver">
 |	<ELAPSEDTIME: "elapsedtime">
@@ -614,10 +850,13 @@
 |	<FAIL: "fail">
 |	<FIRST: "first">
 |	<FOR: "for">
+|	<FROM: "from">
 |	<GET: "get">
 |	<GETCURRENTROWNUMBER: "getcurrentrownumber">
 |	<HOLD: "hold">
 |	<HELP: "help">
+|	<IN: "in">
+|	<INDEXES: "indexes">
 |	<INSENSITIVE: "insensitive">
 |	<INTO: "into">
 |	<LAST: "last">
@@ -634,6 +873,7 @@
 |	<PREPARE: "prepare">
 |	<PREVIOUS: "previous">
 |	<PROCEDURE: "procedure">
+|	<PROCEDURES: "procedures">
 |	<PROPERTIES: "properties">
 |	<PROTOCOL: "protocol">
 |	<QUIT: "quit">
@@ -645,14 +885,18 @@
 |	<RUN: "run">
 |	<TO: "to">
 |	<SAVEPOINT: "savepoint">
+|	<SCHEMAS: "schemas">
 |	<SCROLL: "scroll">
 |	<SENSITIVE: "sensitive">
 |	<SET: "set">
 |	<SHOW: "show">
 |	<SHUTDOWN: "shutdown">
 |	<STATEMENT: "statement">
+|	<SYNONYMS: "synonyms">
+|	<TABLES: "tables">
 |	<USER: "user">
 |	<USING: "using">
+|	<VIEWS: "views">
 |	<WAIT: "wait">
 |	<WITH: "with">
 |	<XA_1PHASE: "XA_1phase">
@@ -985,6 +1229,7 @@
 | 	r=CloseStatement()
 | 	r=CommitStatement()
 | 	r=ConnectStatement()
+|	r=DescTableStatement()
 |	r=DisconnectStatement()
 |	r=DriverStatement()
 |	r=ElapsedTimeStatement()	
@@ -1012,7 +1257,7 @@
 |	r=RemoveStatement()	
 |	r=RunStatement()	
 |	r=SetConnectionStatement()	
-|	r=ShowConnectionsStatement()	
+|	r=ShowStatement()	
 |	r=WaitForStatement()	
 |	r=XA_DataSourceStatement()
 |	r=XA_ConnectStatement()
@@ -1246,6 +1491,43 @@
 
 
 /**
+ * Handles DESCRIBE table
+ */
+ijResult
+DescTableStatement()
+throws SQLException
+:
+{
+	String i = null;
+	String i2 = null;
+	Token  s = null;
+}
+{
+	<DESCRIBE>
+	( ( i=identifier() <PERIOD> i2=identifier() )
+	| i2=identifier()
+	| s=<STRING>
+	)
+	{
+		if(s!=null) {
+			String image = stringValue(s.image.toUpperCase());
+
+			int dotPosition = image.indexOf('.');
+			if(dotPosition!=-1) {
+				i = image.substring(0,dotPosition);
+				i2 = image.substring(dotPosition+1);
+			}
+		}
+
+		if(i==null)
+			i = util.getSelectedSchema(theConnection);
+
+		return describeTable(i,i2);
+	}
+}
+
+
+/**
   * Handles CONNECT yadda.yadda.foo( stringArg, ... stringArg ) AS connectionName
   */
 ijResult
@@ -1334,19 +1616,69 @@
 }
 
 /**
-	Shows the current connections for the current environment.
+ * Handles showing current connections for the current environment, and
+ * SHOW TABLES/VIEWS/... commands.
  */
 ijResult
-ShowConnectionsStatement()
+ShowStatement()
 throws SQLException
 :
 {
+	String schema  = null;
+	String tblname = null;
+	String str     = null;
+	String[] types = null;
+	Token t = null;
+	Token v = null;
 }
 {
 	<SHOW> <CONNECTIONS>
 	{
 		return showConnectionsMethod(false);
 	}
+|   <SHOW> (t=<TABLES> | v=<VIEWS> | <SYNONYMS> | <ALIASES>)
+		[ <IN> schema=identifier() ]
+	{
+		if(t!=null) {
+			// Only show non-system tables by default.
+			// If schema specified (i.e. SYS), also display system tables.
+			if(schema!=null)
+				types = new String[] { "TABLE", "SYSTEM TABLE" };
+			else
+				types = new String[] { "TABLE" };
+		}
+		else if(v!=null)
+			types = new String[] { "VIEW" };
+		else
+			types = new String[] { "ALIAS" };
+		return showTables(schema, types);
+	}
+|	<SHOW> <INDEXES> 
+		[ (<IN> schema=identifier()) |
+		  (<FROM> tblname=identifier() [ <PERIOD> str=identifier() ] ) ]
+	{
+		if(str != null) {
+			// if absolute table reference given
+			schema = tblname;
+			tblname = str;
+		}
+
+		// If user specifies a table name, then assume schema is
+		// current schema. Note that getSelectedSchema may return
+		// null for some DBMSes.
+		if(schema == null && tblname != null)
+			schema = util.getSelectedSchema(theConnection);
+		return showIndexes(schema,tblname);
+	}
+|	<SHOW> <PROCEDURES>
+		[ <IN> schema=identifier() ]
+	{
+		return showProcedures(schema);
+	}
+|	<SHOW> <SCHEMAS>
+	{
+		return showSchemas();
+	}
 }
 
 /**
@@ -3097,6 +3429,7 @@
 	(
 	tok = <ABSOLUTE>
 |	tok = <AFTER>
+|	tok = <ALIASES>
 |	tok = <ALL>
 |	tok = <AS>
 |	tok = <ASYNC>
@@ -3111,6 +3444,7 @@
 | 	tok = <CONNECTIONS>
 |	tok = <CURRENT>
 |	tok = <CURSOR>
+|	tok = <DESCRIBE>
 |	tok = <DISCONNECT>
 |	tok = <DRIVER>
 |	tok = <ELAPSEDTIME>
@@ -3121,10 +3455,13 @@
 |	tok = <FAIL>
 |	tok = <FIRST>
 |	tok = <FOR>
+|	tok = <FROM>
 |	tok = <GET>
 |	tok = <GETCURRENTROWNUMBER>
 |	tok = <HOLD>
 |	tok = <HELP>
+|	tok = <IN>
+|	tok = <INDEXES>
 |	tok = <INSENSITIVE>
 |	tok = <INTO>
 |	tok = <LAST>
@@ -3141,6 +3478,7 @@
 |	tok = <PREPARE>
 |	tok = <PREVIOUS>
 |	tok = <PROCEDURE>
+|	tok = <PROCEDURES>
 |	tok = <PROPERTIES>
 |	tok = <PROTOCOL>
 |	tok = <QUIT>
@@ -3151,14 +3489,18 @@
 |	tok = <ROLLBACK>
 |	tok = <RUN>
 |	tok = <TO>
+|	tok = <SCHEMAS>
 |	tok = <SCROLL>
 |	tok = <SENSITIVE>
 |	tok = <SET>
 |	tok = <SHOW>
 |	tok = <SHUTDOWN>
 |	tok = <STATEMENT>
+|	tok = <SYNONYMS>
+|	tok = <TABLES>
 |	tok = <USER>
 |	tok = <USING>
+|	tok = <VIEWS>
 |	tok = <WAIT>
 |	tok = <WITH>
 |	tok = <XA_1PHASE>

Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java (original)
+++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java Wed Aug  9 15:53:53 2006
@@ -53,6 +53,7 @@
 	private final static String NoSuchAsyncStatement = "IJ_NoAsynStatEx";
 	private final static String NoSuchConnection = "IJ_NoConnExisWi";
 	private final static String NoSuchProtocol = "IJ_NoProtExisWi";
+	private final static String NoSuchTable = "IJ_NoSuchTable";
 	private final static String NotJDBC20 = "IJ_IsOnlySuppIn";
 	private final static String NoUsingResults = "IJ_UsinClauHadN";
 	private final static String ObjectWasNull = "IJ_UnabToEsta";
@@ -122,6 +123,9 @@
 	}
 	static ijException noSuchProtocol(String c) {
 		return new ijException(LocalizedResource.getMessage(NoSuchProtocol, c));
+	}
+	static ijException noSuchTable(String c) {
+		return new ijException(LocalizedResource.getMessage(NoSuchTable, c));
 	}
 	static public ijException notJDBC20(String operation) {
 		return new ijException(LocalizedResource.getMessage(NotJDBC20, operation));

Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java (original)
+++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java Wed Aug  9 15:53:53 2006
@@ -54,6 +54,8 @@
 	ResultSet getNextRowOfResultSet();
 	Vector getVector();
 	SQLException getException();
+	int[] getColumnDisplayList();
+	int[] getColumnWidthList();
 
 	void closeStatement() throws SQLException ;
 

Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java (original)
+++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java Wed Aug  9 15:53:53 2006
@@ -53,6 +53,9 @@
 	public Vector getVector() { return null; }
 	public SQLException getException() { return null; }
 
+	public int[] getColumnDisplayList() { return null; }
+	public int[] getColumnWidthList() { return null; }
+
 	public void closeStatement() throws SQLException { }
 
 	public abstract SQLWarning getSQLWarnings() throws SQLException;
@@ -66,6 +69,10 @@
 		if (isVector()) return LocalizedResource.getMessage("IJ_Vec0",getVector().toString());
 		if (isMulti()) return LocalizedResource.getMessage("IJ_Mul0",getVector().toString());
 		if (isException()) return LocalizedResource.getMessage("IJ_Exc0",getException().toString());
+		try {
+			if (isResultSet()) return LocalizedResource.getMessage("IJ_Rse0",getStatement().toString());
+		} catch(SQLException se) {
+		}
 		return LocalizedResource.getMessage("IJ_Unkn0",this.getClass().getName());
 	}
 }

Added: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java?rev=430177&view=auto
==============================================================================
--- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java (added)
+++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java Wed Aug  9 15:53:53 2006
@@ -0,0 +1,81 @@
+/*
+
+   Derby - Class org.apache.derby.impl.tools.ij.ijResultSetResult
+
+   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.derby.impl.tools.ij;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+
+/**
+ * This impl is intended to be used with a resultset,
+ * where the execution of the statement is already complete.
+ */
+public class ijResultSetResult extends ijResultImpl {
+
+	ResultSet resultSet;
+	Statement statement;
+
+	int[]     displayColumns = null;
+	int[]     columnWidths = null;
+
+	/**
+	 * Create a ijResultImpl that represents a result set.
+	 */
+	public ijResultSetResult(ResultSet r) throws SQLException {
+		resultSet = r;
+		statement = resultSet.getStatement();
+	}
+
+	/**
+	 * Create a ijResultImpl that represents a result set, only
+	 * displaying a subset of the columns, using specified column widths.
+	 * 
+	 * @param r The result set to display
+	 * @param display Which column numbers to display, or null to display
+	 *                all columns.
+	 * @param widths  The widths of the columns specified in 'display', or
+	 *                null to display using default column sizes.
+	 */
+	public ijResultSetResult(ResultSet r, int[] display,
+							 int[] widths) throws SQLException {
+		resultSet = r;
+		statement = resultSet.getStatement();
+
+		displayColumns = display;
+		columnWidths   = widths;
+	}
+
+	public boolean isResultSet() throws SQLException { return statement==null || statement.getUpdateCount() == -1; }
+
+	public ResultSet getResultSet() throws SQLException { return resultSet; }
+
+	public void closeStatement() throws SQLException { if(statement!=null) statement.close(); else resultSet.close(); }
+
+	public int[] getColumnDisplayList() { return displayColumns; }
+	public int[] getColumnWidthList() { return columnWidths; }
+
+	public SQLWarning getSQLWarnings() throws SQLException { return resultSet.getWarnings(); }
+	public void clearSQLWarnings() throws SQLException { resultSet.clearWarnings(); }
+}

Propchange: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java (original)
+++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java Wed Aug  9 15:53:53 2006
@@ -853,6 +853,35 @@
 			 (framework.toUpperCase(Locale.ENGLISH).indexOf("JCC") != -1)));
 	}
 	
-
+	/**
+	 * Selects the current schema from the given connection.
+	 * 
+	 * As there are no way of getting current schema supported by
+	 * all major DBMS-es, this method may return null.
+	 * 
+	 * @param theConnection  Connection to get current schema for
+	 * @return the current schema of the connection, or null if error.
+	 */
+	public static String getSelectedSchema(Connection theConnection) throws SQLException {
+		String schema = null;
+                if (theConnection == null)
+                  return null;
+		Statement st = theConnection.createStatement();
+		try {
+			if(!st.execute("VALUES CURRENT SCHEMA"))
+				return null;
+			
+			ResultSet rs = st.getResultSet();
+			if(rs==null || !rs.next())
+				return null;
+			schema = rs.getString(1);
+		} catch(SQLException e) {
+			// There are no standard way of getting schema.
+			// Getting default schema may fail.
+		} finally {
+			st.close();
+		}
+		return schema;
+	}
 }
 

Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java (original)
+++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java Wed Aug  9 15:53:53 2006
@@ -451,6 +451,15 @@
 					JDBCDisplayUtil.ShowWarnings(out,result.getSQLWarnings());
 					result.clearSQLWarnings();
 				}
+			} else if (result.isResultSet()) {
+				ResultSet rs = result.getResultSet();
+				try {
+					JDBCDisplayUtil.DisplayResults(out,rs,connEnv[currCE].getConnection(), result.getColumnDisplayList(), result.getColumnWidthList());
+				} catch (SQLException se) {
+					result.closeStatement();
+					throw se;
+				}
+				result.closeStatement();
 			} else if (result.isException()) {
 				JDBCDisplayUtil.ShowException(out,result.getException());
 			}

Modified: db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties (original)
+++ db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties Wed Aug  9 15:53:53 2006
@@ -65,6 +65,13 @@
 \                               -- drop current, named, or all connections;\n\
 \                               -- the default is CURRENT\n\
 \ \n\
+\  SHOW SCHEMAS;                -- lists all schemas in the current database\n\
+\  SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema };\n\
+\                               -- lists tables, views, procedures or synonyms\n\
+\  SHOW INDEXES { IN schema | FROM table };\n\
+\                               -- lists indexes in a schema, or for a table\n\
+\  DESCRIBE name;               -- lists columns in the named table\n\
+\ \n\
 \  COMMIT;                      -- commits the current transaction\n\
 \  ROLLBACK;                    -- rolls back the current transaction\n\
 \ \n\
@@ -129,6 +136,7 @@
 IJ_NoAsynStatEx=No async statement exists with the name {0}
 IJ_NoConnExisWi=No connection exists with the name {0}
 IJ_NoProtExisWi=No protocol exists with the name {0}
+IJ_NoSuchTable=No table exists with the name {0}
 IJ_IsOnlySuppIn={0} is only supported in JDBC 2.0 and greater.
 IJ_UsinClauHadN=Using clause had no results
 IJ_UnabToEsta=Unable to establish {0}
@@ -149,6 +157,7 @@
 IJ_Vec0=VEC::{0}
 IJ_Mul0=MUL::{0}
 IJ_Exc0=EXC::{0}
+IJ_Rse0=RST::{0}
 IJ_Unkn0=UNKNOWN::{0}
 # From util.java
 IJ_UsageJavaComCloudToolsIjPPropeInput=Usage: java org.apache.derby.tools.ij [-p propertyfile] [-ca connectionAttributePropertyFile] [inputfile]

Modified: db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java?rev=430177&r1=430176&r2=430177&view=diff
==============================================================================
--- db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java (original)
+++ db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java Wed Aug  9 15:53:53 2006
@@ -258,18 +258,20 @@
 	static public void DisplayResults(PrintWriter out, Statement stmt, Connection conn )
 		throws SQLException
 	{
-		indent_DisplayResults( out, stmt, conn, 0);			
+		indent_DisplayResults( out, stmt, conn, 0, null, null);			
 	}
 
 	static private void indent_DisplayResults
-	(PrintWriter out, Statement stmt, Connection conn, int indentLevel)
+	(PrintWriter out, Statement stmt, Connection conn, int indentLevel,
+	 int[] displayColumns, int[] displayColumnWidths)
 		throws SQLException {
 
 		checkNotNull(stmt, "Statement");
 
 		ResultSet rs = stmt.getResultSet();
 		if (rs != null) {
-			indent_DisplayResults(out, rs, conn, indentLevel);
+			indent_DisplayResults(out, rs, conn, indentLevel, 
+								  displayColumns, displayColumnWidths);
 			rs.close(); // let the result set go away
 		}
 		else {
@@ -297,20 +299,48 @@
 	}
 
 	/**
+	    Calculates column display widths from the default widths of the
+	    result set.
+	 */
+	static private int[] getColumnDisplayWidths(ResultSetMetaData rsmd, int[] dispColumns,
+												boolean localizedOutput)
+		throws SQLException {
+		int count = (dispColumns == null) ? rsmd.getColumnCount() : dispColumns.length;
+		int[] widths = new int[count];
+
+		for(int i=0; i<count; i++) {
+			int colnum = (dispColumns == null) ? (i + 1) : dispColumns[i];
+			int dispsize = localizedOutput
+				? LocalizedResource.getInstance().getColumnDisplaySize(rsmd, colnum)
+                : rsmd.getColumnDisplaySize(colnum);
+			widths[i] = Math.min(maxWidth,
+				Math.max((rsmd.isNullable(colnum) == ResultSetMetaData.columnNoNulls)?
+				0 : MINWIDTH, dispsize));
+		}
+		return widths;
+	}
+
+
+	/**
 		@param out the place to write to
 		@param rs the ResultSet to display
 		@param conn the Connection against which the ResultSet was retrieved
+	    @param displayColumns Column numbers to display, or null if all
+	    @param displayColumnWidths Column widths, in characters, if displayColumns is specified.
 
 		@exception SQLException on JDBC access failure
 	 */
-	static public void DisplayResults(PrintWriter out, ResultSet rs, Connection conn)
+	static public void DisplayResults(PrintWriter out, ResultSet rs, Connection conn,
+									  int[] displayColumns, int[] displayColumnWidths)
 		throws SQLException
 	{
-		indent_DisplayResults( out, rs, conn, 0);
+		indent_DisplayResults( out, rs, conn, 0, displayColumns, 
+							   displayColumnWidths);
 	}
 
 	static private void indent_DisplayResults
-	(PrintWriter out, ResultSet rs, Connection conn, int indentLevel)
+	(PrintWriter out, ResultSet rs, Connection conn, int indentLevel, 
+	 int[] displayColumns, int[] displayColumnWidths)
 		throws SQLException {
 		ResultSetMetaData rsmd = rs.getMetaData();
 		checkNotNull(rsmd, "ResultSetMetaData");
@@ -324,7 +354,11 @@
 		else
 			nestedResults = null;
 
-		int len = indent_DisplayBanner(out,rsmd, indentLevel);
+		if(displayColumnWidths == null)
+			displayColumnWidths = getColumnDisplayWidths(rsmd, displayColumns,true);
+		
+		int len = indent_DisplayBanner(out,rsmd, indentLevel, displayColumns,
+									   displayColumnWidths);
 
 		// When displaying rows, keep going past errors
 		// unless/until the maximum # of errors is reached.
@@ -335,7 +369,9 @@
 				doNext = rs.next();
 				if (doNext) {
 
-		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, indentLevel);
+		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, 
+							   indentLevel, displayColumns, 
+							   displayColumnWidths);
 					ShowWarnings(out, rs);
 					numberOfRowsSelected++;
 				}
@@ -392,7 +428,8 @@
 			LocalizedResource.OutputWriter().println(b);
 			LocalizedResource.OutputWriter().println(LocalizedResource.getMessage("UT_Resul0", LocalizedResource.getNumber(i)));
 			LocalizedResource.OutputWriter().println(b);
-			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn, indentLevel);
+			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn,
+								  indentLevel, null, null);
 		}
 	}
 
@@ -409,10 +446,12 @@
 	static public void DisplayNextRow(PrintWriter out, ResultSet rs, Connection conn )
 		throws SQLException
 	{
-		indent_DisplayNextRow( out, rs, conn, 0 );
+		indent_DisplayNextRow( out, rs, conn, 0, null, (rs == null) ? null
+							   : getColumnDisplayWidths(rs.getMetaData(), null, true));
 	}
 
-	static private void indent_DisplayNextRow(PrintWriter out, ResultSet rs, Connection conn, int indentLevel )
+	static private void indent_DisplayNextRow(PrintWriter out, ResultSet rs, Connection conn, int indentLevel,
+											  int[] displayColumns, int[] displayColumnWidths )
 		throws SQLException {
 
 		Vector nestedResults;
@@ -431,8 +470,9 @@
 
 		// Only print stuff out if there is a row to be had.
 		if (rs.next()) {
-			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
-    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
+			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, displayColumns, displayColumnWidths);
+    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
+					   null, null );
 		}
 		else {
 			indentedPrintLine( out, indentLevel, LocalizedResource.getMessage("UT_NoCurreRow"));
@@ -458,10 +498,12 @@
 	static public void DisplayCurrentRow(PrintWriter out, ResultSet rs, Connection conn )
 		throws SQLException
 	{
-		indent_DisplayCurrentRow( out, rs, conn, 0 );
+		indent_DisplayCurrentRow( out, rs, conn, 0, null, (rs == null) ? null
+								  : getColumnDisplayWidths(rs.getMetaData(), null, true) );
 	}
 
-	static private void indent_DisplayCurrentRow(PrintWriter out, ResultSet rs, Connection conn, int indentLevel )
+	static private void indent_DisplayCurrentRow(PrintWriter out, ResultSet rs, Connection conn, 
+												 int indentLevel, int[] displayColumns, int[] displayColumnWidths )
 		throws SQLException {
 
 		Vector nestedResults;
@@ -481,8 +523,9 @@
 		ResultSetMetaData rsmd = rs.getMetaData();
 		checkNotNull(rsmd, "ResultSetMetaData");
 
-		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
-   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
+		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, displayColumns, displayColumnWidths);
+   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
+				   displayColumns, displayColumnWidths );
 
 		ShowWarnings(out, rs);
 
@@ -504,42 +547,38 @@
 	static public int DisplayBanner(PrintWriter out, ResultSetMetaData rsmd )
 		throws SQLException
 	{
-		return indent_DisplayBanner( out, rsmd, 0 );
+		return indent_DisplayBanner( out, rsmd, 0, null, 
+									 getColumnDisplayWidths(rsmd, null, true) );
 	}
 
-	static private int indent_DisplayBanner(PrintWriter out, ResultSetMetaData rsmd, int indentLevel )
+	static private int indent_DisplayBanner(PrintWriter out, ResultSetMetaData rsmd, int indentLevel,
+											int[] displayColumns, int[] displayColumnWidths )
 		throws SQLException	{
 
 		StringBuffer buf = new StringBuffer();
 
-		int numCols = rsmd.getColumnCount();
+		int numCols = displayColumnWidths.length;
 		int rowLen;
 
 		// do some precalculation so the buffer is allocated only once
 		// buffer is twice as long as the display length plus one for a newline
 		rowLen = (numCols - 1); // for the column separators
-		for (int i=1; i <= numCols; i++) {
-			rowLen += Math.min(maxWidth,
-				Math.max((rsmd.isNullable(i) == 
-							ResultSetMetaData.columnNoNulls)?
-							0 : MINWIDTH, LocalizedResource.getInstance().getColumnDisplaySize(rsmd, i)));
-		}
+		for (int i=1; i <= numCols; i++)
+			rowLen += displayColumnWidths[i-1];
 		buf.ensureCapacity(rowLen);
 
 		// get column header info
 		// truncate it to the column display width
 		// add a bar between each item.
 		for (int i=1; i <= numCols; i++) {
+			int colnum = displayColumns==null ? i : displayColumns[i-1];
 
 			if (i>1)
 				buf.append('|');
 
-			String s = rsmd.getColumnLabel(i);
+			String s = rsmd.getColumnLabel(colnum);
 
-			int w = Math.min(maxWidth,
-				Math.max(((rsmd.isNullable(i) == 
-							ResultSetMetaData.columnNoNulls)?
-							0 : MINWIDTH), LocalizedResource.getInstance().getColumnDisplaySize(rsmd, i)));
+			int w = displayColumnWidths[i-1];
 
 			if (s.length() < w) {
 				
@@ -592,34 +631,39 @@
 		@param nestedResults
 		@param conn
 		@param indentLevel number of tab stops to indent line
+	    @param displayColumns A list of column numbers to display
+	    @param displayColumnWidths If displayColumns is set, the width of
+								columns to display, in characters.
 
 		@exception SQLException thrown on JDBC access failure
 	 */
-	static private void DisplayRow(PrintWriter out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel )
+	static private void DisplayRow(PrintWriter out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel,
+								   int[] displayColumns, int[] displayColumnWidths )
 		throws SQLException
 	{
 		StringBuffer buf = new StringBuffer();
 		buf.ensureCapacity(rowLen);
 
-		int numCols = rsmd.getColumnCount();
+		int numCols = displayColumnWidths.length;
 		int i;
 
 		// get column header info
 		// truncate it to the column display width
 		// add a bar between each item.
 		for (i=1; i <= numCols; i++){
+			int colnum = displayColumns==null ? i : displayColumns[i-1];
 			if (i>1)
 				buf.append('|');
 
 			String s;
-			switch (rsmd.getColumnType(i)) {
+			switch (rsmd.getColumnType(colnum)) {
 			default:
-				s = LocalizedResource.getInstance().getLocalizedString(rs, rsmd, i );
+				s = LocalizedResource.getInstance().getLocalizedString(rs, rsmd, colnum );
 				break;
 			case org.apache.derby.iapi.reference.JDBC20Translation.SQL_TYPES_JAVA_OBJECT:
 			case Types.OTHER:
 			{
-				Object o = rs.getObject(i);
+				Object o = rs.getObject(colnum);
 				if (o == null) { s = "NULL"; }
 				else if (o instanceof ResultSet && nestedResults != null)
 				{
@@ -629,7 +673,7 @@
 				else
 				{
 					try {
-						s = rs.getString(i);
+						s = rs.getString(colnum);
 					} catch (SQLException se) {
 						// oops, they don't support refetching the column
 						s = o.toString();
@@ -640,10 +684,7 @@
 			}
 			if (s==null) s = "NULL";
 
-			int w = Math.min(maxWidth,
-				Math.max((rsmd.isNullable(i) == 
-							ResultSetMetaData.columnNoNulls)?
-							0 : MINWIDTH, LocalizedResource.getInstance().getColumnDisplaySize(rsmd, i)));
+			int w = displayColumnWidths[i-1];
 			if (s.length() < w) {
 				StringBuffer fullS = new StringBuffer(s);
 				fullS.ensureCapacity(w);
@@ -816,18 +857,20 @@
 	static public void DisplayResults(PrintStream out, Statement stmt, Connection conn )
 		throws SQLException
 	{
-		indent_DisplayResults( out, stmt, conn, 0);			
+		indent_DisplayResults( out, stmt, conn, 0, null, null);			
 	}
 
 	static private void indent_DisplayResults
-	(PrintStream out, Statement stmt, Connection conn, int indentLevel)
+	(PrintStream out, Statement stmt, Connection conn, int indentLevel,
+	 int[] displayColumns, int[] displayColumnWidths)
 		throws SQLException {
 
 		checkNotNull(stmt, "Statement");
 
 		ResultSet rs = stmt.getResultSet();
 		if (rs != null) {
-			indent_DisplayResults(out, rs, conn, indentLevel);
+			indent_DisplayResults(out, rs, conn, indentLevel, displayColumns,
+								  displayColumnWidths);
 			rs.close(); // let the result set go away
 		}
 		else {
@@ -852,11 +895,12 @@
 	static public void DisplayResults(PrintStream out, ResultSet rs, Connection conn)
 		throws SQLException
 	{
-		indent_DisplayResults( out, rs, conn, 0);
+		indent_DisplayResults( out, rs, conn, 0, null, null);
 	}
 
 	static private void indent_DisplayResults
-	(PrintStream out, ResultSet rs, Connection conn, int indentLevel)
+	(PrintStream out, ResultSet rs, Connection conn, int indentLevel,
+	 int[] displayColumns, int[] displayColumnWidths)
 		throws SQLException {
 		ResultSetMetaData rsmd = rs.getMetaData();
 		checkNotNull(rsmd, "ResultSetMetaData");
@@ -870,7 +914,11 @@
 		else
 			nestedResults = null;
 
-		int len = indent_DisplayBanner(out,rsmd, indentLevel);
+		if(displayColumnWidths == null)
+			displayColumnWidths = getColumnDisplayWidths(rsmd, displayColumns, false);
+
+		int len = indent_DisplayBanner(out,rsmd, indentLevel, displayColumns,
+									   displayColumnWidths);
 
 		// When displaying rows, keep going past errors
 		// unless/until the maximum # of errors is reached.
@@ -881,7 +929,9 @@
 				doNext = rs.next();
 				if (doNext) {
 
-		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, indentLevel);
+		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, 
+							   indentLevel, displayColumns, 
+							   displayColumnWidths);
 					ShowWarnings(out, rs);
 					numberOfRowsSelected++;
 				}
@@ -930,17 +980,20 @@
 			System.out.println(b);
 			System.out.println(s+i+" +");
 			System.out.println(b);
-			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn, indentLevel);
+			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn, 
+								  indentLevel, null, null);
 		}
 	}
 
 	static public void DisplayNextRow(PrintStream out, ResultSet rs, Connection conn )
 		throws SQLException
 	{
-		indent_DisplayNextRow( out, rs, conn, 0 );
+		indent_DisplayNextRow( out, rs, conn, 0, null, (rs == null) ? null
+							   : getColumnDisplayWidths(rs.getMetaData(),null,false) );
 	}
 
-	static private void indent_DisplayNextRow(PrintStream out, ResultSet rs, Connection conn, int indentLevel )
+	static private void indent_DisplayNextRow(PrintStream out, ResultSet rs, Connection conn, int indentLevel,
+											  int[] displayColumns, int[] displayColumnWidths )
 		throws SQLException {
 
 		Vector nestedResults;
@@ -959,8 +1012,9 @@
 
 		// Only print stuff out if there is a row to be had.
 		if (rs.next()) {
-			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
-    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
+			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, null, null);
+    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
+					   displayColumns, displayColumnWidths);
 		}
 		else {
 			indentedPrintLine( out, indentLevel, LocalizedResource.getMessage("UT_NoCurreRow"));
@@ -976,10 +1030,12 @@
 	static public void DisplayCurrentRow(PrintStream out, ResultSet rs, Connection conn )
 		throws SQLException
 	{
-		indent_DisplayCurrentRow( out, rs, conn, 0 );
+		indent_DisplayCurrentRow( out, rs, conn, 0, null, (rs == null) ? null
+								  : getColumnDisplayWidths(rs.getMetaData(),null,false) );
 	}
 
-	static private void indent_DisplayCurrentRow(PrintStream out, ResultSet rs, Connection conn, int indentLevel )
+	static private void indent_DisplayCurrentRow(PrintStream out, ResultSet rs, Connection conn, 
+												 int indentLevel, int[] displayColumns, int[] displayColumnWidths )
 		throws SQLException {
 
 		Vector nestedResults;
@@ -999,8 +1055,9 @@
 		ResultSetMetaData rsmd = rs.getMetaData();
 		checkNotNull(rsmd, "ResultSetMetaData");
 
-		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
-   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
+		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, displayColumns, displayColumnWidths);
+   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
+				   displayColumns, displayColumnWidths);
 
 		ShowWarnings(out, rs);
 
@@ -1012,26 +1069,24 @@
 	static public int DisplayBanner(PrintStream out, ResultSetMetaData rsmd )
 		throws SQLException
 	{
-		return indent_DisplayBanner( out, rsmd, 0 );
+		return indent_DisplayBanner( out, rsmd, 0, null,
+									 getColumnDisplayWidths(rsmd,null,false) );
 	}
 
-	static private int indent_DisplayBanner(PrintStream out, ResultSetMetaData rsmd, int indentLevel )
+	static private int indent_DisplayBanner(PrintStream out, ResultSetMetaData rsmd, int indentLevel,
+											int[] displayColumns, int[] displayColumnWidths )
 		throws SQLException	{
 
 		StringBuffer buf = new StringBuffer();
 
-		int numCols = rsmd.getColumnCount();
+		int numCols = displayColumnWidths.length;
 		int rowLen;
 
 		// do some precalculation so the buffer is allocated only once
 		// buffer is twice as long as the display length plus one for a newline
 		rowLen = (numCols - 1); // for the column separators
 		for (int i=1; i <= numCols; i++) {
-			rowLen += Math.min(maxWidth,
-				Math.max((rsmd.isNullable(i) == 
-							ResultSetMetaData.columnNoNulls)?
-							0 : MINWIDTH,
-						rsmd.getColumnDisplaySize(i)));
+			rowLen += displayColumnWidths[i-1];
 		}
 		buf.ensureCapacity(rowLen);
 
@@ -1039,17 +1094,14 @@
 		// truncate it to the column display width
 		// add a bar between each item.
 		for (int i=1; i <= numCols; i++) {
+			int colnum = displayColumns==null ? i : displayColumns[i-1];
 
 			if (i>1)
 				buf.append('|');
 
-			String s = rsmd.getColumnLabel(i);
+			String s = rsmd.getColumnLabel(colnum);
 
-			int w = Math.min(maxWidth,
-				Math.max(((rsmd.isNullable(i) == 
-							ResultSetMetaData.columnNoNulls)?
-							0 : MINWIDTH),
-						rsmd.getColumnDisplaySize(i)));
+			int w = displayColumnWidths[i-1];
 
 			if (s.length() < w) {
 				// build a string buffer to hold the whitespace
@@ -1095,31 +1147,33 @@
 		return rowLen;
 	} // DisplayBanner
 
-	static private void DisplayRow(PrintStream out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel )
+	static private void DisplayRow(PrintStream out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel,
+								   int[] displayColumns, int[] displayColumnWidths)
 		throws SQLException
 	{
 		StringBuffer buf = new StringBuffer();
 		buf.ensureCapacity(rowLen);
 
-		int numCols = rsmd.getColumnCount();
+		int numCols = displayColumnWidths.length;
 		int i;
 
 		// get column header info
 		// truncate it to the column display width
 		// add a bar between each item.
 		for (i=1; i <= numCols; i++){
+			int colnum = displayColumns==null ? i : displayColumns[i-1];
 			if (i>1)
 				buf.append('|');
 
 			String s;
-			switch (rsmd.getColumnType(i)) {
+			switch (rsmd.getColumnType(colnum)) {
 			default:
-				s = rs.getString(i);
+				s = rs.getString(colnum);
 				break;
 			case org.apache.derby.iapi.reference.JDBC20Translation.SQL_TYPES_JAVA_OBJECT:
 			case Types.OTHER:
 			{
-				Object o = rs.getObject(i);
+				Object o = rs.getObject(colnum);
 				if (o == null) { s = "NULL"; }
 				else if (o instanceof ResultSet && nestedResults != null)
 				{
@@ -1129,7 +1183,7 @@
 				else
 				{
 					try {
-						s = rs.getString(i);
+						s = rs.getString(colnum);
 					} catch (SQLException se) {
 						// oops, they don't support refetching the column
 						s = o.toString();
@@ -1141,11 +1195,7 @@
 
 			if (s==null) s = "NULL";
 
-			int w = Math.min(maxWidth,
-				Math.max((rsmd.isNullable(i) == 
-							ResultSetMetaData.columnNoNulls)?
-							0 : MINWIDTH,
-						rsmd.getColumnDisplaySize(i)));
+			int w = displayColumnWidths[i-1];
 			if (s.length() < w) {
 				StringBuffer fullS = new StringBuffer(s);
 				fullS.ensureCapacity(w);



Re: svn commit: r430177 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/jdbc/ testing/org/apache/derbyTesting/functionTests/master/ testing/org/apache/derbyTesting/functionTests/master/DerbyNet/ testing/org/apache/derbyTesting/functionTests/ma...

Posted by David Van Couvering <Da...@Sun.COM>.
Great stuff, Havard!  Is documentation coming for this?

David

fuzzylogic@apache.org wrote:
> Author: fuzzylogic
> Date: Wed Aug  9 15:53:53 2006
> New Revision: 430177
> 
> URL: http://svn.apache.org/viewvc?rev=430177&view=rev
> Log:
> DERBY-1146: Add SHOW TABLES and DESCRIBE commands to ij.
> 
> Committed for Havard Mork <ha...@gmail.com>
> 
> Added:
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out   (with props)
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql   (with props)
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties   (with props)
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java   (with props)
> Modified:
>     db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java
>     db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java
>     db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties
>     db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java
> 
> Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java (original)
> +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java Wed Aug  9 15:53:53 2006
> @@ -283,7 +283,7 @@
>  	public String getDatabaseProductVersion() {
>  		ProductVersionHolder myPVH = Monitor.getMonitor().getEngineVersion();
>  
> -		return myPVH.getVersionBuildString(false);
> +		return myPVH.getVersionBuildString(true);
>  	}
>  
>      /**
> 
> Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties (original)
> +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties Wed Aug  9 15:53:53 2006
> @@ -133,8 +133,8 @@
>  	FROM \
>  		 SYS.SYSTABLES, \
>  	     SYS.SYSSCHEMAS, \
> -	     (VALUES ('T','TABLE'), \
> -			('S','SYSTEM TABLE'), ('V', 'VIEW')) T(TTABBREV,TABLE_TYPE) \
> +	     (VALUES ('T','TABLE'), ('S','SYSTEM TABLE'), \
> +			('V', 'VIEW'), ('A', 'SYNONYM')) T(TTABBREV,TABLE_TYPE) \
>  	WHERE (TTABBREV=TABLETYPE 	\
>  	  AND (SYS.SYSTABLES.SCHEMAID = SYS.SYSSCHEMAS.SCHEMAID) \
>  	  AND ((1=1) OR ? IS NOT NULL) \
> @@ -272,7 +272,8 @@
>  # so we wrap the values in a select to name it.
>  getTableTypes=\
>  	SELECT CAST (RTRIM(TABLE_TYPE) AS VARCHAR(12)) AS TABLE_TYPE \
> -	FROM (VALUES 'SYSTEM TABLE', 'TABLE', 'VIEW') TABLETYPES(TABLE_TYPE) \
> +	FROM (VALUES 'SYNONYM', 'SYSTEM TABLE', 'TABLE', 'VIEW') \
> +		TABLETYPES(TABLE_TYPE) \
>  	ORDER BY TABLE_TYPE
>  
>  # parameter 1 = pattern for catalog name
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out Wed Aug  9 15:53:53 2006
> @@ -284,6 +284,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out Wed Aug  9 15:53:53 2006
> @@ -314,6 +314,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out Wed Aug  9 15:53:53 2006
> @@ -377,6 +377,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out Wed Aug  9 15:53:53 2006
> @@ -377,6 +377,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out Wed Aug  9 15:53:53 2006
> @@ -407,6 +407,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out Wed Aug  9 15:53:53 2006
> @@ -1106,6 +1106,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> @@ -2597,6 +2598,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out Wed Aug  9 15:53:53 2006
> @@ -49,6 +49,12 @@
>    DISCONNECT [ CURRENT | connectionName | ALL ];
>                                 -- drop current, named, or all connections;
>                                 -- the default is CURRENT
> +  SHOW SCHEMAS;                -- lists all schemas in the current database
> +  SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema };
> +                               -- lists tables, views, procedures or synonyms
> +  SHOW INDEXES { IN schema | FROM table };
> +                               -- lists indexes in a schema, or for a table
> +  DESCRIBE name;               -- lists columns in the named table
>    COMMIT;                      -- commits the current transaction
>    ROLLBACK;                    -- rolls back the current transaction
>    PREPARE name AS 'SQL-J text'; -- prepares the SQL-J text
> 
> Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out?rev=430177&view=auto
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out (added)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out Wed Aug  9 15:53:53 2006
> @@ -0,0 +1,89 @@
> +ij> -- This test will cover SHOW TABLES, SHOW SCHEMAS, etc.
> +-- and the DESCRIBE command.
> +connect 'jdbc:derby:wombat;create=true';
> +ij> SET SCHEMA = APP;
> +0 rows inserted/updated/deleted
> +ij> CREATE TABLE t1 (i int generated always as identity, d DECIMAL(5,2), test VARCHAR(20));
> +0 rows inserted/updated/deleted
> +ij> CREATE SCHEMA USER1;
> +0 rows inserted/updated/deleted
> +ij> SET SCHEMA = USER1;
> +0 rows inserted/updated/deleted
> +ij> CREATE TABLE t2 (i int);
> +0 rows inserted/updated/deleted
> +ij> CREATE SYNONYM USER1.T3 FOR USER1.T2;
> +0 rows inserted/updated/deleted
> +ij> CREATE VIEW v1 AS SELECT * from app.t1;
> +0 rows inserted/updated/deleted
> +ij> CREATE INDEX idx1 ON APP.t1 (test ASC);
> +0 rows inserted/updated/deleted
> +ij> CREATE PROCEDURE APP.PROCTEST(IN A INTEGER, OUT B DECIMAL(10,2))
> +PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA 
> +EXTERNAL NAME 'a.b.c.d.e';
> +0 rows inserted/updated/deleted
> +ij> -- first display all tables, then display tables in one schema
> +SHOW TABLES;
> +TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
> +------------------------------------------------------------------------
> +APP                 |T1                            |                    
> +USER1               |T2                            |                    
> +2 rows selected
> +ij> SHOW TABLES IN APP;
> +TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
> +------------------------------------------------------------------------
> +APP                 |T1                            |                    
> +1 row selected
> +ij> -- 'describe t1' will give error, as not in current schema
> +DESCRIBE t1;
> +IJ ERROR: No table exists with the name T1
> +ij> DESCRIBE APP.t1;
> +COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
> +------------------------------------------------------------------------------
> +I                   |INTEGER  |0   |10  |10    |AUTOINCRE&|NULL      |NO      
> +D                   |DECIMAL  |2   |10  |5     |NULL      |NULL      |YES     
> +TEST                |VARCHAR  |NULL|NULL|20    |NULL      |40        |YES     
> +3 rows selected
> +ij> DESCRIBE v1;
> +COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
> +------------------------------------------------------------------------------
> +I                   |INTEGER  |0   |10  |10    |NULL      |NULL      |NO      
> +D                   |DECIMAL  |2   |10  |5     |NULL      |NULL      |YES     
> +TEST                |VARCHAR  |NULL|NULL|20    |NULL      |40        |YES     
> +3 rows selected
> +ij> SHOW SCHEMAS;
> +TABLE_SCHEM                   
> +------------------------------
> +APP                           
> +NULLID                        
> +SQLJ                          
> +SYS                           
> +SYSCAT                        
> +SYSCS_DIAG                    
> +SYSCS_UTIL                    
> +SYSFUN                        
> +SYSIBM                        
> +SYSPROC                       
> +SYSSTAT                       
> +USER1                         
> +12 rows selected
> +ij> SHOW VIEWS IN USER1;
> +TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
> +------------------------------------------------------------------------
> +USER1               |V1                            |                    
> +1 row selected
> +ij> SHOW PROCEDURES IN APP;
> +PROCEDURE_SCHEM     |PROCEDURE_NAME                |REMARKS             
> +------------------------------------------------------------------------
> +APP                 |PROCTEST                      |a.b.c.d.e           
> +1 row selected
> +ij> SHOW SYNONYMS IN USER1;
> +TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
> +------------------------------------------------------------------------
> +USER1               |T3                            |                    
> +1 row selected
> +ij> SHOW INDEXES FROM APP.t1;
> +TABLE_NAME          |COLUMN_NAME         |NON_U&|TYPE|ASC&|CARDINA&|PAGES   
> +----------------------------------------------------------------------------
> +T1                  |TEST                |true  |3   |A   |NULL    |NULL    
> +1 row selected
> +ij> 
> 
> Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out Wed Aug  9 15:53:53 2006
> @@ -49,6 +49,12 @@
>    DISCONNECT [ CURRENT | connectionName | ALL ];
>                                 -- drop current, named, or all connections;
>                                 -- the default is CURRENT
> +  SHOW SCHEMAS;                -- lists all schemas in the current database
> +  SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema };
> +                               -- lists tables, views, procedures or synonyms
> +  SHOW INDEXES { IN schema | FROM table };
> +                               -- lists indexes in a schema, or for a table
> +  DESCRIBE name;               -- lists columns in the named table
>    COMMIT;                      -- commits the current transaction
>    ROLLBACK;                    -- rolls back the current transaction
>    PREPARE name AS 'SQL-J text'; -- prepares the SQL-J text
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out Wed Aug  9 15:53:53 2006
> @@ -377,6 +377,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out Wed Aug  9 15:53:53 2006
> @@ -407,6 +407,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall Wed Aug  9 15:53:53 2006
> @@ -10,5 +10,6 @@
>  tools/ij4.sql
>  tools/ij5.sql
>  tools/ij6.sql
> +tools/ij7.sql
>  tools/ijConnName.sql
>  tools/URLCheck.sql
> 
> Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql?rev=430177&view=auto
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql (added)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql Wed Aug  9 15:53:53 2006
> @@ -0,0 +1,35 @@
> +
> +-- This test will cover SHOW TABLES, SHOW SCHEMAS, etc.
> +-- and the DESCRIBE command.
> +
> +connect 'jdbc:derby:wombat;create=true';
> +
> +SET SCHEMA = APP;
> +CREATE TABLE t1 (i int generated always as identity, d DECIMAL(5,2), test VARCHAR(20));
> +
> +CREATE SCHEMA USER1;
> +SET SCHEMA = USER1;
> +CREATE TABLE t2 (i int);
> +
> +CREATE SYNONYM USER1.T3 FOR USER1.T2;
> +CREATE VIEW v1 AS SELECT * from app.t1;
> +CREATE INDEX idx1 ON APP.t1 (test ASC);
> +CREATE PROCEDURE APP.PROCTEST(IN A INTEGER, OUT B DECIMAL(10,2))
> +PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA 
> +EXTERNAL NAME 'a.b.c.d.e';
> +
> +-- first display all tables, then display tables in one schema
> +SHOW TABLES;
> +SHOW TABLES IN APP;
> +
> +-- 'describe t1' will give error, as not in current schema
> +DESCRIBE t1;
> +DESCRIBE APP.t1;
> +DESCRIBE v1;
> +
> +SHOW SCHEMAS;
> +SHOW VIEWS IN USER1;
> +SHOW PROCEDURES IN APP;
> +SHOW SYNONYMS IN USER1;
> +SHOW INDEXES FROM APP.t1;
> +
> 
> Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 
> Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties?rev=430177&view=auto
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties (added)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties Wed Aug  9 15:53:53 2006
> @@ -0,0 +1,4 @@
> +ij.showNoConnectionsAtStart=false
> +
> +#Exclude for J2ME/Foundation - need to look into reason for failure
> +runwithfoundation=false
> \ No newline at end of file
> 
> Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj Wed Aug  9 15:53:53 2006
> @@ -551,6 +551,240 @@
>  	  	return new ijVectorResult(v,w);
>  	}
>  
> +	/**
> +	   Returns a subset of the input integer array
> +	   
> +	   @param input The input integer array
> +	   @param start Starting index, inclusive
> +	   @param end   Ending index, exclusive
> +	 */
> +	public static int[] intArraySubset(final int[] input, int start, int end) {
> +		int[] res = new int[end-start];
> +		System.arraycopy(input, start, res, 0, end-start);
> +		return res;
> +	}
> +
> +	/**
> +	   Verify that a table exists within a schema. Throws an exception
> +	   if table does not exist.
> +	   
> +	   @param schema Schema for the table
> +	   @param table  Name of table to check for existence of
> +	 */
> +	public void verifyTableExists(String schema, String table) 
> +	throws SQLException {
> +		if(schema == null)
> +			return;
> +
> +		ResultSet rs = null;
> +		try {
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getTables(null,schema,table,null);
> +			if(!rs.next())
> +				throw ijException.noSuchTable(table);
> +		} finally {
> +			if(rs!=null)
> +				rs.close();
> +		}
> +	}
> +
> +	/**
> +	   Return a resultset of tables (or views, procs...) in the given schema. 
> +
> +	   @param schema  Schema to get tables for, or null for search 
> +	                  in all schemas.
> +	   @param tableType Types of tables to return, see
> +	                  {@link java.sql.DatabaseMetaData#getTableTypes}
> +	 */
> +	public ijResult showTables(String schema, String[] tableType) throws SQLException {
> +		ResultSet rs = null;
> +		try {
> +			haveConnection();
> +
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getTables(null,schema,null,tableType);
> +
> +			int[] displayColumns = new int[] {
> +				rs.findColumn("TABLE_SCHEM"),
> +				rs.findColumn("TABLE_NAME"),
> +				rs.findColumn("REMARKS"),
> +			};
> +			int[] columnWidths = new int[] {
> +				20,
> +				30,
> +				20,
> +			};
> +
> +			return new ijResultSetResult(rs, displayColumns, columnWidths);
> +		} catch (SQLException e) {
> +			if(rs!=null)
> +				rs.close();
> +			throw e;
> +		}
> +	}
> +
> +	/**
> +	   Return a resultset of indexes for the given table or schema
> +
> +	   @param schema  schema to find indexes for
> +	   @param table   table to find indexes for
> +	 */
> +	public ijResult showIndexes(String schema, String table) throws SQLException {
> +		ResultSet rs = null;
> +		try {
> +			haveConnection();
> +			verifyTableExists(schema, table);
> +
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getIndexInfo(null, schema, table, false, true);
> +
> +			int[] displayColumns = new int[] {
> +				rs.findColumn("TABLE_SCHEM"),
> +				rs.findColumn("TABLE_NAME"),
> +				rs.findColumn("COLUMN_NAME"),
> +				rs.findColumn("NON_UNIQUE"),
> +				rs.findColumn("TYPE"),
> +				rs.findColumn("ASC_OR_DESC"),
> +				rs.findColumn("CARDINALITY"),
> +				rs.findColumn("PAGES"),
> +			};
> +			int[] columnWidths = new int[] {
> +				20,
> +				20,
> +				20,
> +				6,
> +				4,
> +				4,
> +				8,
> +				8,
> +			};
> +
> +			if(schema!=null) {
> +				displayColumns = intArraySubset(displayColumns, 1, 
> +												displayColumns.length);
> +				columnWidths   = intArraySubset(columnWidths, 1, 
> +												columnWidths.length);
> +			}
> +			return new ijResultSetResult(rs, displayColumns, columnWidths);
> +		} catch (SQLException e) {
> +			if(rs!=null)
> +				rs.close();
> +			throw e;
> +		}
> +	}
> +
> +	/**
> +	   Return a resultset of procedures from database metadata
> +	 */
> +	public ijResult showProcedures(String schema) throws SQLException {
> +		ResultSet rs = null;
> +		try {
> +			haveConnection();
> +
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getProcedures(null,schema,null);
> +
> +			int[] displayColumns = new int[] {
> +				rs.findColumn("PROCEDURE_SCHEM"),
> +				rs.findColumn("PROCEDURE_NAME"),
> +				rs.findColumn("REMARKS"),
> +			};
> +			int[] columnWidths = new int[] {
> +				20,
> +				30,
> +				20,
> +			};
> +
> +			return new ijResultSetResult(rs, displayColumns, columnWidths);
> +		} catch (SQLException e) {
> +			if(rs!=null)
> +				rs.close();
> +			throw e;
> +		}
> +	}
> +
> +	/**
> +	   Return a resultset of schemas from database metadata
> +	 */
> +	public ijResult showSchemas() throws SQLException {
> +		ResultSet rs = null;
> +		try {
> +			haveConnection();
> +
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getSchemas();
> +
> +			int[] displayColumns = new int[] {
> +				rs.findColumn("TABLE_SCHEM")
> +			};
> +			int[] columnWidths = new int[] {
> +				30
> +			};
> +
> +			return new ijResultSetResult(rs, displayColumns, columnWidths);
> +		} catch (SQLException e) {
> +			if(rs!=null)
> +				rs.close();
> +			throw e;
> +		}
> +	}
> +
> +	/**
> +	   Outputs the names of all fields of given table. Outputs field
> +	   names and data type.
> +	 */
> +	public ijResult describeTable(String schema, String table) throws SQLException {
> +		ResultSet rs = null;
> +		try {
> +			haveConnection();
> +			verifyTableExists(schema,table);
> +
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getColumns(null,schema,table,null);
> +
> +			int[] displayColumns = new int[] {
> +				rs.findColumn("TABLE_SCHEM"),
> +				rs.findColumn("TABLE_NAME"),
> +				rs.findColumn("COLUMN_NAME"),
> +				rs.findColumn("TYPE_NAME"),
> +				rs.findColumn("DECIMAL_DIGITS"),
> +				rs.findColumn("NUM_PREC_RADIX"),
> +				rs.findColumn("COLUMN_SIZE"),
> +				rs.findColumn("COLUMN_DEF"),
> +				rs.findColumn("CHAR_OCTET_LENGTH"),
> +				rs.findColumn("IS_NULLABLE"),
> +			};
> +			int[] columnWidths = new int[] {
> +				20,
> +				20,
> +				20,
> +				9,
> +				4,
> +				4,
> +				6,
> +				10,
> +				10,
> +				8
> +			};
> +
> +			//
> +			// If schema is specified (if util.getSelectedSchema in
> +			// DescTableStatement() returns correct value), then we
> +			// don't need to output schema and table names.
> +			if(schema!=null) {
> +				displayColumns = intArraySubset(displayColumns, 2, 
> +												displayColumns.length);
> +				columnWidths   = intArraySubset(columnWidths, 2, 
> +												columnWidths.length);
> +			}
> +
> +			return new ijResultSetResult(rs, displayColumns, columnWidths);
> +		} catch (SQLException e) {
> +			if(rs!=null)
> +				rs.close();
> +			throw e;
> +		}
> +	}
>  
>  	private Object makeXid(int xid)
>  	{
> @@ -589,6 +823,7 @@
>  {	/* ij Keywords */
>  	<ABSOLUTE: "absolute">
>  |	<AFTER: "after">
> +|	<ALIASES: "aliases">
>  |	<ALL: "all">
>  |	<AS: "as">
>  |	<ASYNC: "async">
> @@ -603,6 +838,7 @@
>  | 	<CONNECTIONS: "connections">
>  |	<CURRENT: "current">
>  |	<CURSOR: "cursor">
> +|	<DESCRIBE: "describe">
>  |	<DISCONNECT: "disconnect">
>  |	<DRIVER: "driver">
>  |	<ELAPSEDTIME: "elapsedtime">
> @@ -614,10 +850,13 @@
>  |	<FAIL: "fail">
>  |	<FIRST: "first">
>  |	<FOR: "for">
> +|	<FROM: "from">
>  |	<GET: "get">
>  |	<GETCURRENTROWNUMBER: "getcurrentrownumber">
>  |	<HOLD: "hold">
>  |	<HELP: "help">
> +|	<IN: "in">
> +|	<INDEXES: "indexes">
>  |	<INSENSITIVE: "insensitive">
>  |	<INTO: "into">
>  |	<LAST: "last">
> @@ -634,6 +873,7 @@
>  |	<PREPARE: "prepare">
>  |	<PREVIOUS: "previous">
>  |	<PROCEDURE: "procedure">
> +|	<PROCEDURES: "procedures">
>  |	<PROPERTIES: "properties">
>  |	<PROTOCOL: "protocol">
>  |	<QUIT: "quit">
> @@ -645,14 +885,18 @@
>  |	<RUN: "run">
>  |	<TO: "to">
>  |	<SAVEPOINT: "savepoint">
> +|	<SCHEMAS: "schemas">
>  |	<SCROLL: "scroll">
>  |	<SENSITIVE: "sensitive">
>  |	<SET: "set">
>  |	<SHOW: "show">
>  |	<SHUTDOWN: "shutdown">
>  |	<STATEMENT: "statement">
> +|	<SYNONYMS: "synonyms">
> +|	<TABLES: "tables">
>  |	<USER: "user">
>  |	<USING: "using">
> +|	<VIEWS: "views">
>  |	<WAIT: "wait">
>  |	<WITH: "with">
>  |	<XA_1PHASE: "XA_1phase">
> @@ -985,6 +1229,7 @@
>  | 	r=CloseStatement()
>  | 	r=CommitStatement()
>  | 	r=ConnectStatement()
> +|	r=DescTableStatement()
>  |	r=DisconnectStatement()
>  |	r=DriverStatement()
>  |	r=ElapsedTimeStatement()	
> @@ -1012,7 +1257,7 @@
>  |	r=RemoveStatement()	
>  |	r=RunStatement()	
>  |	r=SetConnectionStatement()	
> -|	r=ShowConnectionsStatement()	
> +|	r=ShowStatement()	
>  |	r=WaitForStatement()	
>  |	r=XA_DataSourceStatement()
>  |	r=XA_ConnectStatement()
> @@ -1246,6 +1491,43 @@
>  
>  
>  /**
> + * Handles DESCRIBE table
> + */
> +ijResult
> +DescTableStatement()
> +throws SQLException
> +:
> +{
> +	String i = null;
> +	String i2 = null;
> +	Token  s = null;
> +}
> +{
> +	<DESCRIBE>
> +	( ( i=identifier() <PERIOD> i2=identifier() )
> +	| i2=identifier()
> +	| s=<STRING>
> +	)
> +	{
> +		if(s!=null) {
> +			String image = stringValue(s.image.toUpperCase());
> +
> +			int dotPosition = image.indexOf('.');
> +			if(dotPosition!=-1) {
> +				i = image.substring(0,dotPosition);
> +				i2 = image.substring(dotPosition+1);
> +			}
> +		}
> +
> +		if(i==null)
> +			i = util.getSelectedSchema(theConnection);
> +
> +		return describeTable(i,i2);
> +	}
> +}
> +
> +
> +/**
>    * Handles CONNECT yadda.yadda.foo( stringArg, ... stringArg ) AS connectionName
>    */
>  ijResult
> @@ -1334,19 +1616,69 @@
>  }
>  
>  /**
> -	Shows the current connections for the current environment.
> + * Handles showing current connections for the current environment, and
> + * SHOW TABLES/VIEWS/... commands.
>   */
>  ijResult
> -ShowConnectionsStatement()
> +ShowStatement()
>  throws SQLException
>  :
>  {
> +	String schema  = null;
> +	String tblname = null;
> +	String str     = null;
> +	String[] types = null;
> +	Token t = null;
> +	Token v = null;
>  }
>  {
>  	<SHOW> <CONNECTIONS>
>  	{
>  		return showConnectionsMethod(false);
>  	}
> +|   <SHOW> (t=<TABLES> | v=<VIEWS> | <SYNONYMS> | <ALIASES>)
> +		[ <IN> schema=identifier() ]
> +	{
> +		if(t!=null) {
> +			// Only show non-system tables by default.
> +			// If schema specified (i.e. SYS), also display system tables.
> +			if(schema!=null)
> +				types = new String[] { "TABLE", "SYSTEM TABLE" };
> +			else
> +				types = new String[] { "TABLE" };
> +		}
> +		else if(v!=null)
> +			types = new String[] { "VIEW" };
> +		else
> +			types = new String[] { "ALIAS" };
> +		return showTables(schema, types);
> +	}
> +|	<SHOW> <INDEXES> 
> +		[ (<IN> schema=identifier()) |
> +		  (<FROM> tblname=identifier() [ <PERIOD> str=identifier() ] ) ]
> +	{
> +		if(str != null) {
> +			// if absolute table reference given
> +			schema = tblname;
> +			tblname = str;
> +		}
> +
> +		// If user specifies a table name, then assume schema is
> +		// current schema. Note that getSelectedSchema may return
> +		// null for some DBMSes.
> +		if(schema == null && tblname != null)
> +			schema = util.getSelectedSchema(theConnection);
> +		return showIndexes(schema,tblname);
> +	}
> +|	<SHOW> <PROCEDURES>
> +		[ <IN> schema=identifier() ]
> +	{
> +		return showProcedures(schema);
> +	}
> +|	<SHOW> <SCHEMAS>
> +	{
> +		return showSchemas();
> +	}
>  }
>  
>  /**
> @@ -3097,6 +3429,7 @@
>  	(
>  	tok = <ABSOLUTE>
>  |	tok = <AFTER>
> +|	tok = <ALIASES>
>  |	tok = <ALL>
>  |	tok = <AS>
>  |	tok = <ASYNC>
> @@ -3111,6 +3444,7 @@
>  | 	tok = <CONNECTIONS>
>  |	tok = <CURRENT>
>  |	tok = <CURSOR>
> +|	tok = <DESCRIBE>
>  |	tok = <DISCONNECT>
>  |	tok = <DRIVER>
>  |	tok = <ELAPSEDTIME>
> @@ -3121,10 +3455,13 @@
>  |	tok = <FAIL>
>  |	tok = <FIRST>
>  |	tok = <FOR>
> +|	tok = <FROM>
>  |	tok = <GET>
>  |	tok = <GETCURRENTROWNUMBER>
>  |	tok = <HOLD>
>  |	tok = <HELP>
> +|	tok = <IN>
> +|	tok = <INDEXES>
>  |	tok = <INSENSITIVE>
>  |	tok = <INTO>
>  |	tok = <LAST>
> @@ -3141,6 +3478,7 @@
>  |	tok = <PREPARE>
>  |	tok = <PREVIOUS>
>  |	tok = <PROCEDURE>
> +|	tok = <PROCEDURES>
>  |	tok = <PROPERTIES>
>  |	tok = <PROTOCOL>
>  |	tok = <QUIT>
> @@ -3151,14 +3489,18 @@
>  |	tok = <ROLLBACK>
>  |	tok = <RUN>
>  |	tok = <TO>
> +|	tok = <SCHEMAS>
>  |	tok = <SCROLL>
>  |	tok = <SENSITIVE>
>  |	tok = <SET>
>  |	tok = <SHOW>
>  |	tok = <SHUTDOWN>
>  |	tok = <STATEMENT>
> +|	tok = <SYNONYMS>
> +|	tok = <TABLES>
>  |	tok = <USER>
>  |	tok = <USING>
> +|	tok = <VIEWS>
>  |	tok = <WAIT>
>  |	tok = <WITH>
>  |	tok = <XA_1PHASE>
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java Wed Aug  9 15:53:53 2006
> @@ -53,6 +53,7 @@
>  	private final static String NoSuchAsyncStatement = "IJ_NoAsynStatEx";
>  	private final static String NoSuchConnection = "IJ_NoConnExisWi";
>  	private final static String NoSuchProtocol = "IJ_NoProtExisWi";
> +	private final static String NoSuchTable = "IJ_NoSuchTable";
>  	private final static String NotJDBC20 = "IJ_IsOnlySuppIn";
>  	private final static String NoUsingResults = "IJ_UsinClauHadN";
>  	private final static String ObjectWasNull = "IJ_UnabToEsta";
> @@ -122,6 +123,9 @@
>  	}
>  	static ijException noSuchProtocol(String c) {
>  		return new ijException(LocalizedResource.getMessage(NoSuchProtocol, c));
> +	}
> +	static ijException noSuchTable(String c) {
> +		return new ijException(LocalizedResource.getMessage(NoSuchTable, c));
>  	}
>  	static public ijException notJDBC20(String operation) {
>  		return new ijException(LocalizedResource.getMessage(NotJDBC20, operation));
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java Wed Aug  9 15:53:53 2006
> @@ -54,6 +54,8 @@
>  	ResultSet getNextRowOfResultSet();
>  	Vector getVector();
>  	SQLException getException();
> +	int[] getColumnDisplayList();
> +	int[] getColumnWidthList();
>  
>  	void closeStatement() throws SQLException ;
>  
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java Wed Aug  9 15:53:53 2006
> @@ -53,6 +53,9 @@
>  	public Vector getVector() { return null; }
>  	public SQLException getException() { return null; }
>  
> +	public int[] getColumnDisplayList() { return null; }
> +	public int[] getColumnWidthList() { return null; }
> +
>  	public void closeStatement() throws SQLException { }
>  
>  	public abstract SQLWarning getSQLWarnings() throws SQLException;
> @@ -66,6 +69,10 @@
>  		if (isVector()) return LocalizedResource.getMessage("IJ_Vec0",getVector().toString());
>  		if (isMulti()) return LocalizedResource.getMessage("IJ_Mul0",getVector().toString());
>  		if (isException()) return LocalizedResource.getMessage("IJ_Exc0",getException().toString());
> +		try {
> +			if (isResultSet()) return LocalizedResource.getMessage("IJ_Rse0",getStatement().toString());
> +		} catch(SQLException se) {
> +		}
>  		return LocalizedResource.getMessage("IJ_Unkn0",this.getClass().getName());
>  	}
>  }
> 
> Added: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java?rev=430177&view=auto
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java (added)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java Wed Aug  9 15:53:53 2006
> @@ -0,0 +1,81 @@
> +/*
> +
> +   Derby - Class org.apache.derby.impl.tools.ij.ijResultSetResult
> +
> +   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.derby.impl.tools.ij;
> +
> +import java.sql.Connection;
> +import java.sql.ResultSet;
> +import java.sql.Statement;
> +import java.sql.SQLException;
> +import java.sql.SQLWarning;
> +
> +/**
> + * This impl is intended to be used with a resultset,
> + * where the execution of the statement is already complete.
> + */
> +public class ijResultSetResult extends ijResultImpl {
> +
> +	ResultSet resultSet;
> +	Statement statement;
> +
> +	int[]     displayColumns = null;
> +	int[]     columnWidths = null;
> +
> +	/**
> +	 * Create a ijResultImpl that represents a result set.
> +	 */
> +	public ijResultSetResult(ResultSet r) throws SQLException {
> +		resultSet = r;
> +		statement = resultSet.getStatement();
> +	}
> +
> +	/**
> +	 * Create a ijResultImpl that represents a result set, only
> +	 * displaying a subset of the columns, using specified column widths.
> +	 * 
> +	 * @param r The result set to display
> +	 * @param display Which column numbers to display, or null to display
> +	 *                all columns.
> +	 * @param widths  The widths of the columns specified in 'display', or
> +	 *                null to display using default column sizes.
> +	 */
> +	public ijResultSetResult(ResultSet r, int[] display,
> +							 int[] widths) throws SQLException {
> +		resultSet = r;
> +		statement = resultSet.getStatement();
> +
> +		displayColumns = display;
> +		columnWidths   = widths;
> +	}
> +
> +	public boolean isResultSet() throws SQLException { return statement==null || statement.getUpdateCount() == -1; }
> +
> +	public ResultSet getResultSet() throws SQLException { return resultSet; }
> +
> +	public void closeStatement() throws SQLException { if(statement!=null) statement.close(); else resultSet.close(); }
> +
> +	public int[] getColumnDisplayList() { return displayColumns; }
> +	public int[] getColumnWidthList() { return columnWidths; }
> +
> +	public SQLWarning getSQLWarnings() throws SQLException { return resultSet.getWarnings(); }
> +	public void clearSQLWarnings() throws SQLException { resultSet.clearWarnings(); }
> +}
> 
> Propchange: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java Wed Aug  9 15:53:53 2006
> @@ -853,6 +853,35 @@
>  			 (framework.toUpperCase(Locale.ENGLISH).indexOf("JCC") != -1)));
>  	}
>  	
> -
> +	/**
> +	 * Selects the current schema from the given connection.
> +	 * 
> +	 * As there are no way of getting current schema supported by
> +	 * all major DBMS-es, this method may return null.
> +	 * 
> +	 * @param theConnection  Connection to get current schema for
> +	 * @return the current schema of the connection, or null if error.
> +	 */
> +	public static String getSelectedSchema(Connection theConnection) throws SQLException {
> +		String schema = null;
> +                if (theConnection == null)
> +                  return null;
> +		Statement st = theConnection.createStatement();
> +		try {
> +			if(!st.execute("VALUES CURRENT SCHEMA"))
> +				return null;
> +			
> +			ResultSet rs = st.getResultSet();
> +			if(rs==null || !rs.next())
> +				return null;
> +			schema = rs.getString(1);
> +		} catch(SQLException e) {
> +			// There are no standard way of getting schema.
> +			// Getting default schema may fail.
> +		} finally {
> +			st.close();
> +		}
> +		return schema;
> +	}
>  }
>  
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java Wed Aug  9 15:53:53 2006
> @@ -451,6 +451,15 @@
>  					JDBCDisplayUtil.ShowWarnings(out,result.getSQLWarnings());
>  					result.clearSQLWarnings();
>  				}
> +			} else if (result.isResultSet()) {
> +				ResultSet rs = result.getResultSet();
> +				try {
> +					JDBCDisplayUtil.DisplayResults(out,rs,connEnv[currCE].getConnection(), result.getColumnDisplayList(), result.getColumnWidthList());
> +				} catch (SQLException se) {
> +					result.closeStatement();
> +					throw se;
> +				}
> +				result.closeStatement();
>  			} else if (result.isException()) {
>  				JDBCDisplayUtil.ShowException(out,result.getException());
>  			}
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties Wed Aug  9 15:53:53 2006
> @@ -65,6 +65,13 @@
>  \                               -- drop current, named, or all connections;\n\
>  \                               -- the default is CURRENT\n\
>  \ \n\
> +\  SHOW SCHEMAS;                -- lists all schemas in the current database\n\
> +\  SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema };\n\
> +\                               -- lists tables, views, procedures or synonyms\n\
> +\  SHOW INDEXES { IN schema | FROM table };\n\
> +\                               -- lists indexes in a schema, or for a table\n\
> +\  DESCRIBE name;               -- lists columns in the named table\n\
> +\ \n\
>  \  COMMIT;                      -- commits the current transaction\n\
>  \  ROLLBACK;                    -- rolls back the current transaction\n\
>  \ \n\
> @@ -129,6 +136,7 @@
>  IJ_NoAsynStatEx=No async statement exists with the name {0}
>  IJ_NoConnExisWi=No connection exists with the name {0}
>  IJ_NoProtExisWi=No protocol exists with the name {0}
> +IJ_NoSuchTable=No table exists with the name {0}
>  IJ_IsOnlySuppIn={0} is only supported in JDBC 2.0 and greater.
>  IJ_UsinClauHadN=Using clause had no results
>  IJ_UnabToEsta=Unable to establish {0}
> @@ -149,6 +157,7 @@
>  IJ_Vec0=VEC::{0}
>  IJ_Mul0=MUL::{0}
>  IJ_Exc0=EXC::{0}
> +IJ_Rse0=RST::{0}
>  IJ_Unkn0=UNKNOWN::{0}
>  # From util.java
>  IJ_UsageJavaComCloudToolsIjPPropeInput=Usage: java org.apache.derby.tools.ij [-p propertyfile] [-ca connectionAttributePropertyFile] [inputfile]
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java Wed Aug  9 15:53:53 2006
> @@ -258,18 +258,20 @@
>  	static public void DisplayResults(PrintWriter out, Statement stmt, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayResults( out, stmt, conn, 0);			
> +		indent_DisplayResults( out, stmt, conn, 0, null, null);			
>  	}
>  
>  	static private void indent_DisplayResults
> -	(PrintWriter out, Statement stmt, Connection conn, int indentLevel)
> +	(PrintWriter out, Statement stmt, Connection conn, int indentLevel,
> +	 int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException {
>  
>  		checkNotNull(stmt, "Statement");
>  
>  		ResultSet rs = stmt.getResultSet();
>  		if (rs != null) {
> -			indent_DisplayResults(out, rs, conn, indentLevel);
> +			indent_DisplayResults(out, rs, conn, indentLevel, 
> +								  displayColumns, displayColumnWidths);
>  			rs.close(); // let the result set go away
>  		}
>  		else {
> @@ -297,20 +299,48 @@
>  	}
>  
>  	/**
> +	    Calculates column display widths from the default widths of the
> +	    result set.
> +	 */
> +	static private int[] getColumnDisplayWidths(ResultSetMetaData rsmd, int[] dispColumns,
> +												boolean localizedOutput)
> +		throws SQLException {
> +		int count = (dispColumns == null) ? rsmd.getColumnCount() : dispColumns.length;
> +		int[] widths = new int[count];
> +
> +		for(int i=0; i<count; i++) {
> +			int colnum = (dispColumns == null) ? (i + 1) : dispColumns[i];
> +			int dispsize = localizedOutput
> +				? LocalizedResource.getInstance().getColumnDisplaySize(rsmd, colnum)
> +                : rsmd.getColumnDisplaySize(colnum);
> +			widths[i] = Math.min(maxWidth,
> +				Math.max((rsmd.isNullable(colnum) == ResultSetMetaData.columnNoNulls)?
> +				0 : MINWIDTH, dispsize));
> +		}
> +		return widths;
> +	}
> +
> +
> +	/**
>  		@param out the place to write to
>  		@param rs the ResultSet to display
>  		@param conn the Connection against which the ResultSet was retrieved
> +	    @param displayColumns Column numbers to display, or null if all
> +	    @param displayColumnWidths Column widths, in characters, if displayColumns is specified.
>  
>  		@exception SQLException on JDBC access failure
>  	 */
> -	static public void DisplayResults(PrintWriter out, ResultSet rs, Connection conn)
> +	static public void DisplayResults(PrintWriter out, ResultSet rs, Connection conn,
> +									  int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException
>  	{
> -		indent_DisplayResults( out, rs, conn, 0);
> +		indent_DisplayResults( out, rs, conn, 0, displayColumns, 
> +							   displayColumnWidths);
>  	}
>  
>  	static private void indent_DisplayResults
> -	(PrintWriter out, ResultSet rs, Connection conn, int indentLevel)
> +	(PrintWriter out, ResultSet rs, Connection conn, int indentLevel, 
> +	 int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException {
>  		ResultSetMetaData rsmd = rs.getMetaData();
>  		checkNotNull(rsmd, "ResultSetMetaData");
> @@ -324,7 +354,11 @@
>  		else
>  			nestedResults = null;
>  
> -		int len = indent_DisplayBanner(out,rsmd, indentLevel);
> +		if(displayColumnWidths == null)
> +			displayColumnWidths = getColumnDisplayWidths(rsmd, displayColumns,true);
> +		
> +		int len = indent_DisplayBanner(out,rsmd, indentLevel, displayColumns,
> +									   displayColumnWidths);
>  
>  		// When displaying rows, keep going past errors
>  		// unless/until the maximum # of errors is reached.
> @@ -335,7 +369,9 @@
>  				doNext = rs.next();
>  				if (doNext) {
>  
> -		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, indentLevel);
> +		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, 
> +							   indentLevel, displayColumns, 
> +							   displayColumnWidths);
>  					ShowWarnings(out, rs);
>  					numberOfRowsSelected++;
>  				}
> @@ -392,7 +428,8 @@
>  			LocalizedResource.OutputWriter().println(b);
>  			LocalizedResource.OutputWriter().println(LocalizedResource.getMessage("UT_Resul0", LocalizedResource.getNumber(i)));
>  			LocalizedResource.OutputWriter().println(b);
> -			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn, indentLevel);
> +			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn,
> +								  indentLevel, null, null);
>  		}
>  	}
>  
> @@ -409,10 +446,12 @@
>  	static public void DisplayNextRow(PrintWriter out, ResultSet rs, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayNextRow( out, rs, conn, 0 );
> +		indent_DisplayNextRow( out, rs, conn, 0, null, (rs == null) ? null
> +							   : getColumnDisplayWidths(rs.getMetaData(), null, true));
>  	}
>  
> -	static private void indent_DisplayNextRow(PrintWriter out, ResultSet rs, Connection conn, int indentLevel )
> +	static private void indent_DisplayNextRow(PrintWriter out, ResultSet rs, Connection conn, int indentLevel,
> +											  int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException {
>  
>  		Vector nestedResults;
> @@ -431,8 +470,9 @@
>  
>  		// Only print stuff out if there is a row to be had.
>  		if (rs.next()) {
> -			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
> -    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
> +			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, displayColumns, displayColumnWidths);
> +    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
> +					   null, null );
>  		}
>  		else {
>  			indentedPrintLine( out, indentLevel, LocalizedResource.getMessage("UT_NoCurreRow"));
> @@ -458,10 +498,12 @@
>  	static public void DisplayCurrentRow(PrintWriter out, ResultSet rs, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayCurrentRow( out, rs, conn, 0 );
> +		indent_DisplayCurrentRow( out, rs, conn, 0, null, (rs == null) ? null
> +								  : getColumnDisplayWidths(rs.getMetaData(), null, true) );
>  	}
>  
> -	static private void indent_DisplayCurrentRow(PrintWriter out, ResultSet rs, Connection conn, int indentLevel )
> +	static private void indent_DisplayCurrentRow(PrintWriter out, ResultSet rs, Connection conn, 
> +												 int indentLevel, int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException {
>  
>  		Vector nestedResults;
> @@ -481,8 +523,9 @@
>  		ResultSetMetaData rsmd = rs.getMetaData();
>  		checkNotNull(rsmd, "ResultSetMetaData");
>  
> -		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
> -   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
> +		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, displayColumns, displayColumnWidths);
> +   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
> +				   displayColumns, displayColumnWidths );
>  
>  		ShowWarnings(out, rs);
>  
> @@ -504,42 +547,38 @@
>  	static public int DisplayBanner(PrintWriter out, ResultSetMetaData rsmd )
>  		throws SQLException
>  	{
> -		return indent_DisplayBanner( out, rsmd, 0 );
> +		return indent_DisplayBanner( out, rsmd, 0, null, 
> +									 getColumnDisplayWidths(rsmd, null, true) );
>  	}
>  
> -	static private int indent_DisplayBanner(PrintWriter out, ResultSetMetaData rsmd, int indentLevel )
> +	static private int indent_DisplayBanner(PrintWriter out, ResultSetMetaData rsmd, int indentLevel,
> +											int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException	{
>  
>  		StringBuffer buf = new StringBuffer();
>  
> -		int numCols = rsmd.getColumnCount();
> +		int numCols = displayColumnWidths.length;
>  		int rowLen;
>  
>  		// do some precalculation so the buffer is allocated only once
>  		// buffer is twice as long as the display length plus one for a newline
>  		rowLen = (numCols - 1); // for the column separators
> -		for (int i=1; i <= numCols; i++) {
> -			rowLen += Math.min(maxWidth,
> -				Math.max((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH, LocalizedResource.getInstance().getColumnDisplaySize(rsmd, i)));
> -		}
> +		for (int i=1; i <= numCols; i++)
> +			rowLen += displayColumnWidths[i-1];
>  		buf.ensureCapacity(rowLen);
>  
>  		// get column header info
>  		// truncate it to the column display width
>  		// add a bar between each item.
>  		for (int i=1; i <= numCols; i++) {
> +			int colnum = displayColumns==null ? i : displayColumns[i-1];
>  
>  			if (i>1)
>  				buf.append('|');
>  
> -			String s = rsmd.getColumnLabel(i);
> +			String s = rsmd.getColumnLabel(colnum);
>  
> -			int w = Math.min(maxWidth,
> -				Math.max(((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH), LocalizedResource.getInstance().getColumnDisplaySize(rsmd, i)));
> +			int w = displayColumnWidths[i-1];
>  
>  			if (s.length() < w) {
>  				
> @@ -592,34 +631,39 @@
>  		@param nestedResults
>  		@param conn
>  		@param indentLevel number of tab stops to indent line
> +	    @param displayColumns A list of column numbers to display
> +	    @param displayColumnWidths If displayColumns is set, the width of
> +								columns to display, in characters.
>  
>  		@exception SQLException thrown on JDBC access failure
>  	 */
> -	static private void DisplayRow(PrintWriter out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel )
> +	static private void DisplayRow(PrintWriter out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel,
> +								   int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException
>  	{
>  		StringBuffer buf = new StringBuffer();
>  		buf.ensureCapacity(rowLen);
>  
> -		int numCols = rsmd.getColumnCount();
> +		int numCols = displayColumnWidths.length;
>  		int i;
>  
>  		// get column header info
>  		// truncate it to the column display width
>  		// add a bar between each item.
>  		for (i=1; i <= numCols; i++){
> +			int colnum = displayColumns==null ? i : displayColumns[i-1];
>  			if (i>1)
>  				buf.append('|');
>  
>  			String s;
> -			switch (rsmd.getColumnType(i)) {
> +			switch (rsmd.getColumnType(colnum)) {
>  			default:
> -				s = LocalizedResource.getInstance().getLocalizedString(rs, rsmd, i );
> +				s = LocalizedResource.getInstance().getLocalizedString(rs, rsmd, colnum );
>  				break;
>  			case org.apache.derby.iapi.reference.JDBC20Translation.SQL_TYPES_JAVA_OBJECT:
>  			case Types.OTHER:
>  			{
> -				Object o = rs.getObject(i);
> +				Object o = rs.getObject(colnum);
>  				if (o == null) { s = "NULL"; }
>  				else if (o instanceof ResultSet && nestedResults != null)
>  				{
> @@ -629,7 +673,7 @@
>  				else
>  				{
>  					try {
> -						s = rs.getString(i);
> +						s = rs.getString(colnum);
>  					} catch (SQLException se) {
>  						// oops, they don't support refetching the column
>  						s = o.toString();
> @@ -640,10 +684,7 @@
>  			}
>  			if (s==null) s = "NULL";
>  
> -			int w = Math.min(maxWidth,
> -				Math.max((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH, LocalizedResource.getInstance().getColumnDisplaySize(rsmd, i)));
> +			int w = displayColumnWidths[i-1];
>  			if (s.length() < w) {
>  				StringBuffer fullS = new StringBuffer(s);
>  				fullS.ensureCapacity(w);
> @@ -816,18 +857,20 @@
>  	static public void DisplayResults(PrintStream out, Statement stmt, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayResults( out, stmt, conn, 0);			
> +		indent_DisplayResults( out, stmt, conn, 0, null, null);			
>  	}
>  
>  	static private void indent_DisplayResults
> -	(PrintStream out, Statement stmt, Connection conn, int indentLevel)
> +	(PrintStream out, Statement stmt, Connection conn, int indentLevel,
> +	 int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException {
>  
>  		checkNotNull(stmt, "Statement");
>  
>  		ResultSet rs = stmt.getResultSet();
>  		if (rs != null) {
> -			indent_DisplayResults(out, rs, conn, indentLevel);
> +			indent_DisplayResults(out, rs, conn, indentLevel, displayColumns,
> +								  displayColumnWidths);
>  			rs.close(); // let the result set go away
>  		}
>  		else {
> @@ -852,11 +895,12 @@
>  	static public void DisplayResults(PrintStream out, ResultSet rs, Connection conn)
>  		throws SQLException
>  	{
> -		indent_DisplayResults( out, rs, conn, 0);
> +		indent_DisplayResults( out, rs, conn, 0, null, null);
>  	}
>  
>  	static private void indent_DisplayResults
> -	(PrintStream out, ResultSet rs, Connection conn, int indentLevel)
> +	(PrintStream out, ResultSet rs, Connection conn, int indentLevel,
> +	 int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException {
>  		ResultSetMetaData rsmd = rs.getMetaData();
>  		checkNotNull(rsmd, "ResultSetMetaData");
> @@ -870,7 +914,11 @@
>  		else
>  			nestedResults = null;
>  
> -		int len = indent_DisplayBanner(out,rsmd, indentLevel);
> +		if(displayColumnWidths == null)
> +			displayColumnWidths = getColumnDisplayWidths(rsmd, displayColumns, false);
> +
> +		int len = indent_DisplayBanner(out,rsmd, indentLevel, displayColumns,
> +									   displayColumnWidths);
>  
>  		// When displaying rows, keep going past errors
>  		// unless/until the maximum # of errors is reached.
> @@ -881,7 +929,9 @@
>  				doNext = rs.next();
>  				if (doNext) {
>  
> -		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, indentLevel);
> +		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, 
> +							   indentLevel, displayColumns, 
> +							   displayColumnWidths);
>  					ShowWarnings(out, rs);
>  					numberOfRowsSelected++;
>  				}
> @@ -930,17 +980,20 @@
>  			System.out.println(b);
>  			System.out.println(s+i+" +");
>  			System.out.println(b);
> -			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn, indentLevel);
> +			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn, 
> +								  indentLevel, null, null);
>  		}
>  	}
>  
>  	static public void DisplayNextRow(PrintStream out, ResultSet rs, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayNextRow( out, rs, conn, 0 );
> +		indent_DisplayNextRow( out, rs, conn, 0, null, (rs == null) ? null
> +							   : getColumnDisplayWidths(rs.getMetaData(),null,false) );
>  	}
>  
> -	static private void indent_DisplayNextRow(PrintStream out, ResultSet rs, Connection conn, int indentLevel )
> +	static private void indent_DisplayNextRow(PrintStream out, ResultSet rs, Connection conn, int indentLevel,
> +											  int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException {
>  
>  		Vector nestedResults;
> @@ -959,8 +1012,9 @@
>  
>  		// Only print stuff out if there is a row to be had.
>  		if (rs.next()) {
> -			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
> -    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
> +			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, null, null);
> +    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
> +					   displayColumns, displayColumnWidths);
>  		}
>  		else {
>  			indentedPrintLine( out, indentLevel, LocalizedResource.getMessage("UT_NoCurreRow"));
> @@ -976,10 +1030,12 @@
>  	static public void DisplayCurrentRow(PrintStream out, ResultSet rs, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayCurrentRow( out, rs, conn, 0 );
> +		indent_DisplayCurrentRow( out, rs, conn, 0, null, (rs == null) ? null
> +								  : getColumnDisplayWidths(rs.getMetaData(),null,false) );
>  	}
>  
> -	static private void indent_DisplayCurrentRow(PrintStream out, ResultSet rs, Connection conn, int indentLevel )
> +	static private void indent_DisplayCurrentRow(PrintStream out, ResultSet rs, Connection conn, 
> +												 int indentLevel, int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException {
>  
>  		Vector nestedResults;
> @@ -999,8 +1055,9 @@
>  		ResultSetMetaData rsmd = rs.getMetaData();
>  		checkNotNull(rsmd, "ResultSetMetaData");
>  
> -		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
> -   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
> +		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, displayColumns, displayColumnWidths);
> +   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
> +				   displayColumns, displayColumnWidths);
>  
>  		ShowWarnings(out, rs);
>  
> @@ -1012,26 +1069,24 @@
>  	static public int DisplayBanner(PrintStream out, ResultSetMetaData rsmd )
>  		throws SQLException
>  	{
> -		return indent_DisplayBanner( out, rsmd, 0 );
> +		return indent_DisplayBanner( out, rsmd, 0, null,
> +									 getColumnDisplayWidths(rsmd,null,false) );
>  	}
>  
> -	static private int indent_DisplayBanner(PrintStream out, ResultSetMetaData rsmd, int indentLevel )
> +	static private int indent_DisplayBanner(PrintStream out, ResultSetMetaData rsmd, int indentLevel,
> +											int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException	{
>  
>  		StringBuffer buf = new StringBuffer();
>  
> -		int numCols = rsmd.getColumnCount();
> +		int numCols = displayColumnWidths.length;
>  		int rowLen;
>  
>  		// do some precalculation so the buffer is allocated only once
>  		// buffer is twice as long as the display length plus one for a newline
>  		rowLen = (numCols - 1); // for the column separators
>  		for (int i=1; i <= numCols; i++) {
> -			rowLen += Math.min(maxWidth,
> -				Math.max((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH,
> -						rsmd.getColumnDisplaySize(i)));
> +			rowLen += displayColumnWidths[i-1];
>  		}
>  		buf.ensureCapacity(rowLen);
>  
> @@ -1039,17 +1094,14 @@
>  		// truncate it to the column display width
>  		// add a bar between each item.
>  		for (int i=1; i <= numCols; i++) {
> +			int colnum = displayColumns==null ? i : displayColumns[i-1];
>  
>  			if (i>1)
>  				buf.append('|');
>  
> -			String s = rsmd.getColumnLabel(i);
> +			String s = rsmd.getColumnLabel(colnum);
>  
> -			int w = Math.min(maxWidth,
> -				Math.max(((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH),
> -						rsmd.getColumnDisplaySize(i)));
> +			int w = displayColumnWidths[i-1];
>  
>  			if (s.length() < w) {
>  				// build a string buffer to hold the whitespace
> @@ -1095,31 +1147,33 @@
>  		return rowLen;
>  	} // DisplayBanner
>  
> -	static private void DisplayRow(PrintStream out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel )
> +	static private void DisplayRow(PrintStream out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel,
> +								   int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException
>  	{
>  		StringBuffer buf = new StringBuffer();
>  		buf.ensureCapacity(rowLen);
>  
> -		int numCols = rsmd.getColumnCount();
> +		int numCols = displayColumnWidths.length;
>  		int i;
>  
>  		// get column header info
>  		// truncate it to the column display width
>  		// add a bar between each item.
>  		for (i=1; i <= numCols; i++){
> +			int colnum = displayColumns==null ? i : displayColumns[i-1];
>  			if (i>1)
>  				buf.append('|');
>  
>  			String s;
> -			switch (rsmd.getColumnType(i)) {
> +			switch (rsmd.getColumnType(colnum)) {
>  			default:
> -				s = rs.getString(i);
> +				s = rs.getString(colnum);
>  				break;
>  			case org.apache.derby.iapi.reference.JDBC20Translation.SQL_TYPES_JAVA_OBJECT:
>  			case Types.OTHER:
>  			{
> -				Object o = rs.getObject(i);
> +				Object o = rs.getObject(colnum);
>  				if (o == null) { s = "NULL"; }
>  				else if (o instanceof ResultSet && nestedResults != null)
>  				{
> @@ -1129,7 +1183,7 @@
>  				else
>  				{
>  					try {
> -						s = rs.getString(i);
> +						s = rs.getString(colnum);
>  					} catch (SQLException se) {
>  						// oops, they don't support refetching the column
>  						s = o.toString();
> @@ -1141,11 +1195,7 @@
>  
>  			if (s==null) s = "NULL";
>  
> -			int w = Math.min(maxWidth,
> -				Math.max((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH,
> -						rsmd.getColumnDisplaySize(i)));
> +			int w = displayColumnWidths[i-1];
>  			if (s.length() < w) {
>  				StringBuffer fullS = new StringBuffer(s);
>  				fullS.ensureCapacity(w);
> 
> 

Re: svn commit: r430177 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/jdbc/ testing/org/apache/derbyTesting/functionTests/master/ testing/org/apache/derbyTesting/functionTests/master/DerbyNet/ testing/org/apache/derbyTesting/functionTests/ma...

Posted by David Van Couvering <Da...@Sun.COM>.
Great stuff, Havard!  Is documentation coming for this?

David

fuzzylogic@apache.org wrote:
> Author: fuzzylogic
> Date: Wed Aug  9 15:53:53 2006
> New Revision: 430177
> 
> URL: http://svn.apache.org/viewvc?rev=430177&view=rev
> Log:
> DERBY-1146: Add SHOW TABLES and DESCRIBE commands to ij.
> 
> Committed for Havard Mork <ha...@gmail.com>
> 
> Added:
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out   (with props)
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql   (with props)
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties   (with props)
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java   (with props)
> Modified:
>     db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java
>     db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out
>     db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java
>     db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java
>     db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties
>     db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java
> 
> Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java (original)
> +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java Wed Aug  9 15:53:53 2006
> @@ -283,7 +283,7 @@
>  	public String getDatabaseProductVersion() {
>  		ProductVersionHolder myPVH = Monitor.getMonitor().getEngineVersion();
>  
> -		return myPVH.getVersionBuildString(false);
> +		return myPVH.getVersionBuildString(true);
>  	}
>  
>      /**
> 
> Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties (original)
> +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/metadata.properties Wed Aug  9 15:53:53 2006
> @@ -133,8 +133,8 @@
>  	FROM \
>  		 SYS.SYSTABLES, \
>  	     SYS.SYSSCHEMAS, \
> -	     (VALUES ('T','TABLE'), \
> -			('S','SYSTEM TABLE'), ('V', 'VIEW')) T(TTABBREV,TABLE_TYPE) \
> +	     (VALUES ('T','TABLE'), ('S','SYSTEM TABLE'), \
> +			('V', 'VIEW'), ('A', 'SYNONYM')) T(TTABBREV,TABLE_TYPE) \
>  	WHERE (TTABBREV=TABLETYPE 	\
>  	  AND (SYS.SYSTABLES.SCHEMAID = SYS.SYSSCHEMAS.SCHEMAID) \
>  	  AND ((1=1) OR ? IS NOT NULL) \
> @@ -272,7 +272,8 @@
>  # so we wrap the values in a select to name it.
>  getTableTypes=\
>  	SELECT CAST (RTRIM(TABLE_TYPE) AS VARCHAR(12)) AS TABLE_TYPE \
> -	FROM (VALUES 'SYSTEM TABLE', 'TABLE', 'VIEW') TABLETYPES(TABLE_TYPE) \
> +	FROM (VALUES 'SYNONYM', 'SYSTEM TABLE', 'TABLE', 'VIEW') \
> +		TABLETYPES(TABLE_TYPE) \
>  	ORDER BY TABLE_TYPE
>  
>  # parameter 1 = pattern for catalog name
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/metadata.out Wed Aug  9 15:53:53 2006
> @@ -284,6 +284,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/odbc_metadata.out Wed Aug  9 15:53:53 2006
> @@ -314,6 +314,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/metadata.out Wed Aug  9 15:53:53 2006
> @@ -377,6 +377,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/metadata.out Wed Aug  9 15:53:53 2006
> @@ -377,6 +377,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/odbc_metadata.out Wed Aug  9 15:53:53 2006
> @@ -407,6 +407,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/Upgrade_10_1_10_2.out Wed Aug  9 15:53:53 2006
> @@ -1106,6 +1106,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> @@ -2597,6 +2598,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij.out Wed Aug  9 15:53:53 2006
> @@ -49,6 +49,12 @@
>    DISCONNECT [ CURRENT | connectionName | ALL ];
>                                 -- drop current, named, or all connections;
>                                 -- the default is CURRENT
> +  SHOW SCHEMAS;                -- lists all schemas in the current database
> +  SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema };
> +                               -- lists tables, views, procedures or synonyms
> +  SHOW INDEXES { IN schema | FROM table };
> +                               -- lists indexes in a schema, or for a table
> +  DESCRIBE name;               -- lists columns in the named table
>    COMMIT;                      -- commits the current transaction
>    ROLLBACK;                    -- rolls back the current transaction
>    PREPARE name AS 'SQL-J text'; -- prepares the SQL-J text
> 
> Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out?rev=430177&view=auto
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out (added)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out Wed Aug  9 15:53:53 2006
> @@ -0,0 +1,89 @@
> +ij> -- This test will cover SHOW TABLES, SHOW SCHEMAS, etc.
> +-- and the DESCRIBE command.
> +connect 'jdbc:derby:wombat;create=true';
> +ij> SET SCHEMA = APP;
> +0 rows inserted/updated/deleted
> +ij> CREATE TABLE t1 (i int generated always as identity, d DECIMAL(5,2), test VARCHAR(20));
> +0 rows inserted/updated/deleted
> +ij> CREATE SCHEMA USER1;
> +0 rows inserted/updated/deleted
> +ij> SET SCHEMA = USER1;
> +0 rows inserted/updated/deleted
> +ij> CREATE TABLE t2 (i int);
> +0 rows inserted/updated/deleted
> +ij> CREATE SYNONYM USER1.T3 FOR USER1.T2;
> +0 rows inserted/updated/deleted
> +ij> CREATE VIEW v1 AS SELECT * from app.t1;
> +0 rows inserted/updated/deleted
> +ij> CREATE INDEX idx1 ON APP.t1 (test ASC);
> +0 rows inserted/updated/deleted
> +ij> CREATE PROCEDURE APP.PROCTEST(IN A INTEGER, OUT B DECIMAL(10,2))
> +PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA 
> +EXTERNAL NAME 'a.b.c.d.e';
> +0 rows inserted/updated/deleted
> +ij> -- first display all tables, then display tables in one schema
> +SHOW TABLES;
> +TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
> +------------------------------------------------------------------------
> +APP                 |T1                            |                    
> +USER1               |T2                            |                    
> +2 rows selected
> +ij> SHOW TABLES IN APP;
> +TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
> +------------------------------------------------------------------------
> +APP                 |T1                            |                    
> +1 row selected
> +ij> -- 'describe t1' will give error, as not in current schema
> +DESCRIBE t1;
> +IJ ERROR: No table exists with the name T1
> +ij> DESCRIBE APP.t1;
> +COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
> +------------------------------------------------------------------------------
> +I                   |INTEGER  |0   |10  |10    |AUTOINCRE&|NULL      |NO      
> +D                   |DECIMAL  |2   |10  |5     |NULL      |NULL      |YES     
> +TEST                |VARCHAR  |NULL|NULL|20    |NULL      |40        |YES     
> +3 rows selected
> +ij> DESCRIBE v1;
> +COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
> +------------------------------------------------------------------------------
> +I                   |INTEGER  |0   |10  |10    |NULL      |NULL      |NO      
> +D                   |DECIMAL  |2   |10  |5     |NULL      |NULL      |YES     
> +TEST                |VARCHAR  |NULL|NULL|20    |NULL      |40        |YES     
> +3 rows selected
> +ij> SHOW SCHEMAS;
> +TABLE_SCHEM                   
> +------------------------------
> +APP                           
> +NULLID                        
> +SQLJ                          
> +SYS                           
> +SYSCAT                        
> +SYSCS_DIAG                    
> +SYSCS_UTIL                    
> +SYSFUN                        
> +SYSIBM                        
> +SYSPROC                       
> +SYSSTAT                       
> +USER1                         
> +12 rows selected
> +ij> SHOW VIEWS IN USER1;
> +TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
> +------------------------------------------------------------------------
> +USER1               |V1                            |                    
> +1 row selected
> +ij> SHOW PROCEDURES IN APP;
> +PROCEDURE_SCHEM     |PROCEDURE_NAME                |REMARKS             
> +------------------------------------------------------------------------
> +APP                 |PROCTEST                      |a.b.c.d.e           
> +1 row selected
> +ij> SHOW SYNONYMS IN USER1;
> +TABLE_SCHEM         |TABLE_NAME                    |REMARKS             
> +------------------------------------------------------------------------
> +USER1               |T3                            |                    
> +1 row selected
> +ij> SHOW INDEXES FROM APP.t1;
> +TABLE_NAME          |COLUMN_NAME         |NON_U&|TYPE|ASC&|CARDINA&|PAGES   
> +----------------------------------------------------------------------------
> +T1                  |TEST                |true  |3   |A   |NULL    |NULL    
> +1 row selected
> +ij> 
> 
> Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ij7.out
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/j9_13/ij.out Wed Aug  9 15:53:53 2006
> @@ -49,6 +49,12 @@
>    DISCONNECT [ CURRENT | connectionName | ALL ];
>                                 -- drop current, named, or all connections;
>                                 -- the default is CURRENT
> +  SHOW SCHEMAS;                -- lists all schemas in the current database
> +  SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema };
> +                               -- lists tables, views, procedures or synonyms
> +  SHOW INDEXES { IN schema | FROM table };
> +                               -- lists indexes in a schema, or for a table
> +  DESCRIBE name;               -- lists columns in the named table
>    COMMIT;                      -- commits the current transaction
>    ROLLBACK;                    -- rolls back the current transaction
>    PREPARE name AS 'SQL-J text'; -- prepares the SQL-J text
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/metadata.out Wed Aug  9 15:53:53 2006
> @@ -377,6 +377,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/odbc_metadata.out Wed Aug  9 15:53:53 2006
> @@ -407,6 +407,7 @@
>  ,APP,SCREWIE,VIEW,,null,null,null,null,null
>  getTableTypes():
>  TABLE_TYPE[VARCHAR]
> +SYNONYM
>  SYSTEM TABLE
>  TABLE
>  VIEW
> 
> Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall (original)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbytools.runall Wed Aug  9 15:53:53 2006
> @@ -10,5 +10,6 @@
>  tools/ij4.sql
>  tools/ij5.sql
>  tools/ij6.sql
> +tools/ij7.sql
>  tools/ijConnName.sql
>  tools/URLCheck.sql
> 
> Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql?rev=430177&view=auto
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql (added)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql Wed Aug  9 15:53:53 2006
> @@ -0,0 +1,35 @@
> +
> +-- This test will cover SHOW TABLES, SHOW SCHEMAS, etc.
> +-- and the DESCRIBE command.
> +
> +connect 'jdbc:derby:wombat;create=true';
> +
> +SET SCHEMA = APP;
> +CREATE TABLE t1 (i int generated always as identity, d DECIMAL(5,2), test VARCHAR(20));
> +
> +CREATE SCHEMA USER1;
> +SET SCHEMA = USER1;
> +CREATE TABLE t2 (i int);
> +
> +CREATE SYNONYM USER1.T3 FOR USER1.T2;
> +CREATE VIEW v1 AS SELECT * from app.t1;
> +CREATE INDEX idx1 ON APP.t1 (test ASC);
> +CREATE PROCEDURE APP.PROCTEST(IN A INTEGER, OUT B DECIMAL(10,2))
> +PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA 
> +EXTERNAL NAME 'a.b.c.d.e';
> +
> +-- first display all tables, then display tables in one schema
> +SHOW TABLES;
> +SHOW TABLES IN APP;
> +
> +-- 'describe t1' will give error, as not in current schema
> +DESCRIBE t1;
> +DESCRIBE APP.t1;
> +DESCRIBE v1;
> +
> +SHOW SCHEMAS;
> +SHOW VIEWS IN USER1;
> +SHOW PROCEDURES IN APP;
> +SHOW SYNONYMS IN USER1;
> +SHOW INDEXES FROM APP.t1;
> +
> 
> Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7.sql
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 
> Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties?rev=430177&view=auto
> ==============================================================================
> --- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties (added)
> +++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties Wed Aug  9 15:53:53 2006
> @@ -0,0 +1,4 @@
> +ij.showNoConnectionsAtStart=false
> +
> +#Exclude for J2ME/Foundation - need to look into reason for failure
> +runwithfoundation=false
> \ No newline at end of file
> 
> Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/tools/ij7_app.properties
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ij.jj Wed Aug  9 15:53:53 2006
> @@ -551,6 +551,240 @@
>  	  	return new ijVectorResult(v,w);
>  	}
>  
> +	/**
> +	   Returns a subset of the input integer array
> +	   
> +	   @param input The input integer array
> +	   @param start Starting index, inclusive
> +	   @param end   Ending index, exclusive
> +	 */
> +	public static int[] intArraySubset(final int[] input, int start, int end) {
> +		int[] res = new int[end-start];
> +		System.arraycopy(input, start, res, 0, end-start);
> +		return res;
> +	}
> +
> +	/**
> +	   Verify that a table exists within a schema. Throws an exception
> +	   if table does not exist.
> +	   
> +	   @param schema Schema for the table
> +	   @param table  Name of table to check for existence of
> +	 */
> +	public void verifyTableExists(String schema, String table) 
> +	throws SQLException {
> +		if(schema == null)
> +			return;
> +
> +		ResultSet rs = null;
> +		try {
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getTables(null,schema,table,null);
> +			if(!rs.next())
> +				throw ijException.noSuchTable(table);
> +		} finally {
> +			if(rs!=null)
> +				rs.close();
> +		}
> +	}
> +
> +	/**
> +	   Return a resultset of tables (or views, procs...) in the given schema. 
> +
> +	   @param schema  Schema to get tables for, or null for search 
> +	                  in all schemas.
> +	   @param tableType Types of tables to return, see
> +	                  {@link java.sql.DatabaseMetaData#getTableTypes}
> +	 */
> +	public ijResult showTables(String schema, String[] tableType) throws SQLException {
> +		ResultSet rs = null;
> +		try {
> +			haveConnection();
> +
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getTables(null,schema,null,tableType);
> +
> +			int[] displayColumns = new int[] {
> +				rs.findColumn("TABLE_SCHEM"),
> +				rs.findColumn("TABLE_NAME"),
> +				rs.findColumn("REMARKS"),
> +			};
> +			int[] columnWidths = new int[] {
> +				20,
> +				30,
> +				20,
> +			};
> +
> +			return new ijResultSetResult(rs, displayColumns, columnWidths);
> +		} catch (SQLException e) {
> +			if(rs!=null)
> +				rs.close();
> +			throw e;
> +		}
> +	}
> +
> +	/**
> +	   Return a resultset of indexes for the given table or schema
> +
> +	   @param schema  schema to find indexes for
> +	   @param table   table to find indexes for
> +	 */
> +	public ijResult showIndexes(String schema, String table) throws SQLException {
> +		ResultSet rs = null;
> +		try {
> +			haveConnection();
> +			verifyTableExists(schema, table);
> +
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getIndexInfo(null, schema, table, false, true);
> +
> +			int[] displayColumns = new int[] {
> +				rs.findColumn("TABLE_SCHEM"),
> +				rs.findColumn("TABLE_NAME"),
> +				rs.findColumn("COLUMN_NAME"),
> +				rs.findColumn("NON_UNIQUE"),
> +				rs.findColumn("TYPE"),
> +				rs.findColumn("ASC_OR_DESC"),
> +				rs.findColumn("CARDINALITY"),
> +				rs.findColumn("PAGES"),
> +			};
> +			int[] columnWidths = new int[] {
> +				20,
> +				20,
> +				20,
> +				6,
> +				4,
> +				4,
> +				8,
> +				8,
> +			};
> +
> +			if(schema!=null) {
> +				displayColumns = intArraySubset(displayColumns, 1, 
> +												displayColumns.length);
> +				columnWidths   = intArraySubset(columnWidths, 1, 
> +												columnWidths.length);
> +			}
> +			return new ijResultSetResult(rs, displayColumns, columnWidths);
> +		} catch (SQLException e) {
> +			if(rs!=null)
> +				rs.close();
> +			throw e;
> +		}
> +	}
> +
> +	/**
> +	   Return a resultset of procedures from database metadata
> +	 */
> +	public ijResult showProcedures(String schema) throws SQLException {
> +		ResultSet rs = null;
> +		try {
> +			haveConnection();
> +
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getProcedures(null,schema,null);
> +
> +			int[] displayColumns = new int[] {
> +				rs.findColumn("PROCEDURE_SCHEM"),
> +				rs.findColumn("PROCEDURE_NAME"),
> +				rs.findColumn("REMARKS"),
> +			};
> +			int[] columnWidths = new int[] {
> +				20,
> +				30,
> +				20,
> +			};
> +
> +			return new ijResultSetResult(rs, displayColumns, columnWidths);
> +		} catch (SQLException e) {
> +			if(rs!=null)
> +				rs.close();
> +			throw e;
> +		}
> +	}
> +
> +	/**
> +	   Return a resultset of schemas from database metadata
> +	 */
> +	public ijResult showSchemas() throws SQLException {
> +		ResultSet rs = null;
> +		try {
> +			haveConnection();
> +
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getSchemas();
> +
> +			int[] displayColumns = new int[] {
> +				rs.findColumn("TABLE_SCHEM")
> +			};
> +			int[] columnWidths = new int[] {
> +				30
> +			};
> +
> +			return new ijResultSetResult(rs, displayColumns, columnWidths);
> +		} catch (SQLException e) {
> +			if(rs!=null)
> +				rs.close();
> +			throw e;
> +		}
> +	}
> +
> +	/**
> +	   Outputs the names of all fields of given table. Outputs field
> +	   names and data type.
> +	 */
> +	public ijResult describeTable(String schema, String table) throws SQLException {
> +		ResultSet rs = null;
> +		try {
> +			haveConnection();
> +			verifyTableExists(schema,table);
> +
> +			DatabaseMetaData dbmd = theConnection.getMetaData();
> +			rs = dbmd.getColumns(null,schema,table,null);
> +
> +			int[] displayColumns = new int[] {
> +				rs.findColumn("TABLE_SCHEM"),
> +				rs.findColumn("TABLE_NAME"),
> +				rs.findColumn("COLUMN_NAME"),
> +				rs.findColumn("TYPE_NAME"),
> +				rs.findColumn("DECIMAL_DIGITS"),
> +				rs.findColumn("NUM_PREC_RADIX"),
> +				rs.findColumn("COLUMN_SIZE"),
> +				rs.findColumn("COLUMN_DEF"),
> +				rs.findColumn("CHAR_OCTET_LENGTH"),
> +				rs.findColumn("IS_NULLABLE"),
> +			};
> +			int[] columnWidths = new int[] {
> +				20,
> +				20,
> +				20,
> +				9,
> +				4,
> +				4,
> +				6,
> +				10,
> +				10,
> +				8
> +			};
> +
> +			//
> +			// If schema is specified (if util.getSelectedSchema in
> +			// DescTableStatement() returns correct value), then we
> +			// don't need to output schema and table names.
> +			if(schema!=null) {
> +				displayColumns = intArraySubset(displayColumns, 2, 
> +												displayColumns.length);
> +				columnWidths   = intArraySubset(columnWidths, 2, 
> +												columnWidths.length);
> +			}
> +
> +			return new ijResultSetResult(rs, displayColumns, columnWidths);
> +		} catch (SQLException e) {
> +			if(rs!=null)
> +				rs.close();
> +			throw e;
> +		}
> +	}
>  
>  	private Object makeXid(int xid)
>  	{
> @@ -589,6 +823,7 @@
>  {	/* ij Keywords */
>  	<ABSOLUTE: "absolute">
>  |	<AFTER: "after">
> +|	<ALIASES: "aliases">
>  |	<ALL: "all">
>  |	<AS: "as">
>  |	<ASYNC: "async">
> @@ -603,6 +838,7 @@
>  | 	<CONNECTIONS: "connections">
>  |	<CURRENT: "current">
>  |	<CURSOR: "cursor">
> +|	<DESCRIBE: "describe">
>  |	<DISCONNECT: "disconnect">
>  |	<DRIVER: "driver">
>  |	<ELAPSEDTIME: "elapsedtime">
> @@ -614,10 +850,13 @@
>  |	<FAIL: "fail">
>  |	<FIRST: "first">
>  |	<FOR: "for">
> +|	<FROM: "from">
>  |	<GET: "get">
>  |	<GETCURRENTROWNUMBER: "getcurrentrownumber">
>  |	<HOLD: "hold">
>  |	<HELP: "help">
> +|	<IN: "in">
> +|	<INDEXES: "indexes">
>  |	<INSENSITIVE: "insensitive">
>  |	<INTO: "into">
>  |	<LAST: "last">
> @@ -634,6 +873,7 @@
>  |	<PREPARE: "prepare">
>  |	<PREVIOUS: "previous">
>  |	<PROCEDURE: "procedure">
> +|	<PROCEDURES: "procedures">
>  |	<PROPERTIES: "properties">
>  |	<PROTOCOL: "protocol">
>  |	<QUIT: "quit">
> @@ -645,14 +885,18 @@
>  |	<RUN: "run">
>  |	<TO: "to">
>  |	<SAVEPOINT: "savepoint">
> +|	<SCHEMAS: "schemas">
>  |	<SCROLL: "scroll">
>  |	<SENSITIVE: "sensitive">
>  |	<SET: "set">
>  |	<SHOW: "show">
>  |	<SHUTDOWN: "shutdown">
>  |	<STATEMENT: "statement">
> +|	<SYNONYMS: "synonyms">
> +|	<TABLES: "tables">
>  |	<USER: "user">
>  |	<USING: "using">
> +|	<VIEWS: "views">
>  |	<WAIT: "wait">
>  |	<WITH: "with">
>  |	<XA_1PHASE: "XA_1phase">
> @@ -985,6 +1229,7 @@
>  | 	r=CloseStatement()
>  | 	r=CommitStatement()
>  | 	r=ConnectStatement()
> +|	r=DescTableStatement()
>  |	r=DisconnectStatement()
>  |	r=DriverStatement()
>  |	r=ElapsedTimeStatement()	
> @@ -1012,7 +1257,7 @@
>  |	r=RemoveStatement()	
>  |	r=RunStatement()	
>  |	r=SetConnectionStatement()	
> -|	r=ShowConnectionsStatement()	
> +|	r=ShowStatement()	
>  |	r=WaitForStatement()	
>  |	r=XA_DataSourceStatement()
>  |	r=XA_ConnectStatement()
> @@ -1246,6 +1491,43 @@
>  
>  
>  /**
> + * Handles DESCRIBE table
> + */
> +ijResult
> +DescTableStatement()
> +throws SQLException
> +:
> +{
> +	String i = null;
> +	String i2 = null;
> +	Token  s = null;
> +}
> +{
> +	<DESCRIBE>
> +	( ( i=identifier() <PERIOD> i2=identifier() )
> +	| i2=identifier()
> +	| s=<STRING>
> +	)
> +	{
> +		if(s!=null) {
> +			String image = stringValue(s.image.toUpperCase());
> +
> +			int dotPosition = image.indexOf('.');
> +			if(dotPosition!=-1) {
> +				i = image.substring(0,dotPosition);
> +				i2 = image.substring(dotPosition+1);
> +			}
> +		}
> +
> +		if(i==null)
> +			i = util.getSelectedSchema(theConnection);
> +
> +		return describeTable(i,i2);
> +	}
> +}
> +
> +
> +/**
>    * Handles CONNECT yadda.yadda.foo( stringArg, ... stringArg ) AS connectionName
>    */
>  ijResult
> @@ -1334,19 +1616,69 @@
>  }
>  
>  /**
> -	Shows the current connections for the current environment.
> + * Handles showing current connections for the current environment, and
> + * SHOW TABLES/VIEWS/... commands.
>   */
>  ijResult
> -ShowConnectionsStatement()
> +ShowStatement()
>  throws SQLException
>  :
>  {
> +	String schema  = null;
> +	String tblname = null;
> +	String str     = null;
> +	String[] types = null;
> +	Token t = null;
> +	Token v = null;
>  }
>  {
>  	<SHOW> <CONNECTIONS>
>  	{
>  		return showConnectionsMethod(false);
>  	}
> +|   <SHOW> (t=<TABLES> | v=<VIEWS> | <SYNONYMS> | <ALIASES>)
> +		[ <IN> schema=identifier() ]
> +	{
> +		if(t!=null) {
> +			// Only show non-system tables by default.
> +			// If schema specified (i.e. SYS), also display system tables.
> +			if(schema!=null)
> +				types = new String[] { "TABLE", "SYSTEM TABLE" };
> +			else
> +				types = new String[] { "TABLE" };
> +		}
> +		else if(v!=null)
> +			types = new String[] { "VIEW" };
> +		else
> +			types = new String[] { "ALIAS" };
> +		return showTables(schema, types);
> +	}
> +|	<SHOW> <INDEXES> 
> +		[ (<IN> schema=identifier()) |
> +		  (<FROM> tblname=identifier() [ <PERIOD> str=identifier() ] ) ]
> +	{
> +		if(str != null) {
> +			// if absolute table reference given
> +			schema = tblname;
> +			tblname = str;
> +		}
> +
> +		// If user specifies a table name, then assume schema is
> +		// current schema. Note that getSelectedSchema may return
> +		// null for some DBMSes.
> +		if(schema == null && tblname != null)
> +			schema = util.getSelectedSchema(theConnection);
> +		return showIndexes(schema,tblname);
> +	}
> +|	<SHOW> <PROCEDURES>
> +		[ <IN> schema=identifier() ]
> +	{
> +		return showProcedures(schema);
> +	}
> +|	<SHOW> <SCHEMAS>
> +	{
> +		return showSchemas();
> +	}
>  }
>  
>  /**
> @@ -3097,6 +3429,7 @@
>  	(
>  	tok = <ABSOLUTE>
>  |	tok = <AFTER>
> +|	tok = <ALIASES>
>  |	tok = <ALL>
>  |	tok = <AS>
>  |	tok = <ASYNC>
> @@ -3111,6 +3444,7 @@
>  | 	tok = <CONNECTIONS>
>  |	tok = <CURRENT>
>  |	tok = <CURSOR>
> +|	tok = <DESCRIBE>
>  |	tok = <DISCONNECT>
>  |	tok = <DRIVER>
>  |	tok = <ELAPSEDTIME>
> @@ -3121,10 +3455,13 @@
>  |	tok = <FAIL>
>  |	tok = <FIRST>
>  |	tok = <FOR>
> +|	tok = <FROM>
>  |	tok = <GET>
>  |	tok = <GETCURRENTROWNUMBER>
>  |	tok = <HOLD>
>  |	tok = <HELP>
> +|	tok = <IN>
> +|	tok = <INDEXES>
>  |	tok = <INSENSITIVE>
>  |	tok = <INTO>
>  |	tok = <LAST>
> @@ -3141,6 +3478,7 @@
>  |	tok = <PREPARE>
>  |	tok = <PREVIOUS>
>  |	tok = <PROCEDURE>
> +|	tok = <PROCEDURES>
>  |	tok = <PROPERTIES>
>  |	tok = <PROTOCOL>
>  |	tok = <QUIT>
> @@ -3151,14 +3489,18 @@
>  |	tok = <ROLLBACK>
>  |	tok = <RUN>
>  |	tok = <TO>
> +|	tok = <SCHEMAS>
>  |	tok = <SCROLL>
>  |	tok = <SENSITIVE>
>  |	tok = <SET>
>  |	tok = <SHOW>
>  |	tok = <SHUTDOWN>
>  |	tok = <STATEMENT>
> +|	tok = <SYNONYMS>
> +|	tok = <TABLES>
>  |	tok = <USER>
>  |	tok = <USING>
> +|	tok = <VIEWS>
>  |	tok = <WAIT>
>  |	tok = <WITH>
>  |	tok = <XA_1PHASE>
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijException.java Wed Aug  9 15:53:53 2006
> @@ -53,6 +53,7 @@
>  	private final static String NoSuchAsyncStatement = "IJ_NoAsynStatEx";
>  	private final static String NoSuchConnection = "IJ_NoConnExisWi";
>  	private final static String NoSuchProtocol = "IJ_NoProtExisWi";
> +	private final static String NoSuchTable = "IJ_NoSuchTable";
>  	private final static String NotJDBC20 = "IJ_IsOnlySuppIn";
>  	private final static String NoUsingResults = "IJ_UsinClauHadN";
>  	private final static String ObjectWasNull = "IJ_UnabToEsta";
> @@ -122,6 +123,9 @@
>  	}
>  	static ijException noSuchProtocol(String c) {
>  		return new ijException(LocalizedResource.getMessage(NoSuchProtocol, c));
> +	}
> +	static ijException noSuchTable(String c) {
> +		return new ijException(LocalizedResource.getMessage(NoSuchTable, c));
>  	}
>  	static public ijException notJDBC20(String operation) {
>  		return new ijException(LocalizedResource.getMessage(NotJDBC20, operation));
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResult.java Wed Aug  9 15:53:53 2006
> @@ -54,6 +54,8 @@
>  	ResultSet getNextRowOfResultSet();
>  	Vector getVector();
>  	SQLException getException();
> +	int[] getColumnDisplayList();
> +	int[] getColumnWidthList();
>  
>  	void closeStatement() throws SQLException ;
>  
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultImpl.java Wed Aug  9 15:53:53 2006
> @@ -53,6 +53,9 @@
>  	public Vector getVector() { return null; }
>  	public SQLException getException() { return null; }
>  
> +	public int[] getColumnDisplayList() { return null; }
> +	public int[] getColumnWidthList() { return null; }
> +
>  	public void closeStatement() throws SQLException { }
>  
>  	public abstract SQLWarning getSQLWarnings() throws SQLException;
> @@ -66,6 +69,10 @@
>  		if (isVector()) return LocalizedResource.getMessage("IJ_Vec0",getVector().toString());
>  		if (isMulti()) return LocalizedResource.getMessage("IJ_Mul0",getVector().toString());
>  		if (isException()) return LocalizedResource.getMessage("IJ_Exc0",getException().toString());
> +		try {
> +			if (isResultSet()) return LocalizedResource.getMessage("IJ_Rse0",getStatement().toString());
> +		} catch(SQLException se) {
> +		}
>  		return LocalizedResource.getMessage("IJ_Unkn0",this.getClass().getName());
>  	}
>  }
> 
> Added: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java?rev=430177&view=auto
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java (added)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java Wed Aug  9 15:53:53 2006
> @@ -0,0 +1,81 @@
> +/*
> +
> +   Derby - Class org.apache.derby.impl.tools.ij.ijResultSetResult
> +
> +   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.derby.impl.tools.ij;
> +
> +import java.sql.Connection;
> +import java.sql.ResultSet;
> +import java.sql.Statement;
> +import java.sql.SQLException;
> +import java.sql.SQLWarning;
> +
> +/**
> + * This impl is intended to be used with a resultset,
> + * where the execution of the statement is already complete.
> + */
> +public class ijResultSetResult extends ijResultImpl {
> +
> +	ResultSet resultSet;
> +	Statement statement;
> +
> +	int[]     displayColumns = null;
> +	int[]     columnWidths = null;
> +
> +	/**
> +	 * Create a ijResultImpl that represents a result set.
> +	 */
> +	public ijResultSetResult(ResultSet r) throws SQLException {
> +		resultSet = r;
> +		statement = resultSet.getStatement();
> +	}
> +
> +	/**
> +	 * Create a ijResultImpl that represents a result set, only
> +	 * displaying a subset of the columns, using specified column widths.
> +	 * 
> +	 * @param r The result set to display
> +	 * @param display Which column numbers to display, or null to display
> +	 *                all columns.
> +	 * @param widths  The widths of the columns specified in 'display', or
> +	 *                null to display using default column sizes.
> +	 */
> +	public ijResultSetResult(ResultSet r, int[] display,
> +							 int[] widths) throws SQLException {
> +		resultSet = r;
> +		statement = resultSet.getStatement();
> +
> +		displayColumns = display;
> +		columnWidths   = widths;
> +	}
> +
> +	public boolean isResultSet() throws SQLException { return statement==null || statement.getUpdateCount() == -1; }
> +
> +	public ResultSet getResultSet() throws SQLException { return resultSet; }
> +
> +	public void closeStatement() throws SQLException { if(statement!=null) statement.close(); else resultSet.close(); }
> +
> +	public int[] getColumnDisplayList() { return displayColumns; }
> +	public int[] getColumnWidthList() { return columnWidths; }
> +
> +	public SQLWarning getSQLWarnings() throws SQLException { return resultSet.getWarnings(); }
> +	public void clearSQLWarnings() throws SQLException { resultSet.clearWarnings(); }
> +}
> 
> Propchange: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/ijResultSetResult.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/util.java Wed Aug  9 15:53:53 2006
> @@ -853,6 +853,35 @@
>  			 (framework.toUpperCase(Locale.ENGLISH).indexOf("JCC") != -1)));
>  	}
>  	
> -
> +	/**
> +	 * Selects the current schema from the given connection.
> +	 * 
> +	 * As there are no way of getting current schema supported by
> +	 * all major DBMS-es, this method may return null.
> +	 * 
> +	 * @param theConnection  Connection to get current schema for
> +	 * @return the current schema of the connection, or null if error.
> +	 */
> +	public static String getSelectedSchema(Connection theConnection) throws SQLException {
> +		String schema = null;
> +                if (theConnection == null)
> +                  return null;
> +		Statement st = theConnection.createStatement();
> +		try {
> +			if(!st.execute("VALUES CURRENT SCHEMA"))
> +				return null;
> +			
> +			ResultSet rs = st.getResultSet();
> +			if(rs==null || !rs.next())
> +				return null;
> +			schema = rs.getString(1);
> +		} catch(SQLException e) {
> +			// There are no standard way of getting schema.
> +			// Getting default schema may fail.
> +		} finally {
> +			st.close();
> +		}
> +		return schema;
> +	}
>  }
>  
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/ij/utilMain.java Wed Aug  9 15:53:53 2006
> @@ -451,6 +451,15 @@
>  					JDBCDisplayUtil.ShowWarnings(out,result.getSQLWarnings());
>  					result.clearSQLWarnings();
>  				}
> +			} else if (result.isResultSet()) {
> +				ResultSet rs = result.getResultSet();
> +				try {
> +					JDBCDisplayUtil.DisplayResults(out,rs,connEnv[currCE].getConnection(), result.getColumnDisplayList(), result.getColumnWidthList());
> +				} catch (SQLException se) {
> +					result.closeStatement();
> +					throw se;
> +				}
> +				result.closeStatement();
>  			} else if (result.isException()) {
>  				JDBCDisplayUtil.ShowException(out,result.getException());
>  			}
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/loc/toolsmessages.properties Wed Aug  9 15:53:53 2006
> @@ -65,6 +65,13 @@
>  \                               -- drop current, named, or all connections;\n\
>  \                               -- the default is CURRENT\n\
>  \ \n\
> +\  SHOW SCHEMAS;                -- lists all schemas in the current database\n\
> +\  SHOW [ TABLES | VIEWS | PROCEDURES | SYNONYMS ] { IN schema };\n\
> +\                               -- lists tables, views, procedures or synonyms\n\
> +\  SHOW INDEXES { IN schema | FROM table };\n\
> +\                               -- lists indexes in a schema, or for a table\n\
> +\  DESCRIBE name;               -- lists columns in the named table\n\
> +\ \n\
>  \  COMMIT;                      -- commits the current transaction\n\
>  \  ROLLBACK;                    -- rolls back the current transaction\n\
>  \ \n\
> @@ -129,6 +136,7 @@
>  IJ_NoAsynStatEx=No async statement exists with the name {0}
>  IJ_NoConnExisWi=No connection exists with the name {0}
>  IJ_NoProtExisWi=No protocol exists with the name {0}
> +IJ_NoSuchTable=No table exists with the name {0}
>  IJ_IsOnlySuppIn={0} is only supported in JDBC 2.0 and greater.
>  IJ_UsinClauHadN=Using clause had no results
>  IJ_UnabToEsta=Unable to establish {0}
> @@ -149,6 +157,7 @@
>  IJ_Vec0=VEC::{0}
>  IJ_Mul0=MUL::{0}
>  IJ_Exc0=EXC::{0}
> +IJ_Rse0=RST::{0}
>  IJ_Unkn0=UNKNOWN::{0}
>  # From util.java
>  IJ_UsageJavaComCloudToolsIjPPropeInput=Usage: java org.apache.derby.tools.ij [-p propertyfile] [-ca connectionAttributePropertyFile] [inputfile]
> 
> Modified: db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java
> URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java?rev=430177&r1=430176&r2=430177&view=diff
> ==============================================================================
> --- db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java (original)
> +++ db/derby/code/trunk/java/tools/org/apache/derby/tools/JDBCDisplayUtil.java Wed Aug  9 15:53:53 2006
> @@ -258,18 +258,20 @@
>  	static public void DisplayResults(PrintWriter out, Statement stmt, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayResults( out, stmt, conn, 0);			
> +		indent_DisplayResults( out, stmt, conn, 0, null, null);			
>  	}
>  
>  	static private void indent_DisplayResults
> -	(PrintWriter out, Statement stmt, Connection conn, int indentLevel)
> +	(PrintWriter out, Statement stmt, Connection conn, int indentLevel,
> +	 int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException {
>  
>  		checkNotNull(stmt, "Statement");
>  
>  		ResultSet rs = stmt.getResultSet();
>  		if (rs != null) {
> -			indent_DisplayResults(out, rs, conn, indentLevel);
> +			indent_DisplayResults(out, rs, conn, indentLevel, 
> +								  displayColumns, displayColumnWidths);
>  			rs.close(); // let the result set go away
>  		}
>  		else {
> @@ -297,20 +299,48 @@
>  	}
>  
>  	/**
> +	    Calculates column display widths from the default widths of the
> +	    result set.
> +	 */
> +	static private int[] getColumnDisplayWidths(ResultSetMetaData rsmd, int[] dispColumns,
> +												boolean localizedOutput)
> +		throws SQLException {
> +		int count = (dispColumns == null) ? rsmd.getColumnCount() : dispColumns.length;
> +		int[] widths = new int[count];
> +
> +		for(int i=0; i<count; i++) {
> +			int colnum = (dispColumns == null) ? (i + 1) : dispColumns[i];
> +			int dispsize = localizedOutput
> +				? LocalizedResource.getInstance().getColumnDisplaySize(rsmd, colnum)
> +                : rsmd.getColumnDisplaySize(colnum);
> +			widths[i] = Math.min(maxWidth,
> +				Math.max((rsmd.isNullable(colnum) == ResultSetMetaData.columnNoNulls)?
> +				0 : MINWIDTH, dispsize));
> +		}
> +		return widths;
> +	}
> +
> +
> +	/**
>  		@param out the place to write to
>  		@param rs the ResultSet to display
>  		@param conn the Connection against which the ResultSet was retrieved
> +	    @param displayColumns Column numbers to display, or null if all
> +	    @param displayColumnWidths Column widths, in characters, if displayColumns is specified.
>  
>  		@exception SQLException on JDBC access failure
>  	 */
> -	static public void DisplayResults(PrintWriter out, ResultSet rs, Connection conn)
> +	static public void DisplayResults(PrintWriter out, ResultSet rs, Connection conn,
> +									  int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException
>  	{
> -		indent_DisplayResults( out, rs, conn, 0);
> +		indent_DisplayResults( out, rs, conn, 0, displayColumns, 
> +							   displayColumnWidths);
>  	}
>  
>  	static private void indent_DisplayResults
> -	(PrintWriter out, ResultSet rs, Connection conn, int indentLevel)
> +	(PrintWriter out, ResultSet rs, Connection conn, int indentLevel, 
> +	 int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException {
>  		ResultSetMetaData rsmd = rs.getMetaData();
>  		checkNotNull(rsmd, "ResultSetMetaData");
> @@ -324,7 +354,11 @@
>  		else
>  			nestedResults = null;
>  
> -		int len = indent_DisplayBanner(out,rsmd, indentLevel);
> +		if(displayColumnWidths == null)
> +			displayColumnWidths = getColumnDisplayWidths(rsmd, displayColumns,true);
> +		
> +		int len = indent_DisplayBanner(out,rsmd, indentLevel, displayColumns,
> +									   displayColumnWidths);
>  
>  		// When displaying rows, keep going past errors
>  		// unless/until the maximum # of errors is reached.
> @@ -335,7 +369,9 @@
>  				doNext = rs.next();
>  				if (doNext) {
>  
> -		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, indentLevel);
> +		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, 
> +							   indentLevel, displayColumns, 
> +							   displayColumnWidths);
>  					ShowWarnings(out, rs);
>  					numberOfRowsSelected++;
>  				}
> @@ -392,7 +428,8 @@
>  			LocalizedResource.OutputWriter().println(b);
>  			LocalizedResource.OutputWriter().println(LocalizedResource.getMessage("UT_Resul0", LocalizedResource.getNumber(i)));
>  			LocalizedResource.OutputWriter().println(b);
> -			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn, indentLevel);
> +			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn,
> +								  indentLevel, null, null);
>  		}
>  	}
>  
> @@ -409,10 +446,12 @@
>  	static public void DisplayNextRow(PrintWriter out, ResultSet rs, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayNextRow( out, rs, conn, 0 );
> +		indent_DisplayNextRow( out, rs, conn, 0, null, (rs == null) ? null
> +							   : getColumnDisplayWidths(rs.getMetaData(), null, true));
>  	}
>  
> -	static private void indent_DisplayNextRow(PrintWriter out, ResultSet rs, Connection conn, int indentLevel )
> +	static private void indent_DisplayNextRow(PrintWriter out, ResultSet rs, Connection conn, int indentLevel,
> +											  int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException {
>  
>  		Vector nestedResults;
> @@ -431,8 +470,9 @@
>  
>  		// Only print stuff out if there is a row to be had.
>  		if (rs.next()) {
> -			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
> -    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
> +			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, displayColumns, displayColumnWidths);
> +    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
> +					   null, null );
>  		}
>  		else {
>  			indentedPrintLine( out, indentLevel, LocalizedResource.getMessage("UT_NoCurreRow"));
> @@ -458,10 +498,12 @@
>  	static public void DisplayCurrentRow(PrintWriter out, ResultSet rs, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayCurrentRow( out, rs, conn, 0 );
> +		indent_DisplayCurrentRow( out, rs, conn, 0, null, (rs == null) ? null
> +								  : getColumnDisplayWidths(rs.getMetaData(), null, true) );
>  	}
>  
> -	static private void indent_DisplayCurrentRow(PrintWriter out, ResultSet rs, Connection conn, int indentLevel )
> +	static private void indent_DisplayCurrentRow(PrintWriter out, ResultSet rs, Connection conn, 
> +												 int indentLevel, int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException {
>  
>  		Vector nestedResults;
> @@ -481,8 +523,9 @@
>  		ResultSetMetaData rsmd = rs.getMetaData();
>  		checkNotNull(rsmd, "ResultSetMetaData");
>  
> -		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
> -   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
> +		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, displayColumns, displayColumnWidths);
> +   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
> +				   displayColumns, displayColumnWidths );
>  
>  		ShowWarnings(out, rs);
>  
> @@ -504,42 +547,38 @@
>  	static public int DisplayBanner(PrintWriter out, ResultSetMetaData rsmd )
>  		throws SQLException
>  	{
> -		return indent_DisplayBanner( out, rsmd, 0 );
> +		return indent_DisplayBanner( out, rsmd, 0, null, 
> +									 getColumnDisplayWidths(rsmd, null, true) );
>  	}
>  
> -	static private int indent_DisplayBanner(PrintWriter out, ResultSetMetaData rsmd, int indentLevel )
> +	static private int indent_DisplayBanner(PrintWriter out, ResultSetMetaData rsmd, int indentLevel,
> +											int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException	{
>  
>  		StringBuffer buf = new StringBuffer();
>  
> -		int numCols = rsmd.getColumnCount();
> +		int numCols = displayColumnWidths.length;
>  		int rowLen;
>  
>  		// do some precalculation so the buffer is allocated only once
>  		// buffer is twice as long as the display length plus one for a newline
>  		rowLen = (numCols - 1); // for the column separators
> -		for (int i=1; i <= numCols; i++) {
> -			rowLen += Math.min(maxWidth,
> -				Math.max((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH, LocalizedResource.getInstance().getColumnDisplaySize(rsmd, i)));
> -		}
> +		for (int i=1; i <= numCols; i++)
> +			rowLen += displayColumnWidths[i-1];
>  		buf.ensureCapacity(rowLen);
>  
>  		// get column header info
>  		// truncate it to the column display width
>  		// add a bar between each item.
>  		for (int i=1; i <= numCols; i++) {
> +			int colnum = displayColumns==null ? i : displayColumns[i-1];
>  
>  			if (i>1)
>  				buf.append('|');
>  
> -			String s = rsmd.getColumnLabel(i);
> +			String s = rsmd.getColumnLabel(colnum);
>  
> -			int w = Math.min(maxWidth,
> -				Math.max(((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH), LocalizedResource.getInstance().getColumnDisplaySize(rsmd, i)));
> +			int w = displayColumnWidths[i-1];
>  
>  			if (s.length() < w) {
>  				
> @@ -592,34 +631,39 @@
>  		@param nestedResults
>  		@param conn
>  		@param indentLevel number of tab stops to indent line
> +	    @param displayColumns A list of column numbers to display
> +	    @param displayColumnWidths If displayColumns is set, the width of
> +								columns to display, in characters.
>  
>  		@exception SQLException thrown on JDBC access failure
>  	 */
> -	static private void DisplayRow(PrintWriter out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel )
> +	static private void DisplayRow(PrintWriter out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel,
> +								   int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException
>  	{
>  		StringBuffer buf = new StringBuffer();
>  		buf.ensureCapacity(rowLen);
>  
> -		int numCols = rsmd.getColumnCount();
> +		int numCols = displayColumnWidths.length;
>  		int i;
>  
>  		// get column header info
>  		// truncate it to the column display width
>  		// add a bar between each item.
>  		for (i=1; i <= numCols; i++){
> +			int colnum = displayColumns==null ? i : displayColumns[i-1];
>  			if (i>1)
>  				buf.append('|');
>  
>  			String s;
> -			switch (rsmd.getColumnType(i)) {
> +			switch (rsmd.getColumnType(colnum)) {
>  			default:
> -				s = LocalizedResource.getInstance().getLocalizedString(rs, rsmd, i );
> +				s = LocalizedResource.getInstance().getLocalizedString(rs, rsmd, colnum );
>  				break;
>  			case org.apache.derby.iapi.reference.JDBC20Translation.SQL_TYPES_JAVA_OBJECT:
>  			case Types.OTHER:
>  			{
> -				Object o = rs.getObject(i);
> +				Object o = rs.getObject(colnum);
>  				if (o == null) { s = "NULL"; }
>  				else if (o instanceof ResultSet && nestedResults != null)
>  				{
> @@ -629,7 +673,7 @@
>  				else
>  				{
>  					try {
> -						s = rs.getString(i);
> +						s = rs.getString(colnum);
>  					} catch (SQLException se) {
>  						// oops, they don't support refetching the column
>  						s = o.toString();
> @@ -640,10 +684,7 @@
>  			}
>  			if (s==null) s = "NULL";
>  
> -			int w = Math.min(maxWidth,
> -				Math.max((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH, LocalizedResource.getInstance().getColumnDisplaySize(rsmd, i)));
> +			int w = displayColumnWidths[i-1];
>  			if (s.length() < w) {
>  				StringBuffer fullS = new StringBuffer(s);
>  				fullS.ensureCapacity(w);
> @@ -816,18 +857,20 @@
>  	static public void DisplayResults(PrintStream out, Statement stmt, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayResults( out, stmt, conn, 0);			
> +		indent_DisplayResults( out, stmt, conn, 0, null, null);			
>  	}
>  
>  	static private void indent_DisplayResults
> -	(PrintStream out, Statement stmt, Connection conn, int indentLevel)
> +	(PrintStream out, Statement stmt, Connection conn, int indentLevel,
> +	 int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException {
>  
>  		checkNotNull(stmt, "Statement");
>  
>  		ResultSet rs = stmt.getResultSet();
>  		if (rs != null) {
> -			indent_DisplayResults(out, rs, conn, indentLevel);
> +			indent_DisplayResults(out, rs, conn, indentLevel, displayColumns,
> +								  displayColumnWidths);
>  			rs.close(); // let the result set go away
>  		}
>  		else {
> @@ -852,11 +895,12 @@
>  	static public void DisplayResults(PrintStream out, ResultSet rs, Connection conn)
>  		throws SQLException
>  	{
> -		indent_DisplayResults( out, rs, conn, 0);
> +		indent_DisplayResults( out, rs, conn, 0, null, null);
>  	}
>  
>  	static private void indent_DisplayResults
> -	(PrintStream out, ResultSet rs, Connection conn, int indentLevel)
> +	(PrintStream out, ResultSet rs, Connection conn, int indentLevel,
> +	 int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException {
>  		ResultSetMetaData rsmd = rs.getMetaData();
>  		checkNotNull(rsmd, "ResultSetMetaData");
> @@ -870,7 +914,11 @@
>  		else
>  			nestedResults = null;
>  
> -		int len = indent_DisplayBanner(out,rsmd, indentLevel);
> +		if(displayColumnWidths == null)
> +			displayColumnWidths = getColumnDisplayWidths(rsmd, displayColumns, false);
> +
> +		int len = indent_DisplayBanner(out,rsmd, indentLevel, displayColumns,
> +									   displayColumnWidths);
>  
>  		// When displaying rows, keep going past errors
>  		// unless/until the maximum # of errors is reached.
> @@ -881,7 +929,9 @@
>  				doNext = rs.next();
>  				if (doNext) {
>  
> -		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, indentLevel);
> +		    		DisplayRow(out, rs, rsmd, len, nestedResults, conn, 
> +							   indentLevel, displayColumns, 
> +							   displayColumnWidths);
>  					ShowWarnings(out, rs);
>  					numberOfRowsSelected++;
>  				}
> @@ -930,17 +980,20 @@
>  			System.out.println(b);
>  			System.out.println(s+i+" +");
>  			System.out.println(b);
> -			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn, indentLevel);
> +			indent_DisplayResults(out, (ResultSet) nr.elementAt(i), conn, 
> +								  indentLevel, null, null);
>  		}
>  	}
>  
>  	static public void DisplayNextRow(PrintStream out, ResultSet rs, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayNextRow( out, rs, conn, 0 );
> +		indent_DisplayNextRow( out, rs, conn, 0, null, (rs == null) ? null
> +							   : getColumnDisplayWidths(rs.getMetaData(),null,false) );
>  	}
>  
> -	static private void indent_DisplayNextRow(PrintStream out, ResultSet rs, Connection conn, int indentLevel )
> +	static private void indent_DisplayNextRow(PrintStream out, ResultSet rs, Connection conn, int indentLevel,
> +											  int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException {
>  
>  		Vector nestedResults;
> @@ -959,8 +1012,9 @@
>  
>  		// Only print stuff out if there is a row to be had.
>  		if (rs.next()) {
> -			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
> -    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
> +			int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, null, null);
> +    		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
> +					   displayColumns, displayColumnWidths);
>  		}
>  		else {
>  			indentedPrintLine( out, indentLevel, LocalizedResource.getMessage("UT_NoCurreRow"));
> @@ -976,10 +1030,12 @@
>  	static public void DisplayCurrentRow(PrintStream out, ResultSet rs, Connection conn )
>  		throws SQLException
>  	{
> -		indent_DisplayCurrentRow( out, rs, conn, 0 );
> +		indent_DisplayCurrentRow( out, rs, conn, 0, null, (rs == null) ? null
> +								  : getColumnDisplayWidths(rs.getMetaData(),null,false) );
>  	}
>  
> -	static private void indent_DisplayCurrentRow(PrintStream out, ResultSet rs, Connection conn, int indentLevel )
> +	static private void indent_DisplayCurrentRow(PrintStream out, ResultSet rs, Connection conn, 
> +												 int indentLevel, int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException {
>  
>  		Vector nestedResults;
> @@ -999,8 +1055,9 @@
>  		ResultSetMetaData rsmd = rs.getMetaData();
>  		checkNotNull(rsmd, "ResultSetMetaData");
>  
> -		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel);
> -   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel );
> +		int rowLen = indent_DisplayBanner(out, rsmd, indentLevel, displayColumns, displayColumnWidths);
> +   		DisplayRow(out, rs, rsmd, rowLen, nestedResults, conn, indentLevel,
> +				   displayColumns, displayColumnWidths);
>  
>  		ShowWarnings(out, rs);
>  
> @@ -1012,26 +1069,24 @@
>  	static public int DisplayBanner(PrintStream out, ResultSetMetaData rsmd )
>  		throws SQLException
>  	{
> -		return indent_DisplayBanner( out, rsmd, 0 );
> +		return indent_DisplayBanner( out, rsmd, 0, null,
> +									 getColumnDisplayWidths(rsmd,null,false) );
>  	}
>  
> -	static private int indent_DisplayBanner(PrintStream out, ResultSetMetaData rsmd, int indentLevel )
> +	static private int indent_DisplayBanner(PrintStream out, ResultSetMetaData rsmd, int indentLevel,
> +											int[] displayColumns, int[] displayColumnWidths )
>  		throws SQLException	{
>  
>  		StringBuffer buf = new StringBuffer();
>  
> -		int numCols = rsmd.getColumnCount();
> +		int numCols = displayColumnWidths.length;
>  		int rowLen;
>  
>  		// do some precalculation so the buffer is allocated only once
>  		// buffer is twice as long as the display length plus one for a newline
>  		rowLen = (numCols - 1); // for the column separators
>  		for (int i=1; i <= numCols; i++) {
> -			rowLen += Math.min(maxWidth,
> -				Math.max((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH,
> -						rsmd.getColumnDisplaySize(i)));
> +			rowLen += displayColumnWidths[i-1];
>  		}
>  		buf.ensureCapacity(rowLen);
>  
> @@ -1039,17 +1094,14 @@
>  		// truncate it to the column display width
>  		// add a bar between each item.
>  		for (int i=1; i <= numCols; i++) {
> +			int colnum = displayColumns==null ? i : displayColumns[i-1];
>  
>  			if (i>1)
>  				buf.append('|');
>  
> -			String s = rsmd.getColumnLabel(i);
> +			String s = rsmd.getColumnLabel(colnum);
>  
> -			int w = Math.min(maxWidth,
> -				Math.max(((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH),
> -						rsmd.getColumnDisplaySize(i)));
> +			int w = displayColumnWidths[i-1];
>  
>  			if (s.length() < w) {
>  				// build a string buffer to hold the whitespace
> @@ -1095,31 +1147,33 @@
>  		return rowLen;
>  	} // DisplayBanner
>  
> -	static private void DisplayRow(PrintStream out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel )
> +	static private void DisplayRow(PrintStream out, ResultSet rs, ResultSetMetaData rsmd, int rowLen, Vector nestedResults, Connection conn, int indentLevel,
> +								   int[] displayColumns, int[] displayColumnWidths)
>  		throws SQLException
>  	{
>  		StringBuffer buf = new StringBuffer();
>  		buf.ensureCapacity(rowLen);
>  
> -		int numCols = rsmd.getColumnCount();
> +		int numCols = displayColumnWidths.length;
>  		int i;
>  
>  		// get column header info
>  		// truncate it to the column display width
>  		// add a bar between each item.
>  		for (i=1; i <= numCols; i++){
> +			int colnum = displayColumns==null ? i : displayColumns[i-1];
>  			if (i>1)
>  				buf.append('|');
>  
>  			String s;
> -			switch (rsmd.getColumnType(i)) {
> +			switch (rsmd.getColumnType(colnum)) {
>  			default:
> -				s = rs.getString(i);
> +				s = rs.getString(colnum);
>  				break;
>  			case org.apache.derby.iapi.reference.JDBC20Translation.SQL_TYPES_JAVA_OBJECT:
>  			case Types.OTHER:
>  			{
> -				Object o = rs.getObject(i);
> +				Object o = rs.getObject(colnum);
>  				if (o == null) { s = "NULL"; }
>  				else if (o instanceof ResultSet && nestedResults != null)
>  				{
> @@ -1129,7 +1183,7 @@
>  				else
>  				{
>  					try {
> -						s = rs.getString(i);
> +						s = rs.getString(colnum);
>  					} catch (SQLException se) {
>  						// oops, they don't support refetching the column
>  						s = o.toString();
> @@ -1141,11 +1195,7 @@
>  
>  			if (s==null) s = "NULL";
>  
> -			int w = Math.min(maxWidth,
> -				Math.max((rsmd.isNullable(i) == 
> -							ResultSetMetaData.columnNoNulls)?
> -							0 : MINWIDTH,
> -						rsmd.getColumnDisplaySize(i)));
> +			int w = displayColumnWidths[i-1];
>  			if (s.length() < w) {
>  				StringBuffer fullS = new StringBuffer(s);
>  				fullS.ensureCapacity(w);
> 
>