sql_exp * exps_bind_column2( list *exps, char *rname, char *cname ) { if (exps) { node *en; if (exps && !exps->ht && list_length(exps) > HASH_MIN_SIZE) { exps->ht = hash_new(exps->sa, list_length(exps), (fkeyvalue)&exp_key); for (en = exps->h; en; en = en->next ) { sql_exp *e = en->data; if (e->name) { int key = exp_key(e); hash_add(exps->ht, key, e); } } } if (exps && exps->ht) { int key = hash_key(cname); sql_hash_e *he = exps->ht->buckets[key&(exps->ht->size-1)]; for (; he; he = he->chain) { sql_exp *e = he->value; if (e && is_column(e->type) && e->name && e->rname && strcmp(e->name, cname) == 0 && strcmp(e->rname, rname) == 0) return e; if (e && e->type == e_column && e->name && !e->rname && e->l && strcmp(e->name, cname) == 0 && strcmp(e->l, rname) == 0) return e; } return NULL; } for (en = exps->h; en; en = en->next ) { sql_exp *e = en->data; if (e && is_column(e->type) && e->name && e->rname && strcmp(e->name, cname) == 0 && strcmp(e->rname, rname) == 0) return e; if (e && e->type == e_column && e->name && !e->rname && e->l && strcmp(e->name, cname) == 0 && strcmp(e->l, rname) == 0) return e; if (e && e->type == e_column && !e->name && !e->rname && e->l && e->r && strcmp(e->r, cname) == 0 && strcmp(e->l, rname) == 0) { assert(0); return e; } } } return NULL; }
int add_to_list(t_list **list, int i, int j, char **tab) { t_list *elem; int nbr; int pos; if ((elem = malloc(sizeof(t_list))) == NULL) return (-1); elem->i = i; elem->j = j; nbr = 0; pos = 0; while (++nbr < 10) if (is_line(tab, i, (nbr + '0')) == 0 && is_column(tab, j, (nbr + '0')) == 0 && is_block(tab, i, j, (nbr + '0')) == 0) ++pos; elem->possibilities = pos; elem->next = *list; *list = elem; return (0); }
bool is_column(const std::string& column_name) const { return is_column(column_name, typeid(T)); }