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

Reply via email to