* a catalog name; "" retrieves those without a catalog @param schema a
	 * schema name; "" retrieves those without a schema @param table a table
	 * name @return ResultSet each row is a column description
	 */
	public java.sql.ResultSet getVersionColumns(String catalog, String schema,
		String table) throws SQLException
	{
		ResultSetField f[] = new ResultSetField[8];
		ArrayList v = new ArrayList(); // The new ResultSet tuple stuff

		f[0] = new ResultSetField("SCOPE", TypeOid.INT2, 2);
		f[1] = new ResultSetField("COLUMN_NAME", TypeOid.VARCHAR,
			getMaxNameLength());
		f[2] = new ResultSetField("DATA_TYPE", TypeOid.INT2, 2);
		f[3] = new ResultSetField("TYPE_NAME", TypeOid.VARCHAR,
			getMaxNameLength());
		f[4] = new ResultSetField("COLUMN_SIZE", TypeOid.INT4, 4);
		f[5] = new ResultSetField("BUFFER_LENGTH", TypeOid.INT4, 4);
		f[6] = new ResultSetField("DECIMAL_DIGITS", TypeOid.INT2, 2);
		f[7] = new ResultSetField("PSEUDO_COLUMN", TypeOid.INT2, 2);

		Object[] tuple = new Object[8];

		/*
		 * Postgresql does not have any column types that are automatically
		 * updated like some databases' timestamp type. We can't tell what rules
		 * or triggers might be doing, so we are left with the system columns
		 * that change on an update. An update may change all of the following
		 * system columns: ctid, xmax, xmin, cmax, and cmin. Depending on if we
		 * are in a transaction and wether we roll it back or not the only
		 * guaranteed change is to ctid. -KJ
		 */

		tuple[0] = null;
		tuple[1] = "ctid";
		tuple[2] = new Short((short)m_connection.getSQLType("tid"));
		tuple[3] = "tid";
		tuple[4] = null;
		tuple[5] = null;
		tuple[6] = null;
		tuple[7] = new Short((short)java.sql.DatabaseMetaData.versionColumnPseudo);
		v.add(tuple);

		/*
		 * Perhaps we should check that the given catalog.schema.table actually
		 * exists. -KJ
		 */
		return createSyntheticResultSet(f, v);
	}