static sql_rel* create_table_from_loader(mvc *sql, dlist *qname, symbol *fcall) { sql_schema *s = NULL; char *sname = qname_schema(qname); char *tname = qname_table(qname); sql_subfunc *loader = NULL; sql_rel* rel = NULL; if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: no such schema '%s'", sname); if (mvc_bind_table(sql, s, tname)) { return sql_error(sql, 02, SQLSTATE(42S01) "CREATE TABLE: name '%s' already in use", tname); } else if (!mvc_schema_privs(sql, s)){ return sql_error(sql, 02, SQLSTATE(42000) "CREATE TABLE: insufficient privileges for user '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name); } rel = rel_loader_function(sql, fcall, new_exp_list(sql->sa), &loader); if (!rel || !loader) { return NULL; } loader->sname = sname ? sa_zalloc(sql->sa, strlen(sname) + 1) : NULL; loader->tname = tname ? sa_zalloc(sql->sa, strlen(tname) + 1) : NULL; if (sname) strcpy(loader->sname, sname); if (tname) strcpy(loader->tname, tname); return rel; }
static sql_rel * rel_create_trigger(mvc *sql, char *sname, char *tname, char *triggername, int time, int orientation, int event, char *old_name, char *new_name, char *condition, char *query) { sql_rel *rel = rel_create(sql->sa); list *exps = new_exp_list(sql->sa); append(exps, exp_atom_str(sql->sa, sname, sql_bind_localtype("str") )); append(exps, exp_atom_str(sql->sa, tname, sql_bind_localtype("str") )); append(exps, exp_atom_str(sql->sa, triggername, sql_bind_localtype("str") )); append(exps, exp_atom_int(sql->sa, time)); append(exps, exp_atom_int(sql->sa, orientation)); append(exps, exp_atom_int(sql->sa, event)); append(exps, exp_atom_str(sql->sa, old_name, sql_bind_localtype("str") )); append(exps, exp_atom_str(sql->sa, new_name, sql_bind_localtype("str") )); append(exps, exp_atom_str(sql->sa, condition, sql_bind_localtype("str") )); append(exps, exp_atom_str(sql->sa, query, sql_bind_localtype("str") )); rel->l = NULL; rel->r = NULL; rel->op = op_ddl; rel->flag = DDL_CREATE_TRIGGER; rel->exps = exps; rel->card = CARD_MULTI; rel->nrcols = 0; return rel; }
list * exps_copy( sql_allocator *sa, list *exps) { node *n; list *nl = new_exp_list(sa); for(n = exps->h; n; n = n->next) { sql_exp *arg = n->data; arg = exp_copy(sa, arg); if (!arg) return NULL; append(nl, arg); } return nl; }
static sql_rel* rel_create_function(sql_allocator *sa, char *sname, sql_func *f) { sql_rel *rel = rel_create(sa); list *exps = new_exp_list(sa); append(exps, exp_atom_clob(sa, sname)); append(exps, exp_atom_ptr(sa, f)); rel->l = NULL; rel->r = NULL; rel->op = op_ddl; rel->flag = DDL_CREATE_FUNCTION; rel->exps = exps; rel->card = 0; rel->nrcols = 0; return rel; }
static sql_rel * rel_drop_trigger(mvc *sql, char *sname, char *tname) { sql_rel *rel = rel_create(sql->sa); list *exps = new_exp_list(sql->sa); append(exps, exp_atom_str(sql->sa, sname, sql_bind_localtype("str") )); append(exps, exp_atom_str(sql->sa, tname, sql_bind_localtype("str") )); rel->l = NULL; rel->r = NULL; rel->op = op_ddl; rel->flag = DDL_DROP_TRIGGER; rel->exps = exps; rel->card = CARD_MULTI; rel->nrcols = 0; return rel; }
static sql_rel * rel_trans(mvc *sql, int trans_type, int nr, char *name) { sql_rel *rel = rel_create(sql->sa); list *exps = new_exp_list(sql->sa); append(exps, exp_atom_int(sql->sa, nr)); if (name) append(exps, exp_atom_clob(sql->sa, name)); rel->l = NULL; rel->r = NULL; rel->op = op_ddl; rel->flag = trans_type; rel->exps = exps; rel->card = 0; rel->nrcols = 0; return rel; }
static sql_rel* rel_drop_function(sql_allocator *sa, char *sname, char *name, int nr, int type, int action) { sql_rel *rel = rel_create(sa); list *exps = new_exp_list(sa); append(exps, exp_atom_clob(sa, sname)); append(exps, exp_atom_clob(sa, name)); append(exps, exp_atom_int(sa, nr)); append(exps, exp_atom_int(sa, type)); append(exps, exp_atom_int(sa, action)); rel->l = NULL; rel->r = NULL; rel->op = op_ddl; rel->flag = DDL_DROP_FUNCTION; rel->exps = exps; rel->card = 0; rel->nrcols = 0; return rel; }