Changeset: 670fa61d6ce5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/670fa61d6ce5
Branch: Jul2021
Log Message:
Not so big one, merged iso into Jul2021
diffs (truncated from 4832 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -9170,6 +9170,7 @@ stdout of test 'MAL-signatures` in direc
[ "rapi", "eval_aggr", "pattern rapi.eval_aggr(X_0:ptr, X_1:str,
X_2:any...):any... ", "RAPIevalAggr;", "" ]
[ "rapi", "prelude", "command rapi.prelude():void ", "RAPIprelude;",
"" ]
[ "rapi", "subeval_aggr", "pattern rapi.subeval_aggr(X_0:ptr, X_1:str,
X_2:any...):any... ", "RAPIevalAggr;", "" ]
+[ "remote", "assert", "pattern remote.assert(X_0:bit, X_1:str):void
", "RMTassert;", "" ]
[ "remote", "batbincopy", "pattern remote.batbincopy():bat[:any] ",
"RMTbincopyfrom;", "" ]
[ "remote", "batbincopy", "pattern remote.batbincopy(X_0:bat[:any]):void
", "RMTbincopyto;", "" ]
[ "remote", "batload", "pattern remote.batload(X_0:any_1,
X_1:int):bat[:any_1] ", "RMTbatload;", "" ]
@@ -9271,6 +9272,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "deltas", "pattern sql.deltas(X_0:str, X_1:str)
(X_2:bat[:int], X_3:bat[:lng], X_4:bat[:lng], X_5:bat[:lng], X_6:bat[:lng],
X_7:bat[:lng], X_8:bat[:int]) ", "mvc_delta_values;", "" ]
[ "sql", "deltas", "pattern sql.deltas(X_0:str, X_1:str, X_2:str)
(X_3:bat[:int], X_4:bat[:lng], X_5:bat[:lng], X_6:bat[:lng], X_7:bat[:lng],
X_8:bat[:lng], X_9:bat[:int]) ", "mvc_delta_values;", "" ]
[ "sql", "dense_rank", "pattern sql.dense_rank(X_0:any_1, X_1:bit,
X_2:bit):int ", "SQLdense_rank;", "" ]
+[ "sql", "deregister", "pattern sql.deregister():int ",
"RAstatementEnd;", "" ]
[ "sql", "diff", "pattern sql.diff(X_0:any_1):bit ", "SQLdiff;",
"" ]
[ "sql", "diff", "pattern sql.diff(X_0:bit, X_1:any_1):bit ",
"SQLdiff;", "" ]
[ "sql", "drop_hash", "unsafe pattern sql.drop_hash(X_0:str,
X_1:str):void ", "SQLdrop_hash;", "" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -12471,6 +12471,7 @@ stdout of test 'MAL-signatures` in direc
[ "rapi", "eval_aggr", "pattern rapi.eval_aggr(X_0:ptr, X_1:str,
X_2:any...):any... ", "RAPIevalAggr;", "" ]
[ "rapi", "prelude", "command rapi.prelude():void ", "RAPIprelude;",
"" ]
[ "rapi", "subeval_aggr", "pattern rapi.subeval_aggr(X_0:ptr, X_1:str,
X_2:any...):any... ", "RAPIevalAggr;", "" ]
+[ "remote", "assert", "pattern remote.assert(X_0:bit, X_1:str):void
", "RMTassert;", "" ]
[ "remote", "batbincopy", "pattern remote.batbincopy():bat[:any] ",
"RMTbincopyfrom;", "" ]
[ "remote", "batbincopy", "pattern remote.batbincopy(X_0:bat[:any]):void
", "RMTbincopyto;", "" ]
[ "remote", "batload", "pattern remote.batload(X_0:any_1,
X_1:int):bat[:any_1] ", "RMTbatload;", "" ]
@@ -12577,6 +12578,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "deltas", "pattern sql.deltas(X_0:str, X_1:str)
(X_2:bat[:int], X_3:bat[:lng], X_4:bat[:lng], X_5:bat[:lng], X_6:bat[:lng],
X_7:bat[:lng], X_8:bat[:int]) ", "mvc_delta_values;", "" ]
[ "sql", "deltas", "pattern sql.deltas(X_0:str, X_1:str, X_2:str)
(X_3:bat[:int], X_4:bat[:lng], X_5:bat[:lng], X_6:bat[:lng], X_7:bat[:lng],
X_8:bat[:lng], X_9:bat[:int]) ", "mvc_delta_values;", "" ]
[ "sql", "dense_rank", "pattern sql.dense_rank(X_0:any_1, X_1:bit,
X_2:bit):int ", "SQLdense_rank;", "" ]
+[ "sql", "deregister", "pattern sql.deregister():int ",
"RAstatementEnd;", "" ]
[ "sql", "diff", "pattern sql.diff(X_0:any_1):bit ", "SQLdiff;",
"" ]
[ "sql", "diff", "pattern sql.diff(X_0:bit, X_1:any_1):bit ",
"SQLdiff;", "" ]
[ "sql", "drop_hash", "unsafe pattern sql.drop_hash(X_0:str,
X_1:str):void ", "SQLdrop_hash;", "" ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -937,6 +937,7 @@ const char *deleteRef;
void deleteSymbol(Module scope, Symbol prg);
const char *deltaRef;
const char *dense_rankRef;
+const char *deregisterRef;
malType destinationType(MalBlkPtr mb, InstrPtr p);
const char *diffRef;
const char *diffcandRef;
diff --git a/monetdb5/mal/mal_exception.c b/monetdb5/mal/mal_exception.c
--- a/monetdb5/mal/mal_exception.c
+++ b/monetdb5/mal/mal_exception.c
@@ -29,7 +29,8 @@ static char *exceptionNames[] = {
/*11 */ "ArithmeticException",
/*12 */ "PermissionDeniedException",
/*13 */ "SQLException",
-/*14 */ "Deprecated operation",
+/*14 */ "RemoteException",
+/*15 */ "Deprecated operation",
/*EOE*/ NULL
};
diff --git a/monetdb5/mal/mal_exception.h b/monetdb5/mal/mal_exception.h
--- a/monetdb5/mal/mal_exception.h
+++ b/monetdb5/mal/mal_exception.h
@@ -26,7 +26,8 @@ enum malexception {
PARSE,
ARITH,
PERMD,
- SQL
+ SQL,
+ REMOTE
};
#define MAL_SUCCEED ((str) 0) /* no error */
diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c
--- a/monetdb5/modules/mal/remote.c
+++ b/monetdb5/modules/mal/remote.c
@@ -1662,10 +1662,39 @@ RMTregisterSupervisor(int *ret, str *sup
return MAL_SUCCEED;
}
+/* this is needed in remote plans */
+static str
+RMTassert(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ bool flg = (bool) *getArgReference_bit(stk, pci, 1);
+ str msg = *getArgReference_str(stk, pci, 2);
+
+ (void) cntxt;
+ (void) mb;
+ if (flg) {
+ if (strlen(msg) > 6 &&
+ msg[5] == '!' &&
+ (isdigit((unsigned char) msg[0]) ||
+ isupper((unsigned char) msg[0])) &&
+ (isdigit((unsigned char) msg[1]) ||
+ isupper((unsigned char) msg[1])) &&
+ (isdigit((unsigned char) msg[2]) ||
+ isupper((unsigned char) msg[2])) &&
+ (isdigit((unsigned char) msg[3]) ||
+ isupper((unsigned char) msg[3])) &&
+ (isdigit((unsigned char) msg[4]) ||
+ isupper((unsigned char) msg[4])))
+ throw(REMOTE, "assert", "%s", msg); /* includes state */
+ throw(REMOTE, "assert", SQLSTATE(M0M29) "%s", msg);
+ }
+ return MAL_SUCCEED;
+}
+
#include "mel.h"
mel_func remote_init_funcs[] = {
command("remote", "prelude", RMTprelude, false, "initialise the remote
module", args(1,1, arg("",void))),
command("remote", "epilogue", RMTepilogue, false, "release the resources held
by the remote module", args(1,1, arg("",void))),
+ pattern("remote", "assert", RMTassert, false, "Generate an exception when
b==true", args(1,3, arg("",void),arg("b",bit),arg("msg",str))),
command("remote", "resolve", RMTresolve, false, "resolve a pattern against
Merovingian and return the URIs", args(1,2, batarg("",str),arg("pattern",str))),
pattern("remote", "connect", RMTconnect, false, "returns a newly created
connection for uri, using user name and password", args(1,5,
arg("",str),arg("uri",str),arg("user",str),arg("passwd",str),arg("scen",str))),
command("remote", "connect", RMTconnectScen, false, "returns a newly created
connection for uri, using user name, password and scenario", args(1,6,
arg("",str),arg("uri",str),arg("user",str),arg("passwd",str),arg("scen",str),arg("columnar",bit))),
diff --git a/monetdb5/optimizer/opt_oltp.c b/monetdb5/optimizer/opt_oltp.c
--- a/monetdb5/optimizer/opt_oltp.c
+++ b/monetdb5/optimizer/opt_oltp.c
@@ -106,10 +106,10 @@ OPToltpImplementation(Client cntxt, MalB
p = old[i];
if( p->token == ENDsymbol){
// unlock all if there is an error
- q= newCatchStmt(mb,"MALexception");
- q= newExitStmt(mb,"MALexception");
- q= newCatchStmt(mb,"SQLexception");
- q= newExitStmt(mb,"SQLexception");
+ q= newCatchStmt(mb,"MALException");
+ q= newExitStmt(mb,"MALException");
+ q= newCatchStmt(mb,"SQLException");
+ q= newExitStmt(mb,"SQLException");
q= copyInstruction(lcks);
if( q == NULL){
for(; i<slimit; i++)
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -106,6 +106,7 @@ const char *defineRef;
const char *deleteRef;
const char *deltaRef;
const char *dense_rankRef;
+const char *deregisterRef;
const char *diffcandRef;
const char *differenceRef;
const char *disconnectRef;
@@ -412,6 +413,7 @@ void optimizerInit(void)
deleteRef = putName("delete");
deltaRef = putName("delta");
dense_rankRef = putName("dense_rank");
+ deregisterRef = putName("deregister");
diffcandRef= putName("diffcand");
differenceRef = putName("difference");
disconnectRef= putName("disconnect");
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -102,6 +102,7 @@ mal_export const char *defineRef;
mal_export const char *deleteRef;
mal_export const char *deltaRef;
mal_export const char *dense_rankRef;
+mal_export const char *deregisterRef;
mal_export const char *diffcandRef;
mal_export const char *differenceRef;
mal_export const char *diffRef;
diff --git a/sql/backends/monet5/CMakeLists.txt
b/sql/backends/monet5/CMakeLists.txt
--- a/sql/backends/monet5/CMakeLists.txt
+++ b/sql/backends/monet5/CMakeLists.txt
@@ -64,6 +64,7 @@ target_sources(sql
sql_assert.c sql_assert.h
sql_upgrades.c sql_upgrades.h
rel_bin.c rel_bin.h
+ rel_predicates.c rel_predicates.h
sql_cat.c sql_cat.h
sql_transaction.c sql_transaction.h
sql_statement.c sql_statement.h
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
@@ -18,6 +18,7 @@
#include "rel_updates.h"
#include "rel_unnest.h"
#include "rel_optimizer.h"
+#include "rel_predicates.h"
#include "sql_env.h"
#include "sql_optimizer.h"
#include "sql_gencode.h"
@@ -3939,6 +3940,10 @@ insert_check_ukey(backend *be, list *ins
sql_kc *c = m->data;
stmt *cs = list_fetch(inserts, c->c->colnr);
+ /* foreach column add predicate */
+ if (add_column_predicate(be, c->c) != LOG_OK)
+ return sql_error(sql, 02,
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+
col = stmt_col(be, c->c, dels, dels->partition);
if ((k->type == ukey) && stmt_has_null(col)) {
stmt *nn = stmt_selectnonil(be, col, s);
@@ -3958,6 +3963,10 @@ insert_check_ukey(backend *be, list *ins
sql_kc *c = m->data;
stmt *cs = list_fetch(inserts, c->c->colnr);
+ /* foreach column add predicate */
+ if (add_column_predicate(be, c->c) != LOG_OK)
+ return sql_error(sql, 02,
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+
col = stmt_col(be, c->c, dels, dels->partition);
list_append(lje, col);
list_append(rje, cs);
@@ -4018,6 +4027,10 @@ insert_check_ukey(backend *be, list *ins
sql_kc *c = k->columns->h->data;
stmt *s = list_fetch(inserts, c->c->colnr), *h = s;
+ /* add predicate for this column */
+ if (add_column_predicate(be, c->c) != LOG_OK)
+ return sql_error(sql, 02, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+
s = stmt_col(be, c->c, dels, dels->partition);
if ((k->type == ukey) && stmt_has_null(s)) {
stmt *nn = stmt_selectnonil(be, s, NULL);
@@ -4083,6 +4096,14 @@ insert_check_fkey(backend *be, list *ins
sql_subtype *bt = sql_bind_localtype("bit");
sql_subfunc *ne = sql_bind_func_result(sql, "sys", "<>", F_FUNC, bt, 2,
lng, lng);
+ for (node *m = k->columns->h; m; m = m->next) {
+ sql_kc *c = m->data;
+
+ /* foreach column add predicate */
+ if (add_column_predicate(be, c->c) != LOG_OK)
+ return sql_error(sql, 02, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ }
+
if (pin && list_length(pin->op4.lval))
s = pin->op4.lval->h->data;
if (s->key && s->nrcols == 0) {
@@ -4180,7 +4201,7 @@ sql_insert_triggers(backend *be, sql_tab
return res;
}
-static void
+static sql_table *
sql_insert_check_null(backend *be, sql_table *t, list *inserts)
{
mvc *sql = be->mvc;
@@ -4196,6 +4217,10 @@ sql_insert_check_null(backend *be, sql_t
stmt *s = i;
char *msg = NULL;
+ /* foreach column add predicate */
+ if (add_column_predicate(be, c) != LOG_OK)
+ return sql_error(sql, 02, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+
if (!(s->key && s->nrcols == 0)) {
s = stmt_selectnil(be, column(be, i));
s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1);
@@ -4208,6 +4233,7 @@ sql_insert_check_null(backend *be, sql_t
(void)stmt_exception(be, s, msg, 00001);
}
}
+ return t; /* return something to say it succeeded */
}
static stmt **
@@ -4257,8 +4283,8 @@ rel2bin_insert(backend *be, sql_rel *rel
if (idx_ins)
pin = refs_find_rel(refs, prel);
- if (constraint)
- sql_insert_check_null(be, t, inserts->op4.lval);
+ if (constraint && !sql_insert_check_null(be, t, inserts->op4.lval))
+ return NULL;
l = sa_list(sql->sa);
@@ -4336,6 +4362,12 @@ rel2bin_insert(backend *be, sql_rel *rel
if (!sql_insert_triggers(be, t, updates, 1))
return sql_error(sql, 02, SQLSTATE(27000) "INSERT INTO:
triggers failed for table '%s'", t->base.name);
+ /* update predicate list */
+ if (rel->r && !rel_predicates(be, rel->r))
+ return NULL;
+ if (!isNew(t) && sql_trans_add_dependency_change(be->mvc->session->tr,
t->base.id, dml) != LOG_OK)
+ return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+
if (ddl) {
ret = ddl;
list_prepend(l, ddl);
@@ -5324,6 +5356,10 @@ rel2bin_update(backend *be, sql_rel *rel
if (sql->cascade_action)
sql->cascade_action = NULL;
+ if (rel->r && !rel_predicates(be, rel->r))
+ return NULL;
+ if (!isNew(t) && sql_trans_add_dependency_change(be->mvc->session->tr,
t->base.id, dml) != LOG_OK)
+ return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
return cnt;
}
@@ -5563,6 +5599,11 @@ rel2bin_delete(backend *be, sql_rel *rel
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list