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