static sql_exp * rel_psm_if_then_else( mvc *sql, sql_subtype *res, list *restypelist, dnode *elseif, int is_func) { if (!elseif) return NULL; if (elseif->next && elseif->type == type_symbol) { /* if or elseif */ sql_exp *cond; list *ifstmts, *elsestmts; dnode *n = elseif; sql_rel *rel = NULL; cond = rel_logical_value_exp(sql, &rel, n->data.sym, sql_sel); n = n->next; ifstmts = sequential_block(sql, res, restypelist, n->data.lval, NULL, is_func); n = n->next; elsestmts = psm_if_then_else( sql, res, restypelist, n, is_func); if (sql->session->status || !cond || !ifstmts) return NULL; if (rel) { sql_exp *er = exp_rel(sql, rel); list *b = sa_list(sql->sa); append(b, er); append(b, exp_if(sql->sa, cond, ifstmts, elsestmts)); return exp_rel(sql, rel_psm_block(sql->sa, b)); } return exp_if( sql->sa, cond, ifstmts, elsestmts); } return NULL; }
static sql_exp * rel_psm_if_then_else( mvc *sql, sql_subtype *res, dnode *elseif, int is_func) { if (!elseif) return NULL; if (elseif->next && elseif->type == type_symbol) { /* if or elseif */ sql_exp *cond; list *ifstmts, *elsestmts; dnode *n = elseif; sql_rel *rel = NULL; cond = rel_logical_value_exp(sql, &rel, n->data.sym, sql_sel); n = n->next; ifstmts = sequential_block(sql, res, NULL, n->data.lval, NULL, is_func); n = n->next; elsestmts = psm_if_then_else( sql, res, n, is_func); if (sql->session->status || !cond || !ifstmts || rel) { if (rel) return sql_error(sql, 02, "IF THEN ELSE: No SELECT statements allowed within the IF condition"); return NULL; } return exp_if( sql->sa, cond, ifstmts, elsestmts); } return NULL; }
/* if (cond) then statement_list [ elseif (cond) then statement_list ]* [ else statement_list ] end if */ static list * psm_if_then_else( mvc *sql, sql_subtype *res, list *restypelist, dnode *elseif, int is_func) { if (!elseif) return NULL; assert(elseif->type == type_symbol); if (elseif->data.sym && elseif->data.sym->token == SQL_IF) { sql_exp *cond; list *ifstmts, *elsestmts; dnode *n = elseif->data.sym->data.lval->h; sql_rel *rel = NULL; cond = rel_logical_value_exp(sql, &rel, n->data.sym, sql_sel); n = n->next; ifstmts = sequential_block(sql, res, restypelist, n->data.lval, NULL, is_func); n = n->next; elsestmts = psm_if_then_else( sql, res, restypelist, n, is_func); if (sql->session->status || !cond || !ifstmts) return NULL; if (rel) { sql_exp *er = exp_rel(sql, rel); list *b = sa_list(sql->sa); append(b, er); append(b, exp_if(sql->sa, cond, ifstmts, elsestmts)); return b; } return append(sa_list(sql->sa), exp_if( sql->sa, cond, ifstmts, elsestmts)); } else { /* else */ symbol *e = elseif->data.sym; if (e==NULL || (e->token != SQL_ELSE)) return NULL; return sequential_block( sql, res, restypelist, e->data.lval, NULL, is_func); } }