Changeset: 4a65076da211 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4a65076da211
Modified Files:
        monetdb5/mal/mal_linker.c
        monetdb5/mal/mal_resolve.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_execute.c
        sql/common/sql_list.c
        sql/include/sql_catalog.h
        sql/include/sql_list.h
        sql/server/rel_propagate.c
        sql/server/rel_select.c
        sql/server/rel_semantic.c
        sql/server/rel_unnest.c
        sql/server/rel_updates.c
        sql/server/sql_partition.c
        sql/storage/sql_catalog.c
        sql/storage/store.c
        sql/test/merge-partitions/Tests/mergepart23.SQL.py
        sql/test/merge-partitions/Tests/mergepart23.stable.err
        sql/test/subquery/Tests/subquery5.sql
        sql/test/subquery/Tests/subquery5.stable.err
Branch: default
Log Message:

Merged with Jun2020


diffs (truncated from 595 to 300 lines):

diff --git a/monetdb5/mal/mal_linker.c b/monetdb5/mal/mal_linker.c
--- a/monetdb5/mal/mal_linker.c
+++ b/monetdb5/mal/mal_linker.c
@@ -439,22 +439,40 @@ MSP_locate_sqlscript(const char *filenam
        return locate_file(filename, SQL_EXT, recurse);
 }
 
-
 int
-malLibraryEnabled(str name) {
+malLibraryEnabled(str name)
+{
        if (strcmp(name, "pyapi3") == 0) {
                const char *val = GDKgetenv("embedded_py");
                return val && (strcmp(val, "3") == 0 ||
                                           strcasecmp(val, "true") == 0 ||
                                           strcasecmp(val, "yes") == 0);
+       } else if (strcmp(name, "rapi") == 0) {
+               const char *val = GDKgetenv("embedded_r");
+               return val && (strcasecmp(val, "true") == 0 ||
+                                          strcasecmp(val, "yes") == 0);
+       } else if (strcmp(name, "capi") == 0) {
+               const char *val = GDKgetenv("embedded_c");
+               return val && (strcasecmp(val, "true") == 0 ||
+                                          strcasecmp(val, "yes") == 0);
        }
        return true;
 }
 
-char*
-malLibraryHowToEnable(str name) {
+#define HOW_TO_ENABLE_ERROR(LANGUAGE, OPTION) \
+       if (malLibraryEnabled(name)) \
+               return "Embedded " LANGUAGE " has not been installed. Please 
install it first, then start server with --set " OPTION; \
+       return "Embedded " LANGUAGE " has not been enabled. Start server with 
--set " OPTION;
+
+char *
+malLibraryHowToEnable(str name)
+{
        if (strcmp(name, "pyapi3") == 0) {
-               return "Embedded Python 3 has not been enabled. Start server 
with --set embedded_py=3";
+               HOW_TO_ENABLE_ERROR("Python 3", "embedded_py=3")
+       } else if (strcmp(name, "rapi") == 0) {
+               HOW_TO_ENABLE_ERROR("R", "embedded_r=true")
+       } else if (strcmp(name, "capi") == 0) {
+               HOW_TO_ENABLE_ERROR("C/C++", "embedded_c=true")
        }
        return "";
 }
diff --git a/monetdb5/mal/mal_resolve.c b/monetdb5/mal/mal_resolve.c
--- a/monetdb5/mal/mal_resolve.c
+++ b/monetdb5/mal/mal_resolve.c
@@ -536,7 +536,7 @@ typeChecker(Module scope, MalBlkPtr mb, 
                 */
                if (!isaSignature(p) && !getInstrPtr(mb, 0)->polymorphic) {
                        if (!silent) {
-                               char *errsig;
+                               char *errsig = NULL;
                                if (!malLibraryEnabled(p->modname)) {
                                        mb->errors = createMalException(mb, 
idx, TYPE,
                                                                                
"'%s%s%s' library error in: %s",
@@ -544,13 +544,21 @@ typeChecker(Module scope, MalBlkPtr mb, 
                                                                                
(getModuleId(p) ? "." : ""),
                                                                                
getFunctionId(p), malLibraryHowToEnable(p->modname));
                                } else {
-                                       errsig = instruction2str(mb,0,p, 
(LIST_MAL_NAME | LIST_MAL_TYPE | LIST_MAL_VALUE));
+                                       bool free_errsig = false, 
special_undefined = false;
+                                       errsig = 
malLibraryHowToEnable(p->modname);
+                                       if (!strcmp(errsig, "")) {
+                                               errsig = 
instruction2str(mb,0,p, (LIST_MAL_NAME | LIST_MAL_TYPE | LIST_MAL_VALUE));
+                                               free_errsig = true;
+                                       } else {
+                                               special_undefined = true;
+                                       }
                                        mb->errors = createMalException(mb, 
idx, TYPE,
-                                                                               
"'%s%s%s' undefined in: %s",
+                                                                               
"'%s%s%s' undefined%s: %s",
                                                                                
(getModuleId(p) ? getModuleId(p) : ""),
                                                                                
(getModuleId(p) ? "." : ""),
-                                                                               
getFunctionId(p), errsig?errsig:"failed instruction2str()");
-                                       GDKfree(errsig);
+                                                                               
getFunctionId(p), special_undefined ? "" : " in", errsig?errsig:"failed 
instruction2str()");
+                                       if (free_errsig)
+                                               GDKfree(errsig);
                                }
                        } 
                        p->typechk = TYPE_UNKNOWN;
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
@@ -1435,11 +1435,18 @@ rel_parse_value(backend *be, char *query
        if (m->session->status || m->errstr[0]) {
                int status = m->session->status;
 
-               memcpy(o.errstr, m->errstr, sizeof(o.errstr));
+               strcpy(o.errstr, m->errstr);
                *m = o;
                m->session->status = status;
        } else {
+               int label = m->label;
+
+               while (m->topvars > o.topvars) {
+                       if (m->vars[--m->topvars].name)
+                               c_delete(m->vars[m->topvars].name);
+               }
                *m = o;
+               m->label = label;
        }
        return s;
 }
@@ -3595,19 +3602,23 @@ sql_parse(backend *be, sql_allocator *sa
                sa_destroy(m->sa);
        m->sym = NULL;
        {
+               int label = m->label;
                int status = m->session->status;
                int sizevars = m->sizevars, topvars = m->topvars;
                sql_var *vars = m->vars;
                /* cascade list maybe removed */
                list *cascade_action = m->cascade_action;
+               char *mquery = m->query;
 
                strcpy(o->errstr, m->errstr);
                *m = *o;
+               m->label = label;
                m->sizevars = sizevars;
                m->topvars = topvars;
                m->vars = vars;
                m->session->status = status;
                m->cascade_action = cascade_action;
+               m->query = mquery;
        }
        _DELETE(o);
        return sq;
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -256,7 +256,7 @@ alter_table_add_range_partition(mvc *sql
                                                                                
"one partition can store null values at the time", err->t->s->base.name, 
err->base.name);
                        } else {
                                ssize_t (*atomtostr)(str *, size_t *, const 
void *, bool) = BATatoms[tp1].atomToStr;
-                               ptr nil = ATOMnil(tp1);
+                               const void *nil = ATOMnilptr(tp1);
                                sql_table *errt = mvc_bind_table(sql, mt->s, 
err->base.name);
 
                                if (!ATOMcmp(tp1, nil, 
err->part.range.minvalue)) {
@@ -364,12 +364,11 @@ alter_table_add_value_partition(mvc *sql
                }
 
                nextv = SA_ZNEW(sql->session->tr->sa, sql_part_value); /* 
instantiate the part value */
-               nextv->tpe = tpe;
                nextv->value = sa_alloc(sql->session->tr->sa, len);
                memcpy(nextv->value, pnext, len);
                nextv->length = len;
 
-               if (list_append_sorted(values, nextv, 
sql_values_list_element_validate_and_insert) != NULL) {
+               if (list_append_sorted(values, nextv, &tpe, 
sql_values_list_element_validate_and_insert) != NULL) {
                        msg = 
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
                                                                        "ALTER 
TABLE: there are duplicated values in the list");
                        goto finish;
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
@@ -448,20 +448,16 @@ SQLescapeString(str s)
 str
 SQLstatementIntern(Client c, str *expr, str nme, bit execute, bit output, 
res_table **result)
 {
-       int status = 0;
-       int err = 0;
+       int status = 0, err = 0, oldvtop, oldstop = 1, inited = 0, label, ac, 
sizevars, topvars;
        mvc *o, *m;
-       int ac, sizevars, topvars;
        sql_var *vars;
-       int oldvtop, oldstop = 1;
        buffer *b;
-       char *n;
+       char *n, *mquery;
        bstream *bs;
        stream *buf;
        str msg = MAL_SUCCEED;
        backend *be, *sql = (backend *) c->sqlcontext;
        size_t len = strlen(*expr);
-       int inited = 0;
 
 #ifdef _SQL_COMPILE
        mnstr_printf(c->fdout, "#SQLstatement:%s\n", *expr);
@@ -700,17 +696,21 @@ endofcompile:
        m->sa = NULL;
        m->sym = NULL;
        /* variable stack maybe resized, ie we need to keep the new stack */
+       label = m->label;
        status = m->session->status;
        sizevars = m->sizevars;
        topvars = m->topvars;
        vars = m->vars;
+       mquery = m->query;
        *m = *o;
        _DELETE(o);
+       m->label = label;
        m->sizevars = sizevars;
        m->topvars = topvars;
        m->vars = vars;
        m->session->status = status;
        m->session->auto_commit = ac;
+       m->query = mquery;
        if (inited)
                SQLresetClient(c);
        return msg;
diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c
--- a/sql/common/sql_list.c
+++ b/sql/common/sql_list.c
@@ -175,7 +175,7 @@ list_append_with_validate(list *l, void 
 }
 
 void*
-list_append_sorted(list *l, void *data, fcmpvalidate cmp)
+list_append_sorted(list *l, void *data, void *extra, fcmpvalidate cmp)
 {
        node *n = node_create(l->sa, data), *m, *prev = NULL;
        int first = 1, comp = 0;
@@ -188,7 +188,7 @@ list_append_sorted(list *l, void *data, 
                l->t = n;
        } else {
                for (m = l->h; m; m = m->next) {
-                       err = cmp(m->data, data, &comp);
+                       err = cmp(m->data, data, extra, &comp);
                        if(err)
                                return err;
                        if(comp < 0)
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -604,7 +604,6 @@ typedef enum table_types {
 #define TABLE_APPENDONLY       2
 
 typedef struct sql_part_value {
-       sql_subtype tpe;
        ptr value;
        size_t length;
 } sql_part_value;
@@ -755,7 +754,7 @@ extern node *find_sql_func_node(sql_sche
 extern node *find_sql_trigger_node(sql_schema *s, sqlid id);
 extern sql_trigger *sql_trans_find_trigger(sql_trans *tr, sqlid id);
 
-extern void *sql_values_list_element_validate_and_insert(void *v1, void *v2, 
int* res);
+extern void *sql_values_list_element_validate_and_insert(void *v1, void *v2, 
void *tpe, int* res);
 extern void *sql_range_part_validate_and_insert(void *v1, void *v2);
 extern void *sql_values_part_validate_and_insert(void *v1, void *v2);
 
diff --git a/sql/include/sql_list.h b/sql/include/sql_list.h
--- a/sql/include/sql_list.h
+++ b/sql/include/sql_list.h
@@ -58,7 +58,7 @@ extern int list_traverse(list *l, traver
  * Returns 0 if data and key are equal 
  * */
 typedef int (*fcmp) (void *data, void *key);
-typedef void *(*fcmpvalidate) (void *v1, void *v2, int *cmp);
+typedef void *(*fcmpvalidate) (void *v1, void *v2, void *extra, int *cmp);
 typedef void *(*fvalidate) (void *v1, void *v2);
 typedef int (*fcmp2) (void *data, void *v1, void *v2);
 typedef void *(*fdup) (void *data);
@@ -68,7 +68,7 @@ typedef void *(*fmap) (void *data, void 
 
 extern void *list_traverse_with_validate(list *l, void *data, fvalidate cmp);
 extern void *list_append_with_validate(list *l, void *data, fvalidate cmp);
-extern void *list_append_sorted(list *l, void *data, fcmpvalidate cmp);
+extern void *list_append_sorted(list *l, void *data, void *extra, fcmpvalidate 
cmp);
 extern node *list_find(list *l, void *key, fcmp cmp);
 extern int  list_position(list *l, void *val);
 extern void *list_fetch(list *l, int pos);
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -305,7 +305,7 @@ propagate_validation_to_upper_tables(sql
                                list *exps = new_exp_list(sql->sa);
                                for (node *n = spt->part.values->h ; n ; n = 
n->next) {
                                        sql_part_value *next = 
(sql_part_value*) n->data;
-                                       sql_exp *e1 = 
create_table_part_atom_exp(sql, next->tpe, next->value);
+                                       sql_exp *e1 = 
create_table_part_atom_exp(sql, spt->tpe, next->value);
                                        list_append(exps, e1);
                                }
                                rel = rel_list(sql->sa, rel, 
create_list_partition_anti_rel(query, it, pt, spt->with_nills, exps));
@@ -734,7 +734,7 @@ rel_generate_subinserts(sql_query *query
                                list *exps = new_exp_list(sql->sa);
                                for (node *nn = pt->part.values->h ; nn ; nn = 
nn->next) {
                                        sql_part_value *next = 
(sql_part_value*) nn->data;
-                                       sql_exp *e1 = 
create_table_part_atom_exp(sql, next->tpe, next->value);
+                                       sql_exp *e1 = 
create_table_part_atom_exp(sql, pt->tpe, next->value);
                                        list_append(exps, e1);
                                        list_append(anti_exps, exp_copy(sql, 
e1));
                                }
@@ -951,7 +951,7 @@ rel_subtable_insert(sql_query *query, sq
                if (list_length(pt->part.values)) { /* if the partition holds 
non-null values */
                        for (node *n = pt->part.values->h ; n ; n = n->next) {
                                sql_part_value *next = (sql_part_value*) 
n->data;
-                               sql_exp *e1 = create_table_part_atom_exp(sql, 
next->tpe, next->value);
+                               sql_exp *e1 = create_table_part_atom_exp(sql, 
pt->tpe, next->value);
                                list_append(anti_exps, exp_copy(sql, e1));
                        }
                        anti_exp = exp_in(sql->sa, exp_copy(sql, anti_le), 
anti_exps, cmp_notin);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to