Skip to content

Commit ab00181

Browse files
committed
maybe not correct alter statement
1 parent d603e41 commit ab00181

File tree

6 files changed

+162
-66
lines changed

6 files changed

+162
-66
lines changed

src/main/java/net/sf/jsqlparser/statement/alter/Alter.java

Lines changed: 76 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -19,72 +19,92 @@
1919
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
2020
* #L%
2121
*/
22-
/*
23-
* Copyright (C) 2013 JSQLParser.
24-
*
25-
* This library is free software; you can redistribute it and/or
26-
* modify it under the terms of the GNU Lesser General Public
27-
* License as published by the Free Software Foundation; either
28-
* version 2.1 of the License, or (at your option) any later version.
29-
*
30-
* This library is distributed in the hope that it will be useful,
31-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
32-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
33-
* Lesser General Public License for more details.
34-
*
35-
* You should have received a copy of the GNU Lesser General Public
36-
* License along with this library; if not, write to the Free Software
37-
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
38-
* MA 02110-1301 USA
39-
*/
40-
4122
package net.sf.jsqlparser.statement.alter;
4223

24+
import java.util.List;
4325
import net.sf.jsqlparser.schema.Table;
4426
import net.sf.jsqlparser.statement.Statement;
4527
import net.sf.jsqlparser.statement.StatementVisitor;
4628
import net.sf.jsqlparser.statement.create.table.ColDataType;
29+
import net.sf.jsqlparser.statement.select.PlainSelect;
4730

4831
/**
4932
*
5033
* @author toben
5134
*/
5235
public class Alter implements Statement {
53-
private Table table;
54-
private String columnName;
55-
private ColDataType dataType;
56-
57-
public Table getTable() {
58-
return table;
59-
}
60-
61-
public void setTable(Table table) {
62-
this.table = table;
63-
}
64-
65-
public String getColumnName() {
66-
return columnName;
67-
}
68-
69-
public void setColumnName(String columnName) {
70-
this.columnName = columnName;
71-
}
72-
73-
public ColDataType getDataType() {
74-
return dataType;
75-
}
76-
77-
public void setDataType(ColDataType dataType) {
78-
this.dataType = dataType;
79-
}
80-
81-
@Override
82-
public void accept(StatementVisitor statementVisitor) {
83-
statementVisitor.visit(this);
84-
}
85-
86-
@Override
87-
public String toString() {
88-
return "ALTER TABLE " + table.getFullyQualifiedName() + " ADD COLUMN " + columnName + " " + dataType.toString();
89-
}
36+
37+
private Table table;
38+
private String columnName;
39+
private ColDataType dataType;
40+
private List<String> pkColumns;
41+
private List<String> ukColumns;
42+
private String ukName;
43+
44+
public Table getTable() {
45+
return table;
46+
}
47+
48+
public void setTable(Table table) {
49+
this.table = table;
50+
}
51+
52+
public String getColumnName() {
53+
return columnName;
54+
}
55+
56+
public void setColumnName(String columnName) {
57+
this.columnName = columnName;
58+
}
59+
60+
public ColDataType getDataType() {
61+
return dataType;
62+
}
63+
64+
public void setDataType(ColDataType dataType) {
65+
this.dataType = dataType;
66+
}
67+
68+
public List<String> getPkColumns() {
69+
return pkColumns;
70+
}
71+
72+
public void setPkColumns(List<String> pkColumns) {
73+
this.pkColumns = pkColumns;
74+
}
75+
76+
public List<String> getUkColumns() {
77+
return ukColumns;
78+
}
79+
80+
public void setUkColumns(List<String> ukColumns) {
81+
this.ukColumns = ukColumns;
82+
}
83+
84+
public String getUkName() {
85+
return ukName;
86+
}
87+
88+
public void setUkName(String ukName) {
89+
this.ukName = ukName;
90+
}
91+
92+
@Override
93+
public void accept(StatementVisitor statementVisitor) {
94+
statementVisitor.visit(this);
95+
}
96+
97+
@Override
98+
public String toString() {
99+
StringBuilder b = new StringBuilder();
100+
b.append("ALTER TABLE ").append(table.getFullyQualifiedName()).append(" ADD ");
101+
if (columnName != null) {
102+
b.append("COLUMN ").append(columnName).append(" ").append(dataType.toString());
103+
} else if (pkColumns != null) {
104+
b.append("PRIMARY KEY (").append(PlainSelect.getStringList(pkColumns)).append(")");
105+
} else if (ukColumns != null) {
106+
b.append("UNIQUE KEY ").append(ukName).append(" (").append(PlainSelect.getStringList(ukColumns)).append(")");
107+
}
108+
return b.toString();
109+
}
90110
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2015 JSQLParser
6+
* %%
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU Lesser General Public License as
9+
* published by the Free Software Foundation, either version 2.1 of the
10+
* License, or (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Lesser Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Lesser Public
18+
* License along with this program. If not, see
19+
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
20+
* #L%
21+
*/
22+
package net.sf.jsqlparser.util.deparser;
23+
24+
import net.sf.jsqlparser.statement.alter.Alter;
25+
26+
/**
27+
* very simple alter statement deparser
28+
* @author toben
29+
*/
30+
public class AlterDeParser {
31+
private StringBuilder buffer;
32+
33+
public AlterDeParser(StringBuilder buffer) {
34+
this.buffer = buffer;
35+
}
36+
37+
public void deParse(Alter alter) {
38+
buffer.append(alter.toString());
39+
}
40+
41+
public StringBuilder getBuffer() {
42+
return buffer;
43+
}
44+
45+
public void setBuffer(StringBuilder buffer) {
46+
this.buffer = buffer;
47+
}
48+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ public void setBuffer(StringBuilder buffer) {
146146

147147
@Override
148148
public void visit(Alter alter) {
149-
149+
AlterDeParser alterDeParser = new AlterDeParser(buffer);
150+
alterDeParser.deParse(alter);
150151
}
151152

152153
@Override

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

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2397,10 +2397,10 @@ List<String> ColumnsNamesList():
23972397
Token tk = null;
23982398
}
23992399
{
2400-
"("
2400+
"("
24012401

2402-
tk=<S_IDENTIFIER> { retval.add(tk.image); }
2403-
( "," tk=<S_IDENTIFIER> { retval.add(tk.image); } )*
2402+
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { retval.add(tk.image); }
2403+
( "," (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) { retval.add(tk.image); } )*
24042404

24052405
")"
24062406
{
@@ -2453,15 +2453,29 @@ Alter Alter():
24532453
Table table;
24542454
Token tk;
24552455
ColDataType dataType;
2456+
List<String> pkColumnNames = null;
2457+
List<String> ukColumnNames = null;
24562458
}
24572459
{
2458-
<K_ALTER> <K_TABLE> table=Table() <K_ADD> <K_COLUMN>
2459-
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) dataType=ColDataType()
2460+
<K_ALTER> <K_TABLE> table=Table() { alter.setTable(table); }
24602461

2461-
{
2462-
alter.setTable(table);
2463-
alter.setColumnName(tk.image);
2464-
alter.setDataType(dataType);
2462+
<K_ADD>
2463+
2464+
(
2465+
( <K_COLUMN>
2466+
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) dataType=ColDataType()
2467+
{
2468+
alter.setColumnName(tk.image);
2469+
alter.setDataType(dataType);
2470+
}
2471+
)
2472+
|
2473+
( <K_PRIMARY> <K_KEY> pkColumnNames=ColumnsNamesList() { alter.setPkColumns(pkColumnNames); } )
2474+
|
2475+
( <K_UNIQUE> <K_KEY> (tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>) ukColumnNames=ColumnsNamesList() { alter.setUkName(tk.image); alter.setUkColumns(ukColumnNames); } )
2476+
)
2477+
2478+
{
24652479
return alter;
24662480
}
24672481
}

src/test/java/net/sf/jsqlparser/test/alter/AlterTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
77
import net.sf.jsqlparser.statement.Statement;
88
import net.sf.jsqlparser.statement.alter.Alter;
9+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
910

1011
public class AlterTest extends TestCase {
1112

@@ -21,4 +22,12 @@ public void testAlterTableAddColumn() throws JSQLParserException {
2122
assertEquals("mycolumn", alter.getColumnName());
2223
assertEquals("varchar (255)", alter.getDataType().toString());
2324
}
25+
26+
public void testAlterTablePrimaryKey() throws JSQLParserException {
27+
assertSqlCanBeParsedAndDeparsed("ALTER TABLE animals ADD PRIMARY KEY (id)");
28+
}
29+
30+
public void testAlterTableUniqueKey() throws JSQLParserException {
31+
assertSqlCanBeParsedAndDeparsed("ALTER TABLE `schema_migrations` ADD UNIQUE KEY `unique_schema_migrations` (`version`)");
32+
}
2433
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ public void testCreateTableDefault2() throws JSQLParserException {
111111
public void testCreateTableIfNotExists() throws JSQLParserException {
112112
assertSqlCanBeParsedAndDeparsed("CREATE TABLE IF NOT EXISTS animals (id INT NOT NULL)");
113113
}
114+
115+
public void testCreateTableInlinePrimaryKey() throws JSQLParserException {
116+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE animals (id INT PRIMARY KEY NOT NULL)");
117+
}
114118

115119
public void testRUBiSCreateList() throws Exception {
116120
BufferedReader in = new BufferedReader(new InputStreamReader(CreateTableTest.class.getResourceAsStream("/RUBiS-create-requests.txt")));

0 commit comments

Comments
 (0)