/* ================= schema.rule ============== */ drops_statement : drops_c { $$=make_sql_string_and_free(acl_strdup($1), NULL);} ; drops_c : DROP_TABLE table_name_not_for_column_prefix { if (A4GLSQLCV_check_requirement("ADD_CASCADE")) { SPRINTF1($$, "DROP TABLE %s CASCADE",$2); } else { SPRINTF1($$, "DROP TABLE %s",$2); } add_feature("DROP_TABLE"); } | DROP_VIEW table_name_not_for_column_prefix {SPRINTF2($$,"%s %s ",$1,$2); add_feature("DROP_VIEW"); } | DROP_INDEX idx_name {SPRINTF2($$,"%s %s",$1,$2); if (strchr($2,'@') || strchr($2,':')) add_feature("DROP_INDEX_QUALIFIED_PATH"); add_feature("DROP_INDEX"); } | DROP_TRIGGER identifier {SPRINTF2($$,"%s %s",$1,$2); add_feature("DROP_TRIGGER"); } ; create_statement_ss : create_c_1 {$$=acl_strdup($1);} | create_c_2_ss {$$=$1;} ; create_c_2_ss : CREATE_TABLE table_name_not_for_column_prefix OPEN_BRACKET table_element_list_ss CLOSE_BRACKET opt_cr_table_extra { if (A4GLSQLCV_check_requirement ("ADD_WITH_OIDS")) { $$=make_sql_string_and_free(acl_strdup($1),kw_space,acl_strdup($2),kw_space,kw_ob,$4,kw_cb,acl_strdup(" WITH OIDS "),acl_strdup($6),NULL); } else { $$=make_sql_string_and_free(acl_strdup($1),kw_space,acl_strdup($2),kw_space,kw_ob,$4,kw_cb,acl_strdup($6),NULL); } add_feature("CREATE_TABLE"); } | CREATE_TEMP_TABLE table_name_not_for_column_prefix OPEN_BRACKET table_element_list_ss CLOSE_BRACKET op_no_log opt_cr_table_extra op_no_log { char *tstr; tstr=""; if (strlen($6)) tstr=$6; if (strlen($8)) tstr=$8; map_create_temp($2,$4); $$=A4GLSQLCV_create_temp_table($2,$4,tstr,$7); add_feature("CREATE_TEMP_TABLE"); acl_free($4); } ; opt_cr_table_extra : {strcpy($$,"");} | cr_table_extra {strcpy($$,$1);} ; cr_table_extra : cr_table_extra_entry | cr_table_extra cr_table_extra_entry {SPRINTF2($$,"%s%s",$1,$2); } ; cr_table_extra_entry : KW_IN space_name { add_feature("CREATE_TABLE_IN"); if (A4GLSQLCV_check_requirement("OMIT_TABLE_IN")) { strcpy($$,""); } else { SPRINTF1($$," IN %s",$2); } } | EXTENT_SIZE INT_VALUE { add_feature("CREATE_TABLE_WITH_EXTENT_SIZE"); if (A4GLSQLCV_check_requirement("OMIT_TABLE_EXTENTS")) { strcpy($$,""); } else { SPRINTF1($$," EXTENT SIZE %s",$2); } } | NEXT_SIZE INT_VALUE { add_feature("CREATE_TABLE_WITH_NEXT_EXTENT_SIZE"); if (A4GLSQLCV_check_requirement("OMIT_TABLE_EXTENTS")) { strcpy($$,""); } else { SPRINTF1($$," NEXT SIZE %s",$2); } } | LOCK_MODE_PAGE { add_feature("CREATE_TABLE_LOCK_MODE"); if (A4GLSQLCV_check_requirement("OMIT_LOCK_MODE")) { strcpy($$,""); } else { SPRINTF0($$," LOCK MODE PAGE"); } } | LOCK_MODE_ROW { add_feature("CREATE_TABLE_LOCK_MODE"); if (A4GLSQLCV_check_requirement("OMIT_LOCK_MODE")) { strcpy($$,""); } else { SPRINTF0($$," LOCK MODE ROW"); } } ; space_name : NAMED; op_cr_index_extra: {strcpy($$,"");} | cr_index_extra {strcpy($$,$1);} ; cr_index_extra : cr_index_extra_entry | cr_index_extra cr_index_extra_entry {SPRINTF2($$,"%s%s",$1,$2);} ; cr_index_extra_entry : KW_IN space_name { if (A4GLSQLCV_check_requirement("OMIT_INDEX_IN")) { strcpy($$,""); } else { SPRINTF1($$," IN %s",$2); add_feature("INDEX_IN"); } } | FILLFACTOR INT_VALUE { if (A4GLSQLCV_check_requirement("OMIT_INDEX_FILLFACTOR")) { strcpy($$,""); } else { SPRINTF1($$,"FILLFACTOR %s",$2); add_feature("INDEX_FILLFACTOR"); } } | USING_BTREE { if (A4GLSQLCV_check_requirement("OMIT_INDEX_USING")) { strcpy($$,""); } else { strcpy($$,"USING BTREE"); add_feature("INDEX_BTREE"); } } | USING_RTREE { if (A4GLSQLCV_check_requirement("OMIT_INDEX_USING")) { strcpy($$,""); } else { strcpy($$,"USING RTREE"); add_feature("INDEX_RTREE"); } } ; cr_table_name: table_name_not_for_column_prefix { strcpy(last_tmp_name,$1); } ; create_c_1 : CREATE_U_IDX idx_name KW_ON cr_table_name OPEN_BRACKET idx_column_list CLOSE_BRACKET op_cr_index_extra {SPRINTF7($$,"CREATE UNIQUE INDEX %s %s %s %s %s %s %s",$2,$3,$4,$5,$6,$7,$8); add_feature("CREATE_INDEX"); add_feature("CREATE_INDEX_UNIQUE"); if (strchr($2,'@') || strchr($2,':')) add_feature("CREATE_INDEX_QUALIFIED_PATH"); if (strchr($6,',')) { add_feature("CREATE_INDEX_COMPOSITE"); } } | CREATE_UC_IDX idx_name KW_ON cr_table_name OPEN_BRACKET idx_column_list CLOSE_BRACKET op_cr_index_extra { add_feature("CREATE_INDEX"); add_feature("CREATE_INDEX_UNIQUE"); add_feature("CLUSTER_INDEX"); if (strchr($2,'@') || strchr($2,':')) add_feature("CREATE_INDEX_QUALIFIED_PATH"); if (strchr($6,',')) { add_feature("CREATE_INDEX_COMPOSITE"); } if (A4GLSQLCV_check_requirement("OMIT_INDEX_CLUSTER")) { SPRINTF7($$,"CREATE UNIQUE INDEX %s %s %s %s %s %s %s",$2,$3,$4,$5,$6,$7,$8); } else { SPRINTF7($$,"CREATE UNIQUE CLUSTER INDEX %s %s %s %s %s %s %s",$2,$3,$4,$5,$6,$7,$8); } } | CREATE_C_IDX idx_name KW_ON cr_table_name OPEN_BRACKET idx_column_list CLOSE_BRACKET op_cr_index_extra { add_feature("CREATE_INDEX"); add_feature("CLUSTER_INDEX"); if (strchr($2,'@') || strchr($2,':')) add_feature("CREATE_INDEX_QUALIFIED_PATH"); if (strchr($6,',')) { add_feature("CREATE_INDEX_COMPOSITE"); } if (A4GLSQLCV_check_requirement("OMIT_INDEX_CLUSTER")) { SPRINTF7($$,"CREATE INDEX %s %s %s %s %s %s %s",$2,$3,$4,$5,$6,$7,$8); } else { SPRINTF7($$,"CREATE CLUSTER INDEX %s %s %s %s %s %s %s",$2,$3,$4,$5,$6,$7,$8); } } | CREATE_IDX idx_name KW_ON cr_table_name OPEN_BRACKET idx_column_list CLOSE_BRACKET op_cr_index_extra { if (strchr($2,'@') || strchr($2,':')) add_feature("CREATE_INDEX_QUALIFIED_PATH"); if (strchr($6,',')) { add_feature("CREATE_INDEX_COMPOSITE"); } add_feature("CREATE_INDEX"); SPRINTF7($$," CREATE INDEX %s %s %s %s %s %s %s",$2,$3,$4,$5,$6,$7,$8); } | CREATE_DATABASE var_ident_vl { add_feature("CREATE_DATABASE"); a4gl_yyerror("You cannot create a database from within Aubit4gl - if the target database allows - prepare and execute it manually"); } | DROP_DATABASE var_ident_vl { add_feature("DROP_DATABASE"); a4gl_yyerror("You cannot drop a database from within Aubit4gl - if the target database allows - prepare and execute it manually"); } | CREATE_SYNONYM table_name_not_for_column_prefix KW_FOR table_name_not_for_column_prefix { if (strchr($2,'@') || strchr($2,':')) add_feature("CREATE_SYNONYM_QUALIFIED_PATH"); add_feature("CREATE_SYNONYM"); SPRINTF3($$,"%s %s FOR %s",$1,$2,$4); } | CREATE_AUDIT_FOR table_name_not_for_column_prefix KW_IN CHAR_VALUE { add_feature("CREATE_AUDIT"); SPRINTF2($$,"CREATE AUDIT FOR %s IN '%s'",$2,A4GL_strip_quotes($4)); } | DROP_AUDIT_FOR table_name_not_for_column_prefix { add_feature("DROP_AUDIT"); SPRINTF1($$,"DROP AUDIT FOR %s",$2); } | DROP_SYNONYM table_name_not_for_column_prefix { if (strchr($2,'@') || strchr($2,':')) add_feature("DROP_SYNONYM_QUALIFIED_PATH"); add_feature("DROP_SYNONYM"); SPRINTF2($$,"%s %s",$1,$2); } | RECOVER_TABLE table_name_not_for_column_prefix { add_feature("RECOVER_TABLE"); SPRINTF1($$,"RECOVER TABLE %s",$2); } | ROLLFORWARD_DATABASE identifier { add_feature("ROLLFORWARD_DATABASE"); SPRINTF1($$,"ROLLFORWARD DATABASE %s",$2); } ; op_no_log : {strcpy($$,"");} | WITH_NO_LOG { add_feature("SELECT_INTO_TEMP_WITH_NO_LOG"); if (A4GLSQLCV_check_requirement("OMIT_NO_LOG")) { strcpy($$,""); } else { SPRINTF1($$," %s ",$1); } } ; op_no_log_i : {$$=0;} | WITH_NO_LOG { $$=1;} ; idx_column_list : idx_column | idx_column_list KW_COMMA idx_column {SPRINTF2($$,"%s,%s",$1,$3);} ; idx_column : identifier ASC { add_feature("CREATE_INDEX_ASC"); strcpy($$,A4GL_confirm_colname(last_tmp_name,$1)); if (A4GLSQLCV_check_requirement("OMIT_INDEX_ORDER")) { SPRINTF1($$,"%s",$1); } else { SPRINTF1($$,"%s ASC",$1); } } | identifier DESC { add_feature("CREATE_INDEX_DESC"); strcpy($$,A4GL_confirm_colname(last_tmp_name,$1)); if (A4GLSQLCV_check_requirement("OMIT_INDEX_ORDER")) { SPRINTF1($$,"%s",$1); } else { SPRINTF1($$,"%s DESC",$1); } } | identifier { strcpy($$,A4GL_confirm_colname(last_tmp_name,$1)); } ; table_element_list_ss: table_element_ss { $$=$1; } | table_element_list_ss KW_COMMA table_element_ss { $$=make_sql_string_and_free($1,kw_comma,strdup("\n"),$3,NULL); } ; table_element_ss: ct_column_definiton_ss { $$=make_sql_string_and_free(strdup(" "),$1,NULL); } | table_constraint_definition_ss { $$=make_sql_string_and_free(strdup(" "),$1,NULL); } ; alter_statement_ss : ALTER_TABLE identifier alter_clauses_ss { add_feature("ALTER_TABLE"); $$=make_sql_string_and_free(acl_strdup($1),kw_space,acl_strdup($2),kw_space,$3,NULL); } | ALTER_INDEX idx_name TO_CLUSTER { add_feature("CLUSTER_INDEX"); add_feature("ALTER_INDEX_CLUSTER"); $$=make_sql_string_and_free(acl_strdup("ALTER INDEX "),acl_strdup($2),acl_strdup(" TO CLUSTER"),NULL); } | ALTER_INDEX idx_name TO_NOT_CLUSTER { add_feature("ALTER_INDEX_NOT_CLUSTER"); $$=make_sql_string_and_free(acl_strdup("ALTER INDEX "),acl_strdup($2),acl_strdup(" TO NOT CLUSTER"),NULL); } ; alter_clauses_ss: alter_clause_ss { $$=$1; } | alter_clauses_ss KW_COMMA alter_clause_ss { $$=make_sql_string_and_free($1,kw_comma,$3,NULL); } ; alter_clause_ss: alter_add_clause_ss { $$=$1; } | alter_drop_clause { add_feature("ALTER_TABLE_DROP"); $$=acl_strdup($1); } | alter_modify_clause_ss { add_feature("ALTER_TABLE_MODIFY"); $$=$1; } | alter_add_constraint_clause { add_feature("ALTER_TABLE_ADD_CONSTRAINT"); $$=acl_strdup($1); } | alter_drop_constraint_clause { add_feature("ALTER_TABLE_DROP_CONSTRAINT"); $$=acl_strdup($1); } | alter_modify_next { add_feature("ALTER_TABLE_MODIFY_NEXT"); $$=acl_strdup($1); } | alter_lock_mode { add_feature("ALTER_TABLE_LOCK_MODE"); $$=acl_strdup($1); } ; alter_add_clause_ss: ADD add_column_clause_ss { add_feature("ALTER_TABLE_ADD"); $$=make_sql_string_and_free(acl_strdup("ADD "),$2,NULL); } | ADD OPEN_BRACKET add_column_clauses_ss CLOSE_BRACKET { add_feature("ALTER_TABLE_ADD"); $$=make_sql_string_and_free(acl_strdup("ADD "),kw_ob,$3,kw_cb,NULL); } ; add_column_clause_ss: table_element_ss { $$=$1; } | table_element_ss BEFORE identifier { add_feature("ALTER_TABLE_ADD_BEFORE"); $$=make_sql_string_and_free($1,acl_strdup(" BEFORE "),acl_strdup($3),NULL); } ; add_column_clauses_ss: add_column_clause_ss { $$=$1; } | add_column_clauses_ss KW_COMMA add_column_clause_ss { $$=make_sql_string_and_free($1,kw_comma,$3,NULL); } ; alter_drop_clause: DROP drop_column { SPRINTF1($$,"DROP %s",$2); } | DROP OPEN_BRACKET drop_column_list CLOSE_BRACKET { SPRINTF1($$,"DROP (%s)",$3); } ; drop_column_list: drop_column | drop_column_list KW_COMMA drop_column { SPRINTF2($$,"%s,%s",$1,$3); } ; drop_column : identifier ; alter_modify_clause_ss : MODIFY modify_column_clause_ss { $$=make_sql_string_and_free(acl_strdup("MODIFY "),$2,NULL); } | MODIFY OPEN_BRACKET modify_column_clauses_ss CLOSE_BRACKET { $$=make_sql_string_and_free(acl_strdup("MODIFY "),kw_ob,$3,kw_cb,NULL); } ; modify_column_clauses_ss : modify_column_clause_ss { $$=$1; } | modify_column_clauses_ss KW_COMMA modify_column_clause_ss { $$=make_sql_string_and_free($1,kw_comma,$3,NULL); } ; modify_column_clause_ss : table_element_ss { $$=$1; } ; alter_lock_mode : LOCK_MODE_PAGE {strcpy($$,"LOCK MODE (PAGE)");} | LOCK_MODE_ROW {strcpy($$,"LOCK MODE (ROW)");} ; alter_modify_next : MODIFY_NEXT_SIZE INT_VALUE { add_feature("DDL_NEXT_SIZE"); SPRINTF1($$,"MODIFY NEXT SIZE %d",atoi($2)); } ; alter_add_constraint_clause: ADD_CONSTRAINT table_constraint_definition_ss opt_constraint_name { add_feature("DDL_CONSTRAINT"); SPRINTF2($$,"ADD CONSTRAINT %s%s",$2,$3); } | ADD_CONSTRAINT OPEN_BRACKET table_constraint_definition_list_ss CLOSE_BRACKET { add_feature("ADD_CONSTRAINT"); SPRINTF1($$,"ADD CONSTRAINT (%s)",$3); } ; table_constraint_definition_list_ss: table_constraint_definition_ss opt_constraint_name { $$=make_sql_string_and_free($1,acl_strdup($2),NULL); } | table_constraint_definition_list_ss KW_COMMA table_constraint_definition_ss opt_constraint_name { $$=make_sql_string_and_free($1,kw_comma,$3,acl_strdup($4), NULL); } ; opt_constraint_name : {strcpy($$,"");} | CONSTRAINT identifier {SPRINTF2($$," %s %s",$1,$2); add_feature("DDL_CONSTRAINT");} ; alter_drop_constraint_clause: DROP_CONSTRAINT constraint_names { SPRINTF1($$,"DROP CONSTRAINT %s",$2); add_feature("DROP_CONSTRAINT"); } | DROP_CONSTRAINT OPEN_BRACKET constraint_names CLOSE_BRACKET {add_feature("DROP_CONSTRAINT"); SPRINTF1($$,"DROP CONSTRAINT (%s)",$3); } ; constraint_names : constraint_name {strcpy($$,$1);} | constraint_names KW_COMMA constraint_name {SPRINTF2($$,"%s,%s",$1,$3);} ; constraint_name: identifier ;