Thread: Allow the jdbc driver to retrieve NAMEDATALEN
Make the DatabaseMetaData class query the backend to determine the maximum name length instead of guessing. Also the maximum name length is NAMEDATALEN - 1. Kris JurkaIndex: src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java,v retrieving revision 1.5 diff -c -r1.5 AbstractJdbc1DatabaseMetaData.java *** src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java 2002/09/08 00:15:28 1.5 --- src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java 2002/09/08 02:11:04 *************** *** 27,45 **** protected static final int iInt2Oid = 21; // OID for int2 protected static final int iInt4Oid = 23; // OID for int4 protected static final int VARHDRSZ = 4; // length for int4 ! protected static int NAME_SIZE = 64; // length for name datatype public AbstractJdbc1DatabaseMetaData(AbstractJdbc1Connection conn) { this.connection = conn; try { if (connection.haveMinimumServerVersion("7.3")) { ! NAME_SIZE = 64; } else { ! NAME_SIZE = 32; } } catch (SQLException l_se) { ! //leave value at default } } --- 27,54 ---- protected static final int iInt2Oid = 21; // OID for int2 protected static final int iInt4Oid = 23; // OID for int4 protected static final int VARHDRSZ = 4; // length for int4 ! protected static int NAME_SIZE = 63; // length for name datatype public AbstractJdbc1DatabaseMetaData(AbstractJdbc1Connection conn) { this.connection = conn; + String sql; try { if (connection.haveMinimumServerVersion("7.3")) { ! sql = "SELECT t.typlen FROM pg_catalog.pg_type t, pg_catalog.pg_namespace n WHERE t.typnamespace=n.oidAND t.typname='name' AND n.nspname='pg_catalog'"; ! NAME_SIZE = 63; } else { ! sql = "SELECT typlen FROM pg_type WHERE typname='name'"; ! NAME_SIZE = 31; } + ResultSet rs = connection.createStatement().executeQuery(sql); + if (rs.next()) { + NAME_SIZE = rs.getInt("typlen") - 1; + } + rs.close(); } catch (SQLException l_se) { ! // depending on the error the NAME_SIZE value will ! // be the original or the value set before the query. } }
Patch applied. --Barry Kris Jurka wrote: > > Make the DatabaseMetaData class query the backend to determine the > maximum name length instead of guessing. > > Also the maximum name length is NAMEDATALEN - 1. > > Kris Jurka > > > ------------------------------------------------------------------------ > > Index: src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java > =================================================================== > RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java,v > retrieving revision 1.5 > diff -c -r1.5 AbstractJdbc1DatabaseMetaData.java > *** src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java 2002/09/08 00:15:28 1.5 > --- src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java 2002/09/08 02:11:04 > *************** > *** 27,45 **** > protected static final int iInt2Oid = 21; // OID for int2 > protected static final int iInt4Oid = 23; // OID for int4 > protected static final int VARHDRSZ = 4; // length for int4 > ! protected static int NAME_SIZE = 64; // length for name datatype > > public AbstractJdbc1DatabaseMetaData(AbstractJdbc1Connection conn) > { > this.connection = conn; > try { > if (connection.haveMinimumServerVersion("7.3")) { > ! NAME_SIZE = 64; > } else { > ! NAME_SIZE = 32; > } > } catch (SQLException l_se) { > ! //leave value at default > } > } > > --- 27,54 ---- > protected static final int iInt2Oid = 21; // OID for int2 > protected static final int iInt4Oid = 23; // OID for int4 > protected static final int VARHDRSZ = 4; // length for int4 > ! protected static int NAME_SIZE = 63; // length for name datatype > > public AbstractJdbc1DatabaseMetaData(AbstractJdbc1Connection conn) > { > this.connection = conn; > + String sql; > try { > if (connection.haveMinimumServerVersion("7.3")) { > ! sql = "SELECT t.typlen FROM pg_catalog.pg_type t, pg_catalog.pg_namespace n WHERE t.typnamespace=n.oidAND t.typname='name' AND n.nspname='pg_catalog'"; > ! NAME_SIZE = 63; > } else { > ! sql = "SELECT typlen FROM pg_type WHERE typname='name'"; > ! NAME_SIZE = 31; > } > + ResultSet rs = connection.createStatement().executeQuery(sql); > + if (rs.next()) { > + NAME_SIZE = rs.getInt("typlen") - 1; > + } > + rs.close(); > } catch (SQLException l_se) { > ! // depending on the error the NAME_SIZE value will > ! // be the original or the value set before the query. > } > } > > > > > ------------------------------------------------------------------------ > > > ---------------------------(end of broadcast)--------------------------- > TIP 6: Have you searched our list archives? > > http://archives.postgresql.org