### Eclipse Workspace Patch 1.0 #P postgres jdbc Index: org/postgresql/jdbc2/AbstractJdbc2DatabaseMetaData.java =================================================================== RCS file: /usr/local/cvsroot/pgjdbc/pgjdbc/org/postgresql/jdbc2/AbstractJdbc2DatabaseMetaData.java,v retrieving revision 1.33 diff -u -r1.33 AbstractJdbc2DatabaseMetaData.java --- org/postgresql/jdbc2/AbstractJdbc2DatabaseMetaData.java 1 Dec 2006 08:53:45 -0000 1.33 +++ org/postgresql/jdbc2/AbstractJdbc2DatabaseMetaData.java 14 Feb 2007 07:37:19 -0000 @@ -1724,9 +1724,18 @@ String sql; if (connection.haveMinimumServerVersion("7.3")) { - sql = "SELECT n.nspname,p.proname,p.prorettype,p.proargtypes, t.typtype,t.typrelid " + + sql = "SELECT n.nspname,p.proname,p.prorettype,p.proargtypes, "; + + if(connection.haveMinimumServerVersion("8.0")) + sql += "p.proargnames,"; + + if(connection.haveMinimumServerVersion("8.1")) + sql += "p.proargmodes,"; + + sql += "t.typtype,t.typrelid " + " FROM pg_catalog.pg_proc p,pg_catalog.pg_namespace n, pg_catalog.pg_type t " + " WHERE p.pronamespace=n.oid AND p.prorettype=t.oid "; + if (schemaPattern != null && !"".equals(schemaPattern)) { sql += " AND n.nspname LIKE '" + escapeQuotes(schemaPattern) + "' "; @@ -1758,13 +1767,23 @@ String returnTypeType = rs.getString("typtype"); int returnTypeRelid = rs.getInt("typrelid"); String strArgTypes = rs.getString("proargtypes"); - StringTokenizer st = new StringTokenizer(strArgTypes); + + String strArgNames[] = null; + Array argNamesArray = rs.getArray("proargnames"); + if(argNamesArray != null) + strArgNames = (String[])argNamesArray.getArray(); + String strArgModes[] = null; + Array argModesArray = rs.getArray("proargmodes"); + if(argModesArray != null) + strArgModes = (String[])argModesArray.getArray(); + StringTokenizer st = new StringTokenizer(strArgTypes); Vector argTypes = new Vector(); while (st.hasMoreTokens()) { argTypes.addElement(new Integer(st.nextToken())); } - + + // decide if we are returning a single column result. if (!returnTypeType.equals("c")) { @@ -1786,17 +1805,65 @@ } // Add a row for each argument. - for (int i = 0; i < argTypes.size(); i++) + + int numRows = 0; + if(strArgNames != null) + numRows = strArgNames.length; + else + numRows = argTypes.size(); + int j = 0; //argType counter + for (int i = 0; i < numRows; i++) { - int argOid = ((Integer)argTypes.elementAt(i)).intValue(); byte[][] tuple = new byte[13][]; tuple[0] = null; tuple[1] = schema; tuple[2] = procedureName; - tuple[3] = connection.encodeString("$" + (i + 1)); - tuple[4] = connection.encodeString(Integer.toString(java.sql.DatabaseMetaData.procedureColumnIn)); - tuple[5] = connection.encodeString(Integer.toString(connection.getSQLType(argOid))); - tuple[6] = connection.encodeString(connection.getPGType(argOid)); + + if(strArgNames != null) + { + tuple[3] = connection.encodeString(strArgNames[i]); + } + else + { + tuple[3] = connection.encodeString("$" + (i + 1)); + } + + if(strArgModes != null) + { + + tuple[4] = connection.encodeString(Integer.toString(java.sql.DatabaseMetaData.procedureColumnUnknown)); + if(strArgModes[i].equals("i")) + { + int argOid = ((Integer)argTypes.elementAt(j)).intValue(); + tuple[4] = connection.encodeString(Integer.toString(java.sql.DatabaseMetaData.procedureColumnIn)); + tuple[5] = connection.encodeString(Integer.toString(connection.getSQLType(argOid))); + tuple[6] = connection.encodeString(connection.getPGType(argOid)); + j++; + } + if(strArgModes[i].equals("o")) + { + tuple[4] = connection.encodeString(Integer.toString(java.sql.DatabaseMetaData.procedureColumnOut)); + tuple[5] = null; + tuple[6] = null; + } + if(strArgModes[i].equals("b")) + { + int argOid = ((Integer)argTypes.elementAt(j)).intValue(); + tuple[4] = connection.encodeString(Integer.toString(java.sql.DatabaseMetaData.procedureColumnInOut)); + tuple[5] = connection.encodeString(Integer.toString(connection.getSQLType(argOid))); + tuple[6] = connection.encodeString(connection.getPGType(argOid)); + j++; + } + } + else + { + int argOid = ((Integer)argTypes.elementAt(j)).intValue(); + tuple[4] = connection.encodeString(Integer.toString(java.sql.DatabaseMetaData.procedureColumnIn)); + tuple[5] = connection.encodeString(Integer.toString(connection.getSQLType(argOid))); + tuple[6] = connection.encodeString(connection.getPGType(argOid)); + j++; + } + tuple[7] = null; tuple[8] = null; tuple[9] = null;