sql_rel * rel_psm(mvc *sql, symbol *s) { sql_rel *ret = NULL; switch (s->token) { case SQL_CREATE_FUNC: { dlist *l = s->data.lval; int type = l->h->next->next->next->next->next->data.i_val; int lang = l->h->next->next->next->next->next->next->data.i_val; ret = rel_create_func(sql, l->h->data.lval, l->h->next->data.lval, l->h->next->next->data.sym, l->h->next->next->next->data.lval, l->h->next->next->next->next->data.lval, type, lang); sql->type = Q_SCHEMA; } break; case SQL_DROP_FUNC: { dlist *l = s->data.lval; int type = l->h->next->next->next->next->data.i_val; if (STORE_READONLY) return sql_error(sql, 06, "schema statements cannot be executed on a readonly database."); assert(l->h->next->type == type_int); assert(l->h->next->next->next->type == type_int); if (l->h->next->data.i_val) /*?l_val?*/ ret = rel_drop_all_func(sql, l->h->data.lval, l->h->next->next->next->data.i_val, type); else ret = rel_drop_func(sql, l->h->data.lval, l->h->next->next->data.lval, l->h->next->next->next->data.i_val, type); sql->type = Q_SCHEMA; } break; case SQL_SET: ret = rel_psm_stmt(sql->sa, psm_set_exp(sql, s->data.lval->h)); sql->type = Q_SCHEMA; break; case SQL_DECLARE: ret = rel_psm_block(sql->sa, rel_psm_declare(sql, s->data.lval->h)); sql->type = Q_SCHEMA; break; case SQL_CALL: ret = rel_psm_stmt(sql->sa, rel_psm_call(sql, s->data.sym)); sql->type = Q_UPDATE; break; case SQL_CREATE_TRIGGER: { dlist *l = s->data.lval; assert(l->h->next->type == type_int); ret = create_trigger(sql, l->h->data.lval, l->h->next->data.i_val, l->h->next->next->data.sym, l->h->next->next->next->data.sval, l->h->next->next->next->next->data.lval, l->h->next->next->next->next->next->data.lval); sql->type = Q_SCHEMA; } break; case SQL_DROP_TRIGGER: { dlist *l = s->data.lval; ret = drop_trigger(sql, l); sql->type = Q_SCHEMA; } break; case SQL_ANALYZE: { dlist *l = s->data.lval; ret = psm_analyze(sql, l->h->data.lval /* qualified table name */, l->h->next->data.lval /* opt list of column */, l->h->next->next->data.sym /* opt_sample_size */); sql->type = Q_UPDATE; } break; default: return sql_error(sql, 01, "schema statement unknown symbol(" PTRFMT ")->token = %s", PTRFMTCAST s, token2string(s->token)); } return ret; }
static list * sequential_block (mvc *sql, sql_subtype *restype, list *restypelist, dlist *blk, char *opt_label, int is_func) { list *l=0; dnode *n; assert(!restype || !restypelist); if (THRhighwater()) return sql_error(sql, 10, "SELECT: too many nested operators"); if (blk->h) l = sa_list(sql->sa); stack_push_frame(sql, opt_label); for (n = blk->h; n; n = n->next ) { sql_exp *res = NULL; list *reslist = NULL; symbol *s = n->data.sym; switch (s->token) { case SQL_SET: res = psm_set_exp(sql, s->data.lval->h); break; case SQL_DECLARE: reslist = rel_psm_declare(sql, s->data.lval->h); break; case SQL_CREATE_TABLE: res = rel_psm_declare_table(sql, s->data.lval->h); break; case SQL_WHILE: res = rel_psm_while_do(sql, restype, s->data.lval->h, is_func); break; case SQL_IF: res = rel_psm_if_then_else(sql, restype, s->data.lval->h, is_func); break; case SQL_CASE: reslist = rel_psm_case(sql, restype, s->data.lval->h, is_func); break; case SQL_CALL: res = rel_psm_call(sql, s->data.sym); break; case SQL_RETURN: /*If it is not a function it cannot have a return statement*/ if (!is_func) res = sql_error(sql, 01, "Return statement in the procedure body"); else { /* should be last statement of a sequential_block */ if (n->next) { res = sql_error(sql, 01, "Statement after return"); } else { reslist = rel_psm_return(sql, restype, restypelist, s->data.sym); } } break; case SQL_SELECT: { /* row selections (into variables) */ exp_kind ek = {type_value, card_row, TRUE}; reslist = rel_select_into(sql, s, ek); } break; case SQL_COPYFROM: case SQL_BINCOPYFROM: case SQL_INSERT: case SQL_UPDATE: case SQL_DELETE: { sql_rel *r = rel_updates(sql, s); if (!r) return NULL; res = exp_rel(sql, r); } break; default: res = sql_error(sql, 01, "Statement '%s' is not a valid flow control statement", token2string(s->token)); } if (!res && !reslist) { l = NULL; break; } if (res) list_append(l, res); else list_merge(l, reslist, NULL); } stack_pop_frame(sql); return l; }
sql_rel * rel_psm(mvc *sql, symbol *s) { sql_rel *ret = NULL; switch (s->token) { case SQL_CREATE_FUNC: { dlist *l = s->data.lval; int type = l->h->next->next->next->next->next->data.i_val; int lang = l->h->next->next->next->next->next->next->data.i_val; int repl = l->h->next->next->next->next->next->next->next->data.i_val; ret = rel_create_func(sql, l->h->data.lval, l->h->next->data.lval, l->h->next->next->data.sym, l->h->next->next->next->data.lval, l->h->next->next->next->next->data.lval, type, lang, repl); sql->type = Q_SCHEMA; } break; case SQL_DROP_FUNC: { dlist *l = s->data.lval; dlist *qname = l->h->data.lval; dlist *typelist = l->h->next->data.lval; int type = l->h->next->next->data.i_val; int if_exists = l->h->next->next->next->data.i_val; int all = l->h->next->next->next->next->data.i_val; int drop_action = l->h->next->next->next->next->next->data.i_val; if (STORE_READONLY) return sql_error(sql, 06, SQLSTATE(42000) "Schema statements cannot be executed on a readonly database."); if (all) ret = rel_drop_all_func(sql, qname, drop_action, type); else { ret = rel_drop_func(sql, qname, typelist, drop_action, type, if_exists); } sql->type = Q_SCHEMA; } break; case SQL_SET: ret = rel_psm_stmt(sql->sa, psm_set_exp(sql, s->data.lval->h)); sql->type = Q_SCHEMA; break; case SQL_DECLARE: ret = rel_psm_block(sql->sa, rel_psm_declare(sql, s->data.lval->h)); sql->type = Q_SCHEMA; break; case SQL_CALL: ret = rel_psm_stmt(sql->sa, rel_psm_call(sql, s->data.sym)); sql->type = Q_UPDATE; break; case SQL_CREATE_TABLE_LOADER: { dlist *l = s->data.lval; dlist *qname = l->h->data.lval; symbol *sym = l->h->next->data.sym; ret = create_table_from_loader(sql, qname, sym); if (ret == NULL) return NULL; ret = rel_psm_stmt(sql->sa, exp_rel(sql, ret)); sql->type = Q_SCHEMA; } break; case SQL_CREATE_TRIGGER: { dlist *l = s->data.lval; assert(l->h->next->type == type_int); ret = create_trigger(sql, l->h->data.lval, l->h->next->data.i_val, l->h->next->next->data.sym, l->h->next->next->next->data.lval, l->h->next->next->next->next->data.lval, l->h->next->next->next->next->next->data.lval, l->h->next->next->next->next->next->next->data.i_val); sql->type = Q_SCHEMA; } break; case SQL_DROP_TRIGGER: { dlist *l = s->data.lval; dlist *qname = l->h->data.lval; int if_exists = l->h->next->data.i_val; ret = drop_trigger(sql, qname, if_exists); sql->type = Q_SCHEMA; } break; case SQL_ANALYZE: { dlist *l = s->data.lval; ret = psm_analyze(sql, "analyze", l->h->data.lval /* qualified table name */, l->h->next->data.lval /* opt list of column */, l->h->next->next->data.sym /* opt_sample_size */, l->h->next->next->next->data.i_val); sql->type = Q_UPDATE; } break; default: return sql_error(sql, 01, SQLSTATE(42000) "Schema statement unknown symbol(%p)->token = %s", s, token2string(s->token)); } return ret; }