select_statement_ss_select : KW_SELECT op_first op_ad { //start_bind('i',0); set_ignore_indicators();} select_list_slil { clr_ignore_indicators();} opt_into_sel table_expression_2_select sel_p2_select sel_finish_sf { $$=$8; if ($2!=-1) { $$->limit.start=1; $$->limit.end=$2; } $$->modifier=acl_strdup($3); A4GL_set_associated_mem($$, $$->modifier); $$->into=$7; $$->select_list=$5; $$->next=$9; $$->sf=$10; A4GL_set_associated_mem($$, $$->sf); } ; union_select_statement2_ss: KW_SELECT op_first op_ad select_list_slil table_expression_2_select sel_p2_select { $$=$5; $$->modifier=acl_strdup($3); A4GL_set_associated_mem($$, $$->modifier); if ($2!=-1) { $$->limit.start=1; $$->limit.end=$2; } $$->into=0; $$->select_list=$4; $$->next=$6; } ; uu_select_statement21_select: KW_SELECT op_first op_ad select_list_slil table_expression_2_select sel_p2_select sel_ordby_unload_slil { struct s_select_finish *sf; struct s_select *s1; s1=$5; s1->modifier=acl_strdup($3); A4GL_set_associated_mem(s1, s1->modifier); s1->into=0; s1->select_list=$4; s1->next=$6; if ($2!=-1) { s1->limit.start=1; s1->limit.end=$2; } sf=acl_malloc2(sizeof(struct s_select_finish)); sf->into_temp=0; sf->nolog=0; sf->insert_into=0; sf->order_by=$7; s1->sf=sf; A4GL_set_associated_mem(s1,s1->sf); A4GL_set_sql_lineno(yylineno); $$=A4GL_new_select_list_item_expr(new_select_list_query(s1)); map_select_stmt("SELECT",$$); } ; sel_p2_select : { $$=0;} | UNION op_u_all union_select_statement2_ss { $$=$3; $$->union_op=acl_strdup($2); A4GL_set_associated_mem($$, $$->union_op); add_feature("SELECT_UNION"); } ; sel_ordby_unload_slil: {$$=0;} | order_by_clause_slil { $$=$1;} ; sel_finish_sf: { $$=0; } | order_by_clause_slil { $$=acl_malloc2(sizeof(struct s_select_finish)); $$->order_by=$1; $$->insert_into=0; $$->into_temp=0; $$->nolog=0; } | order_by_clause_slil INTO_TEMP tmp_tabname op_no_log_i { $$=acl_malloc2(sizeof(struct s_select_finish)); add_feature("SELECT_INTO_TEMP_ORDER_BY"); $$->order_by=$1; $$->insert_into=0; $$->into_temp=strdup($3); A4GL_set_associated_mem($$, $$->into_temp); $$->nolog=$4; } | INTO_TEMP tmp_tabname op_no_log_i { $$=acl_malloc2(sizeof(struct s_select_finish)); add_feature("SELECT_INTO_TEMP"); $$->order_by=0; $$->into_temp=strdup($2); A4GL_set_associated_mem($$, $$->into_temp); $$->insert_into=0; $$->nolog=$3; } ; tmp_tabname: identifier; query_specification_select: KW_SELECT op_first op_ad select_list_slil table_expression_2_select { $$=$5; if ($2!=-1) { $$->limit.start=1; $$->limit.end=$2; } $$->modifier=acl_strdup($3); A4GL_set_associated_mem($$, $$->modifier); $$->select_list=$4; } ; subquery_sli: OPEN_BRACKET_SELECT op_first op_ad select_list_slil table_expression_2_select CLOSE_BRACKET { $$=$5; if ($2!=-1) { $$->limit.start=1; $$->limit.end=$2; } $$->modifier=acl_strdup($3); A4GL_set_associated_mem($$, $$->modifier); $$->select_list=$4; $$=new_select_list_subquery($$); } ; op_first : {$$=-1;} | KW_FIRST INT_VALUE { $$=atol($2); } ; op_ad: {strcpy($$,"");} | ALL {strcpy($$,"ALL"); add_feature("SELECT_ALL");} | DISTINCT {strcpy($$,"DISTINCT"); add_feature("SELECT_DISTINCT");} | UNIQUE {strcpy($$,"DISTINCT"); add_feature("SELECT_UNIQUE"); ansi_violation("Use DISTINCT not UNIQUE",0); strcpy($$,"DISTINCT"); } ; select_list_slil: unexpanded_select_list_slil { $$=rationalize_select_list_item_list($1); } ; unexpanded_select_list_slil: value_expression_pls_sli { $$=local_new_select_list_item_list($1); } | select_list_slil KW_COMMA value_expression_pls_sli { $$=local_add_select_list_item_list($1,$3); } ; value_expression_pls_sli : value_expression_sli { $$=$1; } | value_expression_sli identifier { $$=$1; $$->alias=acl_strdup($2); A4GL_set_associated_mem($$, $$->alias); } | value_expression_sli KW_AS identifier { $$=$1; $$->alias=acl_strdup($3); A4GL_set_associated_mem($$, $$->alias); } ; value_expression_sli: value_expression_initial_sli { $$=$1; /* A4GLSQLCV_check_expr($1) */ } | KW_MINUS value_expression_initial_sli { $$=$2; $$->sign='-'; } | KW_PLUS value_expression_initial_sli { $$=$2; } ; value_expression_complex_sli : value_expression_initial_sli KW_DIVIDE value_expression_sli { $$=new_select_list_item_op_expr ($1, $3, "/"); } | value_expression_initial_sli units_qual_i { $$=new_select_list_item_simple_expr((enum e_sli)$2, $1); } | value_expression_initial_sli KW_MULTIPLY value_expression_sli { $$=new_select_list_item_op_expr ($1, $3, "*"); } | value_expression_initial_sli KW_PLUS value_expression_sli { $$=new_select_list_item_op_expr ($1, $3, "+"); } | value_expression_initial_sli KW_MINUS value_expression_sli { $$=new_select_list_item_op_expr ($1, $3, "-"); } | value_expression_initial_sli CONCAT_PIPES value_expression_sli { $$=new_select_list_item_op_expr ($1, $3, "||"); } | literal { $$=new_select_list_item_literal($1); } | KW_TRUE { $$=new_select_list_item_builtin_const(E_SLI_BUILTIN_CONST_TRUE); } | KW_FALSE { $$=new_select_list_item_builtin_const(E_SLI_BUILTIN_CONST_FALSE); } | USER { $$=new_select_list_item_builtin_const(E_SLI_BUILTIN_CONST_USER); } | KW_TODAY { $$=new_select_list_item_builtin_const(E_SLI_BUILTIN_CONST_TODAY); } | KW_ROWID { $$=new_select_list_item_builtin_const(E_SLI_BUILTIN_CONST_ROWID); } | TIME { $$=new_select_list_item_builtin_const(E_SLI_BUILTIN_CONST_TIME); } | KW_MULTIPLY { $$=new_select_list_item_builtin_const(E_SLI_BUILTIN_CONST_STAR); } | COUNT_MULTIPLY { $$=new_select_list_item_builtin_const(E_SLI_BUILTIN_CONST_COUNT_STAR); } | AVG OPEN_BRACKET op_all value_expression_sli CLOSE_BRACKET { $$=new_select_list_item_agg1(E_SLI_BUILTIN_AGG_AVG,$3,$4); add_feature("SELECT_AVG"); } | XMAX OPEN_BRACKET op_all value_expression_sli CLOSE_BRACKET { $$=new_select_list_item_agg1(E_SLI_BUILTIN_AGG_MAX,$3,$4); add_feature("SELECT_MAX"); } | XMIN OPEN_BRACKET op_all value_expression_sli CLOSE_BRACKET { $$=new_select_list_item_agg1(E_SLI_BUILTIN_AGG_MIN,$3,$4); add_feature("SELECT_MIN"); } | KW_SUM OPEN_BRACKET op_all value_expression_sli CLOSE_BRACKET { $$=new_select_list_item_agg1(E_SLI_BUILTIN_AGG_SUM,$3,$4); add_feature("SELECT_SUM"); } | COUNT OPEN_BRACKET op_all value_expression_sli CLOSE_BRACKET { $$=new_select_list_item_agg1(E_SLI_BUILTIN_AGG_COUNT,$3,$4); add_feature("SELECT_COUNT"); } | NAMED OPEN_BRACKET CLOSE_BRACKET { add_sql_function($1); $$=new_select_list_item_fcall($1,0); } | NAMED OPEN_BRACKET value_expr_list_slil CLOSE_BRACKET { add_sql_function($1); $$=new_select_list_item_fcall($1,$3); } | YEAR OPEN_BRACKET value_expr_list_slil CLOSE_BRACKET { $$=new_select_list_item_builtin_fcall(E_SLI_BUILTIN_FUNC_YEAR,$3); } | MONTH OPEN_BRACKET value_expr_list_slil CLOSE_BRACKET { $$=new_select_list_item_builtin_fcall(E_SLI_BUILTIN_FUNC_MONTH,$3); } | DAY OPEN_BRACKET value_expr_list_slil CLOSE_BRACKET { $$=new_select_list_item_builtin_fcall(E_SLI_BUILTIN_FUNC_DAY,$3); } | MDY OPEN_BRACKET value_expr_list_slil CLOSE_BRACKET { $$=new_select_list_item_builtin_fcall(E_SLI_BUILTIN_FUNC_MDY,$3); } | WEEKDAY OPEN_BRACKET value_expr_list_slil CLOSE_BRACKET { $$=new_select_list_item_builtin_fcall(E_SLI_BUILTIN_FUNC_WEEKDAY,$3); } | KW_DOW OPEN_BRACKET value_expr_list_slil CLOSE_BRACKET { $$=new_select_list_item_builtin_fcall(E_SLI_BUILTIN_FUNC_DOW,$3); } | KW_DATE OPEN_BRACKET value_expr_list_slil CLOSE_BRACKET { $$=new_select_list_item_builtin_fcall(E_SLI_BUILTIN_FUNC_DATE,$3); } | OPEN_BRACKET value_expression_sli CLOSE_BRACKET { $$=new_select_list_item_simple_expr(E_SLI_BRACKET_EXPR,$2); } | EXTEND OPEN_BRACKET extend_qual_sli CLOSE_BRACKET { add_feature("EXTEND"); $$=$3; } | datetime_value_qualified { $$=new_select_list_item_datetime($1); add_feature("FUNC_DATETIME"); } | interval_value_qualified { $$=new_select_list_item_interval($1); add_feature("FUNC_INTERVAL"); } | CASE sql_case_stmt END { $$=$2; } | CASE search_condition_sli sql_case_stmt END { $3->data.s_select_list_item_data_u.sqlcase.master_condition=$2; $$=$3; } ; sql_case_stmt : sql_case_stmt_element { $$=new_select_list_item_case($1); } | sql_case_stmt sql_case_stmt_element { $$=append_select_list_item_case( $1, $2); } ; sql_case_stmt_element: WHEN search_condition_sli KW_THEN value_expression_sli { $$=new_select_list_item_case_element( $2, $4); } | ELSE value_expression_sli { $$=new_select_list_item_case_element( 0, $2); } ; value_expr_list_slil : value_expression_sli { $$=local_new_select_list_item_list($1); } | value_expr_list_slil KW_COMMA value_expression_sli { $$=local_add_select_list_item_list($1,$3); } ; op_extend_from_to: {$$=NULL;} | KW_COMMA s_curr KW_TO e_curr { $$=new_str_list($2); add_str_list($$,$4);} | s_curr KW_TO e_curr { $$=new_str_list($1); add_str_list($$,$3);} ; extend_qual_sli: | var_ident_ibind_sli op_extend_from_to { $$=new_select_list_item_extend($1,$2); } | value_expression_sli op_extend_from_to { $$=new_select_list_item_extend($1,$2); } ; units_qual_i : UNITS_YEAR {$$=E_SLI_UNITS_YEAR;} | UNITS_MONTH {$$=E_SLI_UNITS_MONTH;} | UNITS_DAY {$$=E_SLI_UNITS_DAY;} | UNITS_HOUR {$$=E_SLI_UNITS_HOUR;} | UNITS_MINUTE {$$=E_SLI_UNITS_MINUTE;} | UNITS_SECOND {$$=E_SLI_UNITS_SECOND;} ; in_predicate_sli: value_expression_sli KW_IN OPEN_BRACKET in_value_list_slil CLOSE_BRACKET { $$=new_select_list_item_op_slil($1,$4,E_SLI_IN_VALUES); add_feature("WHERE_IN"); } | value_expression_sli KW_IN subquery_sli { $$=new_select_list_item_op_sli($1,$3,E_SLI_IN_SELECT); add_feature("WHERE_IN_SELECT"); } | value_expression_sli NOT_IN OPEN_BRACKET in_value_list_slil CLOSE_BRACKET { $$=new_select_list_item_op_slil($1,$4,E_SLI_NOT_IN_VALUES); add_feature("WHERE_IN"); } | value_expression_sli NOT_IN subquery_sli { $$=new_select_list_item_op_sli($1,$3,E_SLI_NOT_IN_SELECT); add_feature("WHERE_IN_SELECT"); } ; in_value_list_slil: in_value_specification_sli { $$=local_new_select_list_item_list($1); } | in_value_list_slil KW_COMMA in_value_specification_sli { $$=local_add_select_list_item_list($1,$3); } ; in_value_specification_sli : var_ident_ibind_sli { $$=$1;} | literal { $$=new_select_list_item_literal($1); } | KW_MINUS INT_VALUE { char buff[256]; SPRINTF1(buff," -%s",$2); $$=new_select_list_item_literal(buff); } | KW_MINUS real_number { char buff[256]; SPRINTF1(buff," -%s",$2); $$=new_select_list_item_literal(buff); } ; /* ========================= select.rule ================================ */