Changeset: 65b5a80a2c57 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=65b5a80a2c57
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_execute.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: context
Log Message:
merged with default
diffs (truncated from 1944 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);
@@ -1188,8 +1188,8 @@ parse_value(backend *be, char *query, sq
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;
@@ -1262,7 +1262,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;
@@ -1303,7 +1303,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);
@@ -1508,10 +1508,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 {
@@ -1574,7 +1574,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 */
@@ -1588,7 +1588,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)
@@ -4433,7 +4433,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);
@@ -4445,7 +4445,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;
@@ -4476,7 +4476,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_execute.c
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -542,10 +542,10 @@ SQLstatementIntern(Client c, str *expr,
msg =
createException(SQL,"SQLstatement", SQLSTATE(HY001) MAL_MALLOC_FAIL);
goto endofcompile;
}
- 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;
if (res_col_create(m->session->tr, res,
rname, name, t->type->sqlname, t->digits,
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
@@ -174,7 +174,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
@@ -1090,13 +1090,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;
@@ -1141,10 +1141,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
@@ -187,20 +187,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) {
@@ -214,11 +218,11 @@ exp_print(mvc *sql, stream *fout, sql_ex
} else if (e->f) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list