Skip to content

Commit e79ccc6

Browse files
hishidamawumpz
authored andcommitted
Added Oracle COMMENT statement (#685)
1 parent 0e35e22 commit e79ccc6

File tree

8 files changed

+245
-13
lines changed

8 files changed

+245
-13
lines changed

src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
package net.sf.jsqlparser.statement;
2323

2424
import net.sf.jsqlparser.statement.alter.Alter;
25+
import net.sf.jsqlparser.statement.comment.Comment;
2526
import net.sf.jsqlparser.statement.create.index.CreateIndex;
2627
import net.sf.jsqlparser.statement.create.table.CreateTable;
2728
import net.sf.jsqlparser.statement.create.view.AlterView;
@@ -40,6 +41,8 @@
4041

4142
public interface StatementVisitor {
4243

44+
void visit(Comment comment);
45+
4346
void visit(Commit commit);
4447

4548
void visit(Delete delete);

src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
package net.sf.jsqlparser.statement;
2323

2424
import net.sf.jsqlparser.statement.alter.Alter;
25+
import net.sf.jsqlparser.statement.comment.Comment;
2526
import net.sf.jsqlparser.statement.create.index.CreateIndex;
2627
import net.sf.jsqlparser.statement.create.table.CreateTable;
2728
import net.sf.jsqlparser.statement.create.view.AlterView;
@@ -40,6 +41,11 @@
4041

4142
public class StatementVisitorAdapter implements StatementVisitor {
4243

44+
@Override
45+
public void visit(Comment comment) {
46+
47+
}
48+
4349
@Override
4450
public void visit(Commit commit) {
4551

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2017 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.statement.comment;
23+
24+
import net.sf.jsqlparser.expression.StringValue;
25+
import net.sf.jsqlparser.schema.Column;
26+
import net.sf.jsqlparser.schema.Table;
27+
import net.sf.jsqlparser.statement.Statement;
28+
import net.sf.jsqlparser.statement.StatementVisitor;
29+
30+
public class Comment implements Statement {
31+
32+
private Table table;
33+
private Column column;
34+
private StringValue comment;
35+
36+
@Override
37+
public void accept(StatementVisitor statementVisitor) {
38+
statementVisitor.visit(this);
39+
}
40+
41+
public Table getTable() {
42+
return table;
43+
}
44+
45+
public void setTable(Table table) {
46+
this.table = table;
47+
}
48+
49+
public Column getColumn() {
50+
return column;
51+
}
52+
53+
public void setColumn(Column column) {
54+
this.column = column;
55+
}
56+
57+
public StringValue getComment() {
58+
return comment;
59+
}
60+
61+
public void setComment(StringValue comment) {
62+
this.comment = comment;
63+
}
64+
65+
@Override
66+
public String toString() {
67+
String sql = "COMMENT ON ";
68+
if (table != null) {
69+
sql += "TABLE " + table + " ";
70+
} else if (column != null) {
71+
sql += "COLUMN " + column + " ";
72+
}
73+
sql += "IS " + comment;
74+
return sql;
75+
}
76+
}

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import java.util.ArrayList;
2525
import java.util.List;
26+
2627
import net.sf.jsqlparser.expression.AllComparisonExpression;
2728
import net.sf.jsqlparser.expression.AnalyticExpression;
2829
import net.sf.jsqlparser.expression.AnyComparisonExpression;
@@ -100,6 +101,7 @@
100101
import net.sf.jsqlparser.statement.Statements;
101102
import net.sf.jsqlparser.statement.UseStatement;
102103
import net.sf.jsqlparser.statement.alter.Alter;
104+
import net.sf.jsqlparser.statement.comment.Comment;
103105
import net.sf.jsqlparser.statement.create.index.CreateIndex;
104106
import net.sf.jsqlparser.statement.create.table.CreateTable;
105107
import net.sf.jsqlparser.statement.create.view.AlterView;
@@ -813,6 +815,19 @@ public void visit(Block block) {
813815
}
814816
}
815817

818+
@Override
819+
public void visit(Comment comment) {
820+
if (comment.getTable() != null) {
821+
visit(comment.getTable());
822+
}
823+
if (comment.getColumn() != null) {
824+
Table table = comment.getColumn().getTable();
825+
if (table != null) {
826+
visit(table);
827+
}
828+
}
829+
}
830+
816831
@Override
817832
public void visit(ValuesStatement values) {
818833
for (Expression expr : values.getExpressions()) {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import net.sf.jsqlparser.statement.Statements;
3131
import net.sf.jsqlparser.statement.UseStatement;
3232
import net.sf.jsqlparser.statement.alter.Alter;
33+
import net.sf.jsqlparser.statement.comment.Comment;
3334
import net.sf.jsqlparser.statement.create.index.CreateIndex;
3435
import net.sf.jsqlparser.statement.create.table.CreateTable;
3536
import net.sf.jsqlparser.statement.create.view.AlterView;
@@ -242,6 +243,11 @@ public void visit(Block block) {
242243
buffer.append("END");
243244
}
244245

246+
@Override
247+
public void visit(Comment comment) {
248+
buffer.append(comment.toString());
249+
}
250+
245251
@Override
246252
public void visit(ValuesStatement values) {
247253
expressionDeParser.setBuffer(buffer);

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ import net.sf.jsqlparser.expression.operators.relational.*;
7070
import net.sf.jsqlparser.schema.*;
7171
import net.sf.jsqlparser.statement.*;
7272
import net.sf.jsqlparser.statement.alter.*;
73+
import net.sf.jsqlparser.statement.comment.*;
7374
import net.sf.jsqlparser.statement.create.index.*;
7475
import net.sf.jsqlparser.statement.create.table.*;
7576
import net.sf.jsqlparser.statement.create.view.*;
@@ -160,6 +161,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
160161
| <K_CHAR:"CHAR">
161162
| <K_COLUMN:"COLUMN">
162163
| <K_COMMIT:"COMMIT">
164+
| <K_COMMENT:"COMMENT">
163165
| <K_CONNECT:"CONNECT">
164166
| <K_CONSTRAINT:"CONSTRAINT">
165167
| <K_CREATE:"CREATE">
@@ -419,6 +421,8 @@ Statement SingleStatement() :
419421
stm = Use()
420422
|
421423
stm = Commit()
424+
|
425+
stm = Comment()
422426
)
423427
{ return stm; }
424428
} catch (ParseException e) {
@@ -1031,7 +1035,7 @@ String RelObjectNameWithoutValue() :
10311035
{ Token tk = null; }
10321036
{
10331037
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> | tk=<K_BYTE> | <K_CHAR>
1034-
| tk=<K_CAST> | tk=<K_DO> | tk=<K_EXTRACT> | tk=<K_FIRST> | tk=<K_FOLLOWING>
1038+
| tk=<K_CAST> | tk=<K_COMMENT> | tk=<K_DO> | tk=<K_EXTRACT> | tk=<K_FIRST> | tk=<K_FOLLOWING>
10351039
| tk=<K_LAST> | tk=<K_MATERIALIZED> | tk=<K_NULLS> | tk=<K_PARTITION> | tk=<K_RANGE>
10361040
| tk=<K_ROW> | tk=<K_ROWS> | tk=<K_SIBLINGS> | tk=<K_XML>
10371041
| tk=<K_COLUMN> | tk=<K_REPLACE> | tk=<K_TRUNCATE> | tk=<K_KEY> | tk=<K_ANY>
@@ -3783,3 +3787,27 @@ Commit Commit():
37833787
return commit;
37843788
}
37853789
}
3790+
3791+
Comment Comment():
3792+
{
3793+
Comment result = new Comment();
3794+
Table table;
3795+
Column column;
3796+
Token comment;
3797+
}
3798+
{
3799+
<K_COMMENT> <K_ON>
3800+
(
3801+
(
3802+
<K_TABLE> table = Table() { result.setTable(table); }
3803+
)
3804+
|
3805+
(
3806+
<K_COLUMN> column = Column() { result.setColumn(column); }
3807+
)
3808+
)
3809+
<K_IS> comment=<S_CHAR_LITERAL> { result.setComment(new StringValue(comment.image)); }
3810+
{
3811+
return result;
3812+
}
3813+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package net.sf.jsqlparser.statement.comment;
2+
3+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
4+
import static org.junit.Assert.assertEquals;
5+
6+
import java.io.StringReader;
7+
8+
import net.sf.jsqlparser.JSQLParserException;
9+
import net.sf.jsqlparser.parser.CCJSqlParserManager;
10+
import net.sf.jsqlparser.schema.Column;
11+
import net.sf.jsqlparser.schema.Table;
12+
13+
import org.junit.Test;
14+
15+
public class CommentTest {
16+
17+
private final CCJSqlParserManager parserManager = new CCJSqlParserManager();
18+
19+
@Test
20+
public void testCommentTable() throws JSQLParserException {
21+
String statement = "COMMENT ON TABLE table1 IS 'comment1'";
22+
Comment comment = (Comment) parserManager.parse(new StringReader(statement));
23+
Table table = comment.getTable();
24+
assertEquals("table1", table.getName());
25+
assertEquals("comment1", comment.getComment().getValue());
26+
assertEquals(statement, "" + comment);
27+
}
28+
29+
@Test
30+
public void testCommentTable2() throws JSQLParserException {
31+
String statement = "COMMENT ON TABLE schema1.table1 IS 'comment1'";
32+
Comment comment = (Comment) parserManager.parse(new StringReader(statement));
33+
Table table = comment.getTable();
34+
assertEquals("schema1", table.getSchemaName());
35+
assertEquals("table1", table.getName());
36+
assertEquals("comment1", comment.getComment().getValue());
37+
assertEquals(statement, "" + comment);
38+
}
39+
40+
@Test
41+
public void testCommentTableDeparse() throws JSQLParserException {
42+
String statement = "COMMENT ON TABLE table1 IS 'comment1'";
43+
assertSqlCanBeParsedAndDeparsed(statement);
44+
}
45+
46+
@Test
47+
public void testCommentColumn() throws JSQLParserException {
48+
String statement = "COMMENT ON COLUMN table1.column1 IS 'comment1'";
49+
Comment comment = (Comment) parserManager.parse(new StringReader(statement));
50+
Column column = comment.getColumn();
51+
assertEquals("table1", column.getTable().getName());
52+
assertEquals("column1", column.getColumnName());
53+
assertEquals("comment1", comment.getComment().getValue());
54+
assertEquals(statement, "" + comment);
55+
}
56+
57+
@Test
58+
public void testCommentColumnDeparse() throws JSQLParserException {
59+
String statement = "COMMENT ON COLUMN table1.column1 IS 'comment1'";
60+
assertSqlCanBeParsedAndDeparsed(statement);
61+
}
62+
63+
@Test
64+
public void testToString() {
65+
Comment comment = new Comment();
66+
assertEquals("COMMENT ON IS null", comment.toString());
67+
}
68+
}

0 commit comments

Comments
 (0)