byte[][] tuple1 = (byte[][])tuple.clone();
Object[] tuple1 = (Object[])tuple.clone();
	public java.sql.ResultSet getTypeInfo() throws SQLException	{		ResultSetField f[] = new ResultSetField[18];		ArrayList v = new ArrayList(); // The new ResultSet tuple stuff		f[0] = new ResultSetField("TYPE_NAME", TypeOid.VARCHAR,			getMaxNameLength());		f[1] = new ResultSetField("DATA_TYPE", TypeOid.INT2, 2);		f[2] = new ResultSetField("PRECISION", TypeOid.INT4, 4);		f[3] = new ResultSetField("LITERAL_PREFIX", TypeOid.VARCHAR,			getMaxNameLength());		f[4] = new ResultSetField("LITERAL_SUFFIX", TypeOid.VARCHAR,			getMaxNameLength());		f[5] = new ResultSetField("CREATE_PARAMS", TypeOid.VARCHAR,			getMaxNameLength());		f[6] = new ResultSetField("NULLABLE", TypeOid.INT2, 2);		f[7] = new ResultSetField("CASE_SENSITIVE", TypeOid.BOOL, 1);		f[8] = new ResultSetField("SEARCHABLE", TypeOid.INT2, 2);		f[9] = new ResultSetField("UNSIGNED_ATTRIBUTE", TypeOid.BOOL, 1);		f[10] = new ResultSetField("FIXED_PREC_SCALE", TypeOid.BOOL, 1);		f[11] = new ResultSetField("AUTO_INCREMENT", TypeOid.BOOL, 1);		f[12] = new ResultSetField("LOCAL_TYPE_NAME", TypeOid.VARCHAR,			getMaxNameLength());		f[13] = new ResultSetField("MINIMUM_SCALE", TypeOid.INT2, 2);		f[14] = new ResultSetField("MAXIMUM_SCALE", TypeOid.INT2, 2);		f[15] = new ResultSetField("SQL_DATA_TYPE", TypeOid.INT4, 4);		f[16] = new ResultSetField("SQL_DATETIME_SUB", TypeOid.INT4, 4);		f[17] = new ResultSetField("NUM_PREC_RADIX", TypeOid.INT4, 4);		String sql = "SELECT typname FROM pg_catalog.pg_type where typrelid = 0";		ResultSet rs = m_connection.createStatement().executeQuery(sql);		// cache some results, this will keep memory useage down, and speed		// things up a little.		byte b9[] = encodeString("9");		byte b10[] = encodeString("10");		byte bf[] = encodeString("f");		byte bt[] = encodeString("t");		byte bnn[] = encodeString(Integer			.toString(java.sql.DatabaseMetaData.typeNoNulls));		byte bts[] = encodeString(Integer			.toString(java.sql.DatabaseMetaData.typeSearchable));		while(rs.next())		{			byte[][] tuple = new byte[18][];			String typname = rs.getString(1);			tuple[0] = encodeString(typname);			tuple[1] = encodeString(Integer.toString(m_connection				.getSQLType(typname)));			tuple[2] = b9; // for now			tuple[6] = bnn; // for now			tuple[7] = bf; // false for now - not case sensitive			tuple[8] = bts;			tuple[9] = bf; // false for now - it's signed			tuple[10] = bf; // false for now - must handle money			tuple[11] = bf; // false - it isn't autoincrement			// 12 - LOCAL_TYPE_NAME is null			// 13 & 14 ?			// 15 & 16 are unused so we return null			tuple[17] = b10; // everything is base 10			v.add(tuple);			// add pseudo-type serial, bigserial			if(typname.equals("int4"))			{				byte[][] tuple1 = (byte[][])tuple.clone();				tuple1[0] = encodeString("serial");				tuple1[11] = bt;				v.add(tuple1);			}			else if(typname.equals("int8"))			{				byte[][] tuple1 = (byte[][])tuple.clone();				tuple1[0] = encodeString("bigserial");				tuple1[11] = bt;				v.add(tuple1);			}		}		rs.close();		return createSyntheticResultSet(f, v);	}