/*
* Copyright 2010 NCHOVY
*
* 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.krakenapps.sqlparser.syntax;
import static org.krakenapps.bnf.Syntax.*;
import org.krakenapps.bnf.Rule;
import org.krakenapps.bnf.SequenceRule;
import org.krakenapps.bnf.Syntax;
import org.krakenapps.sqlparser.parser.*;
public class SqlSyntax {
private SqlSyntax() {
}
public static Syntax create() {
Syntax s = new Syntax();
// Root syntaxes
s.addRoot("query_specification");
s.addRoot("update_statement_searched");
s.addRoot("insert_statement");
s.addRoot("delete_statement_searched");
s.addRoot("desc_table_statement");
s.addRoot("table_definition");
s.addRoot("drop_table_statement");
s.addRoot("alter_table_statement");
s.addRoot("show_tables");
//merius - start
//ALTER DOMAIN statement -- 1 test
s.addRoot("alter_domain_statement");
s.add("alter_domain_statement", new AlterDomainStatementParser(),
k("ALTER"), k("DOMAIN"), ref("domain_name"), ref("alter_domain_action"));
s.add("alter_domain_action", null, choice(
ref("set_domain_default_clause"),
ref("drop_domain_default_clause"),
ref("add_domain_constraint_definition"),
ref("drop_domain_constraint_definition")));
s.add("set_domain_default_clause", new SetDomainDefaultClauseParser(),
k("SET"), ref("default_clause"));
s.add("drop_domain_default_clause", new DropDomainDefaultClauseParser(),
k("DROP"), k("DEFAULT"));
s.add("add_domain_constraint_definition", new AddDomainConstraintDefinitionParser(),
k("ADD"), ref("domain_constraint") );
s.add("drop_domain_constraint_definition", new DropDomainConstraintDefinitionParser(),
k("DROP"), k("CONSTRAINT"), ref("constraint_name"));
s.add("default_clause", new DefaultClauseParser(),
k("DEFAULT"), ref("default_option"));
s.add("default_option", new DefaultOptionParser(), choice(
ref("literal"),
ref("datetime_value_function"),
k("USER"),
k("CURRENT_USER"),
k("CURRENT_ROLE"),
k("SESSION_USER"),
k("SYSTEN_USER"),
k("CURRENT_PATH"),
ref("implicitly_typed_value_specification")));
s.add("datetime_value_function", new DatetimeValueFunctionParser(), choice(
ref("current_date_value_function"),
ref("current_time_value_function"),
ref("current_timestamp_value_function"),
ref("current_local_time_value_function"),
ref("current_local_timestamp_value_function")));
s.add("current_date_value_function", null, k("CURRENT_DATE"));
s.add("current_time_value_function", new CurrentTimeValueFunctionParser(),
k("CURRENT_TIME"), option( rule( k("("), ref("time_precision"), k(")"))));
s.add("current_timestamp_value_function", new CurrentTimestampValueFunctionParser(),
k("CURRENT_TIMESTAMP"), option( rule( k("("), ref("time_precision"), k(")"))));
s.add("current_local_time_value_function", new CurrentLocalTimeValueFunctionParser(),
k("LOCALTIME"), option( rule( k("("), ref("time_precision"), k(")"))));
s.add("current_local_timestamp_value_function", new CurrentLocalTimestampValueFunctionParser(),
k("LOCALTIMESTAMP"), option( rule( k("("), ref("time_precision"), k(")"))));
s.add("time_precison", null, ref("time_fractional_seconds_precision"));
s.add("time_fractional_seconds_precision", null, ref("unsigned_integer"));
s.add("domain_name", null, ref("schema_qualified_name"));
s.add("domain_constraint", new DomainConstraintParser(),
option(ref("constraint_name_definition")),
ref("check_constraint_definition"),
option(ref("constraint_characteristics")));
//CLOSE statement
s.addRoot("close_statement");
s.add("close_statement", new CloseStatementParser(), k("CLOSE"), ref("cursor_name"));
s.add("cursor_name", null, ref("identifier"));
s.add("local_qualified_name", new LocalQualifiedNameParser(),
option( rule( ref("local_qualifier"), k("."))), ref("qualifier_identifier"));
s.add("local_qualifier", null, k("MODULE"));
s.add("qualifier_identifier", null, k("identifier"));
s.add("actual_identifier", new ActualIdentifierParser(),
choice( ref("regular_identifier"), ref("delimited_identifier")));
s.add("regular_identifier", null, ref("identifier_body"));
s.add("identifier_body", new IdentifierBodyParser(),
ref("identifier"), option(repeat(ref("identifier_part"))));
s.add("identifier_part", null, choice(
ref("alphabetic_character"),
ref("ideographic_character"),
ref("decimal_digit_character"),
ref("identifier_combining_character"),
k("_"),
ref("alternate_underscore"),
ref("extender_character"),
ref("identifier_ignorable_character"),
ref("connector_character")
));
s.add("identifier_start", new IdentifierStartParser(),
choice( ref("initial_alphabetic"), ref("ideographic_character")));
//s.add("initial_alphabetic_character",/**/,/**/); //TODO - initial_alphabetic_character���먯떇��
//s.add("ideographic_character",/**/,/**/); //TODO - ideographic_character���먯떇��
s.add("delimited_identifier", new DelimitedIdentifierParser(),
k("\""), doubleQuotedString(), k("\""));
//s.add("delimited_identifier_body", /**/,/**/); //TODO
//COMMIT statement
s.addRoot("commit_statement");
s.add( "commit_statement", new CommitStatementParser(),
k("COMMIT"), option( k("WORK")), option( rule( k("AND"), option(k("NO")), k("CHAIN"))));
//CONNECT statement
s.addRoot("connect_statement");
s.add("connect_statement", new ConnectStatementParser(),
k("CONNECT"), k("TO"), option( ref("connection_target")));
s.add("connection_target", new ConnectionTargetParser(), choice(
rule( ref("sql_server_name"), option( rule( k("AS"), ref("connection_name"))), option(rule(k("USER"), ref("connection_user_name")))),
k("DEFAULT"))); //TODO
s.add("connection_user_name", null, ref("simple_value_specification"));
s.add("sql_server_name", null, ref("simple_value_specification"));
s.add("simple_value_specification", new SimpleValueSpecificationParser(), choice(
ref("literal"),
ref("host_parameter_name"),
ref("sql_parameter_reference"),
ref("sql_variable_reference"),
ref("embedded_variable_name")));
s.add("signed_numeric_literal", new SignedNumericLiteralParser(),
option( k("+"), k("-")), ref("unsigned_numeric_literal"));
s.add("unsigned_numeric_literal", new UnsignedNumericLiteralParser(),
choice( ref("exact_numeric_literal"), ref("approximate_numeric_literal")));
s.add("exact_numeric_literal", new ExactNumericLiteralParser(), choice(
rule( ref("unsigned_integer"), option( rule( k("."), option( ref("unsigned_integer"))))),
rule( k("."), ref("unsigned_integer"))));
s.add("apprixmate_numeric_literal", new ApproximateNumericLiteralParser(),
ref("mantissa"), k("E"), ref("exponent"));
s.add("mantissa", null, ref("exact_numeric_literal"));
s.add("exponent", null, ref("signed_integer"));
s.add("signed_integer", new SignedIntegerParser(),
option( choice(k("+"), k("-"))), ref("unsigned_integer"));
s.add("host_parameter_name", new HostParameterNameParser(),
k(":"), ref("identifier"));
s.add("sql_parameter_reference", null, ref("basic_identifier_chain"));
s.add("sql_variable_reference", null, ref("basic_identifier_chains"));
s.add("embedded_variable_name", new EmbeddedVariableNameParser(),
k(":"), ref("host_identifier"));
s.add("host_identifier", new HostIdentifierParser(), choice(
ref("ada_host_identifier"),
ref("c_host_identifier"),
ref("cobol_host_identifier"),
ref("fortan_host_identifier"),
ref("mumps_host_identifier"),
ref("pascal_host_identifier"),
ref("pl_l_host_identifier")));
s.add("connection_name", null,
ref("simple_value_specification"));
//s.add("ada_host_identifier"); //TODO
//s.add("cobol_host_identifier"); //TODO
//s.add("fortan_host_identifier"); //TODO
//s.add("mumps_host_identifier"); //TODO
//s.add("pascal_host_identifier"); //TODO
//s.add("pl_l_host_identifier"); //TODO
// CREATE ASSERTION statement
s.addRoot("assertion_definition");
s.add("assertion_definition", new AssertionStatementParser(),
k("CREATE"), k("ASSERTION"), ref("constraint_name"), k("CHECK"), k("("), ref("search_condition"), k(")"), option( ref("constraint_characteristics")) );
s.add("constraint_characteristics", new ConstraintCharacteristicsParser(), choice(
rule( ref("constraint_check_time"), option( rule( option(k("NOT")), k("DEFERABLE")))),
rule( option(k("NOT")), k("DEFERABLE"), option( ref("constraint_check_time")))));
s.add("constraint_check_time", new ConstraintCheckTimeParser(), choice(
rule(k("INITIALLY"), k("DEFERRED")),
rule( k("INITIALLY"), k("IMMEDIATE"))));
// CREATE CHARACTER SET statement
s.addRoot("character_set_definition");
s.add("character_set_definition", new CharacterSetStatementParser(),
k("CREATE"), k("CHARACTER"), k("SET"),
ref("character_set_name"),
option( k("AS")),
ref("character_set_source"),
option( ref("collate_clause")));
s.add("character_set_name", new CharacterSetNameParser(),
option( rule( ref("schema_name"), k("."))), ref("sql_language_identifer"));
s.add("schema_name", new SchemaNameParser(),
option( rule( ref("catalog_name"), k("."))), ref("unqualified_schema_name"));
s.add("catalog_name", null, ref("identifier"));
s.add("unqualified_schema_name", null, ref("identifier"));
s.add("sql_language_identifier", new SQLLanguageIdentifierParser(),
ref("sql_language_identifier_start"),
option( repeat(choice(k("_"), ref("sql_language_identifier_part")))));
s.add("sql_language_identifier_start", null, ref("simple_latin_letter"));
s.add("sql_language_identifier_part", null,
choice(ref("simple_latin_letter"), ref("digit")));
s.add("character_set_source", new CharacterSetSourceParser(),
k("GET"), ref("character_set_specification"));
s.add("collate_clause", new CollateClauseParser(), k("COLLATE"), ref("collation_name"));
s.add("collate_name", new CollateNameParser(), ref("schema_qualified_name"));
s.add("character_set_specification", null, choice(
ref("standard_character_set_name"),
ref("implementation_defined_character_set_name"),
ref("user_defined_character_set_name")
));
s.add("standard_character_set_name",null, ref("character_set_name"));
s.add("implementation_defined_character_set_name", null, ref("character_set_name"));
s.add("user_definded_character_set_name", null, ref("character_set_name"));
// CREATE COLLATION statement
s.addRoot("collation_definition");
s.add("collation_definition", new CollationStatementParser(), k("CREATE"), k("COLLATION"), ref("collation_name"), k("FOR"),
ref("character_set_specification"), k("FROM"), ref("existing_collation_name"), option(ref("pad_characteristic")));
s.add("collation_name", null, ref("schema_qualified_name"));
s.add("existing_collation_name", null, ref("collation_name"));
s.add("pad_characteristic", new PadCharacteristicParser(), choice(
rule( k("NO"), k("PAD")),
rule( k("PAD"), k("SPACE"))
));
// CREATE DOMAIN statement
s.addRoot("domain_definition");
s.add("domain_definition", new DomainStatementParser(),
k("CREATE"), k("DOMAIN"), ref("domain_name"), option(k("AS")),
ref("data_type"),
option( ref("default_clause")),
option(repeat(ref("domain_constraint"))),
option(ref("collate_clause")));
s.add("domain_name", null, ref("schema_qualified_name"));
s.add("domain_constraint", new DomainConstraintParser(),
option(ref("constraint_name_definition")),
ref("check_constraint_definition"),
option(ref("constraint_characteristics")));
s.add("constraint_name_definition", new ConstraintNameDefinitionParser(),
k("CONSTRAINT"), ref("constraint_name"));
// CREATE FUNCTION statement
s.addRoot("schema_definition");
s.add("schema_function", null, k("CREATE"), ref("sql_invoked_function"));
s.add("sql_invoked_function", new SQLInvokedFunctionParser(), choice(
ref("function_specification"),
ref("method_specification_designer")),
ref("routine_body"));
s.add("function_specification", new FunctionSpecificationParser(),
k("FUNCTION"), ref("schema_qualified_routine_name"), ref("sql_parameter_declaration_list"),
ref("returns_clause"), ref("routine_characteristics"), option(ref("dispatch_clause")));
s.add("schema_qualified_routine_name", null, ref("schema_qualified_name"));
s.add("sql_parameter_declaration_list", new SQLParameterDeclarationListParser(),
k("("), ref("sql_parameter_declaration"), option(repeat(rule(k(","), ref("sql_parameter_declaration")))), k(")"));
s.add("sql_parameter_declaration", new SQLParameterDeclarationParser(),
option(ref("parameter_mode")), option(ref("sql_parameter_name")), ref("parameter_type"), option(k("RESULT")));
s.add("parameter_mode", null, choice(
k("IN"), k("OUT"), k("INOUT")));
s.add("sql_parameter_name", null, ref("identifier"));
s.add("parameter_type", new ParameterTypeParser(), ref("data_type"), option(ref("locator_indication")));
s.add("returns_clause", new ReturnsClauseParser(),
k("RETURNS"), ref("returns_data_type"), option( ref("result_cast")));
s.add("returns_data_type", new ReturnsDataTypeParser(),
ref("data_type"), option( ref("locator_indication")));
s.add("locator_indication", new LocatorIndicationParser(), k("AS"), k("LOCATOR"));
s.add("routine_characteristics", new RoutineCharacteristicsParser(),
option(repeat(ref("routine_characteristic"))));
s.add("routine_characteristic", new RoutineCharacteristicParser(),choice(
ref("language_clause"),
ref("parameter_style_clause"),
rule(k("SPECIFIC"), ref("specific_name")),
ref("deterministic_characteristic"),
ref("sql_data_access_indication"),
ref("null_call_clause"),
ref("dynamic_result_sets_characterisitic")
));
s.add("dynamic_result_sets_characterisitic", new DynamicResultSetsCharacteristicParser(),
k("DYNAMIC"), k("RESULT"), k("SETS"), ref("maximum_dynamic_result_sets"));
s.add("maximum_dynamic_result_sets", null, ref("unsigned_integer"));
s.add("null_call_clause", new NullCallClauseParser(), choice(
rule(k("RETURNS"), k("NULL"), k("ON"), k("NULL"), k("INPUT")),
rule(k("CALLED"), k("ON"), k("NULL"), k("INPUT"))
));
s.add("sql_data_access_indication", new SQLDataAccessIndicationParser(), choice(
rule(k("NO"), k("SQL")),
rule(k("CONTAINS"), k("SQL")),
rule(k("READS"), k("SQL"), k("DATA")),
rule(k("DOMIFIES"), k("SQL"), k("DATA"))
));
s.add("deterministic_characteristic", new DeterministicCharacteristicParser(), choice(
k("DETERMINISTIC"),
rule(k("NOT"), k("DETERMINISTIC"))));
s.add("specific_name", null, ref("schema_qualified_name"));
s.add("dispatch_clause", new DispatchClauseParser(), k("STATIC"), k("DISPATCH"));
s.add("routine_body", null, choice( ref("sql_routine_body"), ref("external_body_reference")));
s.add("sql_routine_body", null, ref("sql_procedure_statement"));
s.add("sql_procedure_statement", null, ref("sql_executable_statement"));
s.add("sql_executable_statement", null, choice(
ref("sql_schema_statement"),
ref("sql_data_statement"),
ref("sql_control_statement"),
ref("sql_transaction_statement"),
ref("sql_connection_statement"),
ref("sql_session_statement"),
ref("sql_diagnostics_statement"),
ref("sql_dynamic_statement")
));
s.add("sql_schema_statement", null, choice(
ref("sql_schema_definition_statement"),
ref("sql_schema_manipulation_statement")));
s.add("sql_schema_definition_statement", null, choice(
ref("schema_definition"),
ref("table_definition"),
ref("view_definition"),
ref("sql_invoked_routine"),
ref("grant_statement"),
ref("role_definition"),
ref("domain_definition"),
ref("character_set_definition"),
ref("collation_definition"),
ref("translation_definition"),
ref("assertion_definition"),
ref("trigger_definition"),
ref("user_defined_type_definition"),
ref("user_defined_cast_definition"),
ref("transform_definition"),
ref("sql_server_module_definition")));
s.add("sql_schema_manipulation_statement", null, choice(
ref("drop_schema_statement"),
ref("alter_table_statement"),
ref("drop_table_statement"),
ref("drop_view_statement"),
ref("alter_routine_statement"),
ref("drop_routine_statement"),
ref("drop_user_defined_cast_statement"),
ref("revoke_statement"),
ref("drop_role_statement"),
ref("alter_domain_statement"),
ref("drop_domain_statement"),
ref("drop_character_set_statement"),
ref("drop_collation_statement"),
ref("drop_translation_statement"),
ref("drop_assertion_statement"),
ref("drop_trigger_statement"),
ref("alter_type_statement"),
ref("drop_data_type_statement"),
ref("drop_user_defined_ordering_statement"),
ref("drop_transform_statement"),
ref("drop_module_statement")));
s.add("sql_data_statement", null, choice(
ref("open_statement"),
ref("fetch_statement"),
ref("close_statement"),
ref("select_statement_single_row"),
ref("free_locator_statement"),
ref("hold_locator_statement"),
ref("sql_data_change_statement")));
s.add("select_statement_single_row", new SelectStatementSingleRowParser(),
k("SELECT"), option( ref("set_qualifier")), ref("select_list"), k("INTO"),
ref("select_target_list"), ref("table_expression") );
s.add("set_qualifer", null, choice( k("DISTINCT"), k("ALL")));
s.add("select_target_list", new SelectTargetListParser(),
ref("target_specification"), option(repeat(rule(k(","), ref("target_specification")))));
s.add("sql_control_statement", null, choice(
ref("return_statement"),
ref("assignment_statement"),
ref("compound_statement"),
ref("case_statement"),
ref("if_statement"),
ref("iterate_statement"),
ref("leave_statement"),
ref("loop_statement"),
ref("while_statement"),
ref("repeat_statement"),
ref("for_statement")));
s.add("sql_transaction_statement", null, choice(
ref("start_transaction_statement"),
ref("set_transaction_statement"),
ref("set_constraints_mode_statement"),
ref("savepoint_statement"),
ref("release_savepoint_statement"),
ref("commit_statement"),
ref("rollback_statement")));
s.add("sql_connection_statement", null, choice(
ref("connection_statement"),
ref("set_connection_statement"),
ref("disconnection_statement")));
s.add("sql_session_statement", null, choice(
ref("set_session_user_identifier_statement"),
ref("set_role_statement"),
ref("set_local_time_zone_statement"),
ref("set_session_characteristics_statement"),
ref("set_catalog_statement"),
ref("set_schema_statement"),
ref("set_names_statement"),
ref("set_path_statement"),
ref("set_transform_group_statement")));
s.add("sql_diagnostics_statement", null, choice(
ref("get_diagnostics_statement"),
ref("signal_statement"),
ref("resignal_statement")));
s.add("sql_dynamic_statement", null, choice(
ref("system descriptor statement"),
ref("prepare statement"),
ref("deallocate prepared statement"),
ref("describe statement"),
ref("execute statement"),
ref("execute immediate statement"),
ref("SQL dynamic data statement")));
s.add("external_body_reference", new ExternalBodyReferenceParser(),
k("EXTERNAL"),
option( rule( k("NAME"), ref("external_routine_name"))),
option( ref("parameter_style_clause")),
option( ref("transform_group_specification")),
option( ref("external_security_clause")));
s.add("external_routine_name", null, choice(
ref("identifer"),
ref("character_string_literal")));
s.add("parameter_style_clause", new ParameterStyleClauseParser(),
k("PARAMETER"), k("STYLE"), ref("parameter_style"));
s.add("parameter_style", null, choice(
k("SQL"), k("GENERAL")));
s.add("transform_group_specification", new TransformGroupSpecificationParser(),
k("TRANSFORM"), k("GROUP"), option(
choice( ref("single_group_specification"), ref("multiple_group_specification"))));
s.add("single_group_specification", null, ref("group_name"));
s.add("group_name", null, ref("identifier"));
s.add("multiple_group_specification", new MultipleGroupSpecificationParser(),
ref("group_specification"), option(repeat(rule(k(","), ref("group_specification"))))); //TODO
s.add("external_security_clause", null, choice(
rule( k("EXTERNAL"), k("SECURITY"), k("DEFINER")),
rule( k("EXTERNAL"), k("SECURITY"), k("INVOKER")),
rule( k("EXTERNAL"), k("SECURITY"), k("IMPLEMENTATION"), k("DEFINED"))));
// CREATE PROCEDURE statement
s.addRoot("schema_procedure");
s.add("schema_procedure", new SchemaProcedureParser(), k("CREATE"), ref("sql_invoked_procedure"));
s.add("sql_invoked_procedure", new SQLInvokedProcedureParser(),
k("PROCEDURE"), ref("schema_qualified_routine_name"), ref("sql_parameter_declaration_list"),
ref("routine_characteristics"), ref("routine_body"));
// CREATE SCHEMA statement
s.addRoot("schema_definition");
s.add("schema_definition", new SchemaDefinitionParser(),
k("CREATE"), k("SCHEMA"), ref("schema_name_clause"), option( ref("schema_character_set_or_path")),
repeat(ref("schema_element"))); //TODO
s.add("schema_character_set_or_path", null, choice(
ref("schema_name"),
rule( k("AUTHORIZATION"), ref("schema_authorization_identifier")),
rule( ref("schema_name"), k("AUTHORIZATION"), ref("schema_authorization_identifier"))));
s.add("schema_authorization_identifier", null, ref("authorization_identifer"));
s.add("authorization_identifier", null, choice(
ref("role_name"),
ref("user_identifier")));
s.add("role_name", null, ref("identifier"));
s.add("user_identifier", null, ref("identifier"));
s.add("schema_element", null, choice(
ref("table_definition"),
ref("view_definition"),
ref("domain_definition"),
ref("character_set_definition"),
ref("collation_definition"),
ref("translation_definition"),
ref("assertion_definition"),
ref("trigger_definition"),
ref("user-defined_type_definition"),
ref("schema_routine"),
ref("grant_statement"),
ref("role_definition"),
ref("user_defined_cast_definition"),
ref("user_defined_ordering_definition"),
ref("transform_definition")
));
//CREATE TRANSLATION statement
s.addRoot("translation_definition");
s.add("translation_definition", new TranslationDefinitionParser(),
k("CREATE"), k("TRANSLATION"), ref("translation_name"), k("FOR"),
ref("source_character_set_specification"), k("TO"), ref("target_character_set_specification"),
k("FROM"), ref("translation_source"));
s.add("translation_name", null, ref("schema_qualified_name"));
s.add("source_character_set_specification", null, ref("character_set_specification"));
s.add("target_character_set_specification", null, ref("character_set_specification"));
s.add("translation_source", null, choice(
ref("existing_translation_name"),
ref("translation_routine")));
s.add("existing_translation_name", null, ref("translation_name"));
s.add("translation_routine", null, ref("specific_routine_designator"));
s.add("specific_routine_designator", null, choice(
rule( k("SPECIFIC"), ref("routine_type"), ref("specific_name")),
rule( ref("routine_type"), ref("member_name"), option(rule(k("FOR"), ref("user_defined_type_name"))))));
s.add("routine_type", null, choice(
k("ROUTINE"),
k("FUNCTION"),
k("PROCEDURE"),
rule( option( choice(
k("INSTANCE"), k("STATIC"), k("CONSTRUCTOR"))), k("METHOD"))));
s.add("member_name", new MemberNameParser(),
ref("schema_qualified_routine_name"), option( ref("data_type_list")));
s.add("data_type_list", new DataTypeListParser(),
k("("), ref("data_type_list_inner"), k(")")); //TODO
s.add("data_type_list_inner", null,
choice(ref("data_type_part"), ref("data_type")));
s.add("data_type_part", null, ref("data_type"), k(","), ref("data_type_list_inner"));
s.add("user_defined_type_name", null, ref("schema_qualified_type_name"));
s.add("schema_qualified_type_name", new SchemaQualifiedTypeNameParser(),
option( rule( ref("schema_name"), k("."))), ref("qualified_identifier"));
// CREATE TRIGGER statement
s.addRoot("trigger_definition");
s.add("trigger_definition", new TriggerDefinitionParser(),
k("CREATE"), k("TRIGGER"), ref("trigger_name"), ref("trigger_action_time"), ref("trigger_event"), k("ON"), ref("table_name"),
option( rule(k("REFERENCING"), ref("old_or_new_values_alias_list"))), ref("triggered_action"));
s.add("trigger_name", null, ref("schema_qualified_name"));
s.add("trigger_action_time", null, choice(
k("BEFORE"),
k("AFTER")));
s.add("trigger_event", null, choice(
k("INSERT"),
k("DELETE"),
rule(k("UPDATE"), option( k("OF"), ref("trigger_column_list")))));
s.add("trigger_column_list", null, ref("column_name_list"));
s.add("old_or_new_values_alias_list", null, repeat(ref("old_or_new_values_alias"))); //TODO
s.add("old_or_new_values_alias", new OldOrNewValuesAliasParser(), choice(
rule( k("OLD"), option(k("ROW")), option(k("AS")), ref("old_values_correlation_name")),
rule( k("NEW"), option(k("ROW")), option(k("AS")), ref("new_values_correlation_name")),
rule( k("OLD"), k("ROW"), option(k("AS")), ref("old_values_table_alias")),
rule( k("NEW"), k("ROW"), option(k("AS")), ref("new_values_table_alias"))
));
s.add("old_values_correlation_name", null, ref("correlation_name"));
s.add("new_values_correlation_name", null, ref("correlation_name"));
s.add("old_values_table_alias", null, ref("identifier"));
s.add("new_values_table_alais", null, ref("identifier"));
s.add("triggered_action", new TriggeredActionParser(),
option( rule( k("FOR"), k("EACH"), choice( k("ROW"), k("STATEMENT")))),
option( rule( k("WHEN"), k("("), ref("search_condition"), k(")"))),
ref("triggered_sql_statement"));
s.add("triggered_sql_statement", new TriggeredSQLStatementParser(), choice(
ref("sql_procedure_statement"),
rule( k("BEGIN"), k("ATOMIC"), repeat(
rule(ref("sql_procedure_statement"), k(";"))
), k("END"))));//TODO
// CREATE VIEW statement
s.addRoot("view_definition");
s.add("view_definition", new ViewDefinitionParser(),
k("CREATE"), option(k("RECURSIVE")), k("VIEW"), ref("table_name"), ref("view_specification"), k("KEY"),
ref("query_expression"), option( rule( k("WITH"), option(ref("levels_clause")), k("CHECK"), k("OPTION"))));
s.add("view_specification", null, choice(
ref("regular_view_definition"),
ref("reference_view_specification")));
s.add("regular_view_definition", null, option( rule( k("("), ref("view_column_list"), k(")"))));
s.add("view_column_list", null, ref("column_name_list"));
s.add("reference_view_specification", new ReferenceViewSpecificationParser(),
k("OF"), ref("user_defined_type"), option(ref("subview_clause")), option(ref("view_element_list")));
s.add("user_defined_type", null, ref("user_defined_type_name"));
s.add("subview_clause", new SubviewClauseParser(), k("UNDER"), ref("table_name"));
s.add("view_element_list", new ViewElementListParser(),
k("("), option(rule(ref("self_referencing_column_specification"), k(","))), ref("view_element") /*TODO*/
); //TODO
s.add("view_element", null, ref("view_column_option"));
s.add("view_column_option", new ViewColumnOptionParser(), ref("column_name"), k("WITH"), k("OPTIONS"), ref("scope_clause"));
s.add("scope_clause", new ScopeClauseParser(), k("SCOPE"), ref("table_name"));
s.add("levels_clause", null, choice(
k("CASCADED"),
k("LOCAL")));
// DEALLOCATE PREPARE statement
s.addRoot("deallocate_prepared_statement");
s.add("deallocate_prepared_statement", new DeallocatePreparedStatementParser(),
k("DEALLOCATE"), k("PREPARED"), ref("sql_statement_name"));
s.add("sql_statement_name", null, choice(
ref("statement_name"),
ref("extended_statement_name")));
s.add("statement_name", null, ref("identifier"));
s.add("extended_statement_name", new ExtendedStatementNameParser(), option(ref("scope_option")), ref("simple_value_specification"));
s.add("scope_option", null, choice(k("GLOBAL"), k("LOCAL")));
// DECLARE CURSOR statement : type A
//TODO
// DECLARE LOCAL TEMPORARY statement
s.addRoot("temporary_table_declaration");
s.add("temporary_table_declaration", new TemporaryTableDeclarationParser(),
k("DECLARE"), k("LOCAL"), k("TEMPORARY"), k("TABLE"), ref("table_name"),
ref("table_element_list"), option( rule(k("ON"), k("COMMIT"), ref("table_commit_action"), k("ROWS"))));
s.add("table_commit_action", null, choice(
k("PRESERVE"),
k("DELETE")));
// DELETE statement positioned
s.addRoot("delete_statement_positioned");
s.add("delete_statement_positioned", new DeleteStatementPositionedParser(),
k("DELETE"), k("FROM"), ref("table_name"), k("WHERE"), k("CURRENT"), k("OF"), ref("cursor_name"));
// DELTE statement - dynamic delete statement positioned
s.addRoot("dynamic_delete_statement_positioned");
s.add("dynamic_delete_statement_positioned", new DynamicDeleteStatementPositionedParser(),
k("DELETE"), k("FROM"), ref("table_name"), k("WHERE"), k("CURRENT"), k("OF"), ref("dynamic_cursor_name"));
s.add("dynamic_cursor_name", null, choice(
ref("cursor_name"),
ref("extended_cursor_name")));
s.add("extended_cursor_name", new ExtendedCursorNameParser(), option( ref("scope_option")), ref("simple_value_specification"));
// DESCRIBE statement
s.addRoot("describe_statement");
s.add("describe_statement", null, choice(
ref("describe_input_statement"),
ref("describe_output_statement")));
s.add("describe_input_statement", new DescribeInputStatementParser(),
k("DESCRIBE"), k("INPUT"), ref("sql_statement_name"), ref("using_descriptor"), option( ref("nesting_option")));
s.add("using_descriptor", new UsingDescriptorParser(),
k("USING"), option( k("SQL")), k("DESCRIPTOR"), ref("descriptor_name"));
s.add("descriptor_name",new DescriptorNameParser(), option( ref("scope_option")), ref("simple_value_specification"));
s.add("nesting_option", new NestingOptionParser(), choice(
rule(k("WITH"), k("NESTING")),
rule(k("WITHOUT"), k("NESTING"))));
s.add("describe_output_statement", new DescribeOutputStatementParser(),
k("DESCRIBE"), option(k("OUTPUT")), ref("described_object"), ref("using_descriptor"), option(ref("nesting_option")));
s.add("decribed_object", new DescribedObjectParser(), choice(
ref("sql_statement_name"),
rule( k("CURSOR"), ref("extended_cursor_name"), k("STRUCTURE"))));
// DESCRIPTOR statement
s.addRoot("system_descriptor_statement");
s.add("system_descriptor_statement", null, choice(
ref("allocate_descriptor_statement"),
ref("deallocate_descriptor_statement"),
ref("set_descriptor_statement"),
ref("get_descriptor_statement")
));
s.add("allocate_descriptor_statement", new AllocateDescriptorStatementParser(),
k("ALLOCATE"), option(k("SQL")), k("DESCRIPTOR"), ref("descriptor_name"), option( rule( k("WITH"), k("MAX"), ref("occurrences")))
);
s.add("occurrences", null, ref("simple_value_specification"));
s.add("deallocate_descriptor_statement", new DeallocateDescriptorStatementParser(),
k("DEALLOCATE"), option(k("SQL"), k("DESCRIPTOR"), ref("descriptor_name")));
s.add("set_descriptor_statement", new SetDescriptorStatementParser(),
k("SET"), option(k("SQL")), k("DESCRIPTOR"), ref("descriptor_name"), ref("set_descrptor_information"));
s.add("set_descriptor_information", new SetDescriptorInformationParser(), choice(
ref("set_header_information_list"),
rule(k("VALUE"), ref("item_number"), ref("set_item_information_list"))
));//TODO
s.add("set_item_information_list", null,
ref("set_item_information_list_inner"));
s.add("set_item_information_list_inner", null, choice(
ref("set_item_information_list_part"),
ref("set_item_information")
));
s.add("set_item_information_part", null,
ref("set_item_information"), k(","), ref("set_item_information_list_inner"));
s.add("set_item_information", null,
ref("descriptor_item_name"),
k("="),
ref("simple_value_specification_2"));
s.add("simple_value_specification_2", null, ref("simple_value_specification"));
s.add("get_descriptor_statement", new GetDescriptorStatementParser(),
k("GET"), option(k("SQL")), k("DESCRIPTOR"), ref("descriptor_name"), ref("get_descriptor_information")
);
s.add("get_descriptor_information", new GetDescriptorInformationParser(), choice(
ref("get_header_information_list"),
rule(k("VALUE"), ref("item_number"), ref("get_item_information_list"))
)); //TODO
s.add("get_item_information_list", null,
ref("get_item_information_list_inner"));
s.add("get_item_information_list_inner", null, choice(
ref("get_item_information_list_part"),
ref("get_item_information")
));
s.add("get_item_information_part", null,
ref("get_item_information"), k(","), ref("get_item_information_list_inner"));
s.add("get_item_information", null,
ref("simple_target_specification_1"), k("="), ref("header_item_name")
);
s.add("simple_target_specification_1", null, ref("simple_target_specification"));
s.add("header_item_name", null, choice(
k("COUNT"),
k("KEY_TYPE"),
k("DYNAMIC_FUNCTION"),
k("DUNAMIC_FUNCTION_CODE"),
k("TOP_LEVEL_COUNT")
));
s.add("descriptor_item_name", null, choice(
k("CARDINALITY"),
k("CHARACTER_SET_CATALOG"),
k("CHARACTER_SET_NAME"),
k("CHARACTER_SET_SCHEMA"),
k("COLLATION_CATALOG"),
k("COLLATION_NAME"),
k("COLLATION_SCHEMA"),
k("DATA"),
k("DATETIME_INTERVAL_CODE"),
k("DATETIME_INTERVAL_PRECISION"),
k("DEGREE"),
k("INDICATOR"),
k("KEY_MEMBER"),
k("LENGTH"),
k("LEVEL"),
k("NAME"),
k("NULLABLE"),
k("OCTET_LENGTH"),
k("PARAMETER_MODE"),
k("PARAMETER_ORDINAL_POSITION"),
k("PARAMETER_SPECIFIC_CATALOG"),
k("PARAMETER_SPECIFIC_NAME"),
k("PARAMETER_SPECIFIC_SCHEMA"),
k("PRECISION"),
k("RETURNED_CARDINALITY"),
k("RETURNED_LENGTH"),
k("RETURNED_OCTET_LENGTH"),
k("SCALE"),
k("SCOPE_CATALOG"),
k("SCOPE_NAME"),
k("SCOPE_SCHEMA"),
k("TYPE"),
k("UNNAMED"),
k("USER_DEFINED_TYPE_CATALOG"),
k("USER_DEFINED_TYPE_NAME"),
k("USER_DEFINED_TYPE_SCHEMA")));
// DISCOUNNECT statement
s.addRoot("disconnect_statement");
s.add("disconnect_statement", new DisconnectStatementParser(), k("DISCONNECT"), ref("disconnect_object"));
s.add("disconnect_object", new DisconnectObjectParser(), choice(
ref("connection_object"),
k("ALL"),
k("CURRENT")
));
s.add("connection_object", null, choice(k("OBJECT"), ref("connection_name")));
s.add("connection_name", null, ref("simple_value_specification"));
//EXECUTE STATEMENT
s.addRoot("execute_statement");
s.add("execute_statement", new ExecuteStatementParser(),
k("EXECUTE"), ref("sql_statement_name"), option(ref("result_using_clause")), option(ref("parameter_using_clause")));
s.add("result_using_clause", null, ref("output_using_clause"));
s.add("output_using_clause", null, choice( ref("into_arguments"), ref("into_descriptor")));
s.add("into_arguments", new IntoArgumentsParser(),
k("INTO"), ref("into_argument_list"));//TODO
s.add("into_argument_list", null, choice(ref("into_argument_part"), ref("into_argument")));
s.add("into_argument_part", null, ref("into_argument"), k(","), ref("into_argument_list"));
s.add("into_argument", null, ref("target_specification"));
s.add("into_descriptor", new IntoDescriptorParser(),
k("INTO"), option(k("SQL")), k("DESCIRPTOR"), ref("descriptor_name"));
s.add("parameter_using_clause", null, ref("input_using_clause"));
//EXECUTE IMMEDIATE
s.addRoot("execute_immediate_statement");
s.add("execute_immediate_statement", new ExecuteImmediateStatementParser(),
k("EXECUTE"), k("IMMEDIATE"), ref("sql_statement_variable"));
s.add("sql_statement_variable", null, ref("simple_value_specification"));
// FETCH statement
s.addRoot("fetch_statement");
s.add("fetch_statement", new FetchStatementParser(),
k("FETCH"), option( rule(option(ref("fetch_orientation")),k("FROM"))), ref("cursor_name"), k("INTO"), ref("fetch_target_list") );
s.add("fetch_orientation", new FetchOrientationParser(), choice(
k("NEXT"),
k("PRIOR"),
k("FIRST"),
k("LAST"),
rule( rule(choice(k("ABSOLUTE"), k("RELATIVE"))), ref("simple_value_specification"))
));
s.add("fetch_target_list", new FetchTargetListParser(), choice(
ref("fetch_target_part"), ref("target_specification")
));//TODO
s.add("fetch_target_part", null, ref("target_specification"), k(","), ref("fetch_target_list"));
s.add("target_specification",null, choice(
ref("host_parameter_specification"),
ref("sql_parameter_reference"),
ref("column_reference"),
ref("sql_variable_reference"),
ref("dynamic_parameter_specification"),
ref("embedded_variable_specification")
) );
s.add("host_parameter_specification", null,
ref("host_parameter_name"), option(ref("indicator_parameter")));
s.add("indicator_parameter", new IndicatorParameterParser(),
option(k("INDICATOR")), ref("host_parameter_name"));
s.add("dynamic_parameter_specification", null,
k("?"));
s.add("embedded_variable_specification", null,
ref("embedded_variable_name"), option(ref("indicator_variable")));
s.add("indicator_variable", null,
option(k("INDICATOR")), ref("embedded_variable_name"));
//GET DIAGNOSTICS statement
s.addRoot("get_diagnostics_statement");
s.add("get_diagnostics_statement", new GetDiagnosticsStatementParser(),
k("GET"), k("DIAGNOSTICS"), ref("sql_diagnostics_information"));
s.add("sql_diagnostics_information", null, choice(
ref("statement_information"),
ref("condition_information")
));
s.add("statement_information", new StatementInformationParser(), choice(
ref("statement_information_part"),
ref("statement_information_item")
)); //TODO
s.add("statement_information_part", null,
ref("statement_information_item"), k(","), ref("statement_information_part"));
s.add("statement_information_item", null,
ref("simple_target_specification"), k("="), ref("statement_information_item_name"));
s.add("simple_target_specification", null, choice(
ref("host_parameter_specification"),
ref("sql_parameter_reference"),
ref("column_reference"),
ref("sql_variable_reference"),
ref("embedded_variable_name")
));
s.add("statement_information_item_name", null, choice(
k("NUMBER"),
k("MORE"),
k("COMMAND_FUNCTION"),
k("COMMAND_FUNCTION_CODE"),
k("DYNAMIC_FUNCTION"),
k("DYNAMIC_FUNCTION_CODE"),
k("ROW_COUNT"),
k("TRANSACTIONS_COMMITTED"),
k("TRANSACTIONS_ROLLED_BACK"),
k("TRANSACTION_ACTIV")
));
s.add("condition_information", new ConditionInformationParser(),
k("EXCEPTION"), ref("condition_number"), ref("condition_information_list")); //TODO
s.add("condition_number", null,
ref("simple_value_specification"));
s.add("condition_information_list", null,
choice(ref("condition_information_part"), ref("condition_information_item")));
s.add("condition_information_part", null,
ref("condition_information_item"), k(","), ref("condition_information_list"));
s.add("condition_information_item", null,
ref("simple_target_specification"),
k("="),
ref("condition_information_item_name"));
s.add("condition_information_item_name", null,choice(
k("CATALOG_NAME"),
k("CLASS_ORIGIN"),
k("COLUMN_NAME"),
k("CONDITION_IDENTIFIER"),
k("CONDITION_NUMBER"),
k("CONNECTION_NAME"),
k("CONSTRAINT_CATALOG"),
k("CONSTRAINT_NAME"),
k("CONSTRAINT_SCHEMA"),
k("CURSOR_NAME"),
k("MESSAGE_LENGTH"),
k("MESSAGE_OCTET_LENGTH"),
k("MESSAGE_TEXT"),
k("PARAMETER_MODE"),
k("PARAMETER_NAME"),
k("PARAMETER_ORDINAL_POSITION"),
k("RETURNED_SQLSTATE"),
k("ROUTINE_CATALOG"),
k("ROUTINE_NAME"),
k("ROUTINE_SCHEMA"),
k("SCHEMA_NAME"),
k("SERVER_NAME"),
k("SPECIFIC_NAME"),
k("SUBCLASS_ORIGIN"),
k("TABLE_NAME"),
k("TRIGGER_CATALOG"),
k("TRIGGER_NAME"),
k("TRIGGER_SCHEM")
));
// GRANT statement
s.addRoot("grant_statement");
s.add("grant_statement", null, choice(
ref("grant_privilege_statement"),
ref("grant_role_statement")
));
s.add("grant_privilege_statement", new GrantPrivilegeStatementParser(),
k("GRANT"), ref("previleges"), k("TO"), ref("grantee_list"),
option(rule(k("WITH"), k("HIERARCHY"), k("OPTION"))),
option(rule(k("WITH"), k("GRANT"), k("OPTION"))),
option(rule(k("GRANTED"), k("BY"), ref("grantor")))); //TODO
s.add("grantee_list", null,
choice(ref("grantee_part"), ref("grantee")));
s.add("grantee_part", null, ref("grantee"),k(","), ref("grantee_list"));
s.add("grantor", null, choice(
k("CURRENT_USER"),
k("CURRENT_ROLE")
));
s.add("grant_role_statement", new GrantRoleStatementParser(),
k("GRANT"), ref("role_granted_list"), k("TO"), ref("grantee"), ref("grantee_list"),
option(rule(k("WITH"), k("ADMIN"), k("OPTION"))),
option(rule(k("GRANTED"), k("BY"), k("grantor")))
); //TODO
s.add("role_granted_list", null, choice(
ref("role_granted_part"),
ref("role_granted")
));
s.add("role_granted_part", null,
ref("role_granted"), k(","), ref("role_granted_list"));
s.add("grantee", null, choice(
k("PUBLIC"),
ref("authorization_identifier")));
// OPEN statement
s.addRoot("open_statement");
s.add("open_statement", new OpenStatementParser(),
k("OPEN"), ref("cursor_name"));
// ORDER BY clause
s.add("order_by_clause", new OrderByClauseParser(),
k("ORDER"), k("BY"), ref("sort_specification_list"));
s.add("sort_specification_list", new SortSpecificationListParser(), choice(
ref("sort_specification_part"), ref("sort_specification")
)); //TODO
s.add("sort_specification_part", null,
ref("sort_specification"), k(","), ref("sort_specification_list"));
s.add("sort_specification", null,
ref("sort_key"), option(ref("ordering_specification")));
s.add("sort_key", null, ref("value_expression"));
s.add("ordering_specification", null, choice(
k("ASC"), k("DESC")
));
// PREPARE statement
s.addRoot("prepare_statement");
s.add("prepare_statement", new PrepareStatementParser(),
k("PREPARE"), ref("sql_statement_name"), k("FROM"), k("sql_statement_variable"));
// REVOKE statement
s.addRoot("revoke_statement");
s.add("revoke_statement", new RevokeStatementParser(), choice(
ref("revoke_privilege_statement"),
ref("revoke_role_statement")
));
s.add("revoke_privilege_statement", new RevokePrivilegeStatementParser(),
k("REVOKE"), option(ref("revoke_option_extension")), ref("privileges"), k("FROM"), ref("grantee_list"),
option(rule(k("GRANTED"), k("BY"), k("grantor"))), ref("drop_behavior")
); //TODO
s.add("revoke_option_extension", null, choice(
rule(k("GRANT"), k("OPTION"), k("FOR")),
rule(k("HIERARCHY"), k("OPTION"), k("FOR"))
));
s.add("privileges", new PrivilegesParser(),
ref("object_privileges"), k("ON"), ref("object_name"));
s.add("object_privileges", new ObjectPrivilegesParser(), choice(
rule(k("ALL"), k("PRIVILEGES")),
ref("action_list")
));//TODO
s.add("action_list", null, choice(
ref("action_list_part"),
ref("action")
));
s.add("action_list_part", null,
ref("action"), k(","), ref("action_list"));
s.add("object_name", new ObjectNameParser(), choice(
rule( option(k("TABLE")), ref("table_name")),
rule( k("DOMAIN"), ref("domain_name")),
rule( k("COLLATION"), ref("collation_name")),
rule( k("CHARACTER"), k("SET"), ref("character_set_name")),
rule( k("MODULE"), ref("module_name")),
rule( k("TRANSLATION"), ref("translation_name")),
rule( k("TYPE"), ref("user_defined_type_name")),
ref("specific_routine_designator")
));
s.add("module_name", null, ref("identifier"));//TODO
s.add("revoke_role_statement", new RevokeRoleStatementParser(),
k("REVOKE"), option(rule(k("ADMIN"), k("OPTION"), k("FOR"))), ref("role_revoked_list"),
k("FROM"), ref("grantee_list"),
option(k("GRANTED"), k("BY"),ref("grantor")), option(ref("drop_behavior"))); //TODO
s.add("role_revoked_list", null, choice(
ref("role_revoked_part"), ref("role_revoked")
));
s.add("role_revoked_part", null,
ref("role_revoked"), k(","), ref("role_revoked_list"));
s.add("role_revoked", null, ref("role_name"));
// ROLLBACK statement
s.addRoot("rollback_statement");
s.add("rollback_statement", new RollbackStatementParser(),
k("ROLLBACK"), option(k("WORK")), option( rule(k("AND"), option(k("NO")), k("CHAIN"))),
option(ref("savepoint_clause")));
s.add("savepoint_clause", new SavepointClauseParser(),
k("TO"), k("SAVEPOINT"), ref("savepoint_specifier"));
s.add("savepoint_specifier", null, ref("savepoint_name"));
s.add("savepoint_name", null, ref("identifier"));
//SAVEPOINT statement
s.addRoot("savepoint_statement");
s.add("savepoint_statement", new SavepointStatementParser(), k("SAVEPOINT"), ref("savepoint_specifier"));
// Search condition - regular expression
s.add("regular_expression", null, choice(
ref("regular_expression_part"),
ref("regular_term")
)); //TODO
s.add("regular_expression_part", null,
ref("regular_term"), k("|"), ref("regular_expression"));
s.add("regular_term", null, option(ref("regular_term")), ref("regular_factor"));
s.add("regular_factor", null, choice(
ref("regular_primary"),
rule(ref("regular_primary"), k("*")),
rule(ref("regular_primary"), k("+"))
));
s.add("regular_primary", null, choice(
ref("character_specifier"),
ref("%"),
ref("regular_character_set"),
rule(k("("), ref("regular_expression"), k(")"))
));
s.add("character_specifier", null, choice(
ref("non_escaped_character"),
ref("escaped_character")
));
s.add("non_escaped_character", null, ref("identifier")); //TODO
s.add("escaped_character", null, ref("identifier"));
s.add("regular_character_set", null, choice(
k("_"),
rule(k("["), repeat(ref("character_enumeration")), k("]")),
rule(k("["), k("^"), repeat(ref("character_enumeration")), k("]")),
rule(k("["), k(":"), ref("regular_character_set_identifier"), k(":"), k("]"))
));
s.add("character_enumeration", null,
ref("character_specifier"), option(rule(k("-"), ref("character_specifier"))));
s.add("character_specifier", null, ref("identifier"));
// SET CATALOG statement
s.addRoot("set_catalog_statement");
s.add("set_catalog_statement", new SetCatalogStatementParser(), k("SET"), ref("catalog_name_characteristics"));
s.add("catalog_name_characteristics", new CatalogNameCharacteristicsParser(), k("CATALOG"), ref("value_specification"));
// SET CONNECTION statement
s.addRoot("set_connection_statement");
s.add("set_connection_statement", new SetConnectionStatementParser(),
k("SET"), k("CONNECTION"), ref("connection_object"));
// SET CONSTRAINTS MODE statement
s.addRoot("set_constraints_mode_statement");
s.add("set_constraints_mode_statement", new SetConstraintsModeStatementParser(),
k("SET"), k("CONSTRAINTS"), ref("constraint_name_list"), choice( k("DEFFERRED"), k("IMMEDIATE")));
s.add("constraint_name_list", new ConstraintNameListParser(), choice(
k("ALL"),
ref("constraint_name_list_list")
)); //TODO
s.add("constraint_name_list_list", null, choice(
ref("constraint_name_part"),
ref("constraint_name")
));
s.add("constraint_name_part", null,
ref("constraint_name"), k(","), ref("constraint_name_list_list"));
s.add("constraint_name", null, ref("schema_qualified_name"));
// SET NAMES statement
s.addRoot("set_names_statement");
s.add("set_names_statement", new SetNamesStatementParser(),
k("SET"), ref("character_set_name_characteristic"));
s.add("character_set_name_characteristics", new CharacterSetNameCharacteristicsParser(),
k("NAMES"), k("value_specification"));
//SET schema statement
s.addRoot("set_schema_statement");
s.add("set_schema_statement", new SetSchemaStatementParser(),
k("SET"), ref("schema_name_characteristics"));
s.add("schema_name_characteristics", new SchemaNameCharacteristicsParser(),
k("SCHEMA"), ref("value_specification"));
//SET SESSION USER IDENTIFIER statement
s.addRoot("set_session_user_identifier_statement");
s.add("set_session_user_identifier_statement", new SetSessionUserIdentifierStatementParser(),
k("SET"), k("SESSION"), k("AUTHORIZATION"), ref("value_specification"));
// SET LOCAL TIME ZONE statement
s.addRoot("set_local_time_zone_statement");
s.add("set_local_time_zone_statement", new SetLocalTimeZoneStatementParser(),
k("SET"), k("TIME"), k("ZONE"), ref("set_time_zone_value"));
s.add("set_time_zone_value", null, choice(
ref("interval_value_expression"), k("LOCAL")));
s.add("interval_value_expression", new IntervalValueExpressionParser(),choice(
ref("interval_term"),
rule(ref("interval_value_expression_1"), k("+"), ref("interval_term_1")),
rule(ref("interval_value_expression_1"), k("-"), ref("interval_term_1")),
rule(k("("), ref("datetime_value_expression"), k("-"), ref("datetime_term"), k(")"), ref("interval_qualifer"))
)); //TODO
s.add("interval_value_expression_1", null, ref("interval_value_expression"));
s.add("interval_term_1", null, ref("interval_term"));
s.add("datetime_term", null, ref("datetime_factor"));
s.add("datetime_factor", null, ref("datetime_primary"), option(ref("time_zone")));
s.add("datetime_primary", null, choice(
ref("value_expression_primary"),
ref("datetime_value_function")
));
s.add("time_zone", null, k("AT"), ref("time_zone_specifier"));
s.add("time_zone_specifier", null, choice(
k("LOCAL"),
rule(k("TIMEZONE"), ref("interval_primary"))));
s.add("interval_term_2", null, ref("interval_term"));
s.add("datetime_value_expression", new DateTimeValueExpressionParser(), choice(
ref("datetime_term"),
rule(ref("interval_value_expression"), k("+"), ref("datetime_term")),
rule(ref("datetime_value_expression"), k("+"), ref("interval_term")),
rule(ref("datetime_value_expression"), k("-"), ref("interval_term"))
));
s.add("interval_term", new IntervalTermParser(), choice(
ref("interval_factor"),
rule(ref("interval_term_2"), k("*"), ref("factor")),
rule(ref("interval_term_2"), k("/"), ref("factor")),
rule(ref("term"), k("*"), ref("interval_factor"))
));
s.add("interval_factor", null, option(ref("sign")), ref("interval_primary"));
s.add("interval_primary", null, choice(
ref("value_expression_primary"),
ref("interval_value_function")
));
s.add("interval_value_function", null, ref("interval_absolute_value_function"));
s.add("interval_absolute_value_function", new IntervalAbsoluteValueFunctionParser(),
k("ABS"), k("("), ref("interval_value_expression"), k(")"));
// SET TRANSACTION statement
s.addRoot("set_transaction_statement");
s.add("set_transaction_statement", new SetTransationStatementParser(),
k("SET"), option(k("LOCAL")), ref("transaction_characteristics"));
s.add("transaction_characteristics", new TransactionCharacteristicsParser(),
k("TRANSACTION"), ref("transaction_mode_list")); //TODO
s.add("transaction_mode_list", null, choice(
ref("transaction_mode_part"),
ref("transaction_mode")
));
s.add("transaction_mode_part", null,
ref("transaction_mode"), k(","), ref("transaction_mode_list"));
s.add("transaction_mode", null, choice(
ref("isolation_level"),
ref("transaction_access_mode"),
ref("diagnostics_size")
));
s.add("isolation_level", null,
k("ISOLATION"), k("LEVEL"), ref("level_of_isolation"));
s.add("level_of_isolation", null, choice(
rule(k("READ"), k("UNCOMMITED")),
rule(k("READ"), k("COMMITED")),
rule(k("REPEATABLE"), k("READ")),
k("SERIALIZABLE")
));
s.add("transaction_access_mode", null, choice(
rule(k("READ"), k("ONLY")),
rule(k("READ"), k("WRITE"))
));
s.add("diagnostics_size", null,
k("DIAGNOSTICS"), k("SIZE"), ref("number_of_conditions"));
s.add("number_of_conditions", null, ref("simple_value_specification"));
// SQL-client module statement
s.add("sql_client_module_statement", new SQLClientModuleStatementParser(),
ref("module_name_clause"),
ref("language_clause"),
ref("module_authorization_clause"),
option( ref("module_path_specification")),
option( ref("module_transform_group_specification")),
option( repeat(ref("temporary_table_declaration"))),
repeat( ref("module_contents"))
);
s.add("module_name_clause", new ModuleNameClauseParser(),
k("MODULE"), option( ref("sql_client_module_name")), option(ref("module_character_set_specification")));
s.add("sql_client_module_name", null, ref("identifier"));
s.add("module_character_set_specification", new ModuleCharacterSetSpecificationParser(),
k("NAMES"), k("ARE"),
ref("character_set_specification"));
s.add("language_clause", new LanguageClauseParser(), choice(
k("ADA"),
k("C"),
k("COBOL"),
k("FORTRAN"),
k("MUMPS"),
k("PASCAL"),
k("PL"),
k("SQL")
));
s.add("module_authorization_clause", new ModuleAuthorizationClauseParser(), choice(
rule( k("SCHEMA"), ref("schema_name")),
rule( k("AUTHORIZATION"), ref("module_authorization_identifier")),
rule( k("SCHEMA"), ref("schema_name"), k("AUTHORIZAITON"), ref("module_authorization_identifer"))
));
s.add("catalog_name", null, ref("identifier"));
s.add("module_authorization_identifier", null,
ref("authorization_identifier"));
s.add("module_path_specification", null,
ref("path_specification"));
s.add("path_specification", new PathSpecificationParser(),
k("PATH"), ref("schema_name_list"));
s.add("schema_name_list", null, choice(
ref("schema_name_part"),
ref("schema_name")
));//TODO
s.add("schema_name_part", null,
ref("schema_name"), k(","), ref("schema_name_list"));
s.add("module_transform_group_specification", null, ref("transform_group_specification"));
s.add("module_contents", null, choice(
ref("declare_cursor"),
ref("externally_invoked_procedure"),
ref("dynamic_declare_cursor")
));
s.add("externally_invoked_procedure", new ExternallyInvokedProcedureParser(),
k("PROCEDURE"), ref("procedure_name"), ref("host_parameter_declaration_setup"), k(";"),
ref("sql_procedure_statement"), k(";"));
s.add("procedure_name", null, ref("identifier"));
s.add("host_parameter_declaration_setup", null, ref("host_parameter_declaration_list"));
s.add("host_parameter_declaration_list", new HostParameterDeclarationListParser(),
k("("), ref("host_parameter_declaration_list_inner"), k(")")); //TODO
s.add("host_parameter_declaration_list_inner", null, choice(
ref("host_parameter_declaration_part"),
ref("host_parameter_declaration")
));
s.add("host_parameter_declaration_part", null,
ref("host_parameter_declaration"), k(","),
ref("host_parameter_declaration_list_inner")
);
s.add("host_parameter_declaration", new HostParameterDeclarationParser(), choice(
rule(ref("host_parameter_name"), ref("host_parameter_data_type")),
ref("status_parameter")));
s.add("host_parameter_name", new HostParameterNameParser(), k(":"), ref("identifier"));
s.add("host_parameter_data_type", new HostParameterDataTypeParser(), ref("data_type"), option(ref("host_indication")));
s.add("status_parameter", null, k("SQLSTATE"));
// UPDATE statement - positioned
s.addRoot("update_statement_positioned");
s.add("update_statement_positioned", new UpdateStatementPositionedParser(),
k("UPDATE"), ref("taget_table"), k("SET"),
ref("set_clause_list"), k("WHERE"),
k("CURRENT"), k("OF"), ref("cursor_name")
);
// UPDATE statement - dynamic
s.addRoot("dynamic_update_statement_positioned");
s.add("dynamic_update_statement_positioned", new DynamicUpdateStatementPositionedParser(),
k("UPDATE"), ref("target_table"), k("SET"), ref("set_clause_list"), k("WHERE"), k("CURRENT"),
k("OF"), ref("dynamic_cursor_name"));
// merius - end
// create table
s.add("column_name", null, ref("identifier"));
s.add("column_name_list", new ColumnNameListParser(), ref("column_name"), option(repeat(rule(k(","),
ref("column_name")))));
s.add("table_definition", new TableDefinitionParser(), k("CREATE"), option(ref("table_scope")), k("TABLE"),
ref("table_name"), ref("table_contents_source"));
s.add("table_scope", null, ref("global_or_local"), k("TEMPORARY"));
s.add("global_or_local", null, choice(k("GLOBAL"), k("LOCAL")));
s.add("table_contents_source", new TableContentsSourceParser(), ref("table_element_list"));
s.add("table_element_part", null, ref("table_element"), k(","), ref("table_element_list_inner"));
s.add("table_element_list_inner", null, choice(ref("table_element_part"), ref("table_element")));
s.add("table_element_list", null, k("("), ref("table_element_list_inner"), k(")"));
s.add("table_element", null, choice(ref("column_definition"), ref("table_constraint_definition"),
ref("like_clause"), ref("column_options")));
s.add("column_definition", new ColumnDefinitionParser(), regularId(), ref("data_type"),
option(repeat(ref("column_constraint_definition"))));
s.add("column_constraint_definition", new ColumnConstraintDefinitionParser(), ref("column_constraint"));
s.add("column_constraint", new ColumnConstraintParser(), choice(rule(k("NOT"), k("NULL")),
ref("unique_specification"), ref("references_specification"), ref("check_constraint_definition")));
s.add("table_constraint_definition", null, ref("table_constraint"));
// option(ref("constraint_name_definition")), ref("table_constraint"),
// option(ref("constraint_characteristics")));
s.add("constraint_name_definition", new ConstraintNameDefinitionParser(), k("CONSTRAINT"),
ref("constraint_name"));
s.add("constraint_name", null, ref("schema_qualified_name"));
s.add("schema_qualified_name", new SchemaQualifiedNameParser(),
option(rule(ref("schema_name"), k("."))),
ref("qualified_identifier"));
s.add("qualified_identifier", null, ref("identifier"));
s.add("table_constraint", new TableConstraintParser(), choice(ref("unique_constraint_definition"),
ref("referential_constraint_definition"), ref("check_constraint_definition")));
SequenceRule uniq1 = rule(ref("unique_specification"), k("("), ref("unique_column_list"), k(")"));
SequenceRule uniq2 = rule(k("UNIQUE"), k("("), k("VALUE"), k(")"));
s.add("unique_constraint_definition", new UniqueConstraintDefinitionParser(), choice(uniq1, uniq2));
s.add("unique_specification", new UniqueSpecificationParser(),
choice(k("UNIQUE"), rule(k("PRIMARY"), k("KEY"))));
s.add("unique_column_list", null, ref("column_name_list"));
s.add("referential_constraint_definition", new ReferentialConstraintDefinitionParser(), k("FOREIGN"), k("KEY"),
k("("), ref("referencing_columns"), k(")"), ref("references_specification"));
s.add("referencing_columns", null, ref("reference_column_list"));
s.add("reference_column_list", null, ref("column_name_list"));
s.add("references_specification", new ReferencesSpecificationParser(), k("REFERENCES"),
ref("referenced_table_and_columns"));
s.add("referenced_table_and_columns", new ReferencedTableAndColumnsParser(), ref("table_name"), option(rule(
k("("), ref("reference_column_list"), k(")"))));
s.add("check_constraint_definition", new CheckConstraintDefinitionParser(), k("CHECK"), k("("),
ref("search_condition"), k(")"));
s.add("data_type", null, ref("predefined_type"));
s.add("predefined_type", null, choice(
rule(ref("character_string_type"), option(k("CHARACTER"), k("SET"), ref("character_set_specification"))),
ref("national_character_string_type"),
ref("binary_large_object_string_type"),
ref("bit_string_type"),
ref("numeric_type"),
ref("boolean_type"),
ref("datetime_type"),
ref("interval_type"))
);
Rule dataLength = rule(k("("), ref("length"), k(")"));
Rule largeDataLength = rule(k("("), ref("large_object_length"), k(")"));
Rule charType1 = rule(k("CHARACTER"), k("VARYING"), k("("), ref("length"), k(")"));
Rule charType2 = rule(k("CHAR"), k("VARYING"), k("("), ref("length"), k(")"));
Rule charType3 = rule(k("VARCHAR"), k("("), ref("length"), k(")"));
Rule charType4 = rule(k("CHARACTER"), k("LARGE"), k("OBJECT"), option(largeDataLength));
Rule charType5 = rule(k("CHAR"), k("LARGE"), k("OBJECT"), option(largeDataLength));
Rule charType6 = rule(k("CLOB"), option(largeDataLength));
Rule charType7 = rule(k("CHARACTER"), option(dataLength));
Rule charType8 = rule(k("CHAR"), option(dataLength));
s.add("character_string_type", new StringDataTypeParser(), choice(
charType1, charType2, charType3, charType4,
charType5, charType6, charType7, charType8));
s.add("length", null, ref("unsigned_integer"));
s.add("large_object_length", null, choice(rule(ref("unsigned_integer"), option(ref("multiplier"))),
ref("large_object_length_token")));
s.add("numeric_type", null, ref("exact_numeric_type"));
s.add("datetime_type", new DateTimeDataTypeParser(), choice(k("DATE"), rule(k("TIME"), option(k("("), ref("time_precision"), k(")")),
option(ref("with_or_without_time_zone"))), rule(k("TIMESTAMP"), option(k("("), ref("time_precision"),
k(")")), option(ref("with_or_without_time_zone")))));
// INSERT
Syntax insert = new Syntax();
insert.add("insert_statement", null, k("INSERT"), k("INTO"), ref("insertion_target"),
ref("insert_columns_and_source"));
// TODO: add <from subquery> and <from default>
insert.add("insert_columns_and_source", null, ref("from_constructor"));
// TODO: add optional <insert column types> and <override clause>
insert.add("from_constructor", null, ref("contextually_typed_table_value_constructor"));
insert.add("contextually_typed_table_value_constructor", null, k("VALUES"),
ref("contextually_typed_row_value_expression_list"));
SequenceRule numericColumnDefinition = rule(k("NUMERIC"), option(k("("), idvar(), option(k(","), idvar()),
k(")")));
SequenceRule integerColumnDefinition = rule(k("INTEGER"));
SequenceRule intColumnDefinition = rule(k("INT"));
s.add("exact_numeric_type", new ExactNumericTypeParser(), choice(numericColumnDefinition,
integerColumnDefinition, intColumnDefinition));
// DROP TABLE
s.add("drop_table_statement", new DropTableParser(), k("DROP"), k("TABLE"), ref("table_name"), option(choice(
k("CASCADE"), k("CASCADE"))));
// INSERT
s.add("insert_statement", new InsertStatementParser(), k("INSERT"), k("INTO"), ref("insertion_target"),
ref("insert_columns_and_source"));
s.add("insertion_target", null, ref("table_name"));
s.add("insert_columns_and_source", new InsertColumnsAndSourceParser(), choice(ref("from_subquery"),
ref("from_constructor"), ref("from_default")));
s.add("from_constructor", new FromConstructorParser(), option(rule(k("("), ref("insert_column_list"), k(")"))),
ref("contextually_typed_table_value_constructor"));
s.add("insert_column_list", null, ref("column_name_list"));
s.add("contextually_typed_table_value_constructor", new ContextuallyTypedTableValueConstructorParser(),
k("VALUES"), ref("contextually_typed_row_value_expression_list"));
s.add("contextually_typed_row_value_expression_list", new ContextuallyTypedRowValueExpressionListParser(),
ref("contextually_typed_row_value_expression"), option(repeat(rule(k(","),
ref("contextually_typed_row_value_expression")))));
s.add("contextually_typed_row_value_expression", null, choice(ref("row_value_special_case"),
ref("contextually_typed_row_value_constructor")));
s.add("row_value_special_case", null, choice(ref("value_specification"), ref("value_expression")));
s.add("value_specification", null, choice(ref("literal"), ref("general_value_specification")));
s.add("literal", null, choice(ref("signed_numeric_literal"), ref("general_literal")));
s.add("contextually_typed_row_value_constructor", new RowValueConstructorParser(), choice(
ref("contextually_typed_row_value_constructor_element"), rule(k("("),
ref("contextually_typed_row_value_constructor_element_list"), k(")"))));
s.add("contextually_typed_row_value_constructor_element", null, choice(ref("value_expression"),
ref("contextually_typed_value_specification")));
s.add("contextually_typed_value_specification", null, choice(ref("implicitly_typed_value_specification"),
ref("default_specification")));
// merius touched
s.add("implicitly_typed_value_specification", null, choice(ref("null_specification"), ref("empty_specification")));
s.add("empty_specification", new EmptySpecificationParser(), k("ARRAY"), ref("left_bracket_or_trigraph"), ref("right_bracket_or_trigraph"));
s.add("left_bracket_or_trigraph", null, choice( k("["), ref("left_bracket_trigraph")));
s.add("right_bracket_or_trigraph", null, choice( k("]"), ref("right_bracket_trigraph")));
s.add("left_bracket_trigraph", new LeftBracketTrigraphParser(), k("?"), k("?"), k("("));
s.add("right_bracket_trigraph", new RightBracketTrigraphParser(), k("?"), k("?"), k(")"));
s.add("null_specification", new NullSpecificationParser(), option(k("NOT")), k("NULL"));
//touch end
s.add("default_specification", new DefaultSpecificationParser(), k("DEFAULT"));
s.add("contextually_typed_row_value_constructor_element_list", null,
ref("contextually_typed_row_value_constructor_element"), option(repeat(rule(k(","),
ref("contextually_typed_row_value_constructor_element")))));
s.add("from_default", null, k("DEFAULT"), k("VALUES"));
// value expression
s.add("value_expression", null, choice(ref("numeric_value_expression")));
s.add("numeric_value_expression", new NumericValueExpressionParser(), ref("term"), option(repeat(rule(choice(
k("+"), k("-")), ref("numeric_value_expression")))));
s.add("term", null, choice(ref("factor"), rule(ref("term"), k("*"), ref("factor")), rule(ref("term"), k("/"),
ref("factor"))));
s.add("term", new TermParser(), ref("factor"), option(repeat(rule(choice(k("*"), k("/")), ref("factor")))));
s.add("factor", new FactorParser(), option(ref("sign")), ref("numeric_primary"));
s.add("sign", null, choice(k("+"), k("-")));
s.add("numeric_primary", null, choice(ref("value_expression_primary"), ref("numeric_value_function")));
s.add("numeric_value_function", null, choice(
ref("position_expression"),
ref("extract_expression"),
ref("length_expression"),
ref("cardinality_expression"),
ref("absolute_value_expression"),
ref("modulus_expression")
));
s.add("position_expression", null, choice(
ref("string_position_expression"),
ref("blob_position_expression")
));
s.add("string_position_expression", null,
k("POSITION"), k("("), ref("string_value_expression"), k("IN"), ref("string_value_expression"), k(")"));
s.add("string_value_expression", null, choice(
ref("character_value_expression"),
ref("bit_value_expression"),
ref("blob_value_expression")
));
s.add("character_value_exprssion", null, choice(
ref("character_factor_part"),
ref("character_factor")
));
s.add("character_factor_part", null,
ref("character_factor"), k("||"), ref("character_value_expression"));
s.add("character_factor", null, ref("character_primary"), option(ref("collate_clause")));
s.add("character_primary", null, choice(
ref("value_expression_primary"),
ref("string_value_function")
));
s.add("string_value_function", null, choice(
ref("character_value_function"),
ref("blob_value_function"),
ref("bit_value_function")
));
s.add("character_value_function", null, choice(
ref("character_substring_function"),
ref("regular_expression_substring_function"),
ref("fold"),
ref("form_of_use_conversion"),
ref("character_translation"),
ref("trim_function"),
ref("character_overlay_function"),
ref("specific_type_method")
));
s.add("character_substring_function", null,
k("SUBSTRING"), k("("), ref("character_value_expression"), k("FROM"), ref("start_position"),
option(rule(k("FOR"), ref("string_length"))), k(")"));
s.add("start_position", null, ref("numeric_value_expression"));
s.add("string_length", null, ref("numeric_value_expression"));
s.add("regular_expression_substring_function", null,
k("SUBSTRING"), k("("), ref("character_value_expresssion"), k("SIMILAR"), ref("character_value_expression"),
k("ESCAPE"), ref("escape_character"), k(")"));
s.add("escape_character", null, ref("character_value_expression"));
s.add("fold", new FoldParser(),
choice(k("UPPER"), k("LOWER")), k("("), ref("character_value_expression"), k(")"));
s.add("form_of_use_conversion", null,
k("CONVERT"), k("("), ref("character_value_expression"), k("USING"), ref("form_of_use_conversion_name"), k(")"));
s.add("form_of_use_conversion_name", null, ref("schema_qualified_name"));
s.add("character_translation", null,
k("TRANSLATE"), k("("), ref("character_value_expression"), k("USING"), ref("translation_name"), k(")"));
s.add("trim_function", null,
k("TRIM"), k("("), ref("trim_operands"), k(")"));
s.add("trim_operands", new TrimOperandsParser(),
option(rule( option(ref("trim_specification")), option(ref("trim_character")), k("FROM"))),
ref("trim_source"));
s.add("trim_specification", null, choice(
k("LEADING"),
k("TRAILING"),
k("BOTH")));
s.add("trim_character", null, ref("character_value_expression"));
s.add("trim_source", null, ref("character_value_expression"));
s.add("character_overlay_function", new CharacterOverlayFunctionParser(),
k("OVERLAY"), k("("), ref("character_value_expression"), k("PLACING"), ref("character_value_expression"),
k("FROM"), ref("start_position"), option(rule(k("FOR"), ref("string_length"))), k(")"));
s.add("specific_type_method", null,
ref("user_defined_type_value_expression"), k("."), k("SPECIFICTYPE"));
s.add("user_defined_type_value_expression", null, ref("value_expression_primary"));
s.add("blob_value_function", null, choice(
ref("blob_substring_function"),
ref("blob_trim_function"),
ref("blob_overlay_function")
));
s.add("blob_substring_function", new BlobSubstringFunctionParser(),
k("SUBSTRING"), k("("), ref("blob_value_expression"), k("FROM"), ref("start_position"),
option(rule(k("FOR"), ref("string_length"))), k(")"));
s.add("blob_trim_function", null,
k("TRIM"), k("("), ref("blob_trim_operands"), k(")"));
s.add("blob_trim_operands", null,
option(rule( option(ref("trim_specification")), option(ref("trim_octet")), k("FROM"))), ref("blob_trim_source"));
s.add("trim_octet", null, ref("blob_value_expression"));
s.add("blob_trim_source", null, ref("blob_value_expression"));
s.add("blob_overlay_function", null,
k("OVERLAY"), k("("), ref("blob_value_expression"), k("PLACING"), ref("blob_value_expression"),
k("FROM"), ref("start_position"), option(k("FOR"), ref("string_length")), k(")"));
s.add("bit_value_function", null, ref("bit_substring_function"));
s.add("bit_substring_function", null,
k("SUBSTING"), k("("), ref("bit_value_expression"), k("FROM"), ref("start_position"),
option(rule(k("FOR"),ref("string_length"))), k(")"));
s.add("bit_value_expression", null, choice(
ref("bit_factor_part"),
ref("bit_factor")
));
s.add("bit_factor_part", null,
ref("bit_factor"), k("||"), ref("bit_value_expression"));
s.add("bit_factor", null, ref("bit_primary"));
s.add("bit_primary", null, choice(
ref("value_expression_primary"),
ref("string_value_function")
));
s.add("blob_position_expression", null,
k("POSITION"), k("("), ref("blob_value_expression"), k("IN"), ref("blob_value_expression"), k(")"));
s.add("extract_expression", null,
k("EXTRACT"), k("("), ref("extract_field"), k("FROM"), ref("extract_source"), k(")"));
s.add("extract_field", null, choice(
ref("primary_datetime_field"),
ref("time_zone_filed")));
s.add("primary_datetime_field", null, choice(
ref("non_second_primary_datetime_field"),
k("SECOND")
));
s.add("non_second_primary_datetime_field", null, choice(
k("YEAR"),
k("MONTH"),
k("DAY"),
k("HOUR"),
k("MINUTE")
));
s.add("time_zone_field", null, choice(
k("TIMEZONE_HOUR"),
k("TIMEZONE_MINUTE")));
s.add("extract_source", null, choice(
ref("datetime_value_expression"),
ref("interval_value_expression")));
s.add("length_expression", null, choice(
ref("char_length_expression"),
ref("octet_length_expression"),
ref("bit_length_expression")
));
s.add("char_length_expression", null,
choice(k("CHAR_LENGTH"), k("CHARACTER_LENGTH")), k("("), ref("string_value_expression"), k(")"));
s.add("octet_length_expression", null,
k("OCTET_LENGTH"), k("("), ref("string_value_expression"), k(")"));
s.add("bit_length_expression", null,
k("BIT_LENGTH"), k("("), ref("string_value_expression"), k(")"));
s.add("cardinality_expression", null,
k("CARDINALITY"), k("("), ref("collection_value_expression"), k(")"));
s.add("absolute_value_expression", null,
k("ABS"), k("("), ref("numeric_value_expression"), k(")") );
s.add("modulus_expression", null,
k("MOD"), k("("), ref("numeric_value_expression_dividend"), k(","), ref("numeric_value_expression_divisor"), k(")"));
s.add("numeric_value_expression_dividend", null, ref("numeric_value_expression"));
s.add("numeric_value_expression_divisor", null, ref("numeric_value_exression"));
s.add("value_expression_primary", null, choice(ref("parenthesized_value_expression"),
ref("nonparenthesized_value_expression_primary")));
s.add("parenthesized_value_expression", null, k("("), ref("value_expression"), k(")"));
s.add("nonparenthesized_value_expression_primary", null, choice(ref("unsigned_value_specification"),
ref("column_reference"), ref("set_function_specification"), ref("scalar_subquery"),
ref("case_expression"), ref("cast_specification"), ref("subtype_treatment"),
ref("attribute_or_method_reference"), ref("reference_resolution"), ref("collection_value_constructor"),
ref("routine_invocation"), ref("field_reference"), ref("element_reference"), ref("method_invocation"),
ref("static_method_invocation"), ref("new_specification")));
s.add("unsigned_value_specification", null, choice(ref("unsigned_literal"), ref("general_value_specification")));
s.add("unsigned_literal", null, choice(ref("unsigned_numeric_literal"), ref("general_literal")));
s.add("signed_numeric_literal", new SignedNumericLiteralParser(), option(ref("sign")),
ref("unsigned_numeric_literal"));
s.add("unsigned_numeric_literal", new NumericLiteralParser(), choice(ref("exact_numeric_literal"),
ref("approximate_numeric_literal")));
s.add("exact_numeric_literal", null, choice(ref("unsigned_integer"), rule(k("."), ref("unsigned_integer"))));
s.add("unsigned_integer", null, uint());
s.add("column_reference", new ColumnReferenceParser(), choice(ref("basic_identifier_chain"), rule(k("MODULE"),
k("."), ref("qualified_identifier"), k("."), ref("column_name"))));
s.add("basic_identifier_chain", null, ref("identifier_chain"));
s.add("identifier_chain", new IdentifierChainParser(), ref("identifier"), option(repeat(rule(k("."),
ref("identifier")))));
s.add("identifier", null, ref("actual_identifier"));
s.add("actual_identifier", null, choice(ref("regular_identifier"), ref("delimited_identifier")));
s.add("regular_identifier", null, regularId());
s.add("delimited_identifier", new EnclosedIdentifierParser(), k("\""), doubleQuotedString(), k("\""));
s.add("general_literal", null, choice(ref("character_string_literal")));
// TODO: [ introducer character set specification ] prefix
// TODO: non-quote chars and quote support
// TODO: separator/comment support
s.add("character_string_literal", new CharacterStringLiteralParser(), k("'"),
option(ref("character_representation")), k("'"));
s.add("character_representation", null, quotedString());
// DESC
s.add("desc_table_statement", new DescTableParser(), k("DESC"), ref("table_name"));
// DELETE
s.add("delete_statement_searched", new DeleteStatementParser(), k("DELETE"), k("FROM"), ref("target_table"),
option(rule(k("WHERE"), ref("search_condition"))));
s.add("target_table", null, ref("table_name"));
s.add("table_name", null, ref("local_or_schema_qualified_name"));
// TODO: optional <local or schema qualifier>
s.add("local_or_schema_qualified_name", null, ref("qualified_identifier"));
s.add("search_condition", null, ref("boolean_value_expression"));
s.add("boolean_value_expression", new BooleanValueExpressionParser(), ref("boolean_term"), option(repeat(rule(
k("OR"), ref("boolean_term")))));
s.add("boolean_term", new BooleanTermParser(), ref("boolean_factor"), option(repeat(rule(k("AND"),
ref("boolean_factor")))));
s.add("boolean_factor", new BooleanFactorParser(), option(k("NOT")), ref("boolean_test"));
s.add("boolean_test", new BooleanTestParser(), ref("boolean_primary"), option(rule(k("IS"), option(k("NOT")),
ref("truth_value"))));
s.add("boolean_primary", null, choice(ref("predicate"), ref("parenthesized_boolean_value_expression"),
ref("nonparenthesized_value_expression_primary")));
s.add("predicate", null, choice(ref("comparison_predicate"), ref("between_predicate"), ref("in_predicate"),
ref("like_predicate"), ref("null_predicate"), ref("quantified_comparison_predicate"),
ref("exists_predicate"), ref("unique_predicate"), ref("match_predicate"), ref("overlaps_predicate"),
ref("similar_predicate"), ref("distinct_predicate"), ref("type_predicate")));
s.add("parenthesized_boolean_value_expression", new BindingSelector(1), k("("),
ref("boolean_value_expression"), k(")"));
s.add("comparison_predicate", new ComparisonPredicateParser(), ref("row_value_expression"), ref("comp_op"),
ref("row_value_expression"));
s.add("in_predicate", new InPredicateParser(), ref("row_value_expression"), option(k("NOT")), k("IN"),
ref("in_predicate_value"));
s.add("in_predicate_value", null, choice(ref("table_subquery"), rule(k("("), ref("in_value_list"), k(")"))));
s.add("in_value_list", null, ref("row_value_expression"), repeat(rule(k(","), ref("row_value_expression"))));
s.add("null_predicate", new NullPredicateParser(), ref("row_value_expression"), k("IS"), option(k("NOT")),
k("NULL"));
s.add("row_value_expression", null, choice(ref("row_value_special_case"), ref("row_value_constructor")));
s.add("row_value_constructor", new RowValueConstructorParser(), choice(ref("row_value_constructor_element"),
rule(k("("), ref("row_value_constructor_element_list"), k(")"))), ref("row_subquery"));
s.add("row_value_constructor_element", null, ref("value_expression"));
s.add("row_value_constructor_element_list", null, ref("row_value_constructor_element"), option(repeat(rule(
k(","), ref("row_value_constructor_element")))));
s.add("row_subquery", null, ref("subquery"));
s.add("comp_op", null, choice(k("="), k("<>"), k("<"), k(">"), k("<="), k(">=")));
// SELECT
s.add("query_specification", new SelectStatementParser(), k("SELECT"), option(ref("set_quantifier")),
ref("select_list"), ref("table_expression"));
s.add("select_list", null, choice(k("*"), rule(ref("select_sublist"), option(repeat(rule(k(","),
ref("select_sublist")))))));
s.add("select_sublist", null, choice(ref("derived_column"), ref("qualified_asterisk")));
s.add("derived_column", null, ref("value_expression"), option(ref("as_clause")));
s.add("as_clause", null, option(rule(k("AS"), ref("column_name"))));
s.add("qualified_asterisk", null, choice(rule(ref("asterisked_identifier_chain"), k("."), k("*")),
ref("all_fields_reference")));
s.add("asterisked_identifier_chain", null, ref("asterisked_identifier"), option(repeat(rule(k("."),
ref("asterisked_identifier")))));
s.add("asterisked_identifier", null, ref("identifier"));
s.add("all_fields_reference", null, ref("value_expression_primary"), k("."), k("*"));
s.add("table_expression", null, ref("from_clause"), option(ref("where_clause")),
option(ref("group_by_clause")), option(ref("having_clause")));
s.add("from_clause", null, k("FROM"), ref("table_reference_list"));
s.add("table_reference_list", null, ref("table_reference"),
option(repeat(rule(k(","), ref("table_reference")))));
s.add("table_reference", null, ref("table_primary"), ref("joined_table_repeater"));
Rule columns = rule(option(k("AS")), ref("correlation_name"),
option(k("("), ref("derived_column_list"), k(")")));
Rule tablePrimary1 = rule(ref("table_or_query_name"), option(columns));
Rule tablePrimary2 = rule(ref("derived_table"), columns);
Rule tablePrimary3 = rule(ref("lateral_derived_table"), columns);
Rule tablePrimary4 = rule(ref("collection_derived_table"), columns);
Rule tablePrimary5 = rule(ref("only_spec"), option(columns));
Rule tablePrimary6 = rule(k("("), ref("table_reference"), k(")"));
s.add("table_primary", null, choice(tablePrimary1, tablePrimary2, tablePrimary3, tablePrimary4, tablePrimary5,
tablePrimary6));
s.add("table_or_query_name", null, choice(ref("table_name"), ref("query_name")));
s.add("correlation_name", null, ref("identifier"));
s.add("derived_column_list", null, ref("column_name_list"));
s.add("derived_table", null, ref("table_subquery"));
s.add("lateral_derived_table", null, k("LATERAL"), k("("), ref("query_expression"), k(")"));
s.add("collection_derived_table", null, k("UNNEST"), k("("), ref("collection_value_expression"), k(")"),
option(k("WITH"), k("ORDINALITY")));
s.add("collection_value_expression", null, ref("value_expression_primary"));
s.add("only_spec", null, k("ONLY"), k("("), ref("table_or_query_name"), k(")"));
// non left-recursive form
s.add("joined_table_repeater", null, choice(rule(ref("joined_table2"), ref("joined_table_repeater")), empty()));
s.add("joined_table2", null, choice(ref("cross_join2"), ref("qualified_join2"), ref("natural_join2"),
ref("union_join2")));
s.add("cross_join2", null, k("CROSS"), k("JOIN"), ref("table_primary"));
s.add("qualified_join2", null, option(ref("join_type")), k("JOIN"), ref("table_reference"),
ref("join_specification"));
s.add("natural_join2", null, k("NATURAL"), option(ref("join_type")), k("JOIN"), ref("table_primary"));
s.add("union_join2", null, k("UNION"), k("JOIN"), ref("table_primary"));
// original joined table descendants
s.add("joined_table", null, choice(ref("cross_join"), ref("qualified_join"), ref("natural_join"),
ref("union_join")));
s.add("cross_join", null, ref("table_reference"), k("CROSS"), k("JOIN"), ref("table_primary"));
s.add("qualified_join", null, ref("table_reference"), option(ref("join_type")), k("JOIN"),
ref("table_reference"), ref("join_specification"));
s.add("natural_join", null, ref("table_reference"), k("NATURAL"), option(ref("join_type")), k("JOIN"),
ref("table_primary"));
s.add("union_join", null, ref("table_reference"), k("UNION"), k("JOIN"), ref("table_primary"));
s.add("join_type", null, choice(k("INNER"), rule(ref("outer_join_type"), option(k("OUTER")))));
s.add("outer_join_type", null, choice(k("LEFT"), k("RIGHT"), k("FULL")));
s.add("join_specification", null, choice(ref("join_condition"), ref("named_columns_join")));
s.add("join_condition", null, k("ON"), ref("search_condition"));
s.add("named_columns_join", null, k("USING"), k("("), ref("join_column_list"), k(")"));
s.add("join_column_list", null, k("column_name_list"));
s.add("where_clause", null, k("WHERE"), ref("search_condition"));
s.add("group_by_clause", null, k("GROUP"), k("BY"), ref("grouping_element_list"));
s.add("grouping_element_list", null, ref("grouping_element"), option(repeat(rule(k(","),
ref("grouping_element")))));
s.add("grouping_element", null, ref("ordinary_grouping_set"), ref("rollup_list"), ref("cube_list"),
ref("grouping_sets_specification"), ref("grand_total"));
s.add("grouping_column_reference", null, ref("column_reference"), option(ref("collate_clause")));
s.add("rollup_list", null, k("ROLLUP"), k("("), ref("grouping_column_reference_list"), k(")"));
s.add("grouping_column_reference_list", null, ref("grouping_column_reference"), option(repeat(rule(k(","),
ref("grouping_column_reference")))));
s.add("cube_list", null, k("CUBE"), k("("), ref("grouping_column_reference_list"), k(")"));
s.add("grouping_sets_specification", null, k("GROUPING"), k("SETS"), k("("), ref("grouping_set_list"), k(")"));
s.add("grouping_set_list", null, ref("grouping_set"), option(repeat(rule(k(","), ref("grouping_set")))));
s.add("grouping_set", null, choice(ref("ordinary_grouping_set"), ref("rollup_list"), ref("cube_list"),
ref("grouping_sets_specification"), ref("grand_total")));
s.add("ordinary_grouping_set", null, choice(ref("grouping_column_reference"), rule(k("("),
ref("grouping_column_reference_list"), k(")"))));
s.add("grand_total", null, k("("), k(")"));
s.add("concatenated_grouping", null, ref("grouping_set"), k(","), ref("grouping_set_list"));
s.add("having_clause", null, k("HAVING"), ref("search_condition"));
s.add("table_value_constructor", null, k("VALUES"), ref("row_value_expression_list"));
s.add("row_value_expression_list", null, ref("row_value_expression"), option(repeat(rule(k(","),
ref("row_value_expression")))));
s.add("explicit_table", null, k("TABLE"), ref("table_name"));
// subquery
s.add("table_subquery", null, ref("subquery"));
s.add("subquery", null, k("("), ref("query_expression"), k(")"));
s.add("query_expression", null, option(ref("with_clause")), ref("query_expression_body"));
s.add("query_expression_body", null, choice(ref("non-join_query_expression"), ref("joined_table")));
Rule nonJoinQuery1 = rule(k("UNION"), option(choice(k("ALL"), k("DISTINCT"))),
option(ref("corresponding_spec")), ref("query_term"));
Rule nonJoinQuery2 = rule(k("EXCEPT"), option(choice(k("ALL"), k("DISTINCT"))),
option(ref("corresponding_spec")), ref("query_term"));
s.add("non-join_query_expression", null, ref("non-join_query_term"),
repeat(choice(nonJoinQuery1, nonJoinQuery2)));
Rule nonJoinQuery3 = rule(ref("query_term"), k("INTERSECT"), option(choice(k("ALL"), k("DISTINCT"))),
option(ref("corresponding_spec")), ref("query_primary"));
s.add("non-join_query_term", null, choice(ref("non-join_query_primary"), nonJoinQuery3));
s.add("non-join_query_primary", null, choice(ref("simple_table"), rule(k("("),
ref("non-join_query_expression"), k(")"))));
s.add("simple_table", null, choice(ref("query_specification"), ref("table_value_constructor"),
ref("explicit_table")));
s.add("explicit_table", null, k("TABLE"), ref("table_name"));
// update
s.add("update_statement_searched", new UpdateStatementParser(), k("UPDATE"), ref("target_table"), k("SET"),
ref("set_clause_list"), option(k("WHERE"), ref("search_condition")));
s.add("set_clause_list", null, ref("set_clause"), repeat(rule(k(","), ref("set_clause"))));
s.add("set_clause", null, choice(rule(ref("update_target"), k("="), ref("update_source")), rule(
ref("mutated_set_clause"), k("="), ref("update_source"))));
s.add("update_target", null, ref("object_column"));
s.add("object_column", null, ref("column_name"));
s.add("update_source", null, choice(ref("value_expression"), ref("contextually_typed_value_specification")));
// alter table
s.add("alter_table_statement", new AlterTableStatementParser(), k("ALTER"), k("TABLE"), ref("table_name"),
ref("alter_table_action"));
s.add("alter_table_action", null, choice(ref("add_column_definition"), ref("alter_column_definition"),
ref("drop_column_definition"), ref("add_table_constraint_definition"),
ref("drop_table_constraint_definition")));
s.add("add_column_definition", new AddColumnDefinitionParser(), k("ADD"), option(k("COLUMN")), ref("column_definition"));
s.add("alter_column_definition", new AlterColumnDefinitionParser(), k("ALTER"), option(k("COLUMN")), ref("alter_column_action"));
s.add("alter_column_action", null, choice(ref("set_column_default_clause"), ref("drop_column_default_clause"),
ref("add_column_scope_clause"), ref("drop_column_scope_clause")));
s.add("set_column_default_clause", null, k("SET"), ref("default_clause"));
s.add("drop_column_default_clause", null, k("DROP"), k("DEFAULT"));
s.add("add_column_scope_clause", null, k("ADD"), ref("scope_clause"));
s.add("drop_column_scope_clause", null, k("DROP"), k("SCOPE"), ref("drop_behavior"));
s.add("drop_column_definition", new DropColumnDefinitionParser(), k("DROP"), option(k("COLUMN")), ref("column_name"),
option(ref("drop_behavior")));
s.add("add_table_constraint_definition", null, k("ADD"), option(k("COLUMN")), ref("column_definition"));
s.add("drop_table_constraint_definition", null, k("DROP"), k("CONSTRAINT"), ref("constraint_name"),
ref("drop_behavior"));
s.add("drop_behavior", null, choice(k("CASCADE"), k("RESTRICT")));
// show tables
s.add("show_tables", new ShowTablesParser(), k("SHOW"), k("TABLES"));
return s;
}
private static EnclosedStringPlaceholder quotedString() {
return new EnclosedStringPlaceholder('\'');
}
private static EnclosedStringPlaceholder doubleQuotedString() {
return new EnclosedStringPlaceholder('"');
}
private static RegularIdentifierPlaceholder regularId() {
return new RegularIdentifierPlaceholder();
}
}