Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[CONJ-664] client prepare statement parsing double slash incorrectly
  • Loading branch information
rusher committed Dec 14, 2018
1 parent 8f53be5 commit 013a335
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
Expand Up @@ -107,6 +107,8 @@ public static ClientPrepareResult parameterParts(String queryString, boolean noB
if (state == LexState.Escape && !((car == '\'' && singleQuotes) || (car == '"'
&& !singleQuotes))) {
state = LexState.String;
lastChar = car;
continue;
}
switch (car) {
case '*':
Expand Down Expand Up @@ -238,6 +240,8 @@ public static boolean canAggregateSemiColon(String queryString, boolean noBacksl
if (state == LexState.Escape && !((car == '\'' && singleQuotes) || (car == '"'
&& !singleQuotes))) {
state = LexState.String;
lastChar = car;
continue;
}

switch (car) {
Expand Down Expand Up @@ -400,6 +404,7 @@ public static ClientPrepareResult rewritableParts(String queryString,
if (state == LexState.Escape && !((car == '\'' && singleQuotes) || (car == '"'
&& !singleQuotes))) {
sb.append(car);
lastChar = car;
state = LexState.String;
continue;
}
Expand Down
30 changes: 30 additions & 0 deletions src/test/java/org/mariadb/jdbc/MultiTest.java
Expand Up @@ -133,6 +133,36 @@ public void rewriteSelectQuery() throws Throwable {
assertEquals(rs.getInt(2), 1);
}

@Test
public void rewriteParsingDoubleSlash() throws Throwable {
parsingDoubleSlash(sharedConnection);

try (Connection conn = setConnection("&rewriteBatchedStatements=true")) {
parsingDoubleSlash(conn);

Statement stmt = conn.createStatement();
stmt.execute("CREATE TEMPORARY TABLE rewriteSlash(t varchar(50))");
stmt.addBatch("insert into rewriteSlash values ('\\\\')");
stmt.executeBatch();

ResultSet rs = stmt.executeQuery("SELECT * FROM rewriteSlash");
assertTrue(rs.next());
assertEquals(rs.getString(1), "\\");
}

}

private void parsingDoubleSlash(Connection conn) throws SQLException {
try (PreparedStatement p = conn.prepareStatement("SELECT '\\\\', ?")) {
p.setString(1, "\\\\");
ResultSet rs = p.executeQuery();
assertTrue(rs.next());
assertEquals(rs.getString(1), "\\");
assertEquals(rs.getString(2), "\\\\");
}
}


@Test
public void rewriteSelectQueryServerPrepared() throws Throwable {
Statement st = sharedConnection.createStatement();
Expand Down

0 comments on commit 013a335

Please sign in to comment.