sql_key * mvc_bind_ukey(sql_table *t, list *colnames) { node *cn; node *cur; sql_key *res = NULL; int len = list_length(colnames); if (cs_size(&t->keys)) for (cur = t->keys.set->h; cur; cur = cur->next) { node *cc; sql_key *k = cur->data; if (uniqueKey(k) && list_length(k->columns) == len) { res = k; for (cc = k->columns->h, cn = colnames->h; cc && cn; cc = cc->next, cn = cn->next) { sql_kc *c = cc->data; char *n = cn->data; if (strcmp(c->c->base.name, n) != 0) { res = NULL; break; } } if (res) break; } } return res; }
static int table_dump(sql_trans *tr, sql_table *t) { node *n = cs_first_node(&t->columns); int i, l = cs_size(&t->columns); BAT **b = (BAT**)GDKzalloc(sizeof(BAT*) * l); (void)tr; for (i = 0; n; n = n->next, i++) { sql_column *c = n->data; sql_delta *bat = c->data; b[i] = temp_descriptor(bat->bid); } BATmultiprintf(GDKstdout, l +1, b, TRUE, 0, 1); for (i = 0; i < l; i++) bat_destroy(b[i]); GDKfree(b); return 0; }
/* return val; */ static list * rel_psm_return( mvc *sql, sql_subtype *restype, list *restypelist, symbol *return_sym ) { exp_kind ek = {type_value, card_value, FALSE}; sql_exp *res; sql_rel *rel = NULL; int is_last = 0; list *l = sa_list(sql->sa); if (restypelist) ek.card = card_relation; res = rel_value_exp2(sql, &rel, return_sym, sql_sel, ek, &is_last); if (!res) return NULL; if (ek.card != card_relation && (!res || (res = rel_check_type(sql, restype, res, type_equal)) == NULL)) return NULL; else if (ek.card == card_relation && !rel) return NULL; if (rel && ek.card != card_relation) append(l, exp_rel(sql, rel)); else if (rel && !is_ddl(rel->op)) { list *exps = sa_list(sql->sa); node *n, *m; int isproject = (rel->op == op_project); list *oexps = rel->exps; sql_rel *l = rel->l; if (is_topn(rel->op)) oexps = l->exps; for (n = oexps->h, m = restypelist->h; n && m; n = n->next, m = m->next) { sql_exp *e = n->data; sql_arg *ce = m->data; char *cname = exp_name(e); char name[16]; if (!cname) cname = sa_strdup(sql->sa, number2name(name, 16, ++sql->label)); if (!isproject) e = exp_column(sql->sa, exp_relname(e), cname, exp_subtype(e), exp_card(e), has_nil(e), is_intern(e)); e = rel_check_type(sql, &ce->type, e, type_equal); if (!e) return NULL; append(exps, e); } if (isproject) rel -> exps = exps; else rel = rel_project(sql->sa, rel, exps); res = exp_rel(sql, rel); } else if (rel && restypelist){ /* handle return table-var */ list *exps = sa_list(sql->sa); sql_table *t = rel_ddl_table_get(rel); node *n, *m; char *tname = t->base.name; if (cs_size(&t->columns) != list_length(restypelist)) return sql_error(sql, 02, "RETURN: number of columns do not match"); for (n = t->columns.set->h, m = restypelist->h; n && m; n = n->next, m = m->next) { sql_column *c = n->data; sql_arg *ce = m->data; sql_exp *e = exp_alias(sql->sa, tname, c->base.name, tname, c->base.name, &c->type, CARD_MULTI, c->null, 0); e = rel_check_type(sql, &ce->type, e, type_equal); if (!e) return NULL; append(exps, e); } rel = rel_project(sql->sa, rel, exps); res = exp_rel(sql, rel); } append(l, exp_return(sql->sa, res, stack_nr_of_declared_tables(sql))); return l; }