Skip to content

Commit 0036747

Browse files
committed
fixes #57: brackets were not handled properly
1 parent 5563419 commit 0036747

4 files changed

Lines changed: 35 additions & 7 deletions

File tree

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public class SubSelect implements FromItem, Expression, ItemsList {
3434

3535
private SelectBody selectBody;
3636
private Alias alias;
37+
private boolean useBrackets = true;
3738

3839
private Pivot pivot;
3940

@@ -75,14 +76,22 @@ public void setPivot(Pivot pivot) {
7576
this.pivot = pivot;
7677
}
7778

79+
public boolean isUseBrackets() {
80+
return useBrackets;
81+
}
82+
83+
public void setUseBrackets(boolean useBrackets) {
84+
this.useBrackets = useBrackets;
85+
}
86+
7887
@Override
7988
public void accept(ItemsListVisitor itemsListVisitor) {
8089
itemsListVisitor.visit(this);
8190
}
8291

8392
@Override
8493
public String toString() {
85-
return "(" + selectBody + ")"
94+
return (useBrackets?"(":"") + selectBody + (useBrackets?")":"")
8695
+ ((pivot != null) ? " " + pivot : "")
8796
+ ((alias != null) ? alias.toString() : "");
8897
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,16 @@ public void deParse(Replace replace) {
102102
}
103103
}
104104

105+
if (replace.getItemsList() != null) {
106+
// REPLACE mytab SELECT * FROM mytab2
107+
// or VALUES ('as', ?, 565)
108+
109+
if (replace.isUseValues()) {
110+
buffer.append(" VALUES");
111+
}
112+
113+
buffer.append(replace.getItemsList());
114+
}
105115
}
106116

107117
@Override

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ Replace Replace():
355355
|
356356
{ replace.setUseValues(false); }
357357
itemsList=SubSelect()
358+
{ ((SubSelect)itemsList).setUseBrackets(false); }
358359
)
359360
{
360361
replace.setItemsList(itemsList);

src/test/java/net/sf/jsqlparser/test/replace/ReplaceTest.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.io.StringReader;
44

5-
import junit.framework.TestCase;
65
import net.sf.jsqlparser.JSQLParserException;
76
import net.sf.jsqlparser.expression.JdbcParameter;
87
import net.sf.jsqlparser.expression.LongValue;
@@ -12,15 +11,17 @@
1211
import net.sf.jsqlparser.schema.Column;
1312
import net.sf.jsqlparser.statement.replace.Replace;
1413
import net.sf.jsqlparser.statement.select.SubSelect;
14+
import net.sf.jsqlparser.test.TestUtils;
15+
import static org.junit.Assert.assertEquals;
16+
import static org.junit.Assert.assertTrue;
17+
import org.junit.Test;
1518

16-
public class ReplaceTest extends TestCase {
19+
public class ReplaceTest {
1720

18-
CCJSqlParserManager parserManager = new CCJSqlParserManager();
21+
private static CCJSqlParserManager parserManager = new CCJSqlParserManager();
1922

20-
public ReplaceTest(String arg0) {
21-
super(arg0);
22-
}
2323

24+
@Test
2425
public void testReplaceSyntax1() throws JSQLParserException {
2526
String statement = "REPLACE mytable SET col1='as', col2=?, col3=565";
2627
Replace replace = (Replace) parserManager.parse(new StringReader(statement));
@@ -36,6 +37,7 @@ public void testReplaceSyntax1() throws JSQLParserException {
3637

3738
}
3839

40+
@Test
3941
public void testReplaceSyntax2() throws JSQLParserException {
4042
String statement = "REPLACE mytable (col1, col2, col3) VALUES ('as', ?, 565)";
4143
Replace replace = (Replace) parserManager.parse(new StringReader(statement));
@@ -50,6 +52,7 @@ public void testReplaceSyntax2() throws JSQLParserException {
5052
assertEquals(statement, "" + replace);
5153
}
5254

55+
@Test
5356
public void testReplaceSyntax3() throws JSQLParserException {
5457
String statement = "REPLACE mytable (col1, col2, col3) SELECT * FROM mytable3";
5558
Replace replace = (Replace) parserManager.parse(new StringReader(statement));
@@ -62,4 +65,9 @@ public void testReplaceSyntax3() throws JSQLParserException {
6265
// TODO:
6366
// assertEquals(statement, ""+replace);
6467
}
68+
69+
@Test
70+
public void testProblemReplaceParseDeparse() throws JSQLParserException {
71+
TestUtils.assertSqlCanBeParsedAndDeparsed("REPLACE a_table (ID, A, B) SELECT A_ID, A, B FROM b_table", false);
72+
}
6573
}

0 commit comments

Comments
 (0)