1 16 package scriptella.jdbc; 17 18 import scriptella.AbstractTestCase; 19 20 import java.io.IOException ; 21 import java.io.StringReader ; 22 import java.util.Arrays ; 23 24 30 public class SqlTokenizerTest extends AbstractTestCase { 31 public void test() throws IOException { 32 String s="insert into table values 1,?v,\"?text\";st2"; 33 SqlTokenizer tok = new SqlReaderTokenizer(new StringReader (s)); 34 String actual = tok.nextStatement(); 35 assertEquals("insert into table values 1,?v,\"?text\"", actual); 36 assertTrue(Arrays.equals(new int[] {27}, tok.getInjections())); 37 actual = tok.nextStatement(); 38 assertEquals("st2", actual); 39 assertTrue(tok.getInjections().length==0); 40 41 s="DROP TABLE Test;"; 42 tok = new SqlReaderTokenizer(new StringReader (s)); 43 actual = tok.nextStatement(); 44 assertEquals("DROP TABLE Test", actual); 45 actual = tok.nextStatement(); 46 assertNull(actual); 47 48 s="UPDATE test set value='Updated1' where ID=1;"; 49 tok = new SqlReaderTokenizer(new StringReader (s)); 50 actual = tok.nextStatement(); 51 assertEquals("UPDATE test set value='Updated1' where ID=1", actual); 52 actual = tok.nextStatement(); 53 assertNull(actual); 54 } 55 56 public void testComments() throws IOException { 57 String s="insert into table values 1,?v--$comment\n;" + 58 "-notacomment$v/**fdfdfd$comment\n$comment.v$$???\n;;;*/;stmt${var};\n" + 59 "//$comment"; 60 SqlReaderTokenizer tok = new SqlReaderTokenizer(new StringReader (s)); 61 tok.setKeepFormat(true); 62 assertEquals("insert into table values 1,?v--$comment\n", tok.nextStatement()); 63 assertTrue(Arrays.equals(new int[] {27}, tok.getInjections())); 64 assertEquals("-notacomment$v/**fdfdfd$comment\n$comment.v$$???\n;;;*/", tok.nextStatement()); 65 assertTrue(Arrays.equals(new int[] {12}, tok.getInjections())); 66 assertEquals("stmt${var}", tok.nextStatement()); 67 assertTrue(Arrays.equals(new int[] {4}, tok.getInjections())); 68 tok.nextStatement(); 69 assertTrue(tok.getInjections().length==0); 70 } 71 72 public void testQuotes() throws IOException { 73 String data = "INSERT INTO \"$TBL\" VALUES (\"?V\")"; 74 SqlTokenizer tok = new SqlReaderTokenizer(new StringReader (data)); 75 tok.nextStatement(); 76 assertTrue(Arrays.equals(new int[] {13}, tok.getInjections())); 77 } 78 79 82 public void testEmpty() throws IOException { 83 SqlTokenizer tok = new SqlReaderTokenizer(new StringReader ("")); 84 assertNull(tok.nextStatement()); 85 } 86 87 public void testSeparator() throws IOException { 88 String data = "st;1;;st 2"; 89 SqlReaderTokenizer tok = new SqlReaderTokenizer(new StringReader (data)); 90 tok.setSeparator(";;"); 91 assertEquals("st;1", tok.nextStatement()); 92 assertEquals("st 2", tok.nextStatement()); 93 assertNull(tok.nextStatement()); 94 tok = new SqlReaderTokenizer(new StringReader (data)); 95 tok.setSeparator(";;"); 96 tok.setSeparatorOnSingleLine(true); 97 assertEquals("st;1;;st 2", tok.nextStatement()); 98 assertNull(tok.nextStatement()); 99 data = "st;1 \n;;\nst 2"; 100 tok = new SqlReaderTokenizer(new StringReader (data)); 101 tok.setSeparator(";;"); 102 tok.setSeparatorOnSingleLine(true); 103 assertEquals("st;1 \n", tok.nextStatement()); 104 assertEquals("st 2", tok.nextStatement()); 105 assertNull(tok.nextStatement()); 106 data = "st;$v1\n / /*?comment*/ ?v2 2"; 107 tok = new SqlReaderTokenizer(new StringReader (data)); 108 tok.setSeparator("/"); 109 tok.setSeparatorOnSingleLine(true); 110 tok.setKeepFormat(true); 111 assertEquals(data, tok.nextStatement()); 112 assertTrue(Arrays.equals(new int[] {3, 23}, tok.getInjections())); 113 assertNull(tok.nextStatement()); 114 data = "st;$v1\r/\n/*?comment*/ ?v2 2"; 116 tok = new SqlReaderTokenizer(new StringReader (data)); 117 tok.setSeparator("/"); 118 tok.setSeparatorOnSingleLine(true); 119 tok.setKeepFormat(true); 120 assertEquals("st;$v1\r", tok.nextStatement()); 121 assertTrue(Arrays.equals(new int[] {3}, tok.getInjections())); 122 assertEquals("/*?comment*/ ?v2 2", tok.nextStatement()); 123 assertTrue(Arrays.equals(new int[] {13}, tok.getInjections())); 124 assertNull(tok.nextStatement()); 125 data = "STATEMENT1 / \n\r" + 127 " / \r\nSTATEMENT2\n/**fdfdfd**//"; 128 tok = new SqlReaderTokenizer(new StringReader (data)); 129 tok.setSeparator("/"); 130 tok.setSeparatorOnSingleLine(true); 131 assertEquals("STATEMENT1 / \n", tok.nextStatement()); 132 assertEquals("\nSTATEMENT2\n" + 133 "/", tok.nextStatement()); 134 data = "/\nscript\n/\n"; 136 tok = new SqlReaderTokenizer(new StringReader (data)); 137 tok.setSeparator("/"); 138 tok.setSeparatorOnSingleLine(true); 139 assertEquals("", tok.nextStatement()); 140 assertEquals("script\n", tok.nextStatement()); 141 assertNull(tok.nextStatement()); 142 data = "/\nscript\n/"; 144 tok = new SqlReaderTokenizer(new StringReader (data)); 145 tok.setSeparator("/"); 146 tok.setSeparatorOnSingleLine(true); 147 assertEquals("", tok.nextStatement()); 148 assertEquals("script\n", tok.nextStatement()); 149 assertNull(tok.nextStatement()); 150 data = "statement;--comment\n/\nscrip$t\n/"; 152 tok = new SqlReaderTokenizer(new StringReader (data)); 153 tok.setSeparator("/"); 154 tok.setSeparatorOnSingleLine(true); 155 assertEquals("statement;\n", tok.nextStatement()); 156 assertEquals("scrip$t\n", tok.nextStatement()); 157 assertTrue(Arrays.equals(new int[] {5}, tok.getInjections())); 158 assertNull(tok.nextStatement()); 159 } 160 161 164 public void testOracleHint() throws IOException { 165 String original = "SQL /*+ HINT */ --NOTAHINT \n\r /* +NOTAHINT*/"; 166 SqlReaderTokenizer tok = new SqlReaderTokenizer(new StringReader (original)); 167 assertEquals("SQL /*+ HINT */ \n",tok.nextStatement()); 168 assertNull(tok.nextStatement()); 169 tok = new SqlReaderTokenizer(new StringReader (original)); 170 tok.setKeepFormat(true); 171 assertEquals(original,tok.nextStatement()); 172 assertNull(tok.nextStatement()); 173 tok = new SqlReaderTokenizer(new StringReader (original)); 175 tok.setKeepFormat(true); 176 tok.setSeparator("/"); 177 tok.setSeparatorOnSingleLine(true); 178 assertEquals(original,tok.nextStatement()); 179 assertNull(tok.nextStatement()); 180 original = "SQL $v1 ?v2 /*+ HINT */ --?NOT$AHINT \n\r'$v3'/* +$NOTAHINT*/ ?v4"; 182 tok = new SqlReaderTokenizer(new StringReader (original)); 183 assertEquals("SQL $v1 ?v2 /*+ HINT */ \n'$v3' ?v4",tok.nextStatement()); 184 assertTrue(Arrays.equals(new int[] {4,8,26,31},tok.getInjections())); 185 tok = new SqlReaderTokenizer(new StringReader (original)); 187 tok.setKeepFormat(true); 188 assertEquals(original,tok.nextStatement()); 189 assertTrue(Arrays.equals(new int[] {4,8,40,60},tok.getInjections())); 190 assertNull(tok.nextStatement()); 191 } 192 193 197 public void testWhitespaceTrim() throws IOException { 198 String sql = " --Comment\n\n\n SQL--text\n; SQL2"; 199 SqlTokenizer tok = new SqlReaderTokenizer(new StringReader (sql)); 200 assertEquals(" \nSQL\n", tok.nextStatement()); 201 assertEquals(" SQL2", tok.nextStatement()); 202 assertNull(tok.nextStatement()); 203 } 204 205 206 } 207 | Popular Tags |