Changeset: 113345e0317d for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=113345e0317d Added Files: sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.sql sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.err sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.out sql/test/BugTracker-2016/Tests/foreign_key.Bug-3938.sql sql/test/BugTracker-2016/Tests/foreign_key.Bug-3938.stable.err sql/test/BugTracker-2016/Tests/foreign_key.Bug-3938.stable.out sql/test/BugTracker-2016/Tests/merge_project.Bug-3955.sql sql/test/BugTracker-2016/Tests/merge_project.Bug-3955.stable.err sql/test/BugTracker-2016/Tests/merge_project.Bug-3955.stable.out Modified Files: monetdb5/optimizer/opt_mergetable.c sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_upgrades.c sql/benchmarks/tpch/Tests/20-plan.stable.out sql/benchmarks/tpch/Tests/20-plan.stable.out.int128 sql/common/sql_types.c sql/include/sql_mem.h sql/server/rel_optimizer.c sql/storage/sql_storage.h sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out sql/test/BugTracker-2016/Tests/All sql/test/Via-m/Tests/event_s11.stable.err sql/test/Via-m/Tests/event_s11.stable.out sql/test/Via-m/Tests/media_s18.stable.err sql/test/Via-m/Tests/media_s18.stable.out sql/test/Via-m/Tests/media_s19.stable.err sql/test/Via-m/Tests/media_s19.stable.out sql/test/copy/Tests/int_parse.stable.err sql/test/copy/Tests/int_parse.stable.out sql/test/copy/Tests/int_parse_best.stable.out sql/test/copy/Tests/load_stdin_incorrect_line_nr.stable.err sql/test/copy/Tests/load_stdin_incorrect_line_nr.stable.out sql/test/copy/Tests/null_as_string_errors.stable.err sql/test/copy/Tests/null_as_string_errors.stable.out sql/test/pg_regress/Tests/create_misc.stable.err sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128 testing/Mtest.py.in Branch: Jun2016 Log Message:
Merge with Jul2015 branch. diffs (truncated from 1230 to 300 lines): diff --git a/monetdb5/optimizer/opt_mergetable.c b/monetdb5/optimizer/opt_mergetable.c --- a/monetdb5/optimizer/opt_mergetable.c +++ b/monetdb5/optimizer/opt_mergetable.c @@ -402,35 +402,45 @@ mat_apply2(matlist_t *ml, MalBlkPtr mb, return r; } -static InstrPtr -mat_apply3(matlist_t *ml, MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int n, int o, int mvar, int nvar, int ovar) +static void +mat_apply3(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n, int o, int mvar, int nvar, int ovar) { - int tpe, k; - InstrPtr r = NULL; + int k; + InstrPtr *r = NULL; - r = newInstruction(mb, ASSIGNsymbol); - setModuleId(r,matRef); - setFunctionId(r,packRef); - getArg(r, 0) = getArg(p,0); - tpe = getArgType(mb,p,0); + r = (InstrPtr*) GDKmalloc(sizeof(InstrPtr)* p->retc); + for(k=0; k < p->retc; k++) { + r[k] = newInstruction(mb, ASSIGNsymbol); + setModuleId(r[k],matRef); + setFunctionId(r[k],packRef); + getArg(r[k],0) = getArg(p,k); + } //printf("# %s.%s(%d,%d,%d)", getModuleId(p), getFunctionId(p), m, n, o); - for(k=1; k < mat[m].mi->argc; k++) { + for(k = 1; k < ml->v[m].mi->argc; k++) { + int l, tpe; InstrPtr q = copyInstruction(p); - getArg(q, 0) = newTmpVariable(mb, tpe); - getArg(q, mvar) = getArg(mat[m].mi, k); - getArg(q, nvar) = getArg(mat[n].mi, k); - getArg(q, ovar) = getArg(mat[o].mi, k); + for(l=0; l < p->retc; l++) { + tpe = getArgType(mb,p,l); + getArg(q, l) = newTmpVariable(mb, tpe); + } + getArg(q, mvar) = getArg(ml->v[m].mi, k); + getArg(q, nvar) = getArg(ml->v[n].mi, k); + getArg(q, ovar) = getArg(ml->v[o].mi, k); pushInstruction(mb, q); - setPartnr(ml, -1, getArg(q,0), k); - r = pushArgument(mb, r, getArg(q, 0)); + for(l=0; l < p->retc; l++) { + setPartnr(ml, -1, getArg(q,l), k); + r[l] = pushArgument(mb, r[l], getArg(q, l)); + } } - return r; + for(k=0; k < p->retc; k++) { + mat_add_var(ml, r[k], NULL, getArg(r[k], 0), mat_type(ml->v, m), -1, -1); + pushInstruction(mb, r[k]); + } } - static void mat_setop(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n) { @@ -1726,8 +1736,7 @@ OPTmergetableImplementation(Client cntxt (n=is_a_mat(getArg(p,fn), &ml)) >= 0 && (o=is_a_mat(getArg(p,fo), &ml)) >= 0){ assert(ml.v[m].mi->argc == ml.v[n].mi->argc); - if ((r = mat_apply3(&ml, mb, p, ml.v, m, n, o, fm, fn, fo)) != NULL) - mat_add(&ml, r, mat_type(ml.v, m), getFunctionId(p)); + mat_apply3(mb, p, &ml, m, n, o, fm, fn, fo); actions++; continue; } 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 @@ -3207,7 +3207,7 @@ rel2bin_insert( mvc *sql, sql_rel *rel, if (i->key && constraint) { stmt *ckeys = sql_insert_key(sql, newl, i->key, is, pin); - list_prepend(l, ckeys); + list_append(l, ckeys); } if (!insert) insert = is; @@ -3221,9 +3221,9 @@ rel2bin_insert( mvc *sql, sql_rel *rel, if (!insert) return NULL; - l = list_append(l, stmt_list(sql->sa, newl)); if (constraint) sql_insert_check_null(sql, t, newl, l); + l = list_append(l, stmt_list(sql->sa, newl)); if (!sql_insert_triggers(sql, t, l)) return sql_error(sql, 02, "INSERT INTO: triggers failed for table '%s'", t->base.name); if (insert->op1->nrcols == 0) { diff --git a/sql/backends/monet5/sql_upgrades.c b/sql/backends/monet5/sql_upgrades.c --- a/sql/backends/monet5/sql_upgrades.c +++ b/sql/backends/monet5/sql_upgrades.c @@ -1121,6 +1121,62 @@ sql_update_jul2015(Client c) } static str +sql_update_epoch(Client c, mvc *m) +{ + size_t bufsize = 1000, pos = 0; + char *buf = GDKmalloc(bufsize), *err = NULL; + mvc *sql = ((backend*) c->sqlcontext)->mvc; + ValRecord *schvar = stack_get_var(sql, "current_schema"); + char *schema = NULL; + sql_subtype tp; + int n = 0; + + if (schvar) + schema = strdup(schvar->val.sval); + pos += snprintf(buf + pos, bufsize - pos, "set schema \"sys\";\n"); + + sql_find_subtype(&tp, "bigint", 0, 0); + if (!sql_bind_func(m->sa, mvc_bind_schema(m, "sys"), "epoch", &tp, NULL, F_FUNC)) { + n++; + pos += snprintf(buf + pos, bufsize - pos, "\ +create function sys.\"epoch\"(sec BIGINT) returns TIMESTAMP external name timestamp.\"epoch\";\n"); + } + sql_find_subtype(&tp, "int", 0, 0); + if (!sql_bind_func(m->sa, mvc_bind_schema(m, "sys"), "epoch", &tp, NULL, F_FUNC)) { + n++; + pos += snprintf(buf + pos, bufsize - pos, "\ +create function sys.\"epoch\"(sec INT) returns TIMESTAMP external name timestamp.\"epoch\";\n"); + } + sql_find_subtype(&tp, "timestamp", 0, 0); + if (!sql_bind_func(m->sa, mvc_bind_schema(m, "sys"), "epoch", &tp, NULL, F_FUNC)) { + n++; + pos += snprintf(buf + pos, bufsize - pos, "\ +create function sys.\"epoch\"(ts TIMESTAMP) returns INT external name timestamp.\"epoch\";\n"); + } + sql_find_subtype(&tp, "timestamptz", 0, 0); + if (!sql_bind_func(m->sa, mvc_bind_schema(m, "sys"), "epoch", &tp, NULL, F_FUNC)) { + n++; + pos += snprintf(buf + pos, bufsize - pos, "\ +create function sys.\"epoch\"(ts TIMESTAMP WITH TIME ZONE) returns INT external name timestamp.\"epoch\";\n"); + } + pos += snprintf(buf + pos, bufsize - pos, + "insert into sys.systemfunctions (select id from sys.functions where name = 'epoch' and schema_id = (select id from sys.schemas where name = 'sys') and id not in (select function_id from sys.systemfunctions));\n"); + + if (schema) { + pos += snprintf(buf + pos, bufsize - pos, "set schema \"%s\";\n", schema); + free(schema); + } + + assert(pos < bufsize); + if (n) { + printf("Running database upgrade commands:\n%s\n", buf); + err = SQLstatementIntern(c, &buf, "update", 1, 0, NULL); + } + GDKfree(buf); + return err; /* usually MAL_SUCCEED */ +} + +static str sql_update_jun2016(Client c) { size_t bufsize = 25000, pos = 0; @@ -1349,6 +1405,12 @@ SQLupgrades(Client c, mvc *m) } } + /* add missing epoch functions */ + if ((err = sql_update_epoch(c, m)) != NULL) { + fprintf(stderr, "!%s\n", err); + GDKfree(err); + } + sql_find_subtype(&tp, "clob", 0, 0); if (!sql_bind_func(m->sa, mvc_bind_schema(m, "sys"), "storage", &tp, NULL, F_UNION)) { if ((err = sql_update_jun2016(c)) !=NULL) { diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -43,6 +43,8 @@ int digits2bits(int digits) return 8; else if (digits < 5) return 16; + else if (digits <= 8) + return 27; else if (digits < 10) return 32; else if (digits < 17) @@ -72,9 +74,9 @@ int bits2digits(int bits) return 6; else if (bits < 24) return 7; - else if (bits < 27) + else if (bits <= 27) return 8; - else if (bits < 30) + else if (bits <= 30) return 9; else if (bits <= 32) return 10; diff --git a/sql/include/sql_mem.h b/sql/include/sql_mem.h --- a/sql/include/sql_mem.h +++ b/sql/include/sql_mem.h @@ -15,25 +15,22 @@ #define SQL_ERR 0 #ifdef WIN32 -#ifndef LIBSQLSERVER +#if defined(LIBSQLSERVER) || defined(LIBSQLCOMMON) || defined(LIBBATSTORE) || defined(LIBSTORE) +#define sql_export extern __declspec(dllexport) +#define sqlcommon_export extern __declspec(dllexport) +#define sqlbat_export extern __declspec(dllexport) +#define sqlstore_export extern __declspec(dllexport) +#else #define sql_export extern __declspec(dllimport) -#else -#define sql_export extern __declspec(dllexport) -#endif -#ifndef LIBSQLCOMMON #define sqlcommon_export extern __declspec(dllimport) -#else -#define sqlcommon_export extern __declspec(dllexport) -#endif -#ifndef LIBBATSTORE #define sqlbat_export extern __declspec(dllimport) -#else -#define sqlbat_export extern __declspec(dllexport) +#define sqlstore_export extern __declspec(dllimport) #endif #else #define sql_export extern #define sqlcommon_export extern #define sqlbat_export extern +#define sqlstore_export extern #endif #define MNEW( type ) (type*)GDKmalloc(sizeof(type) ) 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 @@ -2209,6 +2209,37 @@ exps_share_expensive_exp( list *exps, li return 0; } +static int ambigious_ref( list *exps, sql_exp *e); +static int +ambigious_refs( list *exps, list *refs) +{ + node *n; + + for(n=refs->h; n; n = n->next) { + if (ambigious_ref(exps, n->data)) + return 1; + } + return 0; +} + +static int +ambigious_ref( list *exps, sql_exp *e) +{ + sql_exp *ne = NULL; + + if (e->type == e_column) { + if (e->l) + ne = exps_bind_column2(exps, e->l, e->r); + if (!ne && !e->l) + ne = exps_bind_column(exps, e->r, NULL); + if (ne && e != ne) + return 1; + } + if (e->type == e_func) + return ambigious_refs(exps, e->l); + return 0; +} + /* merge 2 projects into the lower one */ static sql_rel * rel_merge_projects(int *changes, mvc *sql, sql_rel *rel) @@ -2232,20 +2263,18 @@ rel_merge_projects(int *changes, mvc *sq sql_exp *e = n->data, *ne = NULL; /* We do not handle expressions pointing back in the list */ - if (e->type == e_column) { - if (e->l) - ne = exps_bind_column2(exps, e->l, e->r); - if (!ne && !e->l) - ne = exps_bind_column(exps, e->r, NULL); - if (ne && e != ne) { - all = 0; - break; - } else { - ne = NULL; - } + if (ambigious_ref(exps, e)) { + all = 0; + break; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list