From c31911b3257ab8980b0a7d1f8493c318e3847ea4 Mon Sep 17 00:00:00 2001 From: "pabloa98@gmail.com" Date: Tue, 26 Jan 2016 18:11:28 -0800 Subject: [PATCH 1/2] Added foreign keys support reference options "ON UPDATE/DELETE NO ACTION/CASCADE" --- .../create/table/ForeignKeyIndex.java | 28 ++++++++++++++++++- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 3 ++ .../test/create/CreateTableTest.java | 8 ++++++ 3 files changed, 38 insertions(+), 1 deletion(-) 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..e3b5343f8 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -227,6 +227,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -2618,6 +2619,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..c3498faaf 100644 --- a/src/test/java/net/sf/jsqlparser/test/create/CreateTableTest.java +++ b/src/test/java/net/sf/jsqlparser/test/create/CreateTableTest.java @@ -180,6 +180,14 @@ public void testCreateTableMySqlOnUpdateCurrentTimestamp() throws JSQLParserExce assertSqlCanBeParsedAndDeparsed("CREATE TABLE test (applied timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)"); } + public void testCreateTableMySqlWithConstraintWithCascade() 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 testCreateTableMySqlWithConstraintWithNoAction() 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 testRUBiSCreateList() throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(CreateTableTest.class.getResourceAsStream("/RUBiS-create-requests.txt"))); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); From 1a2688dca0ec25e9ab014ae52a3c3db4abfd7d5f Mon Sep 17 00:00:00 2001 From: "pabloa98@gmail.com" Date: Tue, 26 Jan 2016 18:54:07 -0800 Subject: [PATCH 2/2] Added Mysql Full Text index parsing and deparsing. Some mysql tests were renamed. --- .../jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 3 ++- .../net/sf/jsqlparser/test/create/CreateTableTest.java | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index e3b5343f8..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 */ | | | +| | | | @@ -2590,7 +2591,7 @@ CreateTable CreateTable(): ) | LOOKAHEAD(3) ( {tk=null;} - [ tk= ] tk2= + [ tk= ] [ tk= ] tk2= sk3=RelObjectName() colNames=ColumnsNamesList() { 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 c3498faaf..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,18 +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 testCreateTableMySqlWithConstraintWithCascade() throws JSQLParserException { + 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 testCreateTableMySqlWithConstraintWithNoAction() throws JSQLParserException { + 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();