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

Reply via email to