Changeset: 2900249a184b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2900249a184b Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_result.c sql/include/sql_relation.h sql/server/rel_distribute.c sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimizer.c sql/server/rel_propagate.c sql/server/rel_rel.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_updates.c sql/server/sql_mvc.h sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128 sql/test/BugTracker-2012/Tests/order_by_on_column_exp.Bug-3193.stable.out sql/test/BugTracker-2014/Tests/crash_on_groupby_distinct_serial.Bug-3463.stable.out sql/test/BugTracker-2014/Tests/groupby_distict.Bug-3423.stable.out sql/test/BugTracker-2014/Tests/type_resolution.Bug-3622.stable.out sql/test/BugTracker-2014/Tests/typecast_error.Bug-3622.stable.out sql/test/BugTracker-2016/Tests/column_alias_in_where_clause.Bug-3947.stable.out sql/test/BugTracker-2016/Tests/column_alias_in_where_clause.Bug-3947.stable.out.int128 sql/test/BugTracker/Tests/groupby_with_alias.SF-1520575.stable.out.int128 sql/test/pg_regress/Tests/numerology.stable.out Branch: default Log Message:
split some of the sql_exp flags into seperate bit fields diffs (truncated from 1919 to 300 lines): diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -466,12 +466,12 @@ exp_bin(backend *be, sql_exp *e, stmt *l stmt *r = exp_bin(be, e->l, left, right, grp, ext, cnt, sel); if(!r) return NULL; - return stmt_assign(be, e->name, r, GET_PSM_LEVEL(e->flag)); + return stmt_assign(be, exp_name(e), r, GET_PSM_LEVEL(e->flag)); } else if (e->flag & PSM_VAR) { if (e->f) - return stmt_vars(be, e->name, e->f, 1, GET_PSM_LEVEL(e->flag)); + return stmt_vars(be, exp_name(e), e->f, 1, GET_PSM_LEVEL(e->flag)); else - return stmt_var(be, e->name, &e->tpe, 1, GET_PSM_LEVEL(e->flag)); + return stmt_var(be, exp_name(e), &e->tpe, 1, GET_PSM_LEVEL(e->flag)); } else if (e->flag & PSM_RETURN) { sql_exp *l = e->l; stmt *r = exp_bin(be, l, left, right, grp, ext, cnt, sel); @@ -1305,8 +1305,8 @@ rel_parse_value(backend *be, char *query static stmt * stmt_rename(backend *be, sql_rel *rel, sql_exp *exp, stmt *s ) { - const char *name = exp->name; - const char *rname = exp->rname; + const char *name = exp_name(exp); + const char *rname = exp_relname(exp); stmt *o = s; (void)rel; @@ -1379,7 +1379,7 @@ rel2bin_basetable(backend *be, sql_rel * assert(rel->exps); for( en = rel->exps->h; en; en = en->next ) { sql_exp *exp = en->data; - const char *rname = exp->rname?exp->rname:exp->l; + const char *rname = exp_relname(exp)?exp_relname(exp):exp->l; const char *oname = exp->r; stmt *s = NULL; @@ -1420,7 +1420,7 @@ rel2bin_basetable(backend *be, sql_rel * s = stmt_col(be, c, dels); } s->tname = rname; - s->cname = exp->name; + s->cname = exp_name(exp); list_append(l, s); } return stmt_list(be, l); @@ -1636,10 +1636,10 @@ rel2bin_table(backend *be, sql_rel *rel, for(i=0, en = rel->exps->h, n = f->res->h; en; en = en->next, n = n->next, i++ ) { sql_exp *exp = en->data; sql_subtype *st = n->data; - const char *rnme = exp->rname?exp->rname:exp->l; + const char *rnme = exp_relname(exp)?exp_relname(exp):exp->l; stmt *s = stmt_rs_column(be, psub, i, st); - s = stmt_alias(be, s, rnme, exp->name); + s = stmt_alias(be, s, rnme, exp_name(exp)); list_append(l, s); } } else { @@ -1702,7 +1702,7 @@ rel2bin_table(backend *be, sql_rel *rel, l = sa_list(sql->sa); for( en = rel->exps->h; en; en = en->next ) { sql_exp *exp = en->data; - const char *rnme = exp->rname?exp->rname:exp->l; + const char *rnme = exp_relname(exp)?exp_relname(exp):exp->l; stmt *s; /* no relation names */ @@ -1716,7 +1716,7 @@ rel2bin_table(backend *be, sql_rel *rel, } if (sub && sub->nrcols >= 1 && s->nrcols == 0) s = stmt_const(be, bin_first_column(be, sub), s); - s = stmt_alias(be, s, rnme, exp->name); + s = stmt_alias(be, s, rnme, exp_name(exp)); list_append(l, s); } if (osub && osub->nrcols) @@ -4681,7 +4681,7 @@ rel2bin_update(backend *be, sql_rel *rel /* lookup the updates */ for (m = rel->exps->h; m; m = m->next) { sql_exp *ce = m->data; - sql_column *c = find_sql_column(t, ce->name); + sql_column *c = find_sql_column(t, exp_name(ce)); if (c) updates[c->colnr] = bin_find_column(be, update, ce->l, ce->r); @@ -4693,7 +4693,7 @@ rel2bin_update(backend *be, sql_rel *rel updcol = first_updated_col(updates, list_length(t->columns.set)); for (m = rel->exps->h; m; m = m->next) { sql_exp *ce = m->data; - sql_idx *i = find_sql_idx(t, ce->name+1); + sql_idx *i = find_sql_idx(t, exp_name(ce)+1); if (i) { stmt *update_idx = bin_find_column(be, update, ce->l, ce->r), *is = NULL; @@ -4724,7 +4724,7 @@ rel2bin_update(backend *be, sql_rel *rel /* apply the update */ for (m = rel->exps->h; m; m = m->next) { sql_exp *ce = m->data; - sql_column *c = find_sql_column(t, ce->name); + sql_column *c = find_sql_column(t, exp_name(ce)); if (c) append(l, stmt_update_col(be, c, tids, updates[c->colnr])); diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -190,7 +190,7 @@ static int if (e->type == e_atom) snprintf(buf,64,"A%d",e->flag); else - snprintf(buf,64,"A%s",e->name); + snprintf(buf,64,"A%s",exp_name(e)); varid = newVariable(curBlk, (char *)buf, strlen(buf), type); curInstr = pushArgument(curBlk, curInstr, varid); setVarType(curBlk, varid, type); diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c --- a/sql/backends/monet5/sql_result.c +++ b/sql/backends/monet5/sql_result.c @@ -1089,13 +1089,13 @@ mvc_export_prepare(mvc *c, stream *out, len3++; max3 *= 10; } - name = e->rname; + name = exp_relname(e); if (!name && e->type == e_column && e->l) name = e->l; slen = name ? strlen(name) : 0; if (slen > len5) len5 = slen; - name = e->name; + name = exp_name(e); if (!name && e->type == e_column && e->r) name = e->r; slen = name ? strlen(name) : 0; @@ -1140,10 +1140,10 @@ mvc_export_prepare(mvc *c, stream *out, sql_exp *e = n->data; t = exp_subtype(e); - name = e->name; + name = exp_name(e); if (!name && e->type == e_column && e->r) name = e->r; - rname = e->rname; + rname = exp_relname(e); if (!rname && e->type == e_column && e->l) rname = e->l; diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h --- a/sql/include/sql_relation.h +++ b/sql/include/sql_relation.h @@ -25,24 +25,26 @@ typedef enum expression_type { #define CARD_AGGR 2 #define CARD_MULTI 3 +typedef struct sql_exp_name { + unsigned int label; + const char *name; + const char *rname; +} sql_exp_name; + typedef struct expression { expression_type type; /* atom, cmp, func/aggr */ - const char *name; - const char *rname; + sql_exp_name alias; void *l; void *r; - void *f; /* func's and aggr's */ - /* e_cmp may have have 2 arguments */ - int flag; /* EXP_DISTINCT, NO_NIL, ASCENDING, NULLS_LAST, cmp types */ - int freevar; /* free variable, ie binds to the upper dependent join */ - unsigned char card; /* card - (0 truth value!) - (1 atoms) - (2 aggr) - (3 multi value) - */ + void *f; /* func's and aggr's, also e_cmp may have have 2 arguments */ + unsigned int + flag:18, /* EXP_DISTINCT, NO_NIL, ASCENDING, NULLS_LAST, cmp types */ + card:2, /* card (0 truth value!) (1 atoms) (2 aggr) (3 multi value) */ + freevar:1, /* free variable, ie binds to the upper dependent join */ + intern:1, + anti:1, + used:1; /* used for quick dead code removal */ sql_subtype tpe; - int used; /* used for quick dead code removal */ void *p; /* properties for the optimizer */ } sql_exp; @@ -57,10 +59,8 @@ typedef struct expression { #define ASCENDING 16 #define CMPMASK (ASCENDING-1) #define get_cmp(e) (e->flag&CMPMASK) -#define ANTISEL 32 -#define HAS_NO_NIL 64 -#define EXP_INTERN 128 -#define NULLS_LAST 256 +#define HAS_NO_NIL 32 +#define NULLS_LAST 64 #define UPD_COMP 1 #define UPD_LOCKED 2 @@ -253,9 +253,16 @@ typedef enum operator_type { e->flag |= ((dir&1)?ASCENDING:0) | ((dir&2)?NULLS_LAST:0) #define is_anti(e) \ - ((e->flag&ANTISEL)==ANTISEL) + ((e)->anti) #define set_anti(e) \ - e->flag |= ANTISEL + (e)->anti = 1 +#define is_intern(e) \ + ((e)->intern) +#define set_intern(e) \ + (e)->intern = 1 + +#define has_label(e) \ + ((e)->alias.label > 0) /* used for expressions and relations */ #define need_distinct(e) \ @@ -265,12 +272,6 @@ typedef enum operator_type { #define set_nodistinct(e) \ e->flag &= (~EXP_DISTINCT) -/* used for expressions and relations */ -#define is_intern(e) \ - (e->type != e_atom && (e->flag&EXP_INTERN)==EXP_INTERN) -#define set_intern(e) \ - e->flag |= EXP_INTERN - #define is_processed(rel) \ ((rel)->processed) #define set_processed(rel) \ diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c --- a/sql/server/rel_distribute.c +++ b/sql/server/rel_distribute.c @@ -80,7 +80,7 @@ rewrite_replica( mvc *sql, sql_rel *rel, sql_exp *e = n->data; sql_exp *ne = m->data; - exp_setname(sql->sa, ne, e->rname, e->name); + exp_prop_alias(ne, e); } rel_destroy(rel); diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -188,20 +188,24 @@ exp_print(mvc *sql, stream *fout, sql_ex if (e->l) mnstr_printf(fout, "\"%s\".", (char*)e->l); mnstr_printf(fout, "\"%s\"", (char*)e->r); - if (e->rname && e->name && e->l && e->r && - strcmp(e->rname, e->l) == 0 && - strcmp(e->name, e->r) == 0) + if (exp_relname(e) && exp_name(e) && e->l && e->r && + strcmp(exp_relname(e), e->l) == 0 && + strcmp(exp_name(e), e->r) == 0) alias = 0; - if (!e->rname && e->name && strcmp(e->name, e->r)==0) + if (!exp_relname(e) && exp_name(e) && strcmp(exp_name(e), e->r)==0) alias = 0; break; case e_cmp: if (e->flag == cmp_in || e->flag == cmp_notin) { exp_print(sql, fout, e->l, depth, refs, 0, alias); + if (is_anti(e)) + mnstr_printf(fout, " !"); cmp_print(sql, fout, get_cmp(e)); exps_print(sql, fout, e->r, depth, refs, alias, 1); } else if (get_cmp(e) == cmp_or) { exps_print(sql, fout, e->l, depth, refs, alias, 1); + if (is_anti(e)) + mnstr_printf(fout, " !"); cmp_print(sql, fout, get_cmp(e)); exps_print(sql, fout, e->r, depth, refs, alias, 1); } else if (get_cmp(e) == cmp_filter) { @@ -215,11 +219,11 @@ exp_print(mvc *sql, stream *fout, sql_ex } else if (e->f) { exp_print(sql, fout, e->r, depth+1, refs, 0, 0); if (is_anti(e)) - mnstr_printf(fout, " ! "); + mnstr_printf(fout, " !"); cmp_print(sql, fout, swap_compare(range2lcompare(e->flag)) ); exp_print(sql, fout, e->l, depth+1, refs, 0, 0); if (is_anti(e)) - mnstr_printf(fout, " ! "); + mnstr_printf(fout, " !"); cmp_print(sql, fout, range2rcompare(e->flag) ); exp_print(sql, fout, e->f, depth+1, refs, 0, 0); if (e->flag & CMP_SYMMETRIC) @@ -227,7 +231,7 @@ exp_print(mvc *sql, stream *fout, sql_ex } else { exp_print(sql, fout, e->l, depth+1, refs, 0, 0); if (is_anti(e)) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list