[libpostgresql-jdbc-java] 02/03: The driver needs to break a statement into individual queries to use the V3 extended query protocol. The parsing code did not recognize multiple rule actions separated by semi-colons as one query.
Emmanuel Bourg
ebourg-guest at moszumanska.debian.org
Mon Jan 9 10:19:17 UTC 2017
This is an automated email from the git hooks/post-receive script.
ebourg-guest pushed a commit to tag REL8_0_314
in repository libpostgresql-jdbc-java.
commit d993a601753d5c77ec0070c74fc27d94a1719962
Author: Kris Jurka <books at ejurka.com>
Date: Sat Nov 5 09:27:56 2005 +0000
The driver needs to break a statement into individual queries to
use the V3 extended query protocol. The parsing code did not
recognize multiple rule actions separated by semi-colons as one
query.
Jolly Chen
---
org/postgresql/core/v3/QueryExecutorImpl.java | 15 +++++++++++++--
org/postgresql/test/jdbc2/StatementTest.java | 21 ++++++++++++++++++++-
2 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/org/postgresql/core/v3/QueryExecutorImpl.java b/org/postgresql/core/v3/QueryExecutorImpl.java
index 945a9b8..4731627 100644
--- a/org/postgresql/core/v3/QueryExecutorImpl.java
+++ b/org/postgresql/core/v3/QueryExecutorImpl.java
@@ -4,7 +4,7 @@
* Copyright (c) 2004, Open Cloud Limited.
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/core/v3/QueryExecutorImpl.java,v 1.20 2005/01/27 22:50:13 oliver Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/core/v3/QueryExecutorImpl.java,v 1.21 2005/02/01 07:27:54 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -66,6 +66,7 @@ public class QueryExecutorImpl implements QueryExecutor {
boolean inSingleQuotes = false;
boolean inDoubleQuotes = false;
+ int inParen = 0;
for (int i = 0; i < query.length(); ++i)
{
@@ -94,8 +95,18 @@ public class QueryExecutorImpl implements QueryExecutor {
}
break;
- case ';':
+ case '(':
+ if (!inSingleQuotes && !inDoubleQuotes)
+ inParen++;
+ break;
+
+ case ')':
if (!inSingleQuotes && !inDoubleQuotes)
+ inParen--;
+ break;
+
+ case ';':
+ if (!inSingleQuotes && !inDoubleQuotes && inParen == 0)
{
fragmentList.add(query.substring(fragmentStart, i));
fragmentStart = i + 1;
diff --git a/org/postgresql/test/jdbc2/StatementTest.java b/org/postgresql/test/jdbc2/StatementTest.java
index 781dc26..d033462 100644
--- a/org/postgresql/test/jdbc2/StatementTest.java
+++ b/org/postgresql/test/jdbc2/StatementTest.java
@@ -3,7 +3,7 @@
* Copyright (c) 2004-2005, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/StatementTest.java,v 1.15 2005/01/27 11:30:48 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/StatementTest.java,v 1.15.2.1 2005/08/12 18:22:31 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -318,4 +318,23 @@ public class StatementTest extends TestCase
stmt.close();
}
+ /**
+ * The parser tries to break multiple statements into individual
+ * queries as required by the V3 extended query protocol. It can
+ * be a little overzealous sometimes and this test ensures we
+ * keep multiple rule actions together in one statement.
+ */
+ public void testParsingSemiColons() throws SQLException
+ {
+ Statement stmt = con.createStatement();
+ stmt.execute("CREATE RULE r1 AS ON INSERT TO escapetest DO (DELETE FROM test_statement ; INSERT INTO test_statement VALUES (1); INSERT INTO test_statement VALUES (2); );");
+ stmt.executeUpdate("INSERT INTO escapetest(ts) VALUES (NULL)");
+ ResultSet rs = stmt.executeQuery("SELECT i from test_statement ORDER BY i");
+ assertTrue(rs.next());
+ assertEquals(1, rs.getInt(1));
+ assertTrue(rs.next());
+ assertEquals(2, rs.getInt(1));
+ assertTrue(!rs.next());
+ }
+
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git
More information about the pkg-java-commits
mailing list