/*
* ModeShape (http://www.modeshape.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.modeshape.sequencer.ddl.dialect.derby;
import static org.junit.Assert.assertEquals;
import static org.modeshape.sequencer.ddl.StandardDdlLexicon.TYPE_PROBLEM;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.modeshape.sequencer.ddl.DdlParserScorer;
import org.modeshape.sequencer.ddl.DdlParserTestHelper;
import org.modeshape.sequencer.ddl.node.AstNode;
public class DerbyDdlParserTest extends DdlParserTestHelper {
public static final String DDL_FILE_PATH = "ddl/dialect/derby/";
@Before
public void beforeEach() {
parser = new DerbyDdlParser();
setPrintToConsole(false);
parser.setTestMode(isPrintToConsole());
parser.setDoUseTerminator(true);
rootNode = parser.nodeFactory().node("ddlRootNode");
scorer = new DdlParserScorer();
}
@Test
public void shouldParseCreateFunctionWithDataTypeReturn() {
// setPrintToConsole(true);
// parser.setTestMode(isPrintToConsole());
printTest("shouldParseCreateFunctionWithDataTypeReturn()");
String content = "CREATE FUNCTION TO_DEGREES" + NEWLINE + "( RADIANS DOUBLE )" + NEWLINE + "RETURNS DOUBLE" + NEWLINE
+ "PARAMETER STYLE JAVA" + NEWLINE + "NO SQL LANGUAGE JAVA" + NEWLINE
+ "EXTERNAL NAME 'java.lang.Math.toDegrees';";
assertScoreAndParse(content, null, 1);
}
@Test
public void shouldParseCreateFunctionWithTableTypeReturn() {
// setPrintToConsole(true);
// parser.setTestMode(isPrintToConsole());
printTest("shouldParseCreateFunctionWithTableTypeReturn()");
String content = "CREATE FUNCTION PROPERTY_FILE_READER" + NEWLINE + "( FILENAME VARCHAR( 32672 ), FILESIZE INTEGER )"
+ NEWLINE + "RETURNS TABLE (KEY_COL VARCHAR( 10 ), VALUE_COL VARCHAR( 1000 ))" + NEWLINE
+ "LANGUAGE JAVA" + NEWLINE + "PARAMETER STYLE DERBY_JDBC_RESULT_SET" + NEWLINE + "NO SQL" + NEWLINE
+ "EXTERNAL NAME 'vtis.example.PropertyFileVTI.propertyFileVTI';";
assertScoreAndParse(content, null, 1);
}
@Test
public void shouldParseDropSchemaRestrict() {
printTest("shouldParseDropSchemaRestrict()");
String content = "DROP SCHEMA SAMP RESTRICT;";
assertScoreAndParse(content, null, 1);
}
@Test
public void shouldParseCreateIndex() {
printTest("shouldParseCreateIndex()");
String content = "CREATE INDEX PAY_DESC ON SAMP.EMPLOYEE (SALARY DESC, UNIT);";
assertScoreAndParse(content, null, 1);
}
@Test
public void shouldParseLockTable() {
printTest("shouldParseLockTable()");
String content = "LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;";
assertScoreAndParse(content, null, 1);
}
@Test
public void shouldParseDeclareGlobaTemporaryTable() {
printTest("shouldParseDeclareGlobaTemporaryTable()");
String content = "declare global temporary table SESSION.t1(c11 int) not logged;";
assertScoreAndParse(content, null, 1);
}
@Test
public void shouldParseRenameTable() {
printTest("shouldParseRenameTable()");
String content = "RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT;";
assertScoreAndParse(content, null, 1);
}
@Test
public void shouldParseCreateSynonym() {
printTest("shouldParseCreateSynonym()");
String content = "CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME;";
assertScoreAndParse(content, null, 1);
}
@Test
public void shouldParseCreateTrigger() {
printTest("shouldParseCreateTrigger()");
String content = "CREATE TRIGGER FLIGHTSDELETE3" + NEWLINE + "AFTER DELETE ON FLIGHTS" + NEWLINE
+ "REFERENCING OLD AS OLD" + NEWLINE + "FOR EACH ROW" + NEWLINE
+ "DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;";
assertScoreAndParse(content, null, 1);
}
@Test
public void shouldParseCreateTrigger_2() {
printTest("shouldParseCreateTrigger_2()");
String content = "CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x" + NEWLINE + "FOR EACH ROW MODE DB2SQL" + NEWLINE
+ "values app.notifyEmail('Jerry', 'Table x is about to be updated');";
assertScoreAndParse(content, null, 1);
}
@Test
public void shouldParseGrantStatements() {
printTest("shouldParseGrantStatements()");
String content = "GRANT SELECT ON TABLE purchaseOrders TO maria,harry;" + NEWLINE
+ "GRANT UPDATE, TRIGGER ON TABLE purchaseOrders TO anita,zhi;" + NEWLINE
+ "GRANT SELECT ON TABLE orders.bills to PUBLIC;" + NEWLINE
+ "GRANT EXECUTE ON PROCEDURE updatePurchases TO george;" + NEWLINE
+ "GRANT purchases_reader_role TO george,maria;" + NEWLINE
+ "GRANT SELECT ON TABLE purchaseOrders TO purchases_reader_role;";
assertScoreAndParse(content, null, 6);
}
@Test
public void shouldParseAlterTableAlterColumnDefaultRealNumber() {
printTest("shouldParseAlterTableAlterColumnDefaultRealNumber()");
String content = "ALTER TABLE Employees ALTER COLUMN Salary DEFAULT 1000.0;";
assertScoreAndParse(content, null, -1);
}
@Test
public void shouldParseDropProcedure() {
printTest("shouldParseDropProcedure()");
String content = "DROP PROCEDURE some_procedure_name";
assertScoreAndParse(content, null, -1);
}
@Test
public void shouldParseDerbyStatements() {
// setPrintToConsole(true);
// parser.setTestMode(isPrintToConsole());
printTest("shouldParseDerbyStatements()");
String content = getFileContent(DDL_FILE_PATH + "derby_test_statements.ddl");
assertScoreAndParse(content, "derby_test_statements.ddl", -1);
List<AstNode> problems = parser.nodeFactory().getChildrenForType(rootNode, TYPE_PROBLEM);
int nStatements = rootNode.getChildCount() - problems.size();
assertEquals(64, nStatements);
}
}