Changeset: c579cab524f3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c579cab524f3
Modified Files:
cmake/monetdb-toolchain.cmake
monetdb5/extras/mal_optimizer_template/opt_sql_append.c
monetdb5/mal/mal_builder.c
monetdb5/mal/mal_builder.h
monetdb5/mal/mal_instruction.c
monetdb5/mal/mal_instruction.h
monetdb5/mal/mal_module.c
monetdb5/mal/mal_namespace.c
monetdb5/mal/mal_parser.c
monetdb5/mal/mal_prelude.c
monetdb5/mal/mal_resolve.c
monetdb5/modules/mal/manifold.c
monetdb5/modules/mal/orderidx.c
monetdb5/optimizer/opt_commonTerms.c
monetdb5/optimizer/opt_dataflow.c
monetdb5/optimizer/opt_dict.c
monetdb5/optimizer/opt_emptybind.c
monetdb5/optimizer/opt_evaluate.c
monetdb5/optimizer/opt_generator.c
monetdb5/optimizer/opt_matpack.c
monetdb5/optimizer/opt_mergetable.c
monetdb5/optimizer/opt_mitosis.c
monetdb5/optimizer/opt_multiplex.c
monetdb5/optimizer/opt_pushselect.c
monetdb5/optimizer/opt_wrapper.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_optimizer.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_statement.c
sql/common/exception_buffer.c
sql/common/sql_hash.c
sql/storage/objectset.c
sql/storage/store.c
Branch: Jun2023
Log Message:
Do a log (and I mean a *lot*) of error checking.
We also now use the exception buffer (i.e. longjmp) more in case of
errors during parsing and optimization.
diffs (truncated from 7614 to 300 lines):
diff --git a/cmake/monetdb-toolchain.cmake b/cmake/monetdb-toolchain.cmake
--- a/cmake/monetdb-toolchain.cmake
+++ b/cmake/monetdb-toolchain.cmake
@@ -98,7 +98,6 @@ function(monetdb_default_compiler_option
add_option_if_available("-fstack-protector-all")
add_option_if_available("-Wpacked-bitfield-compat")
add_option_if_available("-Wsync-nand")
- add_option_if_available("-Wjump-misses-init")
add_option_if_available("-Wmissing-include-dirs")
add_option_if_available("-Wlogical-op")
add_option_if_available("-Wduplicated-cond")
diff --git a/monetdb5/extras/mal_optimizer_template/opt_sql_append.c
b/monetdb5/extras/mal_optimizer_template/opt_sql_append.c
--- a/monetdb5/extras/mal_optimizer_template/opt_sql_append.c
+++ b/monetdb5/extras/mal_optimizer_template/opt_sql_append.c
@@ -201,6 +201,12 @@ OPTsql_appendImplementation(Client cntxt
q2 = pushArgument(mb, q2, getArg(p, 5));
q2 = pushLng(mb, q2, 0);
q2 = pushArgument(mb, q2, getArg(q1, 0));
+ if (mb->errors) {
+ freeInstruction(q1);
+ freeInstruction(q2);
+ i--;
+ break;
+ }
pushInstruction(mb, q1);
pushInstruction(mb, q2);
diff --git a/monetdb5/mal/mal_builder.c b/monetdb5/mal/mal_builder.c
--- a/monetdb5/mal/mal_builder.c
+++ b/monetdb5/mal/mal_builder.c
@@ -219,6 +219,8 @@ newExitStmt(MalBlkPtr mb, const char *nm
InstrPtr
pushEndInstruction(MalBlkPtr mb)
{
+ if (mb->errors)
+ return NULL;
InstrPtr q = newInstruction(mb, NULL, NULL);
if (q == NULL)
@@ -229,6 +231,8 @@ pushEndInstruction(MalBlkPtr mb)
q->retc = 0;
q->argv[0] = 0;
pushInstruction(mb, q);
+ if (mb->errors)
+ return NULL;
return q;
}
@@ -253,8 +257,8 @@ pushInt(MalBlkPtr mb, InstrPtr q, int va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_int;
cst.val.ival = val;
cst.len = 0;
@@ -285,8 +289,8 @@ pushBte(MalBlkPtr mb, InstrPtr q, bte va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_bte;
cst.val.btval = val;
cst.len = 0;
@@ -317,8 +321,8 @@ pushOid(MalBlkPtr mb, InstrPtr q, oid va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_oid;
cst.val.oval = val;
cst.len = 0;
@@ -334,8 +338,8 @@ pushVoid(MalBlkPtr mb, InstrPtr q)
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_void;
cst.val.oval = oid_nil;
cst.len = 0;
@@ -366,8 +370,8 @@ pushLng(MalBlkPtr mb, InstrPtr q, lng va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_lng;
cst.val.lval = val;
cst.len = 0;
@@ -398,8 +402,8 @@ pushSht(MalBlkPtr mb, InstrPtr q, sht va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_sht;
cst.val.shval = val;
cst.len = 0;
@@ -431,8 +435,8 @@ pushHge(MalBlkPtr mb, InstrPtr q, hge va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_hge;
cst.val.hval = val;
cst.len = 0;
@@ -464,8 +468,8 @@ pushDbl(MalBlkPtr mb, InstrPtr q, dbl va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_dbl;
cst.val.dval = val;
cst.len = 0;
@@ -496,8 +500,8 @@ pushFlt(MalBlkPtr mb, InstrPtr q, flt va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_flt;
cst.val.fval = val;
cst.len = 0;
@@ -530,8 +534,8 @@ pushStr(MalBlkPtr mb, InstrPtr q, const
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
if (VALinit(&cst, TYPE_str, Val) == NULL) {
str msg = createException(MAL, "pushStr",
"Can not
allocate string variable");
@@ -566,8 +570,8 @@ pushBit(MalBlkPtr mb, InstrPtr q, bit va
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_bit;
cst.val.btval = val;
cst.len = 0;
@@ -583,12 +587,12 @@ pushNil(MalBlkPtr mb, InstrPtr q, int tp
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.len = 0;
if (!isaBatType(tpe) && tpe != TYPE_bat) {
assert(tpe < MAXATOMS); /* in particular, tpe!=TYPE_any */
- if (!tpe) {
+ if (tpe == TYPE_void) {
cst.vtype = TYPE_void;
cst.val.oval = oid_nil;
} else {
@@ -619,29 +623,28 @@ pushNilType(MalBlkPtr mb, InstrPtr q, ch
ValRecord cst;
str msg;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
idx = getAtomIndex(tpe, strlen(tpe), TYPE_any);
if (idx < 0 || idx >= GDKatomcnt || idx >= MAXATOMS) {
- str msg = createException(MAL, "pushNilType",
- "Can not
allocate type variable");
- addMalException(mb, msg);
- freeException(msg);
+ msg = createException(MAL, "pushNilType",
+ "Can not allocate
type variable");
} else {
cst.vtype = TYPE_void;
cst.val.oval = oid_nil;
cst.len = 0;
msg = convertConstant(idx, &cst);
- if (msg != MAL_SUCCEED) {
- addMalException(mb, msg);
- freeException(msg);
- } else {
+ if (msg == MAL_SUCCEED) {
_t = defConstant(mb, idx, &cst);
if (_t >= 0) {
return pushArgument(mb, q, _t);
}
}
}
+ if (msg) {
+ addMalException(mb, msg);
+ freeException(msg);
+ }
return q;
}
@@ -652,8 +655,8 @@ pushType(MalBlkPtr mb, InstrPtr q, int t
ValRecord cst;
str msg;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_void;
cst.val.oval = oid_nil;
cst.len = 0;
@@ -677,8 +680,8 @@ pushZero(MalBlkPtr mb, InstrPtr q, int t
ValRecord cst;
str msg;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
cst.vtype = TYPE_int;
cst.val.ival = 0;
cst.len = 0;
@@ -697,8 +700,8 @@ pushZero(MalBlkPtr mb, InstrPtr q, int t
InstrPtr
pushEmptyBAT(MalBlkPtr mb, InstrPtr q, int tpe)
{
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
setModuleId(q, getName("bat"));
setFunctionId(q, getName("new"));
@@ -714,8 +717,8 @@ pushValue(MalBlkPtr mb, InstrPtr q, ValP
int _t;
ValRecord cst;
- if (q == NULL)
- return NULL;
+ if (q == NULL || mb->errors)
+ return q;
if (VALcopy(&cst, vr) == NULL) {
str msg = createException(MAL, "pushValue", "Can not allocate
variable");
addMalException(mb, msg);
diff --git a/monetdb5/mal/mal_builder.h b/monetdb5/mal/mal_builder.h
--- a/monetdb5/mal/mal_builder.h
+++ b/monetdb5/mal/mal_builder.h
@@ -27,8 +27,13 @@ mal_export InstrPtr newReturnStmt(MalBlk
mal_export InstrPtr newFcnCall(MalBlkPtr mb, const char *mod, const char *fcn);
mal_export InstrPtr newFcnCallArgs(MalBlkPtr mb, const char *mod,
const char
*fcn, int args);
+mal_export InstrPtr pushEndInstruction(MalBlkPtr mb);
+
+/* all the below push* functions (and also pushArgument) return NULL
+ * _only_ if q is NULL, else they return q or a valid new instruction
+ * (and the old q was then freed); in case of error, mb->errors is set
+ * to a non-NULL value */
mal_export InstrPtr pushSht(MalBlkPtr mb, InstrPtr q, sht val);
-mal_export InstrPtr pushEndInstruction(MalBlkPtr mb);
mal_export InstrPtr pushInt(MalBlkPtr mb, InstrPtr q, int val);
mal_export InstrPtr pushLng(MalBlkPtr mb, InstrPtr q, lng val);
#ifdef HAVE_HGE
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -305,62 +305,37 @@ copyMalBlk(MalBlkPtr old)
}
mb->vsize = old->vsize;
- mb->vtop = old->vtop;
mb->vid = old->vid;
/* copy all variable records */
for (i = 0; i < old->vtop; i++) {
mb->var[i] = old->var[i];
- if (!VALcopy(&(mb->var[i].value), &(old->var[i].value))) {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]