package com.klarna.hiverunner.sql; import com.google.common.base.Joiner; import org.junit.Assert; import org.junit.Test; import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; public class StatementsSplitterTest { @Test public void testSplitBasic() { String str = "foo;bar;baz"; List expected = Arrays.asList("foo", "bar", "baz"); Assert.assertEquals(expected, StatementsSplitter.splitStatements(str)); } @Test public void testRemoveTrailingSemiColon() { String str = ";foo;bar;baz;"; List expected = Arrays.asList("foo", "bar", "baz"); Assert.assertEquals(expected, StatementsSplitter.splitStatements(str)); } @Test public void testDiscardRedundantSemiColons() { String str = "a;b;;;c"; List expected = Arrays.asList("a", "b", "c"); Assert.assertEquals(expected, StatementsSplitter.splitStatements(str)); } @Test public void testDiscardTrailingSpace() { String str = "a; b\t\n ; \n\tc c;"; List expected = Arrays.asList("a", "b", "c c"); Assert.assertEquals(expected, StatementsSplitter.splitStatements(str)); } @Test public void testDiscardEmptyStatements() { String str = "a;b; \t\n ;c;"; List expected = Arrays.asList("a", "b", "c"); Assert.assertEquals(expected, StatementsSplitter.splitStatements(str)); } @Test public void testCommentPreserved() { String str = "foo -- bar"; List expected = Arrays.asList("foo -- bar"); Assert.assertEquals(expected, StatementsSplitter.splitStatements(str)); } @Test public void testCommentWithSingleQuote() { String str = "foo -- b'ar"; List expected = Arrays.asList("foo -- b'ar"); Assert.assertEquals(expected, StatementsSplitter.splitStatements(str)); } @Test public void testCommentWithDoubleQuote() { String str = "foo -- b\"ar"; List expected = Arrays.asList("foo -- b\"ar"); Assert.assertEquals(expected, StatementsSplitter.splitStatements(str)); } @Test public void testCommentWithSemiColon() { String str = "foo -- b;ar"; List expected = Arrays.asList("foo -- b;ar"); Assert.assertEquals(expected, StatementsSplitter.splitStatements(str)); } @Test public void testMultilineStatementWithComment() { String str = "foo -- b;ar\nbaz"; List expected = Arrays.asList("foo -- b;ar\nbaz"); Assert.assertEquals(expected, StatementsSplitter.splitStatements(str)); } @Test public void testRealLifeExample() { String firstStatamenet = "CREATE TABLE serde_test (\n" + " key STRING,\n" + " value STRING\n" + ")\n" + "ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'\n" + "WITH SERDEPROPERTIES (\n" + "\"input.regex\" = \"(.*);\" \n" + ")\n" + "STORED AS TEXTFILE\n" + "LOCATION '${hiveconf:hadoop.tmp.dir}/serde'"; String secondStatamenet = "select * from foobar"; Assert.assertEquals(Arrays.asList(firstStatamenet, secondStatamenet), StatementsSplitter.splitStatements(firstStatamenet + ";\n" + secondStatamenet + ";\n")); } @Test public void realLifeWithComments() { String firstStatement = "CREATE TABLE ${hiveconf:TARGET_SCHEMA_NAME}.pacc_pstatus (\n" + " cid\tstring, -- The cid of the transaction the balance change is connected to\n" + " create_date string , -- the date of the pstatus change\n" + " old_pstatus string, -- The pstatus before the change\n" + " new_pstatus string, -- The pstatus after the change\n" + " manual boolean -- true of the pstatus change is manual, currently false for all changes " + "since we can't know about manual pstatus changes\n" + " -- PRIMARY KEY() -- there no natural primary key for this table, should we add one, e.g. " + "rowno?\n" + " )"; Assert.assertEquals(Arrays.asList(firstStatement), StatementsSplitter.splitStatements(firstStatement + ";\n")); } @Test public void testPreserveQuoted() { List<String> expected = Arrays.asList("\"foo\"", "'bar'", "\"\''\"", "'\"\\\"'", "';'", "\";\""); String input = Joiner.on(";").join(expected); Assert.assertEquals(expected, StatementsSplitter.splitStatements(input)); } @Test public void testReadQuoted() { String firstQuote = "\"foo;\\; b a r\\\"\""; String secondQuote = "'foo;\\; \\'b a r\\\"'"; String expectedTail = "'\'\"foxlov e \""; String expression = firstQuote + secondQuote + expectedTail; StringTokenizer tokenizer = new StringTokenizer(expression, StatementsSplitter.SQL_SPECIAL_CHARS, true); String actualFirstQuote = StatementsSplitter.readQuoted(tokenizer, (String) tokenizer.nextElement()); String actualSecondQuote = StatementsSplitter.readQuoted(tokenizer, (String) tokenizer.nextElement()); String actualTail = ""; while (tokenizer.hasMoreElements()) { actualTail += tokenizer.nextElement(); } Assert.assertEquals(Arrays.asList(firstQuote, secondQuote, expectedTail), Arrays.asList(actualFirstQuote, actualSecondQuote, actualTail)); } @Test public void testReadUntilEndOfLine() { StringTokenizer tokenizer = new StringTokenizer("foo\nbar\n\n\nbaz", StatementsSplitter.SQL_SPECIAL_CHARS, true); Assert.assertEquals("foo\n", StatementsSplitter.readUntilEndOfLine(tokenizer)); Assert.assertEquals("bar\n", StatementsSplitter.readUntilEndOfLine(tokenizer)); Assert.assertEquals("\n", StatementsSplitter.readUntilEndOfLine(tokenizer)); Assert.assertEquals("\n", StatementsSplitter.readUntilEndOfLine(tokenizer)); Assert.assertEquals("baz", StatementsSplitter.readUntilEndOfLine(tokenizer)); Assert.assertEquals("", StatementsSplitter.readUntilEndOfLine(tokenizer)); } }