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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list