Skip to content

Commit b5b11b9

Browse files
committed
Merge origin/master
2 parents 154cf37 + 0415140 commit b5b11b9

File tree

11 files changed

+303
-8
lines changed

11 files changed

+303
-8
lines changed

src/main/java/net/sf/jsqlparser/statement/select/Join.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,9 @@ public void setJoinWindow(KSQLJoinWindow joinWindow) {
183183

184184
@Override
185185
public String toString() {
186-
if (isSimple()) {
186+
if (isSimple() && isOuter()) {
187+
return "OUTER " + rightItem;
188+
} else if (isSimple()) {
187189
return "" + rightItem;
188190
} else {
189191
String type = "";

src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,9 +328,11 @@ public void visit(SubJoin subjoin) {
328328
}
329329

330330
public void deparseJoin(Join join) {
331-
if (join.isSimple()) {
332-
buffer.append(", ");
333-
} else {
331+
if (join.isSimple() && join.isOuter()) {
332+
buffer.append(", OUTER ");
333+
} else if (join.isSimple()) {
334+
buffer.append(", ");
335+
} else {
334336

335337
if (join.isRight()) {
336338
buffer.append(" RIGHT");

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1703,7 +1703,7 @@ Join JoinerExpression() #JoinerExpression:
17031703
| <K_CROSS> { join.setCross(true); }
17041704
]
17051705

1706-
( <K_JOIN> | "," { join.setSimple(true); } )
1706+
( <K_JOIN> | "," { join.setSimple(true); } (<K_OUTER> { join.setOuter(true); } )? )
17071707

17081708
right=FromItem()
17091709

src/test/java/net/sf/jsqlparser/parser/CCJSqlParserUtilTest.java

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
import org.junit.After;
2121
import org.junit.AfterClass;
2222
import static org.junit.Assert.*;
23+
24+
import java.io.ByteArrayInputStream;
25+
import java.io.StringReader;
26+
import java.nio.charset.StandardCharsets;
27+
2328
import org.junit.Before;
2429
import org.junit.BeforeClass;
2530
import org.junit.Test;
@@ -70,7 +75,18 @@ public void testParseExpression2() throws Exception {
7075

7176
@Test(expected = JSQLParserException.class)
7277
public void testParseExpressionNonPartial() throws Exception {
73-
Expression result = CCJSqlParserUtil.parseExpression("a+", false);
78+
CCJSqlParserUtil.parseExpression("a+", false);
79+
80+
}
81+
82+
@Test(expected = JSQLParserException.class)
83+
public void testParseExpressionFromStringFail() throws Exception {
84+
CCJSqlParserUtil.parse("whatever$");
85+
}
86+
87+
@Test(expected = JSQLParserException.class)
88+
public void testParseExpressionFromRaderFail() throws Exception {
89+
CCJSqlParserUtil.parse(new StringReader("whatever$"));
7490
}
7591

7692
@Test
@@ -85,6 +101,24 @@ public void testParseCondExpression() throws Exception {
85101
assertEquals("a + b > 5 AND c < 3", result.toString());
86102
}
87103

104+
@Test(expected = JSQLParserException.class)
105+
public void testParseCondExpressionFail() throws Exception {
106+
CCJSqlParserUtil.parseCondExpression(";");
107+
108+
}
109+
110+
@Test(expected = JSQLParserException.class)
111+
public void testParseFromStreamFail() throws Exception {
112+
CCJSqlParserUtil.parse(new ByteArrayInputStream("BLA".getBytes(StandardCharsets.UTF_8)));
113+
114+
}
115+
116+
@Test(expected = JSQLParserException.class)
117+
public void testParseFromStreamWithEncodingFail() throws Exception {
118+
CCJSqlParserUtil.parse(new ByteArrayInputStream("BLA".getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8.name());
119+
120+
}
121+
88122
@Test
89123
public void testParseCondExpressionNonPartial() throws Exception {
90124
Expression result = CCJSqlParserUtil.parseCondExpression("x=92 and y=29", false);
@@ -126,6 +160,16 @@ public void testParseStatementsIssue691() throws Exception {
126160
+ "SELECT * FROM dual;\n", result.toString());
127161
}
128162

163+
@Test(expected = JSQLParserException.class)
164+
public void testParseStatementsFail() throws Exception {
165+
CCJSqlParserUtil.parseStatements("select * from dual;WHATEVER!!");
166+
}
167+
168+
@Test(expected = JSQLParserException.class)
169+
public void testParseASTFail() throws Exception {
170+
CCJSqlParserUtil.parseAST("select * from dual;WHATEVER!!");
171+
}
172+
129173
@Test
130174
public void testParseStatementsIssue691_2() throws Exception {
131175
Statements result = CCJSqlParserUtil.parseStatements(
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.parser;
11+
12+
import net.sf.jsqlparser.JSQLParserException;
13+
import org.junit.After;
14+
import org.junit.AfterClass;
15+
16+
import static org.junit.Assert.*;
17+
18+
import java.io.ByteArrayOutputStream;
19+
import java.io.PrintStream;
20+
import java.io.PrintWriter;
21+
import java.io.StringWriter;
22+
import java.nio.charset.StandardCharsets;
23+
24+
import org.junit.Before;
25+
import org.junit.BeforeClass;
26+
import org.junit.Test;
27+
28+
/**
29+
*
30+
* @author schwitters
31+
*/
32+
public class JSQLParserExceptionTest {
33+
34+
public JSQLParserExceptionTest() {
35+
}
36+
37+
@BeforeClass
38+
public static void setUpClass() {
39+
}
40+
41+
@AfterClass
42+
public static void tearDownClass() {
43+
}
44+
45+
@Before
46+
public void setUp() {
47+
}
48+
49+
@After
50+
public void tearDown() {
51+
}
52+
53+
/**
54+
* Test of parseExpression method, of class CCJSqlParserUtil.
55+
*/
56+
@Test
57+
public void testExceptionWithCause() throws Exception {
58+
IllegalArgumentException arg1 = new IllegalArgumentException();
59+
JSQLParserException ex1=new JSQLParserException("", arg1);
60+
assertSame(arg1, ex1.getCause());
61+
}
62+
@Test
63+
public void testExceptionPrintStacktrace() throws Exception {
64+
IllegalArgumentException arg1 = new IllegalArgumentException("BRATKARTOFFEL");
65+
JSQLParserException ex1=new JSQLParserException("", arg1);
66+
StringWriter sw = new StringWriter();
67+
ex1.printStackTrace(new PrintWriter(sw, true));
68+
assertTrue(sw.toString().contains("BRATKARTOFFEL"));
69+
ByteArrayOutputStream bos = new ByteArrayOutputStream();
70+
ex1.printStackTrace(new PrintStream(bos, true));
71+
assertTrue(new String(bos.toByteArray(), StandardCharsets.UTF_8).contains("BRATKARTOFFEL"));
72+
73+
}
74+
75+
@Test
76+
public void testExceptionPrintStacktraceNoCause() throws Exception {
77+
JSQLParserException ex1=new JSQLParserException("", null);
78+
StringWriter sw = new StringWriter();
79+
ex1.printStackTrace(new PrintWriter(sw, true));
80+
assertFalse(sw.toString().contains("BRATKARTOFFEL"));
81+
ByteArrayOutputStream bos = new ByteArrayOutputStream();
82+
ex1.printStackTrace(new PrintStream(bos, true));
83+
assertFalse(new String(bos.toByteArray(), StandardCharsets.UTF_8).contains("BRATKARTOFFEL"));
84+
}
85+
@Test
86+
public void testExceptionDefaultContructorCauseInit() throws Exception {
87+
JSQLParserException ex1=new JSQLParserException();
88+
assertNull(ex1.getCause());
89+
ex1=new JSQLParserException((Throwable) null);
90+
assertNull(ex1.getCause());
91+
}
92+
93+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.schema;
11+
12+
import org.junit.After;
13+
import org.junit.AfterClass;
14+
import org.junit.Before;
15+
import org.junit.BeforeClass;
16+
import org.junit.Test;
17+
import static org.junit.Assert.*;
18+
19+
/**
20+
*
21+
* @author schwitters
22+
*/
23+
public class DatabaseTest {
24+
25+
public DatabaseTest() {
26+
}
27+
28+
@BeforeClass
29+
public static void setUpClass() {
30+
}
31+
32+
@AfterClass
33+
public static void tearDownClass() {
34+
}
35+
36+
@Before
37+
public void setUp() {
38+
}
39+
40+
@After
41+
public void tearDown() {
42+
}
43+
44+
@Test
45+
public void testDatabaseSimple() {
46+
String databaseName = "db1";
47+
Database database = new Database(databaseName);
48+
assertEquals(databaseName, database.getFullyQualifiedName());
49+
}
50+
51+
@Test
52+
public void testDatabaseAndServer() {
53+
final Server server = new Server("SERVER", "INSTANCE");
54+
String databaseName = "db1";
55+
Database database = new Database(server, databaseName);
56+
assertEquals("[SERVER\\INSTANCE].db1", database.getFullyQualifiedName());
57+
assertSame(server, database.getServer());
58+
assertEquals(databaseName, database.getDatabaseName());
59+
assertEquals("[SERVER\\INSTANCE].db1", database.toString());
60+
}
61+
62+
@Test
63+
public void testNullDatabaseAndServer() {
64+
final Server server = new Server("SERVER", "INSTANCE");
65+
Database database = new Database(server, null);
66+
assertEquals("[SERVER\\INSTANCE].", database.getFullyQualifiedName());
67+
assertSame(server, database.getServer());
68+
}
69+
70+
}

src/test/java/net/sf/jsqlparser/schema/ServerTest.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public void testServerNameParsing() throws Exception {
2525
assertEquals(fullServerName, server.toString());
2626
}
2727

28+
@Test
2829
public void testServerNameAndInstanceParsing() throws Exception {
2930
final String serverName = "LOCALHOST";
3031
final String serverInstanceName = "SQLSERVER";
@@ -37,4 +38,50 @@ public void testServerNameAndInstanceParsing() throws Exception {
3738
assertEquals(fullServerName, server.toString());
3839

3940
}
41+
@Test
42+
public void testServerNameAndInstanceParsing2() throws Exception {
43+
String simpleName = "LOCALHOST";
44+
final Server server = new Server(simpleName);
45+
assertEquals(simpleName, server.getFullyQualifiedName());
46+
}
47+
@Test
48+
public void testServerNameAndInstanceParsingNull() throws Exception {
49+
final Server server = new Server(null);
50+
assertEquals("", server.getFullyQualifiedName());
51+
}
52+
@Test
53+
public void testServerNameAndInstancePassValues() throws Exception {
54+
final Server server = new Server("SERVER", "INSTANCE");
55+
assertEquals("SERVER", server.getServerName());
56+
assertEquals("INSTANCE", server.getInstanceName());
57+
assertEquals(String.format("[%s\\%s]", "SERVER", "INSTANCE"), server.getFullyQualifiedName());
58+
}
59+
@Test
60+
public void testServerNameNull() throws Exception {
61+
final Server server = new Server(null, "INSTANCE");
62+
assertEquals(null, server.getServerName());
63+
assertEquals("INSTANCE", server.getInstanceName());
64+
assertEquals("", server.getFullyQualifiedName());
65+
}
66+
@Test
67+
public void testServerNameEmpty() throws Exception {
68+
final Server server = new Server("", "INSTANCE");
69+
assertEquals("", server.getServerName());
70+
assertEquals("INSTANCE", server.getInstanceName());
71+
assertEquals("", server.getFullyQualifiedName());
72+
}
73+
@Test
74+
public void testInstanceNameNull() throws Exception {
75+
final Server server = new Server("LOCALHOST", null);
76+
assertEquals("LOCALHOST", server.getServerName());
77+
assertEquals(null, server.getInstanceName());
78+
assertEquals("[LOCALHOST]", server.getFullyQualifiedName());
79+
}
80+
@Test
81+
public void testInstanceNameEmpty() throws Exception {
82+
final Server server = new Server("LOCALHOST", "");
83+
assertEquals("LOCALHOST", server.getServerName());
84+
assertEquals("", server.getInstanceName());
85+
assertEquals("[LOCALHOST]", server.getFullyQualifiedName());
86+
}
4087
}

src/test/java/net/sf/jsqlparser/statement/BlockTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.junit.After;
1515
import org.junit.AfterClass;
1616
import static org.junit.Assert.assertEquals;
17+
import static org.junit.Assert.assertFalse;
1718
import org.junit.Before;
1819
import org.junit.BeforeClass;
1920
import org.junit.Test;
@@ -67,4 +68,18 @@ public void testBlock2() throws JSQLParserException {
6768
+ "", stmts.toString());
6869

6970
}
71+
@Test
72+
public void testBlock3() throws JSQLParserException {
73+
Statements stmts = CCJSqlParserUtil.parseStatements("begin\nselect * from feature;\nend");
74+
Block block =(Block) stmts.getStatements().get(0);
75+
assertFalse(block.getStatements().getStatements().isEmpty());
76+
}
77+
@Test
78+
public void testBlockToStringIsNullSafe() throws JSQLParserException {
79+
Block block = new Block();
80+
block.setStatements(null);
81+
assertEquals("BEGIN\n"
82+
+ "END", block.toString());
83+
}
84+
7085
}

src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,10 @@ public void testMySqlCreateTableWithTextIndexes() throws JSQLParserException {
238238
public void testCreateTableWithCheck() throws JSQLParserException {
239239
assertSqlCanBeParsedAndDeparsed("CREATE TABLE table2 (id INT (10) NOT NULL, name TEXT, url TEXT, CONSTRAINT name_not_empty CHECK (name <> ''))");
240240
}
241-
241+
@Test
242+
public void testCreateTableWithCheckNotNull() throws JSQLParserException {
243+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE table2 (id INT (10) NOT NULL, name TEXT, url TEXT, CONSTRAINT name_not_null CHECK (name IS NOT NULL))");
244+
}
242245
@Test
243246
public void testCreateTableIssue270() throws JSQLParserException {
244247
assertSqlCanBeParsedAndDeparsed("CREATE TABLE item (i_item_sk integer NOT NULL, i_item_id character (16) NOT NULL, i_rec_start_date date, i_rec_end_date date, i_item_desc character varying(200), i_current_price numeric(7,2), i_wholesale_cost numeric(7,2), i_brand_id integer, i_brand character(50), i_class_id integer, i_class character(50), i_category_id integer, i_category character(50), i_manufact_id integer, i_manufact character(50), i_size character(20), i_formulation character(20), i_color character(20), i_units character(10), i_container character(10), i_manager_id integer, i_product_name character(50) )", true);

src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,15 @@ public void testJoin() throws JSQLParserException {
983983
statement = "SELECT * FROM foo AS f LEFT OUTER JOIN (bar AS b RIGHT OUTER JOIN baz AS z ON f.id = z.id) ON f.id = b.id";
984984
select = (Select) parserManager.parse(new StringReader(statement));
985985
assertStatementCanBeDeparsedAs(select, statement);
986-
986+
statement = "SELECT * FROM foo AS f, OUTER bar AS b WHERE f.id = b.id";
987+
select = (Select) parserManager.parse(new StringReader(statement));
988+
assertStatementCanBeDeparsedAs(select, statement);
989+
plainSelect = (PlainSelect) select.getSelectBody();
990+
assertEquals(1, plainSelect.getJoins().size());
991+
assertTrue(plainSelect.getJoins().get(0).isOuter());
992+
assertTrue(plainSelect.getJoins().get(0).isSimple());
993+
assertEquals("bar", ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName());
994+
assertEquals("b", ((Table) plainSelect.getJoins().get(0).getRightItem()).getAlias().getName());
987995
}
988996

989997
@Test

0 commit comments

Comments
 (0)