Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[CONJ-438] insert query that contain table / column that contain SELE…
…CT keyword can be rewritten
  • Loading branch information
rusher committed Mar 8, 2017
1 parent f607774 commit ec288bd
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
Expand Up @@ -490,12 +490,17 @@ public static ClientPrepareResult rewritableParts(String queryString, boolean no
case 'S':
if (state == LexState.Normal) {
if (postValuePart == null
&& queryLength > i + 6
&& queryLength > i + 7
&& (query[i + 1] == 'e' || query[i + 1] == 'E')
&& (query[i + 2] == 'l' || query[i + 2] == 'L')
&& (query[i + 3] == 'e' || query[i + 3] == 'E')
&& (query[i + 4] == 'c' || query[i + 4] == 'C')
&& (query[i + 5] == 't' || query[i + 5] == 'T')) {

// field/table name might contain 'select'
if (i > 0 && (query[i - 1] > ' ' && query[i - 1] != '(' && query[i - 1] != ')')) break;
if ((query[i + 6] > ' ' && query[i + 6] != '(' && query[i + 6] != ')')) break;

//SELECT queries, INSERT FROM SELECT not rewritable
reWritablePrepare = false;
}
Expand Down
@@ -0,0 +1,44 @@
package org.mariadb.jdbc.internal.util.dao;

import static org.junit.Assert.*;

import org.junit.Test;

public class ClientPrepareResultTest {

/**
* SELECT query cannot be rewritable.
*/
@Test
public void selectQuery() {
//SELECT query cannot be rewritable
assertFalse(ClientPrepareResult.rewritableParts("SELECT * FROM MyTable", true).isQueryMultiValuesRewritable());
assertFalse(ClientPrepareResult.rewritableParts("SELECT\n * FROM MyTable", true).isQueryMultiValuesRewritable());
}

/**
* INSERT FROM SELECT are not be rewritable.
*/
@Test
public void insertSelectQuery() {
assertFalse(ClientPrepareResult.rewritableParts("INSERT INTO MyTable (a) SELECT * FROM seq_1_to_1000", true).isQueryMultiValuesRewritable());
assertFalse(ClientPrepareResult.rewritableParts("INSERT INTO MyTable (a)SELECT * FROM seq_1_to_1000", true).isQueryMultiValuesRewritable());
assertFalse(ClientPrepareResult.rewritableParts("INSERT INTO MyTable (a) (SELECT * FROM seq_1_to_1000)", true).isQueryMultiValuesRewritable());
assertFalse(ClientPrepareResult.rewritableParts("INSERT INTO MyTable (a) SELECT\n * FROM seq_1_to_1000", true).isQueryMultiValuesRewritable());
}

/**
* Insert query that contain table/column name with select keyword, or select in comment can be rewritten
*/
@Test
public void rewritableThatContainSelectQuery() {
//but 'SELECT' keyword in column/table name can be rewritable
assertTrue(ClientPrepareResult.rewritableParts("INSERT INTO TABLE_SELECT ", true).isQueryMultiValuesRewritable());
assertTrue(ClientPrepareResult.rewritableParts("INSERT INTO TABLE_SELECT", true).isQueryMultiValuesRewritable());
assertTrue(ClientPrepareResult.rewritableParts("INSERT INTO SELECT_TABLE", true).isQueryMultiValuesRewritable());
assertTrue(ClientPrepareResult.rewritableParts("INSERT INTO `TABLE SELECT `", true).isQueryMultiValuesRewritable());
assertTrue(ClientPrepareResult.rewritableParts("INSERT INTO TABLE /* SELECT in comment */ ", true).isQueryMultiValuesRewritable());
assertTrue(ClientPrepareResult.rewritableParts("INSERT INTO TABLE //SELECT", true).isQueryMultiValuesRewritable());

}
}

0 comments on commit ec288bd

Please sign in to comment.