From 52eeb494e784a7e83eaa4d4d76e201abc596f486 Mon Sep 17 00:00:00 2001 From: Barry Lind Date: Thu, 17 Apr 2003 04:19:55 +0000 Subject: [PATCH] Applied patches from Kris Jurka fixing a string tokenizing problem and fixing an order by problem for index metadata results. Also includes removing some unused code as well as a fix to the toString method on statement. Modified Files: Tag: REL7_3_STABLE jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java --- .../jdbc1/AbstractJdbc1DatabaseMetaData.java | 52 +++++++++++++------ .../jdbc1/AbstractJdbc1Statement.java | 36 +++---------- 2 files changed, 43 insertions(+), 45 deletions(-) diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java index 305b88e81ff..03ce99a2bb1 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1DatabaseMetaData.java @@ -3136,20 +3136,17 @@ public abstract class AbstractJdbc1DatabaseMetaData //\000ww\000vv\000UNSPECIFIED\000m\000a\000n\000b\000 // we are primarily interested in the column names which are the last items in the string - StringTokenizer st = new StringTokenizer(targs, "\\000"); - - int advance = 4 + (keySequence - 1) * 2; - for ( int i = 0; st.hasMoreTokens() && i < advance ; i++ ) - st.nextToken(); // advance to the key column of interest - - if ( st.hasMoreTokens() ) - { - fkeyColumn = st.nextToken(); - } - if ( st.hasMoreTokens() ) - { - pkeyColumn = st.nextToken(); - } + Vector tokens = tokenize(targs, "\\000"); + + int element = 4 + (keySequence - 1) * 2; + if (tokens.size() > element) { + fkeyColumn = (String)tokens.elementAt(element); + } + + element++; + if (tokens.size() > element) { + pkeyColumn = (String)tokens.elementAt(element); + } tuple[3] = pkeyColumn.getBytes(); //PKCOLUMN_NAME tuple[7] = fkeyColumn.getBytes(); //FKCOLUMN_NAME @@ -3553,8 +3550,33 @@ public abstract class AbstractJdbc1DatabaseMetaData if (unique) { sql += " AND i.indisunique "; } - sql += " ORDER BY NON_UNIQUE, TYPE, INDEX_NAME "; + sql += " ORDER BY NON_UNIQUE, TYPE, INDEX_NAME, ORDINAL_POSITION "; return connection.createStatement().executeQuery(sql); } + /** + * Tokenize based on words not on single characters. + */ + private static Vector tokenize(String input, String delimiter) { + Vector result = new Vector(); + int start = 0; + int end = input.length(); + int delimiterSize = delimiter.length(); + + while (start < end) { + int delimiterIndex = input.indexOf(delimiter,start); + if (delimiterIndex < 0) { + result.addElement(input.substring(start)); + break; + } else { + String token = input.substring(start,delimiterIndex); + result.addElement(token); + start = delimiterIndex + delimiterSize; + } + } + return result; + } + + + } diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java index bfb0f81eb6b..d3e6022f0d1 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java @@ -8,7 +8,7 @@ import java.util.Vector; import org.postgresql.largeobject.*; import org.postgresql.util.*; -/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1Statement.java,v 1.12.2.3 2003/02/12 17:14:49 barry Exp $ +/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1Statement.java,v 1.12.2.4 2003/04/17 04:19:55 barry Exp $ * This class defines methods of the jdbc1 specification. This class is * extended by org.postgresql.jdbc2.AbstractJdbc2Statement which adds the jdbc2 * methods. The real Statement class (for jdbc1) is org.postgresql.jdbc1.Jdbc1Statement @@ -1408,35 +1408,7 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme { if (x == null) { - int l_sqlType; - if (x instanceof String) - l_sqlType = Types.VARCHAR; - else if (x instanceof BigDecimal) - l_sqlType = Types.DECIMAL; - else if (x instanceof Short) - l_sqlType = Types.SMALLINT; - else if (x instanceof Integer) - l_sqlType = Types.INTEGER; - else if (x instanceof Long) - l_sqlType = Types.BIGINT; - else if (x instanceof Float) - l_sqlType = Types.FLOAT; - else if (x instanceof Double) - l_sqlType = Types.DOUBLE; - else if (x instanceof byte[]) - l_sqlType = Types.BINARY; - else if (x instanceof java.sql.Date) - l_sqlType = Types.DATE; - else if (x instanceof Time) - l_sqlType = Types.TIME; - else if (x instanceof Timestamp) - l_sqlType = Types.TIMESTAMP; - else if (x instanceof Boolean) - l_sqlType = Types.OTHER; - else - l_sqlType = Types.OTHER; - - setNull(parameterIndex, l_sqlType); + setNull(parameterIndex, Types.OTHER); return ; } if (x instanceof String) @@ -1768,6 +1740,10 @@ public abstract class AbstractJdbc1Statement implements org.postgresql.PGStateme */ public String toString() { + //if no sql yet set, return default toString() + if (m_sqlFragments == null) + return super.toString(); + synchronized (sbuf) { sbuf.setLength(0); -- 2.39.5