diff --git a/src/interfaces/jdbc/CHANGELOG b/src/interfaces/jdbc/CHANGELOG index 830e942b1402d78f4abe0f8467272f79e1716f3d..68b2aa66fad913da3921b02dc9c4ff319d7ee22a 100644 --- a/src/interfaces/jdbc/CHANGELOG +++ b/src/interfaces/jdbc/CHANGELOG @@ -1,3 +1,18 @@ +Mon Sep 13 23:56:00 BST 1999 peter@retep.org.uk + - PG_Stream.SendChar() optimised, increased default buffer size of + output stream to 8k, and introduced an 8k buffer on the input stream + Sverre H Huseby <sverrehu@online.no> + - Added a finalize() method to Connection class in both drivers so that + the connection to the backend is really closed. + - Due to many JVM's not returning a meaningful value for java.version + the decision for building the JDBC1.2 or JDBC2 driver is now a + compile time option. + - Replaced $$(cmd...) with `cmd...` in the Makefile. This should allow + the driver to compile when using shells other than Bash. + +Sun Aug 1 18:05:42 CEST 1999 jens@jens.de + - added support for getTransactionIsolation and setTransactionIsolation + Sun Jun 27 12:00:00 BST 1999 - Fixed typo in postgresql.Driver that prevented compilation - Implemented getTimestamp() fix submitted by Philipp Matthias Hahn diff --git a/src/interfaces/jdbc/Makefile b/src/interfaces/jdbc/Makefile index d942767b0cef0039fe978dbbb5e8200b09b3aea2..c328689aa3d07e9ffdd43c5486c4d29abb4b3ce1 100644 --- a/src/interfaces/jdbc/Makefile +++ b/src/interfaces/jdbc/Makefile @@ -4,7 +4,7 @@ # Makefile for Java JDBC interface # # IDENTIFICATION -# $Header: /cvsroot/pgsql/src/interfaces/jdbc/Attic/Makefile,v 1.14 1999/06/23 05:56:17 peter Exp $ +# $Header: /cvsroot/pgsql/src/interfaces/jdbc/Attic/Makefile,v 1.15 1999/09/14 05:50:27 peter Exp $ # #------------------------------------------------------------------------- @@ -12,7 +12,7 @@ FIND = find IDL2JAVA = idltojava -fno-cpp -fno-tie JAR = jar JAVA = java -JAVAC = javac +JAVAC = javac -g JAVADOC = javadoc RM = rm -f TOUCH = touch @@ -22,12 +22,26 @@ TOUCH = touch $(JAVAC) $< .SUFFIXES: .class .java -.PHONY: all clean doc examples +.PHONY: all clean doc examples msg # In 6.5, the all rule builds the makeVersion class which then calls make using # the jdbc1 or jdbc2 rules -all: makeVersion.class - make $$($(JAVA) makeVersion) +all: + @echo ------------------------------------------------------------ + @echo Due to problems with some JVMs that dont return a meaningful + @echo version number, we have had to make the choice of what jdbc + @echo version is built as a compile time option. + @echo + @echo If you are using JDK1.1.x, you will need the JDBC1.2 driver. + @echo To compile, type: + @echo " make jdbc1" + @echo + @echo "If you are using JDK1.2 (aka Java2) you need the JDBC2." + @echo To compile, type: + @echo " make jdbc2" + @echo ------------------------------------------------------------ + +msg: @echo ------------------------------------------------------------ @echo The JDBC driver has now been built. To make it available to @echo other applications, copy the postgresql.jar file to a public @@ -107,34 +121,29 @@ OBJ_JDBC2= postgresql/jdbc2/ResultSet.class \ postgresql/jdbc2/ResultSetMetaData.class \ postgresql/jdbc2/Statement.class -# This rule should never occur, but will be called when makeVersion fails to -# understand the java.version property correctly. -jdbc0: - @echo - @echo FATAL ERROR! - @echo - @echo makeVersion has not been able to determine what version of - @echo the JDK you are using, and hence what version of the driver - @echo to compile. - @echo - @echo There are two versions available, one that conforms to the - @echo JDBC 1 specification, and one to the JDBC 2 specification. - @echo - @echo To build the driver for JDBC 1 (usually for JDK 1.1 thru 1.1.7) - @echo then type: make jdbc1 - @echo - @echo To build the driver for JDBC 2 (usually for JDK 1.2 and later) - @echo then type: make jdbc2 - @echo - @echo If you still have problems, then please email the interfaces - @echo or bugs lists, or better still to me direct (peter@retep.org.uk) - @echo - # This rule builds the JDBC1 compliant driver -jdbc1: $(OBJ_COMMON) $(OBJ_JDBC1) postgresql.jar +jdbc1: + (echo "package postgresql;" ;\ + echo "public class DriverClass {" ;\ + echo "public static String connectClass=\"postgresql.jdbc1.Connection\";" ;\ + echo "}" \ + ) >postgresql/DriverClass.java + @$(MAKE) jdbc1real + +jdbc2real: postgresql/DriverClass.class \ + $(OBJ_COMMON) $(OBJ_JDBC2) postgresql.jar msg # This rule builds the JDBC2 compliant driver -jdbc2: $(OBJ_COMMON) $(OBJ_JDBC2) postgresql.jar +jdbc2: + (echo "package postgresql;" ;\ + echo "public class DriverClass {" ;\ + echo "public static String connectClass=\"postgresql.jdbc2.Connection\";" ;\ + echo "}" \ + ) >postgresql/DriverClass.java + @$(MAKE) jdbc2real + +jdbc2real: postgresql/DriverClass.class \ + $(OBJ_COMMON) $(OBJ_JDBC2) postgresql.jar msg # If you have problems with this rule, replace the $( ) with ` ` as some # shells (mainly sh under Solaris) doesn't recognise $( ) @@ -143,7 +152,7 @@ jdbc2: $(OBJ_COMMON) $(OBJ_JDBC2) postgresql.jar # directory. We use this later for compiling the dual-mode driver. # postgresql.jar: $(OBJ) $(OBJ_COMMON) - $(JAR) -c0f $@ $$($(FIND) postgresql -name "*.class" -print) \ + $(JAR) -c0f $@ `$(FIND) postgresql -name "*.class" -print` \ $(wildcard postgresql/*.properties) # This rule removes any temporary and compiled files from the source tree. diff --git a/src/interfaces/jdbc/makeVersion.java b/src/interfaces/jdbc/makeVersion.java deleted file mode 100644 index 3badfa9354c4968429676e8af7dfa37d9a40ea92..0000000000000000000000000000000000000000 --- a/src/interfaces/jdbc/makeVersion.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * This class is used by the makefile to determine which version of the - * JDK is currently in use, and if it's using JDK1.1.x then it returns JDBC1 - * and if later, it returns JDBC2 - * - * $Id: makeVersion.java,v 1.1 1999/01/17 04:51:49 momjian Exp $ - */ -public class makeVersion -{ - public static void main(String[] args) { - String key = "java.version"; - String version = System.getProperty(key); - - //System.out.println(key+" = \""+version+"\""); - - // Tip: use print not println here as println breaks the make that - // comes with CygWin-B20.1 - - if(version.startsWith("1.0")) { - // This will trigger the unknown rule in the makefile - System.out.print("jdbc0"); - } else if(version.startsWith("1.1")) { - // This will trigger the building of the JDBC 1 driver - System.out.print("jdbc1"); - } else { - // This will trigger the building of the JDBC 2 driver - System.out.print("jdbc2"); - } - } -} diff --git a/src/interfaces/jdbc/postgresql/Connection.java b/src/interfaces/jdbc/postgresql/Connection.java index fc30b4dfd6c0e996ce7a0c0fcf7d986abe97e4f4..5433e336c7b7661be4825e67e9a3d2bf532936dc 100644 --- a/src/interfaces/jdbc/postgresql/Connection.java +++ b/src/interfaces/jdbc/postgresql/Connection.java @@ -10,7 +10,7 @@ import postgresql.largeobject.*; import postgresql.util.*; /** - * $Id: Connection.java,v 1.17 1999/05/18 23:17:15 peter Exp $ + * $Id: Connection.java,v 1.18 1999/09/14 05:50:33 peter Exp $ * * This abstract class is used by postgresql.Driver to open either the JDBC1 or * JDBC2 versions of the Connection class. @@ -692,4 +692,17 @@ public abstract class Connection * version (from jdbc1 or jdbc2) are returned. */ protected abstract java.sql.ResultSet getResultSet(postgresql.Connection conn, Field[] fields, Vector tuples, String status, int updateCount) throws SQLException; + + /** + * Overides finalize(). If called, it closes the connection. + * + * This was done at the request of Rachel Greenham + * <rachel@enlarion.demon.co.uk> who hit a problem where multiple + * clients didn't close the connection, and once a fortnight enough + * clients were open to kill the postgres server. + */ + public void finalize() throws Throwable + { + close(); + } } diff --git a/src/interfaces/jdbc/postgresql/Driver.java b/src/interfaces/jdbc/postgresql/Driver.java index 06c890309790228565f9414fe6510a120ea35257..67d06e8129dc77cd81566c1da970a38f5d929def 100644 --- a/src/interfaces/jdbc/postgresql/Driver.java +++ b/src/interfaces/jdbc/postgresql/Driver.java @@ -31,9 +31,6 @@ public class Driver implements java.sql.Driver static final int MAJORVERSION = 6; static final int MINORVERSION = 5; - // Cache the version of the JDK in use - static String connectClass; - static { try { @@ -56,11 +53,27 @@ public class Driver implements java.sql.Driver { // Set the connectClass variable so that future calls will handle the correct // base class - if(System.getProperty("java.version").startsWith("1.1")) { - connectClass = "postgresql.jdbc1.Connection"; - } else { - connectClass = "postgresql.jdbc2.Connection"; - } + //if(System.getProperty("java.version").startsWith("1.1")) { + //connectClass = "postgresql.jdbc1.Connection"; + //} else { + //connectClass = "postgresql.jdbc2.Connection"; + //} + + // Ok, when the above code was introduced in 6.5 it's intention was to allow + // the driver to automatically detect which version of JDBC was being used + // and to detect the version of the JVM accordingly. + // + // It did this by using the java.version parameter. + // + // However, it was quickly discovered that not all JVM's returned an easily + // parseable version number (ie "1.2") and some don't return a value at all. + // The latter came from a discussion on the advanced java list. + // + // So, to solve this, I've moved the decision out of the driver, and it's now + // a compile time parameter. + // + // For this to work, the Makefile creates a pseudo class which contains the class + // name that will actually make the connection. } /** @@ -96,10 +109,10 @@ public class Driver implements java.sql.Driver if((props = parseURL(url,info))==null) return null; - DriverManager.println("Using "+connectClass); + DriverManager.println("Using "+DriverClass.connectClass); try { - postgresql.Connection con = (postgresql.Connection)(Class.forName(connectClass).newInstance()); + postgresql.Connection con = (postgresql.Connection)(Class.forName(DriverClass.connectClass).newInstance()); con.openConnection (host(), port(), props, database(), url, this); return (java.sql.Connection)con; } catch(ClassNotFoundException ex) { @@ -302,8 +315,10 @@ public class Driver implements java.sql.Driver // PM June 29 1997 // This now outputs the properties only if we are logging - if(DriverManager.getLogStream() != null) - urlProps.list(DriverManager.getLogStream()); + // PM Sep 13 1999 Commented out, as it throws a Deprecation warning + // when compiled under JDK1.2. + //if(DriverManager.getLogStream() != null) + // urlProps.list(DriverManager.getLogStream()); return urlProps; diff --git a/src/interfaces/jdbc/postgresql/PG_Stream.java b/src/interfaces/jdbc/postgresql/PG_Stream.java index e2ee91ac2f76af3f379f101c033242078d9741b1..d5816b634c9f63e53d525b2937fd698ad4420dfa 100644 --- a/src/interfaces/jdbc/postgresql/PG_Stream.java +++ b/src/interfaces/jdbc/postgresql/PG_Stream.java @@ -39,8 +39,9 @@ public class PG_Stream // improvement on FreeBSD machines (caused by a bug in their TCP Stack) connection.setTcpNoDelay(true); - pg_input = connection.getInputStream(); - pg_output = new BufferedOutputStream(connection.getOutputStream()); + // Buffer sizes submitted by Sverre H Huseby <sverrehu@online.no> + pg_input = new BufferedInputStream(connection.getInputStream(), 8192); + pg_output = new BufferedOutputStream(connection.getOutputStream(), 8192); } /** @@ -51,9 +52,13 @@ public class PG_Stream */ public void SendChar(int val) throws IOException { - byte b[] = new byte[1]; - b[0] = (byte)val; - pg_output.write(b); + // Original code + //byte b[] = new byte[1]; + //b[0] = (byte)val; + //pg_output.write(b); + + // Optimised version by Sverre H. Huseby Aug 22 1999 Applied Sep 13 1999 + pg_output.write((byte)val); } /** diff --git a/src/interfaces/jdbc/postgresql/errors.properties b/src/interfaces/jdbc/postgresql/errors.properties index 53b43c4227e3d51e75ea387d26ab43bdccef13bf..1c295ccc6d65e9f1c0da982ce489e3eb241704a8 100644 --- a/src/interfaces/jdbc/postgresql/errors.properties +++ b/src/interfaces/jdbc/postgresql/errors.properties @@ -15,6 +15,7 @@ postgresql.con.refused:Connection refused. Check that the hostname and port is c postgresql.con.strobj:The object could not be stored. Check that any tables required have already been created in the database. postgresql.con.strobjex:Failed to store object - {0} postgresql.con.toolong:The SQL Statement is too long - {0} +postgresql.con.isolevel:Transaction isolation level {0} is not supported. postgresql.con.tuple:Tuple received before MetaData. postgresql.con.type:Unknown Response Type {0} postgresql.con.user:The user property is missing. It is mandatory. diff --git a/src/interfaces/jdbc/postgresql/jdbc1/Connection.java b/src/interfaces/jdbc/postgresql/jdbc1/Connection.java index f7c88c579a26647c1f55ae8020e7bc5a5a0cc808..7a83e6f114e476a10b90cac8443d4ee84ce16d3d 100644 --- a/src/interfaces/jdbc/postgresql/jdbc1/Connection.java +++ b/src/interfaces/jdbc/postgresql/jdbc1/Connection.java @@ -17,7 +17,7 @@ import postgresql.largeobject.*; import postgresql.util.*; /** - * $Id: Connection.java,v 1.2 1999/05/18 23:17:21 peter Exp $ + * $Id: Connection.java,v 1.3 1999/09/14 05:50:39 peter Exp $ * * A Connection represents a session with a specific database. Within the * context of a Connection, SQL statements are executed and results are @@ -216,7 +216,7 @@ public class Connection extends postgresql.Connection implements java.sql.Connec pg_stream = null; } } - + /** * Tests to see if a Connection is closed * @@ -311,9 +311,23 @@ public class Connection extends postgresql.Connection implements java.sql.Connec */ public void setTransactionIsolation(int level) throws SQLException { - throw postgresql.Driver.notImplemented(); + String q = "SET TRANSACTION ISOLATION LEVEL"; + + switch(level) { + + case java.sql.Connection.TRANSACTION_READ_COMMITTED: + ExecSQL(q + " READ COMMITTED"); + return; + + case java.sql.Connection.TRANSACTION_SERIALIZABLE: + ExecSQL(q + " SERIALIZABLE"); + return; + + default: + throw new PSQLException("postgresql.con.isolevel",new Integer(level)); + } } - + /** * Get this Connection's current transaction isolation mode. * @@ -322,9 +336,18 @@ public class Connection extends postgresql.Connection implements java.sql.Connec */ public int getTransactionIsolation() throws SQLException { - return java.sql.Connection.TRANSACTION_SERIALIZABLE; + ExecSQL("show xactisolevel"); + + SQLWarning w = getWarnings(); + if (w != null) { + if (w.getMessage().indexOf("READ COMMITTED") != -1) return java.sql.Connection.TRANSACTION_READ_COMMITTED; else + if (w.getMessage().indexOf("READ UNCOMMITTED") != -1) return java.sql.Connection.TRANSACTION_READ_UNCOMMITTED; else + if (w.getMessage().indexOf("REPEATABLE READ") != -1) return java.sql.Connection.TRANSACTION_REPEATABLE_READ; else + if (w.getMessage().indexOf("SERIALIZABLE") != -1) return java.sql.Connection.TRANSACTION_SERIALIZABLE; + } + return java.sql.Connection.TRANSACTION_READ_COMMITTED; } - + /** * The first warning reported by calls on this Connection is * returned. diff --git a/src/interfaces/jdbc/postgresql/jdbc1/DatabaseMetaData.java b/src/interfaces/jdbc/postgresql/jdbc1/DatabaseMetaData.java index b7e90e8768adff5cce7cc8b59f48ee79ea474740..84130f2cb46a14d0876f362fa3e03c5699a8f476 100644 --- a/src/interfaces/jdbc/postgresql/jdbc1/DatabaseMetaData.java +++ b/src/interfaces/jdbc/postgresql/jdbc1/DatabaseMetaData.java @@ -179,7 +179,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public String getDatabaseProductVersion() throws SQLException { - return ("6.4"); + return ("6.5.2"); } /** @@ -1350,7 +1350,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public int getDefaultTransactionIsolation() throws SQLException { - return Connection.TRANSACTION_SERIALIZABLE; + return Connection.TRANSACTION_READ_COMMITTED; } /** @@ -1368,7 +1368,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData /** * Does the database support the given transaction isolation level? - * We only support TRANSACTION_SERIALIZABLE + * We only support TRANSACTION_SERIALIZABLE and TRANSACTION_READ_COMMITTED * * @param level the values are defined in java.sql.Connection * @return true if so @@ -1377,10 +1377,11 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public boolean supportsTransactionIsolationLevel(int level) throws SQLException { - if (level == Connection.TRANSACTION_SERIALIZABLE) - return true; - else - return false; + if (level == Connection.TRANSACTION_SERIALIZABLE || + level == Connection.TRANSACTION_READ_COMMITTED) + return true; + else + return false; } /** @@ -2151,21 +2152,19 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData public java.sql.ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException { return connection.createStatement().executeQuery("SELECT " + - "'' as TABLE_CAT," + - "'' AS TABLE_SCHEM," + - "bc.relname AS TABLE_NAME," + - "ic.relname AS COLUMN_NAME," + - "'1' as KEY_SEQ,"+ // -- fake it as a String for now - "t.typname as PK_NAME " + - " FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a, pg_type t " + - " WHERE bc.relkind = 'r' " + // -- not indices - " and bc.relname ~ '"+table+"'" + - " and i.indrelid = bc.oid" + - " and i.indexrelid = ic.oid" + - " and i.indkey[0] = a.attnum" + - " and i.indproc = '0'::oid" + - " and a.attrelid = bc.oid" + - " ORDER BY TABLE_NAME, COLUMN_NAME;" + " '' as TABLE_CAT," + + " '' AS TABLE_SCHEM," + + " bc.relname AS TABLE_NAME," + + " a.attname AS COLUMN_NAME," + + " a.attnum as KEY_SEQ," + + " ic.relname as PK_NAME" + + " from pg_class bc, pg_class ic, pg_index i, pg_attribute a, pg_type t" + + " where bc.relkind = 'r'"+ + " and upper(bc.relname) = upper('test')" + + " and i.indrelid = bc.oid" + + " and i.indexrelid = ic.oid and a.attrelid = ic.oid"+ + " and i.indisprimary='t'"+ + " order by table_name, pk_name,key_seq;" ); } diff --git a/src/interfaces/jdbc/postgresql/jdbc2/Connection.java b/src/interfaces/jdbc/postgresql/jdbc2/Connection.java index 7e086435b2018fa127ce2ebc9e041f4a05430b97..32ffce81ee2902d73bcfdab6853622ac79f32f31 100644 --- a/src/interfaces/jdbc/postgresql/jdbc2/Connection.java +++ b/src/interfaces/jdbc/postgresql/jdbc2/Connection.java @@ -17,7 +17,7 @@ import postgresql.largeobject.*; import postgresql.util.*; /** - * $Id: Connection.java,v 1.2 1999/05/18 23:17:26 peter Exp $ + * $Id: Connection.java,v 1.3 1999/09/14 05:50:44 peter Exp $ * * A Connection represents a session with a specific database. Within the * context of a Connection, SQL statements are executed and results are @@ -216,7 +216,7 @@ public class Connection extends postgresql.Connection implements java.sql.Connec pg_stream = null; } } - + /** * Tests to see if a Connection is closed * @@ -311,7 +311,21 @@ public class Connection extends postgresql.Connection implements java.sql.Connec */ public void setTransactionIsolation(int level) throws SQLException { - throw postgresql.Driver.notImplemented(); + String q = "SET TRANSACTION ISOLATION LEVEL"; + + switch(level) { + + case java.sql.Connection.TRANSACTION_READ_COMMITTED: + ExecSQL(q + " READ COMMITTED"); + return; + + case java.sql.Connection.TRANSACTION_SERIALIZABLE: + ExecSQL(q + " SERIALIZABLE"); + return; + + default: + throw new PSQLException("postgresql.con.isolevel",new Integer(level)); + } } /** @@ -322,9 +336,18 @@ public class Connection extends postgresql.Connection implements java.sql.Connec */ public int getTransactionIsolation() throws SQLException { - return java.sql.Connection.TRANSACTION_SERIALIZABLE; + ExecSQL("show xactisolevel"); + + SQLWarning w = getWarnings(); + if (w != null) { + if (w.getMessage().indexOf("READ COMMITTED") != -1) return java.sql.Connection.TRANSACTION_READ_COMMITTED; else + if (w.getMessage().indexOf("READ UNCOMMITTED") != -1) return java.sql.Connection.TRANSACTION_READ_UNCOMMITTED; else + if (w.getMessage().indexOf("REPEATABLE READ") != -1) return java.sql.Connection.TRANSACTION_REPEATABLE_READ; else + if (w.getMessage().indexOf("SERIALIZABLE") != -1) return java.sql.Connection.TRANSACTION_SERIALIZABLE; + } + return java.sql.Connection.TRANSACTION_READ_COMMITTED; } - + /** * The first warning reported by calls on this Connection is * returned. diff --git a/src/interfaces/jdbc/postgresql/jdbc2/DatabaseMetaData.java b/src/interfaces/jdbc/postgresql/jdbc2/DatabaseMetaData.java index 9a73f22d81f82589652c72bca93f2f9a855a8603..b6550654efda6418dbee9f029f895af444e2e730 100644 --- a/src/interfaces/jdbc/postgresql/jdbc2/DatabaseMetaData.java +++ b/src/interfaces/jdbc/postgresql/jdbc2/DatabaseMetaData.java @@ -179,7 +179,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public String getDatabaseProductVersion() throws SQLException { - return ("6.4"); + return ("6.5.2"); } /** @@ -1350,7 +1350,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public int getDefaultTransactionIsolation() throws SQLException { - return Connection.TRANSACTION_SERIALIZABLE; + return Connection.TRANSACTION_READ_COMMITTED; } /** @@ -1368,7 +1368,7 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData /** * Does the database support the given transaction isolation level? - * We only support TRANSACTION_SERIALIZABLE + * We only support TRANSACTION_SERIALIZABLE and TRANSACTION_READ_COMMITTED * * @param level the values are defined in java.sql.Connection * @return true if so @@ -1377,7 +1377,8 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData */ public boolean supportsTransactionIsolationLevel(int level) throws SQLException { - if (level == Connection.TRANSACTION_SERIALIZABLE) + if (level == Connection.TRANSACTION_SERIALIZABLE || + level == Connection.TRANSACTION_READ_COMMITTED) return true; else return false; @@ -2151,21 +2152,19 @@ public class DatabaseMetaData implements java.sql.DatabaseMetaData public java.sql.ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException { return connection.createStatement().executeQuery("SELECT " + - "'' as TABLE_CAT," + - "'' AS TABLE_SCHEM," + - "bc.relname AS TABLE_NAME," + - "ic.relname AS COLUMN_NAME," + - "'1' as KEY_SEQ,"+ // -- fake it as a String for now - "t.typname as PK_NAME " + - " FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a, pg_type t " + - " WHERE bc.relkind = 'r' " + // -- not indices - " and bc.relname ~ '"+table+"'" + - " and i.indrelid = bc.oid" + - " and i.indexrelid = ic.oid" + - " and i.indkey[0] = a.attnum" + - " and i.indproc = '0'::oid" + - " and a.attrelid = bc.oid" + - " ORDER BY TABLE_NAME, COLUMN_NAME;" + " '' as TABLE_CAT," + + " '' AS TABLE_SCHEM," + + " bc.relname AS TABLE_NAME," + + " a.attname AS COLUMN_NAME," + + " a.attnum as KEY_SEQ," + + " ic.relname as PK_NAME" + + " from pg_class bc, pg_class ic, pg_index i, pg_attribute a, pg_type t" + + " where bc.relkind = 'r'"+ + " and upper(bc.relname) = upper('test')" + + " and i.indrelid = bc.oid" + + " and i.indexrelid = ic.oid and a.attrelid = ic.oid"+ + " and i.indisprimary='t'"+ + " order by table_name, pk_name,key_seq;" ); }