static list * rel_psm_declare(mvc *sql, dnode *n) { list *l = sa_list(sql->sa); while(n) { /* list of 'identfiers with type' */ dnode *ids = n->data.sym->data.lval->h->data.lval->h; sql_subtype *ctype = &n->data.sym->data.lval->h->next->data.typeval; while(ids) { char *name = ids->data.sval; sql_exp *r = NULL; /* check if we overwrite a scope local variable declare x; declare x; */ if (frame_find_var(sql, name)) { return sql_error(sql, 01, "Variable '%s' already declared", name); } /* variables are put on stack, * TODO make sure on plan/explain etc they only * exist during plan phase */ stack_push_var(sql, name, ctype); r = exp_var(sql->sa, sa_strdup(sql->sa, name), ctype, sql->frame); append(l, r); ids = ids->next; } n = n->next; } return l; }
static sql_exp * rel_psm_declare_table(mvc *sql, dnode *n) { sql_rel *rel = NULL; dlist *qname = n->next->data.lval; char *name = qname_table(qname); char *sname = qname_schema(qname); sql_table *t; if (sname) /* not allowed here */ return sql_error(sql, 02, "DECLARE TABLE: qualified name not allowed"); if (frame_find_var(sql, name)) return sql_error(sql, 01, "Variable '%s' already declared", name); assert(n->next->next->next->type == type_int); rel = rel_create_table(sql, cur_schema(sql), SQL_DECLARED_TABLE, NULL, name, n->next->next->data.sym, n->next->next->next->data.i_val, NULL); if (!rel || rel->op != op_ddl || rel->flag != DDL_CREATE_TABLE) return NULL; t = (sql_table*)((atom*)((sql_exp*)rel->exps->t->data)->l)->data.val.pval; stack_push_table(sql, name, rel, t); return exp_table(sql->sa, sa_strdup(sql->sa, name), t, sql->frame); }
static sql_exp * rel_psm_declare_table(mvc *sql, dnode *n) { sql_rel *rel = NULL, *baset = NULL; dlist *qname = n->next->data.lval; const char *name = qname_table(qname); const char *sname = qname_schema(qname); sql_table *t; if (sname) /* not allowed here */ return sql_error(sql, 02, SQLSTATE(42000) "DECLARE TABLE: qualified name not allowed"); if (frame_find_var(sql, name)) return sql_error(sql, 01, SQLSTATE(42000) "Variable '%s' already declared", name); assert(n->next->next->next->type == type_int); rel = rel_create_table(sql, cur_schema(sql), SQL_DECLARED_TABLE, NULL, name, n->next->next->data.sym, n->next->next->next->data.i_val, NULL, NULL, NULL, false, NULL, 0); if (!rel) return NULL; if(rel->op == op_ddl) { baset = rel; } else if(rel->op == op_insert) { baset = rel->l; } else { return NULL; } if(baset->flag != DDL_CREATE_TABLE) return NULL; t = (sql_table*)((atom*)((sql_exp*)baset->exps->t->data)->l)->data.val.pval; if(!stack_push_table(sql, name, baset, t)) return sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL); return exp_table(sql->sa, sa_strdup(sql->sa, name), t, sql->frame); }