Changeset: 3e3d7d5f8dc9 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3e3d7d5f8dc9 Added Files: sql/test/BugTracker-2013/Tests/bogus_aggregation_casts.Bug-3342.sql sql/test/BugTracker-2013/Tests/bogus_aggregation_casts.Bug-3342.stable.err sql/test/BugTracker-2013/Tests/bogus_aggregation_casts.Bug-3342.stable.out sql/test/LSST/Tests/cleanup.reqtests sql/test/LSST/Tests/dbQuery000.reqtests sql/test/LSST/Tests/dbQuery001.reqtests sql/test/LSST/Tests/dbQuery002.reqtests sql/test/LSST/Tests/dbQuery003.reqtests sql/test/LSST/Tests/dbQuery004.reqtests sql/test/LSST/Tests/dbQuery005.reqtests sql/test/LSST/Tests/dbQuery007.reqtests sql/test/LSST/Tests/dbQuery008.reqtests sql/test/LSST/Tests/dbQuery009.reqtests sql/test/LSST/Tests/dbQuery010.reqtests sql/test/LSST/Tests/dbQuery011.reqtests sql/test/LSST/Tests/dbQuery012.reqtests sql/test/LSST/Tests/dbQuery013.reqtests sql/test/LSST/Tests/dbQuery014.reqtests sql/test/LSST/Tests/dbQuery015.reqtests sql/test/LSST/Tests/dbQuery016.reqtests sql/test/LSST/Tests/dbQuery017.reqtests sql/test/LSST/Tests/dbQuery018.reqtests sql/test/LSST/Tests/dbQuery019.reqtests sql/test/LSST/Tests/dbQuery020.reqtests sql/test/LSST/Tests/dbQuery022.reqtests sql/test/LSST/Tests/dbQuery024.reqtests sql/test/LSST/Tests/dbQuery025.reqtests sql/test/LSST/Tests/dbQuery026.reqtests sql/test/LSST/Tests/dbQuery027.reqtests sql/test/LSST/Tests/dbQuery028.reqtests sql/test/LSST/Tests/dbQuery029.reqtests sql/test/LSST/Tests/dbQuery030.reqtests sql/test/LSST/Tests/dbQuery031.reqtests sql/test/LSST/Tests/dbQuery032.reqtests sql/test/LSST/Tests/dbQuery034.reqtests sql/test/LSST/Tests/dbQuery035.reqtests sql/test/LSST/Tests/dbQuery036.reqtests sql/test/LSST/Tests/dbQuery037.reqtests sql/test/LSST/Tests/dbQuery038.reqtests sql/test/LSST/Tests/dbQuery041.reqtests sql/test/LSST/Tests/dbQuery042.reqtests sql/test/LSST/Tests/dbQuery043.reqtests sql/test/LSST/Tests/dbQuery044.reqtests sql/test/LSST/Tests/dbQuery045.reqtests sql/test/LSST/Tests/dbQuery046.reqtests sql/test/LSST/Tests/dbQuery047.reqtests sql/test/LSST/Tests/dbQuery048.reqtests sql/test/LSST/Tests/dbQuery053.reqtests sql/test/LSST/Tests/dbQuery054.reqtests sql/test/LSST/Tests/dbQuery055.reqtests sql/test/LSST/Tests/dbQuery056.reqtests sql/test/LSST/Tests/dbQuery066.reqtests sql/test/Users/Tests/privs.reqtests sql/test/Users/Tests/privs2.reqtests sql/test/Users/Tests/role1.reqtests sql/test/Users/Tests/role2.reqtests sql/test/Users/Tests/table.reqtests sql/test/Users/Tests/test_privs2_p1.reqtests sql/test/Users/Tests/test_privs2_p2.reqtests sql/test/Users/Tests/test_privs_p1.reqtests sql/test/Users/Tests/test_privs_p2.reqtests sql/test/Users/Tests/unknown_user.reqtests sql/test/broken_delete/Tests/broken_delete_1.reqtests sql/test/broken_delete/Tests/broken_delete_2.reqtests sql/test/broken_delete/Tests/broken_delete_3.reqtests sql/test/broken_delete/Tests/broken_delete_4.reqtests sql/test/broken_delete/Tests/broken_delete_5.reqtests sql/test/rdf/Tests/drop_tables_t.reqtests sql/test/rdf/Tests/drop_tables_v.reqtests sql/test/rdf/Tests/q1_t.reqtests sql/test/rdf/Tests/q1_v.reqtests sql/test/rdf/Tests/q2_28_t.reqtests sql/test/rdf/Tests/q2_28_v.reqtests sql/test/rdf/Tests/q2_t.reqtests sql/test/rdf/Tests/q2_v.reqtests sql/test/rdf/Tests/q3_28_t.reqtests sql/test/rdf/Tests/q3_28_v.reqtests sql/test/rdf/Tests/q3_t.reqtests sql/test/rdf/Tests/q3_v.reqtests sql/test/rdf/Tests/q4_28_t.reqtests sql/test/rdf/Tests/q4_28_v.reqtests sql/test/rdf/Tests/q4_t.reqtests sql/test/rdf/Tests/q4_v.reqtests sql/test/rdf/Tests/q5_t.reqtests sql/test/rdf/Tests/q5_v.reqtests sql/test/rdf/Tests/q6_28_t.reqtests sql/test/rdf/Tests/q6_28_v.reqtests sql/test/rdf/Tests/q6_t.reqtests sql/test/rdf/Tests/q6_v.reqtests sql/test/rdf/Tests/q7_t.reqtests sql/test/rdf/Tests/q7_v.reqtests sql/test/rdf/Tests/q8_t.reqtests sql/test/rdf/Tests/q8_v.reqtests sql/test/sql_xml/Tests/xml.reqtests sql/test/sql_xml/Tests/xml_attribute_parsing.SF-1855673.reqtests sql/test/sql_xml/Tests/xmlelement_segfault.SF-2812767.reqtests sql/test/testdb/Tests/testdb-dump.reqtests Modified Files: sql/backends/monet5/rel_bin.c sql/server/rel_optimizer.c sql/server/rel_select.c sql/test/BugTracker-2011/Tests/copy-into-file-error.Bug-2722.stable.out sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err sql/test/BugTracker-2013/Tests/All Branch: default Log Message:
Merge with Feb2013 branch. diffs (truncated from 977 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 @@ -1162,7 +1162,7 @@ static stmt * rel2bin_table( mvc *sql, sql_rel *rel, list *refs) { list *l; - stmt *sub = NULL; + stmt *sub = NULL, *osub = NULL; node *en, *n; sql_exp *op = rel->r; @@ -1194,11 +1194,10 @@ rel2bin_table( mvc *sql, sql_rel *rel, l assert(0); return NULL; } - sub = psub; l = sa_list(sql->sa); for(i = 0, n = t->columns.set->h; n; n = n->next, i++ ) { sql_column *c = n->data; - stmt *s = stmt_rs_column(sql->sa, sub, i, &c->type); + stmt *s = stmt_rs_column(sql->sa, psub, i, &c->type); char *nme = c->base.name; char *rnme = exp_find_rel_name(op); @@ -1206,6 +1205,10 @@ rel2bin_table( mvc *sql, sql_rel *rel, l s = stmt_alias(sql->sa, s, rnme, sa_strdup(sql->sa, nme)); list_append(l, s); } + if (sub && sub->nrcols) { /* add sub */ + list_merge(l, sub->op4.lval, NULL); + osub = sub; + } sub = stmt_list(sql->sa, l); } else if (rel->l) { int i, argc; @@ -1266,6 +1269,8 @@ rel2bin_table( mvc *sql, sql_rel *rel, l s = stmt_alias(sql->sa, s, rnme, sa_strdup(sql->sa, exp->name)); list_append(l, s); } + if (osub && osub->nrcols) + list_merge(l, osub->op4.lval, NULL); sub = stmt_list(sql->sa, l); return sub; } diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -3824,6 +3824,10 @@ rel_reduce_groupby_exps(int *changes, mv } if (i) { /* forall tables find pkey and remove useless other columns */ + /* TODO also remove group by columns which are related to + * the other columns using a foreign-key join (n->1), ie 1 + * on the to be removed side. + */ for(j = 0; j < i; j++) { int l, nr = 0, cnr = 0; @@ -5684,6 +5688,7 @@ rel_rename(mvc *sql, sql_rel *rel, list nme = number2name(name, 16, ++sql->label); /* label + put aliases list into aliases */ nrel->l = rel->l; + nrel->r = rel->r; nrel->exps = new_exp_list(sql->sa); for (n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data, *ne, *a; @@ -5756,7 +5761,10 @@ rel_apply_rename(mvc *sql, sql_rel *rel) return rel; switch(rel->op) { case op_basetable: + return rel; case op_table: + if (rel->l) + rel->l = rel_apply_rename(sql, rel->l); return rel; case op_project: case op_select: @@ -5861,6 +5869,18 @@ rel_apply_rewrite(int *changes, mvc *sql (*changes)++; return nrel; } + /* table function (TODO should output any input cols) */ + if (r->op == op_table && r->l) { + /* + int used = rel_uses_exps(r->l, rel->exps); + + if (used) { + */ + /* ugh */ + r->l = rel->l; + return r; + //} + } if (r->op == op_table || r->op == op_basetable) { if (rel->flag == APPLY_LOJ) rel->op = op_left; diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1904,6 +1904,24 @@ exp_convert_inplace(mvc *sql, sql_subtyp return NULL; } +static sql_exp * +rel_numeric_supertype(mvc *sql, sql_exp *e ) +{ + sql_subtype *tp = exp_subtype(e); + + if (tp->type->eclass == EC_DEC) { + sql_subtype *dtp = sql_bind_localtype("dbl"); + + return rel_check_type(sql, dtp, e, type_cast); + } + if (tp->type->eclass == EC_NUM) { + sql_subtype *ltp = sql_bind_localtype("lng"); + + return rel_check_type(sql, ltp, e, type_cast); + } + return e; +} + sql_exp * rel_check_type(mvc *sql, sql_subtype *t, sql_exp *exp, int tpe) { @@ -3219,6 +3237,11 @@ rel_unop_(mvc *sql, sql_exp *e, sql_sche f->res.digits = t->digits; f->res.scale = t->scale; } + if (card == card_relation && e->card > CARD_ATOM) { + sql_subaggr *zero_or_one = sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(e)); + + e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, 0); + } return exp_unop(sql->sa, e, f); } else if (e) { char *type = exp_subtype(e)->type->sqlname; @@ -3336,6 +3359,16 @@ rel_binop_(mvc *sql, sql_exp *l, sql_exp } else if (f->func->fix_scale == DIGITS_ADD) { f->res.digits = (t1->digits && t2->digits)?t1->digits + t2->digits:0; } + if (card == card_relation && l->card > CARD_ATOM) { + sql_subaggr *zero_or_one = sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(l)); + + l = exp_aggr1(sql->sa, l, zero_or_one, 0, 0, CARD_ATOM, 0); + } + if (card == card_relation && r->card > CARD_ATOM) { + sql_subaggr *zero_or_one = sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(r)); + + r = exp_aggr1(sql->sa, r, zero_or_one, 0, 0, CARD_ATOM, 0); + } return exp_binop(sql->sa, l, r, f); } else { sql_exp *ol = l; @@ -3545,6 +3578,11 @@ rel_nop(mvc *sql, sql_rel **rel, symbol nexps = NULL; break; } + if (table_func && e->card > CARD_ATOM) { + sql_subaggr *zero_or_one = sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(e)); + + e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, 0); + } append(nexps, e); } if (nexps) @@ -3611,26 +3649,6 @@ static sql_exp * return e; } a = sql_bind_aggr(sql->sa, s, aname, NULL); - /* add aggr expression to the groupby, and return a - column expression */ - - /* for correlated selections, we need to count on the - join expression */ - /* - if (groupby->r && exps_intern(groupby->r)) { - sql_rel *i = groupby->l; - - if (i->exps && f == sql_sel && is_join(i->op)) { - sql_rel *j = i->r; - - sql_exp *e = j->exps->h->data; - assert(0); - e = exp_column(sql->sa, exp_relname(e), exp_name(e), exp_subtype(e), exp_card(e), has_nil(e), 0); - e = exp_aggr1(sql->sa, e, a, distinct, 1, groupby->card, 0); - return e; - } - } - */ e = exp_aggr(sql->sa, NULL, a, distinct, 0, groupby->card, 0); if (*rel == groupby && f == sql_sel) /* selection */ return e; @@ -3663,22 +3681,40 @@ static sql_exp * a = sql_bind_aggr_(sql->sa, s, aname, exp_types(sql->sa, exps)); if (!a) { /* find aggr + convert */ - a = sql_find_aggr(sql->sa, s, aname); - if (a) { - node *n, *op = a->aggr->ops->h; - list *nexps = sa_list(sql->sa); - - for (n = exps->h ; a && op && n; op = op->next, n = n->next ) { - sql_arg *arg = op->data; - sql_exp *e = n->data; - - e = rel_check_type(sql, &arg->type, e, type_equal); - if (!e) - a = NULL; - list_append(nexps, e); + /* First try larger numeric type */ + node *n; + list *nexps = sa_list(sql->sa); + + for (n = exps->h ; n; n = n->next ) { + sql_exp *e = n->data; + + /* cast up, for now just dec to double */ + e = rel_numeric_supertype(sql, e); + if (!e) + break; + list_append(nexps, e); + } + a = sql_bind_aggr_(sql->sa, s, aname, exp_types(sql->sa, nexps)); + if (a && list_length(nexps)) /* count(col) has |exps| != |nexps| */ + exps = nexps; + if (!a) { + a = sql_find_aggr(sql->sa, s, aname); + if (a) { + node *n, *op = a->aggr->ops->h; + list *nexps = sa_list(sql->sa); + + for (n = exps->h ; a && op && n; op = op->next, n = n->next ) { + sql_arg *arg = op->data; + sql_exp *e = n->data; + + e = rel_check_type(sql, &arg->type, e, type_equal); + if (!e) + a = NULL; + list_append(nexps, e); + } + if (a && list_length(nexps)) /* count(col) has |exps| != |nexps| */ + exps = nexps; } - if (a && list_length(nexps)) /* count(col) has |exps| != |nexps| */ - exps = nexps; } } /* TODO: convert to single super type (iff |exps| > 1) */ diff --git a/sql/test/BugTracker-2011/Tests/copy-into-file-error.Bug-2722.stable.out b/sql/test/BugTracker-2011/Tests/copy-into-file-error.Bug-2722.stable.out --- a/sql/test/BugTracker-2011/Tests/copy-into-file-error.Bug-2722.stable.out +++ b/sql/test/BugTracker-2011/Tests/copy-into-file-error.Bug-2722.stable.out @@ -39,8 +39,8 @@ Ready. % val # name % int # type % 1 # length +2 4 -2 #copy select val from bug2722 where fk=2 order by time into stdout using delimiters ' ' , '\n'; [ 2 ] #drop table bug2722; diff --git a/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err b/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err --- a/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err +++ b/sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err @@ -25,17 +25,16 @@ stderr of test 'create_function.Bug-3172 # cmdline opt gdk_dbname = mTests_test_BugTracker-2012 # cmdline opt mal_listing = 0 -# 23:33:41 > -# 23:33:41 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-19060" "--port=33352" -# 23:33:41 > +# 16:07:20 > +# 16:07:20 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-27661" "--port=38365" +# 16:07:20 > -MAPI = (monetdb) /var/tmp/mtest-19060/.s.monetdb.33352 +MAPI = (monetdb) /var/tmp/mtest-27661/.s.monetdb.38365 QUERY = select * from x((select id from _tables), (select schema_id from _tables)); ERROR = !TypeException:user.s2_1[115]:'sql.x' undefined in: _216:any := sql.x(_212:int, _214:int) !TypeException:user.s2_1[117]:'bat.insert' undefined in: _219:any := bat.insert(_207:bat[:oid,:int], _217:oid, _216:any) !program contains errors -# 23:33:42 > -# 23:33:42 > "Done." -# 23:33:42 > - +# 16:07:20 > +# 16:07:20 > "Done." +# 16:07:20 > diff --git a/sql/test/BugTracker-2013/Tests/All b/sql/test/BugTracker-2013/Tests/All --- a/sql/test/BugTracker-2013/Tests/All +++ b/sql/test/BugTracker-2013/Tests/All @@ -38,3 +38,4 @@ pivot.Bug-3339 qualified_aggrname.Bug-3332 cannot_use_columns_after_groupby.Bug-3340 sort_void_crash.Bug-3341 +bogus_aggregation_casts.Bug-3342 diff --git a/sql/test/BugTracker-2013/Tests/bogus_aggregation_casts.Bug-3342.sql b/sql/test/BugTracker-2013/Tests/bogus_aggregation_casts.Bug-3342.sql new file mode 100644 _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list