Skip to content

Commit

Permalink
Assorted fixes to the Java CC Parser definition (#1153)
Browse files Browse the repository at this point in the history
* Implement Oracle Hints for INSERT, UPDATE, MERGE, DELETE

* Correct CreateIndex TailOptions
Add a Test Case for CreateIndex TailOptions

* Add WHERE expression to MergeInsert
Add test case for MergeInsert WHERE expression

* Fix Issue #1156: ALTER TABLE ADD FOREIGN KEY with schema reference
Add a specific test case
  • Loading branch information
manticore-projects authored Apr 16, 2021
1 parent b880e16 commit 5ee6ec9
Show file tree
Hide file tree
Showing 15 changed files with 269 additions and 46 deletions.
2 changes: 1 addition & 1 deletion nb-configuration.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
That way multiple projects can share the same settings (useful for formatting rules for example).
Any value defined here will override the pom.xml file value but is only applicable to the current project.
-->
<netbeans.compile.on.save>none</netbeans.compile.on.save>
<netbeans.compile.on.save>all</netbeans.compile.on.save>
<com-junichi11-netbeans-changelf.enable>false</com-junichi11-netbeans-changelf.enable>
<com-junichi11-netbeans-changelf.use-project>true</com-junichi11-netbeans-changelf.use-project>
<com-junichi11-netbeans-changelf.lf-kind>LF</com-junichi11-netbeans-changelf.lf-kind>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ public class AlterExpression {
private Set<ReferentialAction> referentialActions = new LinkedHashSet<>(2);

private List<String> fkColumns;
private String fkSourceSchema;

private String fkSourceTable;
private List<String> fkSourceColumns;
private boolean uk;
Expand All @@ -56,6 +58,13 @@ public class AlterExpression {
private List<ConstraintState> constraints;
private List<String> parameters;
private String commentText;

public String getFkSourceSchema() {
return fkSourceSchema;
}
public void setFkSourceSchema(String fkSourceSchema) {
this.fkSourceSchema = fkSourceSchema;
}

public String getCommentText() {
return commentText;
Expand Down Expand Up @@ -405,11 +414,18 @@ public String toString() {
}
b.append(" (").append(PlainSelect.getStringList(ukColumns)).append(")");
} else if (fkColumns != null) {
b.append("FOREIGN KEY (").append(PlainSelect.getStringList(fkColumns)).append(") REFERENCES ")
.append(fkSourceTable).append(" (").append(
PlainSelect.getStringList(fkSourceColumns))
.append(")");
referentialActions.forEach(b::append);
b.append("FOREIGN KEY (")
.append(PlainSelect.getStringList(fkColumns))
.append(") REFERENCES ")
.append(
fkSourceSchema != null && fkSourceSchema.trim().length() > 0
? fkSourceSchema + "."
: "")
.append(fkSourceTable)
.append(" (")
.append(PlainSelect.getStringList(fkSourceColumns))
.append(")");
referentialActions.forEach(b::append);
} else if (index != null) {
b.append(index);
}
Expand Down Expand Up @@ -490,6 +506,11 @@ public AlterExpression withFkColumns(List<String> fkColumns) {
this.setFkColumns(fkColumns);
return this;
}

public AlterExpression withFkSourceSchema(String fkSourceSchema) {
this.setFkSourceTable(fkSourceSchema);
return this;
}

public AlterExpression withFkSourceTable(String fkSourceTable) {
this.setFkSourceTable(fkSourceTable);
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/delete/Delete.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.Optional;
import static java.util.stream.Collectors.joining;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;
Expand All @@ -27,6 +28,7 @@
public class Delete implements Statement {

private Table table;
private OracleHint oracleHint = null;
private List<Table> tables;
private List<Join> joins;
private Expression where;
Expand Down Expand Up @@ -61,6 +63,14 @@ public void setTable(Table name) {
public void setWhere(Expression expression) {
where = expression;
}

public OracleHint getOracleHint() {
return oracleHint;
}

public void setOracleHint(OracleHint oracleHint) {
this.oracleHint = oracleHint;
}

public Limit getLimit() {
return limit;
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/insert/Insert.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.List;
import java.util.Optional;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
Expand All @@ -29,6 +30,7 @@
public class Insert implements Statement {

private Table table;
private OracleHint oracleHint = null;
private List<Column> columns;
private ItemsList itemsList;
private boolean useValues = true;
Expand Down Expand Up @@ -61,6 +63,14 @@ public Table getTable() {
public void setTable(Table name) {
table = name;
}

public OracleHint getOracleHint() {
return oracleHint;
}

public void setOracleHint(OracleHint oracleHint) {
this.oracleHint = oracleHint;
}

public List<Column> getColumns() {
return columns;
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/merge/Merge.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;
Expand All @@ -19,6 +20,7 @@
public class Merge implements Statement {

private Table table;
private OracleHint oracleHint = null;
private Table usingTable;
private SubSelect usingSelect;
private Alias usingAlias;
Expand All @@ -34,6 +36,14 @@ public Table getTable() {
public void setTable(Table name) {
table = name;
}

public OracleHint getOracleHint() {
return oracleHint;
}

public void setOracleHint(OracleHint oracleHint) {
this.oracleHint = oracleHint;
}

public Table getUsingTable() {
return usingTable;
Expand Down
21 changes: 20 additions & 1 deletion src/main/java/net/sf/jsqlparser/statement/merge/MergeInsert.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class MergeInsert {

private List<Column> columns = null;
private List<Expression> values = null;
private Expression whereCondition;

public List<Column> getColumns() {
return columns;
Expand All @@ -38,12 +39,21 @@ public List<Expression> getValues() {
public void setValues(List<Expression> values) {
this.values = values;
}

public Expression getWhereCondition() {
return whereCondition;
}

public void setWhereCondition(Expression whereCondition) {
this.whereCondition = whereCondition;
}

@Override
public String toString() {
return " WHEN NOT MATCHED THEN INSERT "
+ (columns.isEmpty() ? "" : PlainSelect.getStringList(columns, true, true))
+ " VALUES " + PlainSelect.getStringList(values, true, true);
+ " VALUES " + PlainSelect.getStringList(values, true, true)
+ (whereCondition != null ? (" WHERE " + whereCondition) : "");
}

public MergeInsert withColumns(List<Column> columns) {
Expand Down Expand Up @@ -79,4 +89,13 @@ public MergeInsert addValues(Collection<? extends Expression> values) {
collection.addAll(values);
return this.withValues(collection);
}

public MergeInsert withWhereCondition(Expression whereCondition) {
this.setWhereCondition(whereCondition);
return this;
}

public <E extends Expression> E getWhereCondition(Class<E> type) {
return type.cast(getWhereCondition());
}
}
12 changes: 11 additions & 1 deletion src/main/java/net/sf/jsqlparser/statement/update/Update.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.util.List;
import java.util.Optional;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
Expand All @@ -39,6 +40,7 @@ public class Update implements Statement {
private Select select;
private boolean useColumnsBrackets = true;
private boolean useSelect = false;
private OracleHint oracleHint = null;
private List<OrderByElement> orderByElements;
private Limit limit;
private boolean returningAllColumns = false;
Expand All @@ -64,6 +66,14 @@ public void setTable(Table table) {
public void setWhere(Expression expression) {
where = expression;
}

public OracleHint getOracleHint() {
return oracleHint;
}

public void setOracleHint(OracleHint oracleHint) {
this.oracleHint = oracleHint;
}

public List<Column> getColumns() {
return columns;
Expand Down Expand Up @@ -160,7 +170,7 @@ public List<SelectExpressionItem> getReturningExpressionList() {
public void setReturningExpressionList(List<SelectExpressionItem> returningExpressionList) {
this.returningExpressionList = returningExpressionList;
}

@Override
public String toString() {
StringBuilder b = new StringBuilder("UPDATE ");
Expand Down
36 changes: 25 additions & 11 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -879,7 +879,7 @@ Update Update():
List<SelectExpressionItem> returning = null;
}
{
<K_UPDATE> table=TableWithAlias()
<K_UPDATE> { update.setOracleHint(getOracleHint()); } table=TableWithAlias()
startJoins=JoinsList()

<K_SET>
Expand Down Expand Up @@ -1023,7 +1023,7 @@ Insert Insert( List<WithItem> with ):
boolean useAs = false;
}
{
<K_INSERT>
<K_INSERT> { insert.setOracleHint(getOracleHint()); }
[(tk = <K_LOW_PRIORITY> | tk = <K_DELAYED> | tk = <K_HIGH_PRIORITY>)
{if (tk!=null)
modifierPriority = InsertModifierPriority.valueOf(tk.image.toUpperCase());
Expand Down Expand Up @@ -1209,7 +1209,7 @@ Delete Delete():
List<OrderByElement> orderByElements;
}
{
<K_DELETE> [LOOKAHEAD(2) (table=TableWithAlias() { tables.add(table); }
<K_DELETE> { delete.setOracleHint(getOracleHint()); } [LOOKAHEAD(2) (table=TableWithAlias() { tables.add(table); }
("," table=TableWithAlias() { tables.add(table); } )*
<K_FROM> | <K_FROM>)]

Expand All @@ -1235,7 +1235,7 @@ Statement Merge() : {
MergeInsert insert;
}
{
<K_MERGE> <K_INTO> table=TableWithAlias() { merge.setTable(table); }
<K_MERGE> { merge.setOracleHint(getOracleHint()); } <K_INTO> table=TableWithAlias() { merge.setTable(table); }
<K_USING>
( table=Table() { merge.setUsingTable(table); }
| "(" select=SubSelect() { merge.setUsingSelect(select); } ")" )
Expand Down Expand Up @@ -1287,14 +1287,18 @@ MergeInsert MergeInsertClause() : {
List<Expression> expList = new ArrayList<Expression>();
Column col;
Expression exp;
Expression condition;
}
{
<K_WHEN> <K_NOT> <K_MATCHED> <K_THEN>
<K_INSERT> ["(" col=Column() { columns.add(col); } ("," col=Column() { columns.add(col); } )* ")"] <K_VALUES>
"(" exp=SimpleExpression() { expList.add(exp); } ("," exp=SimpleExpression() { expList.add(exp); } )* ")"
{
return mi.withColumns(columns).withValues(expList);
}

{ mi.withColumns(columns).withValues(expList); }

[ <K_WHERE> condition = Expression() { mi.setWhereCondition(condition); }]

{ return mi; }
}

List<String> RelObjectNameList() : {
Expand Down Expand Up @@ -4028,7 +4032,7 @@ CreateIndex CreateIndex():
Index index = null;
//String name = null;
List<String> parameter = new ArrayList<String>();
List<String> tailParameter = null;
List<String> tailParameters = new ArrayList<String>();
List<String> name;
}
{
Expand All @@ -4049,13 +4053,15 @@ CreateIndex CreateIndex():

colNames = ColumnNamesWithParamsList()

[ tailParameter = CreateParameter() {} ]
/* [ tailParameter = CreateParameter() {} ] */

( parameter=CreateParameter() { tailParameters.addAll(parameter); } )*

{
index.setColumns(colNames);
createIndex.setIndex(index);
createIndex.setTable(table);
createIndex.setTailParameters(tailParameter);
createIndex.setTailParameters(tailParameters);
return createIndex;
}
}
Expand Down Expand Up @@ -4790,8 +4796,16 @@ AlterExpression AlterExpression():
|
//following two choices regarding foreign keys should be merged
( <K_FOREIGN> <K_KEY> columnNames=ColumnsNamesList() { alterExp.setFkColumns(columnNames); columnNames = null; }
<K_REFERENCES> tk=<S_IDENTIFIER> [ columnNames=ColumnsNamesList() ]
/*
<K_REFERENCES> tk=<S_IDENTIFIER> [ columnNames=ColumnsNamesList() ]
{ alterExp.setFkSourceTable(tk.image); alterExp.setFkSourceColumns(columnNames); }
*/
<K_REFERENCES> fkTable=Table() [ columnNames=ColumnsNamesList() ]
{
alterExp.setFkSourceSchema(fkTable.getSchemaName());
alterExp.setFkSourceTable(fkTable.getName());
alterExp.setFkSourceColumns(columnNames);
}

[LOOKAHEAD(2) (<K_ON> (tk=<K_DELETE> | tk=<K_UPDATE>) action = Action()
{ alterExp.setReferentialAction(ReferentialAction.Type.valueOf(tk.image), action); }
Expand Down
14 changes: 14 additions & 0 deletions src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,20 @@ public void testAlterTableForgeignKey3() throws JSQLParserException {
public void testAlterTableForgeignKey4() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("ALTER TABLE test ADD FOREIGN KEY (user_id) REFERENCES ra_user (id) ON DELETE SET NULL");
}

@Test
public void testAlterTableForgeignWithFkSchema() throws JSQLParserException {
final String FK_SCHEMA_NAME = "my_schema";
final String FK_TABLE_NAME= "ra_user";
String sql = "ALTER TABLE test ADD FOREIGN KEY (user_id) REFERENCES " + FK_SCHEMA_NAME +"." + FK_TABLE_NAME + " (id) ON DELETE SET NULL";
assertSqlCanBeParsedAndDeparsed(sql);

Alter alter = (Alter) CCJSqlParserUtil.parse(sql);
AlterExpression alterExpression = alter.getAlterExpressions().get(0);

assertEquals(alterExpression.getFkSourceSchema(), FK_SCHEMA_NAME);
assertEquals(alterExpression.getFkSourceTable(), FK_TABLE_NAME);
}

@Test
public void testAlterTableDropColumn() throws JSQLParserException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
package net.sf.jsqlparser.statement.create;

import java.io.StringReader;
import java.util.List;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
import net.sf.jsqlparser.statement.create.index.CreateIndex;
Expand Down Expand Up @@ -119,4 +120,20 @@ public void testFullIndexNameIssue936() throws JSQLParserException {
public void testFullIndexNameIssue936_2() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("CREATE INDEX \"TS\".\"IDX\" ON \"TEST\" (\"ID\") TABLESPACE \"TS\"");
}

@Test
public void testCreateIndexTrailingOptions() throws JSQLParserException {
String statement =
"CREATE UNIQUE INDEX cfe.version_info_idx2\n"
+ " ON cfe.version_info ( major_version\n"
+ " , minor_version\n"
+ " , patch_level ) parallel compress nologging\n"
+ ";";
CreateIndex createIndex = (CreateIndex) parserManager.parse(new StringReader(statement));
List<String> tailParameters = createIndex.getTailParameters();
assertEquals(3, tailParameters.size());
assertEquals(tailParameters.get(0), "parallel");
assertEquals(tailParameters.get(1), "compress");
assertEquals(tailParameters.get(2), "nologging");
}
}
Loading

0 comments on commit 5ee6ec9

Please sign in to comment.