diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/ForeignKeyIndex.java b/src/main/java/net/sf/jsqlparser/statement/create/table/ForeignKeyIndex.java index b2d42026b..556977680 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/table/ForeignKeyIndex.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/table/ForeignKeyIndex.java @@ -32,6 +32,8 @@ public class ForeignKeyIndex extends NamedConstraint { private Table table; private List referencedColumnNames; + private String onDeleteReferenceOption; + private String onUpdateReferenceOption; public Table getTable() { return table; @@ -49,9 +51,33 @@ public void setReferencedColumnNames(List referencedColumnNames) { this.referencedColumnNames = referencedColumnNames; } + public String getOnDeleteReferenceOption() { + return onDeleteReferenceOption; + } + + public void setOnDeleteReferenceOption(String onDeleteReferenceOption) { + this.onDeleteReferenceOption = onDeleteReferenceOption; + } + + public String getOnUpdateReferenceOption() { + return onUpdateReferenceOption; + } + + public void setOnUpdateReferenceOption(String onUpdateReferenceOption) { + this.onUpdateReferenceOption = onUpdateReferenceOption; + } + @Override public String toString() { + String referenceOptions = ""; + if(onDeleteReferenceOption != null) { + referenceOptions += " ON DELETE " + onDeleteReferenceOption; + } + if(onUpdateReferenceOption != null) { + referenceOptions += " ON UPDATE " + onUpdateReferenceOption; + } return super.toString() - + " REFERENCES " + table + PlainSelect.getStringList(getReferencedColumnNames(), true, true); + + " REFERENCES " + table + PlainSelect.getStringList(getReferencedColumnNames(), true, true) + + referenceOptions; } } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index a8a03dbb3..8de7e854f 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -166,6 +166,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -227,6 +228,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -2589,7 +2591,7 @@ CreateTable CreateTable(): ) | LOOKAHEAD(3) ( {tk=null;} - [ tk= ] tk2= + [ tk= ] [ tk= ] tk2= sk3=RelObjectName() colNames=ColumnsNamesList() { @@ -2618,6 +2620,8 @@ CreateTable CreateTable(): fkIndex.setReferencedColumnNames(colNames); indexes.add(fkIndex); } + [LOOKAHEAD(2) ( ( {fkIndex.setOnDeleteReferenceOption("CASCADE");}| {fkIndex.setOnDeleteReferenceOption("NO ACTION");}))] + [LOOKAHEAD(2) ( ( {fkIndex.setOnUpdateReferenceOption("CASCADE");}| {fkIndex.setOnUpdateReferenceOption("NO ACTION");}))] ) | ( diff --git a/src/test/java/net/sf/jsqlparser/test/create/CreateTableTest.java b/src/test/java/net/sf/jsqlparser/test/create/CreateTableTest.java index b88f663f5..162bd8c44 100644 --- a/src/test/java/net/sf/jsqlparser/test/create/CreateTableTest.java +++ b/src/test/java/net/sf/jsqlparser/test/create/CreateTableTest.java @@ -176,10 +176,22 @@ public void testCreateTableForeignKey6() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (id long, fkey long references another_table (id))"); } - public void testCreateTableMySqlOnUpdateCurrentTimestamp() throws JSQLParserException { + public void testMySqlCreateTableOnUpdateCurrentTimestamp() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (applied timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)"); } + public void testMySqlCreateTableWithConstraintWithCascade() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, t2_id INT (10) UNSIGNED DEFAULT NULL, t3_id INT (10) UNSIGNED DEFAULT NULL, t4_id INT (10) UNSIGNED NOT NULL, PRIMARY KEY (id), KEY fkc_table1_t4 (t4_id), KEY fkc_table1_t2 (t2_id), KEY fkc_table1_t3 (t3_id), CONSTRAINT fkc_table1_t2 FOREIGN KEY (t2_id) REFERENCES table_two(t2o_id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fkc_table1_t3 FOREIGN KEY (t3_id) REFERENCES table_three(t3o_id) ON UPDATE CASCADE, CONSTRAINT fkc_table1_t4 FOREIGN KEY (t4_id) REFERENCES table_four(t4o_id) ON DELETE CASCADE) ENGINE = InnoDB AUTO_INCREMENT = 8761 DEFAULT CHARSET = utf8"); + } + + public void testMySqlCreateTableWithConstraintWithNoAction() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE table1 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, t2_id INT (10) UNSIGNED DEFAULT NULL, t3_id INT (10) UNSIGNED DEFAULT NULL, t4_id INT (10) UNSIGNED NOT NULL, PRIMARY KEY (id), KEY fkc_table1_t4 (t4_id), KEY fkc_table1_t2 (t2_id), KEY fkc_table1_t3 (t3_id), CONSTRAINT fkc_table1_t2 FOREIGN KEY (t2_id) REFERENCES table_two(t2o_id) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT fkc_table1_t3 FOREIGN KEY (t3_id) REFERENCES table_three(t3o_id) ON UPDATE NO ACTION, CONSTRAINT fkc_table1_t4 FOREIGN KEY (t4_id) REFERENCES table_four(t4o_id) ON DELETE NO ACTION) ENGINE = InnoDB AUTO_INCREMENT = 8761 DEFAULT CHARSET = utf8"); + } + + public void testMySqlCreateTableWithTextIndexes() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE TABLE table2 (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, name TEXT, url TEXT, created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FULLTEXT KEY idx_table2_name (name)) ENGINE = InnoDB AUTO_INCREMENT = 7334 DEFAULT CHARSET = utf8"); + } + public void testRUBiSCreateList() throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(CreateTableTest.class.getResourceAsStream("/RUBiS-create-requests.txt"))); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();