This is an automated email from the git hooks/post-receive script. ebourg-guest pushed a commit to tag REL8_2_507 in repository libpostgresql-jdbc-java.
commit d96bbf262fa45a36c89fddb4d5fea85d1c7b5818 Author: Kris Jurka <[email protected]> Date: Sat Oct 20 17:01:55 2007 +0000 The driver was incorrectly parsing identifiers that had parts that look like dollar quotes. Things like a$b$c are valid identifiers, not dollar quotes. When determining if a $ we've found is a dollar quote start, look at the preceding character and see if it is a valid identifier part to determine if we're in the midst of an identifier or are starting a new token. Michael Paesold --- org/postgresql/core/Parser.java | 38 ++++++++++++++++++++-- .../test/jdbc2/PreparedStatementTest.java | 23 ++++++++++++- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/org/postgresql/core/Parser.java b/org/postgresql/core/Parser.java index bf1f122..11b4ec2 100644 --- a/org/postgresql/core/Parser.java +++ b/org/postgresql/core/Parser.java @@ -3,7 +3,7 @@ * Copyright (c) 2006, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/core/Parser.java,v 1.1 2006/11/02 15:31:14 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/core/Parser.java,v 1.2 2006/12/01 08:53:45 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -89,7 +89,8 @@ public class Parser { * character. */ public static int parseDollarQuotes(final char[] query, int offset) { - if (offset + 1 < query.length) + if (offset + 1 < query.length + && (offset == 0 || !isIdentifierContChar(query[offset-1]))) { int endIdx = -1; if (query[offset + 1] == '$') @@ -205,6 +206,37 @@ public class Parser { } /** + * Checks if a character is valid as the start of an identifier. + * + * @param c the character to check + * @return true if valid as first character of an identifier; false if not + */ + public static boolean isIdentifierStartChar(char c) { + /* + * Extracted from {ident_start} and {ident_cont} in + * pgsql/src/backend/parser/scan.l: + * ident_start [A-Za-z\200-\377_] + * ident_cont [A-Za-z\200-\377_0-9\$] + */ + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') + || c == '_' || c > 127 ; + } + + /** + * Checks if a character is valid as the second or later character of an + * identifier. + * + * @param c the character to check + * @return true if valid as second or later character of an identifier; false if not + */ + public static boolean isIdentifierContChar(char c) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') + || c == '_' || c > 127 + || (c >= '0' && c <= '9') + || c == '$'; + } + + /** * @return true if the character terminates an identifier */ public static boolean charTerminatesIdentifier(char c) { @@ -228,7 +260,7 @@ public class Parser { } /** - * Checks if a character is valid as the second or latter character of a + * Checks if a character is valid as the second or later character of a * dollar quoting tag. * * @param c the character to check diff --git a/org/postgresql/test/jdbc2/PreparedStatementTest.java b/org/postgresql/test/jdbc2/PreparedStatementTest.java index 60c3690..8dc8c10 100644 --- a/org/postgresql/test/jdbc2/PreparedStatementTest.java +++ b/org/postgresql/test/jdbc2/PreparedStatementTest.java @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/PreparedStatementTest.java,v 1.17 2006/11/02 15:31:14 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/PreparedStatementTest.java,v 1.18 2006/12/01 08:53:46 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -405,6 +405,27 @@ public class PreparedStatementTest extends TestCase st.close(); } + public void testDollarQuotesAndIdentifiers() throws SQLException { + // dollar-quotes are supported in the backend since version 8.0 + if (!TestUtil.haveMinimumServerVersion(conn, "8.0")) + return; + + PreparedStatement st; + + conn.createStatement().execute("CREATE TEMP TABLE a$b$c(a varchar, b varchar)"); + st = conn.prepareStatement("INSERT INTO a$b$c (a, b) VALUES (?, ?)"); + st.setString(1, "a"); + st.setString(2, "b"); + st.executeUpdate(); + st.close(); + + conn.createStatement().execute("CREATE TEMP TABLE e$f$g(h varchar, e$f$g varchar) "); + st = conn.prepareStatement("UPDATE e$f$g SET h = ? || e$f$g"); + st.setString(1, "a"); + st.executeUpdate(); + st.close(); + } + public void testComments() throws SQLException { PreparedStatement st; ResultSet rs; -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

