/* ===================================================================== Source: sql1.rule ===================================================================== */ rollback_statement: ROLLBACK_W { add_feature("ROLLBACK_WORK"); } ; insert_statement_c: INSERT_INTO { insql=1;} table_name_not_for_column_prefix op_insert_column_list_sl ins_2_ic { $$=$5; $$->connid=0; $$->table=acl_strdup($3); A4GL_set_associated_mem($$, $$->table); $$->column_list=$4; } ; ins_2_ic : VALUES {insql=1;} OPEN_BRACKET insert_value_list_slil CLOSE_BRACKET { $$=malloc(sizeof(struct_insert_cmd)); $$->connid=0; $$->column_list=0; $$->table=0; $$->value_list=0; $$->subselect=0; $$->value_list= expand_slil($4); } | query_specification_select { if ($1->sf==0) { $1->sf=acl_malloc2(sizeof(struct s_select_finish)); $1->sf->order_by=0; $1->sf->into_temp=0; $1->sf->nolog=0; $1->sf->insert_into=0; A4GL_set_associated_mem($1, $1->sf); } $1->sf->insert_into=0; map_select_stmt("SELECT",$1); add_feature("INSERT_INTO_SELECT_FROM"); $$=malloc(sizeof(struct_insert_cmd)); $$->connid=0; $$->column_list=0; $$->table=0; $$->value_list=0; $$->subselect=$1; } ; op_insert_column_list_sl: { $$=0; } | OPEN_BRACKET insert_column_list_sl CLOSE_BRACKET { $$=$2; add_feature("INSERT_COLUMNLIST_EQ_VALUELIST"); } ; insert_column_list_sl: ins_column_name { $$=new_str_list($1); } | insert_column_list_sl KW_COMMA ins_column_name { $$=add_str_list($1, $3); } ; ins_column_name : identifier { strcpy($$,$1); } | identifier KW_DOT identifier { /* with a table prefix - on an insert ? We'll just silently drop it... */ strcpy($$,$3); A4GL_warn("Dropped table prefix from INSERT column name"); } ; insert_value_list_slil: insert_value_sli { $$=local_new_select_list_item_list($1);} | insert_value_list_slil KW_COMMA insert_value_sli { $$=local_add_select_list_item_list($1,$3); } ; insert_value_sli: value_expression_sli {$$=$1;} | KW_NULL {$$=new_select_list_item_builtin_const(E_SLI_BUILTIN_CONST_NULL); } ; delete_statement_c: DELETE_FROM table_name_not_for_column_prefix where_del_p { //A4GL_add_crud("DELETE",$2); if ($3==0) { A4GL_warn("DELETE with no WHERE clause"); } add_feature("ANSI_DELETE"); /* if (strstr($4," EXISTS ")) { add_feature("DELETE_FROM_WHERE_EXISTS_SUBSELECT"); } */ /* @FIXME - add back in */ $$=malloc(sizeof(struct struct_delete_cmd)); $$->connid=NULL; $$->table=acl_strdup($2); $$->where_clause=$3; A4GL_set_associated_mem($$, $$->table); } ; begin_statement: BEGIN_WORK { add_feature("BEGIN_WORK"); } ; commit_statement: COMMIT_W { add_feature("COMMIT_WORK"); } ; op_db_exclusive : {$$=EB_FALSE;} | EXCLUSIVE { add_feature("DATABASE_EXCLUSIVE"); {$$=EB_TRUE;} } ; misc_infx_stmt: misc_infx_stmt_str { char buff[256]; $$=make_sql_string_and_free(acl_strdup($1),NULL); SPRINTF1(buff,"Warning: Informix specific SQL @ line %d\n",yylineno); ansi_violation(buff,1); } ; misc_infx_stmt_str: START_DATABASE identifier WITH_LOG_IN CHAR_VALUE MODE_ANSI { add_feature("START_DATABASE_WITH_LOG_MODE_ANSI"); sprintf($$,"START DATABASE %s WITH LOG IN %s MODE ANSI", $2,$4); } | START_DATABASE identifier WITH_LOG_IN CHAR_VALUE { add_feature("START_DATABASE_WITH_LOG"); sprintf($$,"START DATABASE %s WITH LOG IN %s", $2,$4); } | SET_CONSTRAINTS_ALL_IMMEDIATE { add_feature("SET_CONSTRAINTS_ALL_IMMEDIATE"); SPRINTF1($$,"%s",$1); } | SET_BUFFERED_LOG { add_feature("SET_BUFFERED_LOG"); SPRINTF1($$,"%s",$1); } | SET_LOG { add_feature("SET_LOG"); SPRINTF1($$,"%s",$1); } | UPDATESTATS_T identifier { SPRINTF2($$,"%s %s",$1,$2); add_feature("UPDATE_STATISTICS_TABLE"); } | UPDATESTATS { add_feature("UPDATE_STATISTICS"); SPRINTF1($$,"%s",$1); } ; sql_transact_commands: commit_statement { $$=1; #ifndef SQLCOMPILER set_cmdlineno(token_read_on_line); #endif } | begin_statement { $$=-1; #ifndef SQLCOMPILER set_cmdlineno(token_read_on_line); #endif } | rollback_statement { $$=0; #ifndef SQLCOMPILER set_cmdlineno(token_read_on_line); #endif } ; sql_commands : misc_infx_stmt { $$=$1; } | schema_ss { $$=$1; } | schema_element_ss { $$=$1; } | misc_sql { $$=$1; } | drops_statement { $$=$1; } | create_statement_ss { $$=$1; } | alter_statement_ss { $$=$1; } ; privilege_definition: GRANT privileges KW_ON table_name_not_for_column_prefix KW_TO grantee_list op_with_grant_option {SPRINTF7($$,"%s %s %s %s %s %s %s",$1,$2,$3,$4,$5,$6,$7); add_feature("GRANT"); } | REVOKE privileges KW_ON table_name_not_for_column_prefix FROM grantee_list {SPRINTF6($$,"%s %s %s %s %s %s",$1,$2,$3,$4,$5,$6); add_feature("REVOKE"); } | GRANT db_priv KW_TO grantee_list {SPRINTF4($$,"%s %s %s %s ",$1,$2,$3,$4); add_feature("GRANT"); } | REVOKE db_priv FROM grantee_list {SPRINTF4($$,"%s %s %s %s ",$1,$2,$3,$4); add_feature("REVOKE"); } ; db_priv: CONNECT | RESOURCE | DBA ; op_with_grant_option: {strcpy($$,"");} | WITH_GRANT_OPTION {SPRINTF1($$," %s ",$1);} | KW_AS authorization_identifier {SPRINTF2($$," %s %s",$1,$2);} ; privileges: ALL_PRIVILEGES {SPRINTF1($$," %s ",$1);} | ALL {SPRINTF1($$," %s ",$1);} | action_list ; action_list: action | action_list KW_COMMA action {SPRINTF3($$," %s %s %s",$1,$2,$3);} ; action: KW_SELECT op_grant_column_list { if (A4GLSQLCV_check_requirement("SIMPLE_GRANT_SELECT")) { SPRINTF0($$," SELECT"); } else { SPRINTF2($$," %s %s",$1,$2); } } | KW_INSERT | KW_DELETE | KW_UPDATE op_grant_column_list { if (A4GLSQLCV_check_requirement("SIMPLE_GRANT_UPDATE")) { SPRINTF0($$," UPDATE"); } else { SPRINTF2($$," %s %s",$1,$2); } } | ALTER | INDEX ; op_grant_column_list: {strcpy($$,"");} | OPEN_BRACKET grant_column_list CLOSE_BRACKET {SPRINTF3($$," %s %s %s",$1,$2,$3);} ; grant_column_list: column_name | grant_column_list KW_COMMA column_name {SPRINTF3($$," %s %s %s",$1,$2,$3);} ; grantee_list: grantee | grantee_list KW_COMMA grantee {SPRINTF3($$," %s %s %s",$1,$2,$3);} ; grantee: PUBLIC | authorization_identifier ; view_definition_ss: CREATE_VIEW table_name_not_for_column_prefix op_view_column_list KW_AS query_specification_ss_converted op_with_check_option { add_feature("CREATE_VIEW_AS_SELECT"); $$=make_sql_string_and_free(acl_strdup($1),kw_space,acl_strdup($2),kw_space,acl_strdup($3),kw_space,acl_strdup($4),kw_space,$5,kw_space,acl_strdup($6),NULL); } ; op_view_column_list: {strcpy($$,"");} | OPEN_BRACKET view_column_list CLOSE_BRACKET {SPRINTF3($$," %s %s %s",$1,$2,$3);} ; view_column_list: column_name | view_column_list KW_COMMA column_name {SPRINTF3($$," %s %s %s",$1,$2,$3);} ; op_with_check_option: {strcpy($$,"");} | WITH_CHECK_OPTION { add_feature("CREATE_VIEW_SELECT_WITH_CHECK"); } ; check_constraint_definition_ss: CHECK OPEN_BRACKET search_condition_sli_as_string CLOSE_BRACKET { $$=make_sql_string_and_free(strdup("CHECK ("),$3,kw_cb,NULL); add_feature("DDL_CHECK"); } ; referential_constraint_definition: FOREIGN_KEY OPEN_BRACKET references_columns CLOSE_BRACKET references_specification {SPRINTF5($$," %s %s %s %s %s",$1,$2,$3,$4,$5); add_feature("DDL_FOREIGN_KEY"); } ; references_specification: REFERENCES referenced_table_and_columns {SPRINTF2($$," %s %s",$1,$2); add_feature("DDL_REFERENCES"); } ; references_columns: references_column_list ; referenced_table_and_columns: table_name_not_for_column_prefix | table_name_not_for_column_prefix OPEN_BRACKET references_column_list CLOSE_BRACKET {SPRINTF4($$," %s %s %s %s",$1,$2,$3,$4);} ; references_column_list: column_name | references_column_list KW_COMMA column_name {SPRINTF3($$," %s %s %s",$1,$2,$3);} ; unique_constraint_definition: UNIQUE OPEN_BRACKET unique_column_list CLOSE_BRACKET { SPRINTF3($$," UNIQUE %s %s %s",$2,$3,$4); add_feature("DDL_UNIQUE"); } | DISTINCT OPEN_BRACKET unique_column_list CLOSE_BRACKET { ansi_violation("Use UNIQUE not DISTINCT",0); SPRINTF3($$," UNIQUE %s %s %s",$2,$3,$4); add_feature("DDL_DISTINCT"); } | PRIMARY_KEY OPEN_BRACKET unique_column_list CLOSE_BRACKET {SPRINTF4($$," %s %s %s %s",$1,$2,$3,$4); add_feature("DDL_PRIMARY_KEY"); } ; unique_column_list: column_name | unique_column_list KW_COMMA column_name {SPRINTF3($$," %s %s %s",$1,$2,$3);} ; table_constraint_definition_ss: unique_constraint_definition { $$=acl_strdup($1); } | referential_constraint_definition { $$=acl_strdup($1); } | check_constraint_definition_ss { $$=$1; } ; default_clause: KW_DEFAULT literal {SPRINTF2($$," %s %s",$1,$2); add_feature("DDL_DEFAULT_VALUE"); } | DEFAULT_USER {SPRINTF1($$," DEFAULT %s", A4GLSQLCV_get_sqlconst("USER")); add_feature("DDL_DEFAULT_VALUE"); } | DEFAULT_TODAY {SPRINTF1($$," DEFAULT %s", A4GLSQLCV_get_sqlconst("TODAY")); add_feature("DDL_DEFAULT_VALUE"); } | DEFAULT_NULL { SPRINTF1($$," %s",$1); add_feature("DDL_DEFAULT_VALUE"); } ; ct_column_definiton_ss: identifier data_type op_default_clause op_column_constraint_list_ss { #ifdef DEBUG A4GL_debug("Str1:%s",$1); A4GL_debug("Str2:%s",$2); A4GL_debug("Str3:%s",$3); A4GL_debug("Str4:%s",$4); #endif $$=make_sql_string_and_free(acl_strdup($1),kw_space,acl_strdup($2),NULL); if (strlen($3)) { $$=make_sql_string_and_free($$, kw_space,acl_strdup($3),NULL); } if (strlen($4)) { $$=make_sql_string_and_free($$, kw_space,acl_strdup($4),NULL); } else { free($4); } } ; op_default_clause: {strcpy($$,"");} |default_clause ; op_column_constraint_list_ss: { $$=acl_strdup(""); } | column_constraint_list_ss { $$=$1; } ; column_constraint_list_ss : column_constraint_ss { $$=$1; } | column_constraint_list_ss column_constraint_ss { $$=make_sql_string_and_free($1,kw_space,$2,NULL); } ; column_constraint_ss : column_constraint_ss_1 opt_constraint_name { $$=make_sql_string_and_free($1,acl_strdup($2),NULL); } ; column_constraint_ss_1: NOT_NULL { SPRINTF1($$," %s ",$1); $$=acl_strdup($$); add_feature("DDL_NOT_NULL"); } | NOT_NULL_UNIQUE { SPRINTF0($$," NOT NULL UNIQUE "); $$=acl_strdup($$); add_feature("DDL_NOT_NULL"); add_feature("DDL_UNIQUE"); } | UNIQUE { SPRINTF0($$," UNIQUE "); $$=acl_strdup($$); add_feature("DDL_UNIQUE"); } | DISTINCT { ansi_violation("Use UNIQUE not DISTINCT",0); SPRINTF0($$," UNIQUE "); $$=acl_strdup($$); add_feature("DDL_DISTINCT"); } | references_specification { $$=acl_strdup($1); } | CHECK OPEN_BRACKET search_condition_sli_as_string CLOSE_BRACKET { $$=make_sql_string_and_free(acl_strdup("CHECK ("),$3,kw_cb,NULL); add_feature("DDL_CHECK"); } | PRIMARY_KEY { $$=make_sql_string_and_free(acl_strdup(" PRIMARY KEY "),NULL); add_feature("DDL_PRIMARY_KEY"); } ; schema_ss: CREATE_SCHEMA schema_authorization_clause schema_element_list_ss { add_feature("CREATE_SCHEMA"); $$=make_sql_string_and_free(acl_strdup($1),kw_space,acl_strdup($2),kw_space,acl_strdup($3),NULL); } ; schema_authorization_clause: schema_authorization_identifier {SPRINTF1($$," %s",$1);} ; schema_authorization_identifier: authorization_identifier ; schema_element_list_ss: schema_element_ss | schema_element_list_ss schema_element_ss { $$=make_sql_string_and_free($1,kw_space,$2,NULL); } ; schema_element_ss: view_definition_ss { $$=$1; } | privilege_definition { $$=acl_strdup($1); } ; having_clause_sli: HAVING search_condition_sli { add_feature("HAVING"); $$=$2; } ; where_clause_sli: WHERE search_condition_sli { $$=$2; } ; from_clause_ts: FROM table_reference_list { $$=$2; } ; table_reference_list: tname {$$=$1;} | table_reference_list KW_COMMA tname { $$=A4GLSQLPARSE_append_tablename($1,$3,E_OUTER_NONE,NULL); } | table_reference_list KW_COMMA OUTER tname { $$=A4GLSQLPARSE_append_tablename($1,$4,E_OUTER_NORMAL,NULL); A4GL_warn("OUTER join *may* not be portable to non-informix database"); add_feature("SELECT_OUTER"); } | table_reference_list KW_COMMA OUTER OPEN_BRACKET table_reference_list CLOSE_BRACKET { $$=A4GLSQLPARSE_append_tablename($1,$5,E_OUTER_NORMAL,NULL); A4GL_warn("OUTER join *may* not be portable to non-informix database"); add_feature("SELECT_OUTER"); } /* | table_reference_list LEFT_JOIN tname KW_ON OPEN_BRACKET search_condition_sli CLOSE_BRACKET { $$=A4GLSQLPARSE_append_tablename($1,$3,E_OUTER_LEFT_OUTER, $6); add_feature("SELECT_OUTER"); } */ | table_reference_list LEFT_JOIN op_bracket_table_reference_list KW_ON search_condition_sli { $$=A4GLSQLPARSE_append_tablename($1,$3,E_OUTER_LEFT_OUTER, $5); add_feature("SELECT_OUTER"); } | table_reference_list INNER_JOIN op_bracket_table_reference_list KW_ON search_condition_sli { $$=A4GLSQLPARSE_append_tablename($1,$3,E_INNER, $5); add_feature("SELECT_INNER"); } ; op_bracket_table_reference_list: table_reference_list | OPEN_BRACKET table_reference_list CLOSE_BRACKET {$$=$2;} ; tname: table_name_not_for_column_prefix { //A4GL_add_crud("SELECT",$1); $$=A4GLSQLPARSE_new_tablename($1,NULL); } | table_name_not_for_column_prefix correlation_name { //A4GL_add_crud("SELECT",$1); $$=A4GLSQLPARSE_new_tablename($1,$2); } | table_name_not_for_column_prefix KW_AS correlation_name { //A4GL_add_crud("SELECT",$1); $$=A4GLSQLPARSE_new_tablename($1,$3); } ; table_expression_2_select: { /* No from or where etc.. */ /* eg.. select user ; */ $$=new_empty_select(); } | from_clause_ts op_where_clause_2_select { $$=$2; $$->first=$1; A4GL_set_associated_mem( $$, $$->first); } ; op_where_clause_2_select: op_group_by_clause_2_select { $$=$1; } | where_clause_sli op_group_by_clause_2_select { $$=$2; $$->where_clause=$1; } ; op_group_by_clause_2_select: { $$=new_empty_select(); } | group_by_clause_slil { $$=new_empty_select(); $$->group_by=$1; $$->having=0; } | group_by_clause_slil having_clause_sli { $$=new_empty_select(); $$->group_by=$1; $$->having=$2; } | having_clause_sli { $$=new_empty_select(); $$->group_by=0; $$->having=$1; } ; search_condition_sli: boolean_term_sli { $$=$1; } | search_condition_sli KW_OR boolean_term_sli { $$=new_select_list_item_op_expr($1,$3," OR "); } ; boolean_term_sli: boolean_factor_sli { $$=$1; } | boolean_term_sli KW_AND boolean_factor_sli { $$=new_select_list_item_op_expr($1,$3," AND "); } ; boolean_factor_sli: boolean_primary_sli { $$=$1; } | KW_NOT boolean_primary_sli { $$=new_select_list_item_simple_expr(E_SLI_NOT,$2); } ; boolean_primary_sli: predicate_sli { $$=$1; } | OPEN_BRACKET search_condition_sli CLOSE_BRACKET { $$=new_select_list_item_simple_expr(E_SLI_BRACKET_EXPR,$2); } ; exists_predicate_sli: EXISTS subquery_sli { $$=new_select_list_item_sq(E_SQE_EXISTS, $2); add_feature("WHERE_EXISTS"); } | NOT_EXISTS subquery_sli { $$=new_select_list_item_sq(E_SQE_NOT_EXISTS, $2); add_feature("WHERE_EXISTS"); } ; op_matches_escape: {strcpy($$,"");} | KW_ESCAPE escape_character {SPRINTF1($$," ESCAPE %s",$2);add_feature("WHERE_MATCHES_ESCAPE");} ; op_ilike_escape: {strcpy($$,"");} | KW_ESCAPE escape_character {SPRINTF1($$," ESCAPE %s",$2);add_feature("WHERE_ILIKE_ESCAPE");} ; op_like_escape: {strcpy($$,"");} | KW_ESCAPE escape_character {SPRINTF1($$," ESCAPE %s",$2);add_feature("WHERE_LIKE_ESCAPE");} ; pattern_sli: value_expression_initial_sli { $$=$1; } ; escape_character: literal ; op_not: {strcpy($$,"");} | KW_NOT {strcpy($$," NOT ");} ; comparison_predicate_sli: value_expression_sli op_not IS_NULL { if (strlen($2)==0) { $$=new_select_list_item_simple_expr(E_SLI_ISNULL,$1); } else { $$=new_select_list_item_simple_expr(E_SLI_ISNOTNULL,$1); } add_feature("WHERE_NULL"); } | value_expression_sli op_not IS_NOT_NULL { if (strlen($2)==0) { $$=new_select_list_item_simple_expr(E_SLI_ISNOTNULL,$1); } else { $$=new_select_list_item_simple_expr(E_SLI_ISNULL,$1); } add_feature("WHERE_NULL"); } | value_expression_sli comp_op value_expression_sli { $$=new_select_list_item_op_expr($1,$3,$2); } | value_expression_sli EQUAL value_expression_sli { $$=new_select_list_item_op_expr($1,$3,"="); } | value_expression_sli EQUAL KW_NULL { FPRINTF(stderr,"Warning: Corrected =NULL to IS NULL line %d\n",yylineno); $$=new_select_list_item_simple_expr(E_SLI_ISNULL,$1); } | value_expression_sli op_not BETWEEN value_expression_sli KW_AND value_expression_sli { if (strlen($2)) { $$=new_select_list_item_op_between($2,$1,$4,$6,1); } else { $$=new_select_list_item_op_between($2,$1,$4,$6,0); } } | value_expression_sli LIKE pattern_sli op_like_escape { $$=new_select_list_item_regex(E_SLI_REGEX_LIKE,$1,$3,$4); } | value_expression_sli NOT_LIKE pattern_sli op_like_escape { $$=new_select_list_item_regex(E_SLI_REGEX_NOT_LIKE,$1,$3,$4); } | value_expression_sli ILIKE pattern_sli op_ilike_escape { $$=new_select_list_item_regex(E_SLI_REGEX_ILIKE,$1,$3,$4); } | value_expression_sli NOT_ILIKE pattern_sli op_ilike_escape { $$=new_select_list_item_regex(E_SLI_REGEX_NOT_ILIKE,$1,$3,$4); } | value_expression_sli MATCHES pattern_sli op_matches_escape { $$=new_select_list_item_regex(E_SLI_REGEX_MATCHES,$1,$3,$4); } | value_expression_sli NOT_MATCHES pattern_sli op_matches_escape { $$=new_select_list_item_regex(E_SLI_REGEX_NOT_MATCHES,$1,$3,$4); } ; comp_op: NOT_EQUAL { if (A4GLSQLCV_check_requirement("NOT_EQUAL_AS_LESS_GREATER_THAN")) { strcpy($$," <> "); } else { strcpy($$," != "); } } | LESS_THAN { strcpy($$," < "); } | GREATER_THAN { strcpy($$," > "); } | TILDE { strcpy($$," ~ "); } | LESS_THAN_EQ {strcpy($$," <= ");} | GREATER_THAN_EQ {strcpy($$," >= ");} ; predicate_sli: comparison_predicate_sli { $$=$1; } | in_predicate_sli { $$=$1; } | exists_predicate_sli { $$=$1; } | value_expression_sli { $$=$1; } ; op_all: {strcpy($$,"");} | ALL {strcpy($$," ALL "); add_feature("AGG_ALL");} | DISTINCT { strcpy($$," DISTINCT "); add_feature("AGG_DISTINCT"); } | UNIQUE { ansi_violation("Use DISTINCT not UNIQUE",0); strcpy($$," DISTINCT "); add_feature("AGG_DISTINCT"); } ; op_u_all: {strcpy($$,"");} | ALL {strcpy($$," ALL "); add_feature("UNION_ALL");} | DISTINCT { strcpy($$," DISTINCT "); add_feature("UNION_DISTINCT"); } | UNIQUE { ansi_violation("Use DISTINCT not UNIQUE",0); add_feature("UNION_DISTINCT"); strcpy($$," DISTINCT "); } ; data_type : data_type_i { strcpy($$,A4GLSQLCV_dtype_alias($1)); } ; data_type_i: char_string_type | exact_numeric_type | approx_numeric_type ; char_string_type: KW_CHAR | KW_CHAR OPEN_BRACKET length CLOSE_BRACKET {SPRINTF4($$," %s %s%s%s",$1,$2,$3,$4);} ; exact_numeric_type: SERIAL {strcpy($$,"SERIAL"); add_feature("DDL_SERIAL"); } | SERIAL OPEN_BRACKET INT_VALUE CLOSE_BRACKET { add_feature("DDL_SERIAL"); if (A4GLSQLCV_check_requirement("NO_SERIAL_START_VALUE")) { SPRINTF0($$,"SERIAL"); } else { SPRINTF1($$,"SERIAL(%s)",$3); } } | SERIAL8 {strcpy($$,"SERIAL8"); add_feature("DDL_SERIAL8"); } | SERIAL8 OPEN_BRACKET INT_VALUE CLOSE_BRACKET { add_feature("DDL_SERIAL8"); if (A4GLSQLCV_check_requirement("NO_SERIAL_START_VALUE")) { SPRINTF0($$,"SERIAL8"); } else { SPRINTF1($$,"SERIAL8(%s)",$3); } } | KW_DECIMAL { add_feature("DDL_DECIMAL"); } | KW_DECIMAL OPEN_BRACKET precision op_scale CLOSE_BRACKET { add_feature("DDL_DECIMAL"); if (strlen($4)) { SPRINTF2($$,"DECIMAL(%s%s)",$3,$4); } else { SPRINTF1($$,"DECIMAL(%s)",$3); } } | MONEY OPEN_BRACKET precision op_scale CLOSE_BRACKET { add_feature("DDL_MONEY"); if (A4GLSQLCV_check_requirement("MONEY_AS_DECIMAL")) { SPRINTF2($$," DECIMAL(%s%s)",$3,$4); } else { SPRINTF2($$," MONEY(%s%s)",$3,$4); } } | MONEY { add_feature("DDL_MONEY"); if (A4GLSQLCV_check_requirement ("MONEY_AS_DECIMAL")) { strcpy($$,"DECIMAL"); } else { strcpy($$,"MONEY"); } } | KW_DATE {strcpy($$,"DATE"); add_feature("DDL_DATE"); } | INTEGER {strcpy($$,"INTEGER");} | SMALLINT {strcpy($$,"SMALLINT");} | NCHAR {strcpy($$,"NCHAR"); add_feature("DDL_NCHAR");} | NCHAR OPEN_BRACKET length CLOSE_BRACKET {SPRINTF1($$,"NCHAR(%s)",$3); add_feature("DDL_NCHAR");} | NVARCHAR {add_feature("DDL_NVARCHAR");} | NVARCHAR OPEN_BRACKET INT_VALUE CLOSE_BRACKET {SPRINTF1($$,"NVARCHAR(%s)",$3); add_feature("DDL_NVARCHAR");} | NVARCHAR OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { add_feature("DDL_NVARCHAR"); if (A4GLSQLCV_check_requirement("IGNORE_DTYPE_VARCHAR_MIN")) { SPRINTF1($$,"NVARCHAR(%s)",$3); } else { SPRINTF2($$,"NVARCHAR(%s,%s)",$3,$5); } } | DATETIME s_curr KW_TO e_curr {SPRINTF2($$,"DATETIME %s TO %s",$2,$4); add_feature("DDL_DATETIME");} | DATETIME {add_feature("DDL_DATETIME");} | INTERVAL s_curr KW_TO e_curr {SPRINTF2($$,"INTERVAL %s TO %s",$2,$4); add_feature("DDL_INTERVAL");} | sql_time_dtypes {strcpy($$,$1);} | INTERVAL {add_feature("DDL_INTERVAL");} | INTERVAL s_curr OPEN_BRACKET INT_VALUE CLOSE_BRACKET KW_TO e_curr {SPRINTF3($$,"INTERVAL %s(%s) TO %s",$2,$4,$7); add_feature("DDL_INTERVAL");} | KW_TEXT {add_feature("DDL_TEXT");} | KW_BYTE {add_feature("DDL_BYTE");} | VARCHAR {add_feature("DDL_VARCHAR");} | VARCHAR OPEN_BRACKET INT_VALUE CLOSE_BRACKET {SPRINTF1($$,"VARCHAR(%s)",$3);add_feature("DDL_VARCHAR");} | VARCHAR OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { add_feature("DDL_VARCHAR"); if (A4GLSQLCV_check_requirement("IGNORE_DTYPE_VARCHAR_MIN")) { SPRINTF1($$,"VARCHAR(%s)",$3); } else { SPRINTF2($$,"VARCHAR(%s,%s)",$3,$5); } } ; op_scale: {strcpy($$,"");} | KW_COMMA scale { SPRINTF1($$,",%s",$2); } ; approx_numeric_type: KW_FLOAT OPEN_BRACKET precision CLOSE_BRACKET {SPRINTF4($$," %s %s %s %s",$1,$2,$3,$4);} | REAL | SMALLFLOAT | KW_FLOAT | DOUBLE_PRECISION {add_feature("DDL_DOUBLE_PRECISION"); SPRINTF1($$," %s",$1);} ; length: INT_VALUE ; precision: INT_VALUE ; scale: INT_VALUE ; authorization_identifier: identifier | CHAR_VALUE ; op_col_arr : {$$=0;} | OPEN_SQUARE INT_VALUE CLOSE_SQUARE { $$=1; $$=atoi($2); } | OPEN_SQUARE INT_VALUE KW_COMMA INT_VALUE CLOSE_SQUARE { $$=2; $$=atoi($2); $$=atoi($4); } ; column_name : column_name_specific { strcpy($$,$1); } | ATSIGN column_name_specific { strcpy($$,$2); } ; column_name_sli : column_name_sli_specific { $$= $1; } | ATSIGN column_name_sli_specific { $$= $2; } ; column_name_sli_specific: identifier op_col_arr { $$=new_select_list_item_col(0,$1,&$2); } | table_name KW_DOT identifier op_col_arr { $$=new_select_list_item_col($1,$3,&$4); } | table_name KW_DOT KW_MULTIPLY { $$=new_select_list_item_col($1,"*",0); } | KW_ROWID { $$=new_select_list_item_col(0,"rowid",0); } ; column_name_specific: identifier op_col_arr { struct ilist *i; i=&$2; if (strcmp($1,"rowid")==0) { strcpy($1, A4GLSQLCV_get_sqlconst ("rowid")); add_feature("ROWID"); } ADDMAP("Use Column",$1); strcpy($$,A4GLSQLCV_make_substr(A4GLSQLCV_check_colname(0,$1), i->i0,i->i1,i->i2)); } | table_name KW_DOT identifier op_col_arr { struct ilist *i; if (strcmp($3,"rowid")==0) { strcpy($3, A4GLSQLCV_get_sqlconst ("rowid")); add_feature("ROWID");} SPRINTF1($$,"%s",A4GLSQLCV_check_colname($1,$3)); ADDMAP("Use Column",$$); i=&$4; strcpy($$,A4GLSQLCV_make_substr($$,i->i0,i->i1,i->i2)); } | identifier KW_DOT identifier KW_DOT identifier op_col_arr { struct ilist *i; if (strcmp($3,"rowid")==0) { strcpy($3, A4GLSQLCV_get_sqlconst ("rowid")); add_feature("ROWID"); } // First identifier is the owner... SPRINTF1($$,"%s",A4GLSQLCV_check_colname(A4GLSQLCV_ownerize_tablename($1,$3),$5)); ADDMAP("Use Column",$$); i=&$4; strcpy($$,A4GLSQLCV_make_substr($$,i->i0,i->i1,i->i2)); } | table_name KW_DOT KW_MULTIPLY { SPRINTF1($$,"%s",A4GLSQLCV_check_colname($1,"*")); ADDMAP("Use Column",$$); } ; correlation_name: identifier ; literal: CHAR_VALUE { strcpy($$,$1); #ifdef DEBUG A4GL_debug("Set $$ to %s\n",$$); #endif } | real_number | INT_VALUE | curr_clause ; cur_part: { strcpy($$,A4GLSQLCV_generate_current(0,0)); } | s_curr KW_TO e_curr { strcpy($$,A4GLSQLCV_generate_current($1,$3)); } ; s_curr: YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | FRACTION; e_curr: YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | FRACTION | FRACTION OPEN_BRACKET INT_VALUE CLOSE_BRACKET {SPRINTF1($$,"FRACTION(%s)",$3);} ; simple_column_name : identifier { strcpy($$,$1); // SPRINTF1($$,"\"%s\"",$1); } ; execute_procedure_cmd : opt_use2_p EXECUTE_PROCEDURE spl_proc_name OPEN_BRACKET CLOSE_BRACKET { insql=0; add_sql_function($3); $$=new_execute_procedure_cmd($1,$3,NULL); /* if (A4GLSQLCV_check_requirement("EXECUTE_PROCEDURE_AS_EXEC")) { SPRINTF1($$,"EXEC %s",$2); } else { SPRINTF1($$,"EXECUTE PROCEDURE %s ()",$2); } */ } | opt_use2_p EXECUTE_PROCEDURE spl_proc_name OPEN_BRACKET value_expr_list_slil CLOSE_BRACKET { insql=0; add_sql_function($4); $$=new_execute_procedure_cmd($1,$3,$5); /* if (A4GLSQLCV_check_requirement("EXECUTE_PROCEDURE_AS_EXEC")) { SPRINTF2($$,"EXEC %s %s",$2, get_select_list_item_list(0, $4)); } else { SPRINTF2($$,"EXECUTE PROCEDURE %s (%s)",$2, get_select_list_item_list(0, $4)); } */ } ; misc_sql : lock_stmt { $$=make_sql_string_and_free(acl_strdup($1), NULL);} | unlock_stmt { $$=make_sql_string_and_free(acl_strdup($1), NULL);} | rename_stmt { $$=make_sql_string_and_free(acl_strdup($1), NULL);} ; rename_stmt : RENTAB rentabname KW_TO rentabname { add_feature("RENAME_TABLE"); strcpy($$,A4GLSQLCV_rentab($2,$4)); } | RENCOL table_name KW_DOT rencolname KW_TO rencolname { add_feature("RENAME_COLUMN"); strcpy($$,A4GLSQLCV_rencol($2,$4,$6) ); } ; rentabname : identifier; rencolname : identifier; unlock_stmt: UNLOCK_TABLE table_name_not_for_column_prefix { add_feature("UNLOCK_TABLE"); SPRINTF2($$,"%s %s",$1,$2); } ; lock_stmt : LOCK_TABLE table_name_not_for_column_prefix share_or_exclusive { add_feature("LOCK_TABLE"); SPRINTF3($$,"%s %s %s", $1, $2, $3 ); } ; share_or_exclusive : INSHARE { add_feature("LOCK_TABLE_SHARED");} | INEXCLUSIVE {add_feature("LOCK_TABLE_EXCLUSIVE");} ; datetime_value_qualified : datetime_value {strcpy($$,A4GLSQLCV_datetime_value($1));} | datetime_value s_curr KW_TO e_curr {strcpy($$,A4GLSQLCV_make_dtime_extend($1,$2,$4,0));} ; datetime_value: DATETIME_VALUE {strcpy($$,$1);} ; interval_value_qualified : interval_value {strcpy($$,A4GLSQLCV_interval_value($1));} | interval_value s_curr OPEN_BRACKET INT_VALUE CLOSE_BRACKET KW_TO e_curr { strcpy($$,A4GLSQLCV_make_ival_extend($1,$2,$4,$7,0)); } | interval_value s_curr KW_TO e_curr { strcpy($$,A4GLSQLCV_make_ival_extend($1,$2,(char *)0, $4,0)); } ; interval_value: INTERVAL_VALUE {SPRINTF1($$,"%s",$1);} ; curr_clause : KW_CURRENT cur_part { strcpy($$,$2); } ; order_by_clause_slil: ORDER KW_BY sort_specification_list_slil { $$=$3; add_feature("ORDER_BY"); } ; sort_specification_list_slil: sort_specification_sli { $$=local_new_select_list_item_list($1); } | sort_specification_list_slil KW_COMMA sort_specification_sli { $$=local_add_select_list_item_list($1,$3); } ; sort_specification_sli : sort_spec_sli op_asc_desc { if (strcmp($2,"DESC")!=0) { $$=new_select_list_item_simple_expr(E_SLI_ASC,$1); } else { $$=new_select_list_item_simple_expr(E_SLI_DESC,$1); } } ; sort_spec_sli: INT_VALUE { add_feature("ORDER_BY_NUMBER"); $$=new_select_list_item_literal($1); } | column_name_sli { $$=$1; $$->data.type=E_SLI_COLUMN_ORDERBY; } ; op_asc_desc: {strcpy($$,"");} | ASC {add_feature("ORDER_BY_ASC"); strcpy($$,"ASC");} | DESC {add_feature("ORDER_BY_DESC"); strcpy($$,"DESC");} ; group_by_clause_slil: GROUP_BY gr_column_specification_list_slil { $$=$2; } ; gr_column_specification_list_slil: gr_column_specification_sli { $$=local_new_select_list_item_list($1); } | gr_column_specification_list_slil KW_COMMA gr_column_specification_sli { $$=local_add_select_list_item_list($1,$3); } ; gr_column_specification_sli: column_name_sli { $$=$1; } | INT_VALUE { $$=new_select_list_item_literal($1); } ; search_condition_sli_as_string: search_condition_sli { $$=get_select_list_item(0,$1); } ; query_specification_ss_converted: query_specification_select { A4GL_set_sql_lineno(yylineno); $$=make_select_stmt_v2(current_upd_table, $1,""); map_select_stmt("SELECT",$1); A4GL_free_select_stmt($1); } ; sql_time_dtypes: TIME { if (A4GLSQLCV_check_requirement("ALLOW_TIME_DATATYPE")) { strcpy($$,"TIME"); break; } else { strcpy($$,"DATETIME HOUR TO FRACTION(2)"); break; } } | TIME OPEN_BRACKET INT_VALUE CLOSE_BRACKET { int n; n=atoi($3); if (A4GLSQLCV_check_requirement("ALLOW_TIME_DATATYPE")){ sprintf($$,"TIME(%d)",n); } else { switch (n) { case 0: strcpy($$,"DATETIME HOUR TO SECOND"); break; case 1: strcpy($$,"DATETIME HOUR TO FRACTION(1)"); break; case 2: strcpy($$,"DATETIME HOUR TO FRACTION(2)"); break; case 3: strcpy($$,"DATETIME HOUR TO FRACTION(3)"); break; case 4: strcpy($$,"DATETIME HOUR TO FRACTION(4)"); break; case 5: strcpy($$,"DATETIME HOUR TO FRACTION(5)"); break; default: a4gl_yyerror("Invalid time"); YYERROR; } } } | TIMESTAMP { if (A4GLSQLCV_check_requirement("ALLOW_TIMESTAMP_DATATYPE")) { strcpy($$,"TIMESTAMP"); } else { strcpy($$,"DATETIME YEAR TO FRACTION(2)"); } } | TIMESTAMP OPEN_BRACKET INT_VALUE CLOSE_BRACKET { int n; n=atoi($3); if (A4GLSQLCV_check_requirement("ALLOW_TIMESTAMP_DATATYPE")) { sprintf($$,"TIMESTAMP(%d)",n); } else { switch (n) { case 0: strcpy($$,"DATETIME YEAR TO SECOND"); break; case 1: strcpy($$,"DATETIME YEAR TO FRACTION(1)"); break; case 2: strcpy($$,"DATETIME YEAR TO FRACTION(2)"); break; case 3: strcpy($$,"DATETIME YEAR TO FRACTION(3)"); break; case 4: strcpy($$,"DATETIME YEAR TO FRACTION(4)"); break; case 5: strcpy($$,"DATETIME YEAR TO FRACTION(5)"); break; default: a4gl_yyerror("Invalid time"); YYERROR; } } } ; /* ========================= sql1.rule ================================ */