Changeset: 30614f273837 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=30614f273837 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/Tests/exports.stable.out gdk/gdk_join.c monetdb5/ChangeLog monetdb5/modules/mal/Tests/inspect05.stable.out monetdb5/modules/mal/clients.c monetdb5/modules/mal/clients.h monetdb5/modules/mal/clients.mal monetdb5/optimizer/opt_garbageCollector.c monetdb5/optimizer/opt_mitosis.c sql/ChangeLog sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_upgrades.c sql/common/sql_types.c sql/scripts/22_clients.sql sql/server/rel_rel.h sql/server/rel_select.c sql/server/rel_select.h sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.sql sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.err sql/test/BugTracker-2014/Tests/aggregates-intervals.Bug-3533.stable.out sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out.single sql/test/BugTracker/Tests/explain.SF-1739353.stable.out sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.stable.out sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.stable.out sql/test/emptydb-upgrade-chain-hge/Tests/package.py sql/test/emptydb-upgrade-chain/Tests/package.py sql/test/emptydb/Tests/check.stable.out sql/test/emptydb/Tests/check.stable.out.32bit sql/test/emptydb/Tests/check.stable.out.int128 sql/test/emptydb/Tests/package-hge.py sql/test/emptydb/Tests/package.py sql/test/sys-schema/Tests/systemfunctions.stable.out sql/test/sys-schema/Tests/systemfunctions.stable.out.int128 sql/test/testdb-upgrade-chain-hge/Tests/package.py sql/test/testdb-upgrade-chain/Tests/package.py sql/test/testdb/Tests/package-hge.py sql/test/testdb/Tests/package.py testing/Mtest.py.in Branch: sq2default Log Message:
merged with default diffs (truncated from 1267 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 @@ -10776,10 +10776,13 @@ stdout of test 'MAL-signatures` in direc [ "clients", "setquerytimeout", "pattern clients.setquerytimeout(sid:bte, n:int):void ", "CLTqueryTimeout;", "" ] [ "clients", "setquerytimeout", "pattern clients.setquerytimeout(sid:int, n:int):void ", "CLTqueryTimeout;", "A query is aborted after q seconds (q=0 means run undisturbed)." ] [ "clients", "setquerytimeout", "pattern clients.setquerytimeout(sid:sht, n:int):void ", "CLTqueryTimeout;", "" ] +[ "clients", "setsession", "pattern clients.setsession(n:lng):void ", "CLTsetSessionTimeout;", "Abort a session after n seconds." ] [ "clients", "setsessiontimeout", "pattern clients.setsessiontimeout(n:int):void ", "CLTsessionTimeout;", "" ] [ "clients", "setsessiontimeout", "pattern clients.setsessiontimeout(sid:bte, n:int):void ", "CLTsessionTimeout;", "" ] [ "clients", "setsessiontimeout", "pattern clients.setsessiontimeout(sid:int, n:int):void ", "CLTsessionTimeout;", "Set the session timeout for a particulat session id" ] [ "clients", "setsessiontimeout", "pattern clients.setsessiontimeout(sid:sht, n:int):void ", "CLTsessionTimeout;", "" ] +[ "clients", "settimeout", "pattern clients.settimeout(n:lng):void ", "CLTsetTimeout;", "Abort a query after n seconds." ] +[ "clients", "settimeout", "pattern clients.settimeout(q:lng, s:lng):void ", "CLTsetTimeout;", "Abort a query after q seconds (q=0 means run undisturbed).\nThe session timeout aborts the connection after spending too\nmany seconds on query processing." ] [ "clients", "setworkerlimit", "pattern clients.setworkerlimit(n:int):void ", "CLTsetworkerlimit;", "" ] [ "clients", "setworkerlimit", "pattern clients.setworkerlimit(sid:int, n:int):void ", "CLTsetworkerlimit;", "Limit the number of worker threads per query" ] [ "clients", "sha1sum", "command clients.sha1sum(pw:str):str ", "CLTsha1sum;", "Return hex string representation of the SHA-1 hash of the given string" ] 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 @@ -15164,10 +15164,13 @@ stdout of test 'MAL-signatures` in direc [ "clients", "setquerytimeout", "pattern clients.setquerytimeout(sid:bte, n:int):void ", "CLTqueryTimeout;", "" ] [ "clients", "setquerytimeout", "pattern clients.setquerytimeout(sid:int, n:int):void ", "CLTqueryTimeout;", "A query is aborted after q seconds (q=0 means run undisturbed)." ] [ "clients", "setquerytimeout", "pattern clients.setquerytimeout(sid:sht, n:int):void ", "CLTqueryTimeout;", "" ] +[ "clients", "setsession", "pattern clients.setsession(n:lng):void ", "CLTsetSessionTimeout;", "Abort a session after n seconds." ] [ "clients", "setsessiontimeout", "pattern clients.setsessiontimeout(n:int):void ", "CLTsessionTimeout;", "" ] [ "clients", "setsessiontimeout", "pattern clients.setsessiontimeout(sid:bte, n:int):void ", "CLTsessionTimeout;", "" ] [ "clients", "setsessiontimeout", "pattern clients.setsessiontimeout(sid:int, n:int):void ", "CLTsessionTimeout;", "Set the session timeout for a particulat session id" ] [ "clients", "setsessiontimeout", "pattern clients.setsessiontimeout(sid:sht, n:int):void ", "CLTsessionTimeout;", "" ] +[ "clients", "settimeout", "pattern clients.settimeout(n:lng):void ", "CLTsetTimeout;", "Abort a query after n seconds." ] +[ "clients", "settimeout", "pattern clients.settimeout(q:lng, s:lng):void ", "CLTsetTimeout;", "Abort a query after q seconds (q=0 means run undisturbed).\nThe session timeout aborts the connection after spending too\nmany seconds on query processing." ] [ "clients", "setworkerlimit", "pattern clients.setworkerlimit(n:int):void ", "CLTsetworkerlimit;", "" ] [ "clients", "setworkerlimit", "pattern clients.setworkerlimit(sid:int, n:int):void ", "CLTsetworkerlimit;", "Limit the number of worker threads per query" ] [ "clients", "sha1sum", "command clients.sha1sum(pw:str):str ", "CLTsha1sum;", "Return hex string representation of the SHA-1 hash of the given string" ] 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 @@ -717,7 +717,9 @@ str ALGfirstn(Client cntxt, MalBlkPtr mb str ALGgroupby(bat *res, const bat *gids, const bat *cnts); str ALGintersect(bat *r1, const bat *lid, const bat *rid, const bat *slid, const bat *srid, const bit *nil_matches, const lng *estimate); str ALGjoin(bat *r1, bat *r2, const bat *l, const bat *r, const bat *sl, const bat *sr, const bit *nil_matches, const lng *estimate); +str ALGjoin1(bat *r1, const bat *l, const bat *r, const bat *sl, const bat *sr, const bit *nil_matches, const lng *estimate); str ALGleftjoin(bat *r1, bat *r2, const bat *l, const bat *r, const bat *sl, const bat *sr, const bit *nil_matches, const lng *estimate); +str ALGleftjoin1(bat *r1, const bat *l, const bat *r, const bat *sl, const bat *sr, const bit *nil_matches, const lng *estimate); str ALGmaxany(ptr result, const bat *bid); str ALGmaxany_skipnil(ptr result, const bat *bid, const bit *skipnil); str ALGminany(ptr result, const bat *bid); @@ -911,14 +913,16 @@ str CLTchangeUsername(Client cntxt, MalB str CLTcheckPermission(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTgetClientId(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTgetPasswordHash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +str CLTgetProfile(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTgetScenario(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); -str CLTgetTimeout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTgetUsername(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTgetUsers(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTmd5sum(str *ret, str *pw); +str CLTqueryTimeout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTquit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTremoveUser(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTripemd160sum(str *ret, str *pw); +str CLTsessionTimeout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTsessions(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTsetListing(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CLTsetPassword(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c --- a/gdk/gdk_join.c +++ b/gdk/gdk_join.c @@ -3391,8 +3391,6 @@ leftjoin(BAT **r1p, BAT **r2p, BAT *l, B /* only_misses implies left output only */ assert(!only_misses || r2p == NULL); - /* only no right output allowed for semijoin and diff */ - assert(r2p != NULL || (semi | only_misses)); /* if nil_on_miss is set, we really need a right output */ assert(!nil_on_miss || r2p != NULL); /* if not_in is set, then so is only_misses */ diff --git a/monetdb5/ChangeLog b/monetdb5/ChangeLog --- a/monetdb5/ChangeLog +++ b/monetdb5/ChangeLog @@ -1,6 +1,14 @@ # ChangeLog file for MonetDB5 # This file is updated with Maddlog +* Tue Nov 19 2019 Pedro Ferreira <pedro.ferre...@monetdbsolutions.com> +- Added session identifier, number of workers and memory claim to the + sysmon queue. +- The worker (number of threads), memory (in MB) and optimizer pipeline + limits can now be set per user session basis. The query and session + timeouts are now set in seconds. +- With required privileges an user can set resource limits for a session. + * Wed Nov 13 2019 Sjoerd Mullender <sjo...@acm.org> - There are now versions of group.(sub)group(done) that produce a single output containing just the groups. diff --git a/monetdb5/modules/mal/Tests/inspect05.stable.out b/monetdb5/modules/mal/Tests/inspect05.stable.out --- a/monetdb5/modules/mal/Tests/inspect05.stable.out +++ b/monetdb5/modules/mal/Tests/inspect05.stable.out @@ -79,25 +79,26 @@ stdout of test 'inspect05` in directory [ 48@0, "orderidx", "pattern", "bat", "(bv:bat[:any_1], l:bat[:any_1]...):void ", "OIDXmerge;" ] [ 49@0, "orderidx", "pattern", "bat", "(bv:bat[:any_1], pieces:int):void ", "OIDXcreate;" ] [ 50@0, "orderidx", "pattern", "bat", "(bv:bat[:any_1]):void ", "OIDXcreate;" ] -[ 51@0, "partition", "pattern", "bat", "(b:bat[:any_1], pieces:int, n:int):bat[:any_1] ", "CMDBATpartition2;" ] -[ 52@0, "partition", "pattern", "bat", "(b:bat[:any_1]):bat[:any_1]... ", "CMDBATpartition;" ] -[ 53@0, "replace", "command", "bat", "(b:bat[:any_1], del:bat[:oid]):bat[:oid] ", "BKCreuseBATmap;" ] -[ 54@0, "replace", "command", "bat", "(b:bat[:any_1], del:bat[:oid]):bat[:any_1] ", "BKCreuseBAT;" ] -[ 55@0, "replace", "command", "bat", "(b:bat[:any_1], rid:bat[:oid], val:bat[:any_1], force:bit):bat[:any_1] ", "BKCbat_inplace_force;" ] -[ 56@0, "replace", "command", "bat", "(b:bat[:any_1], rid:bat[:oid], val:bat[:any_1]):bat[:any_1] ", "BKCbat_inplace;" ] -[ 57@0, "reuse", "command", "bat", "(b:bat[:any_1], h:oid, t:any_1, force:bit):bat[:any_1] ", "BKCbun_inplace_force;" ] -[ 58@0, "reuseMap", "command", "bat", "(b:bat[:any_1], h:oid, t:any_1):bat[:any_1] ", "BKCbun_inplace;" ] -[ 59@0, "save", "pattern", "bat", "(val:any_1):bat[:any_1] ", "CMDBATsingle;" ] -[ 60@0, "save", "command", "bat", "(b:bat[:any_1]):bit ", "BKCsetImprints;" ] -[ 61@0, "setAccess", "command", "bat", "(b:bat[:any_1]):bit ", "BKCsetHash;" ] -[ 62@0, "setColumn", "command", "bat", "(nme:str):bit ", "BKCsave;" ] -[ 63@0, "setHash", "command", "bat", "(nme:bat[:any_1]):void ", "BKCsave2;" ] -[ 64@0, "setImprints", "command", "bat", "(b:bat[:any_1]):void ", "BKCsetPersistent;" ] -[ 65@0, "setKey", "command", "bat", "(b:bat[:any_1]):void ", "BKCsetTransient;" ] -[ 66@0, "setName", "command", "bat", "(b:bat[:any_1], t:str):void ", "BKCsetColumn;" ] -[ 67@0, "setPersistent", "command", "bat", "(b:bat[:any_1], s:str):void ", "BKCsetName;" ] -[ 68@0, "setTransient", "command", "bat", "(b:bat[:any_1], mode:str):bat[:any_1] ", "BKCsetAccess;" ] -[ 69@0, "single", "command", "bat", "(b:bat[:any_1], mode:bit):bat[:any_1] ", "BKCsetkey;" ] +[ 51@0, "pack", "pattern", "bat", "(X_0:any_2...):bat[:any_2] ", "MATpackValues;" ] +[ 52@0, "partition", "pattern", "bat", "(b:bat[:any_1], pieces:int, n:int):bat[:any_1] ", "CMDBATpartition2;" ] +[ 53@0, "partition", "pattern", "bat", "(b:bat[:any_1]):bat[:any_1]... ", "CMDBATpartition;" ] +[ 54@0, "replace", "command", "bat", "(b:bat[:any_1], del:bat[:oid]):bat[:oid] ", "BKCreuseBATmap;" ] +[ 55@0, "replace", "command", "bat", "(b:bat[:any_1], del:bat[:oid]):bat[:any_1] ", "BKCreuseBAT;" ] +[ 56@0, "replace", "command", "bat", "(b:bat[:any_1], rid:bat[:oid], val:bat[:any_1], force:bit):bat[:any_1] ", "BKCbat_inplace_force;" ] +[ 57@0, "replace", "command", "bat", "(b:bat[:any_1], rid:bat[:oid], val:bat[:any_1]):bat[:any_1] ", "BKCbat_inplace;" ] +[ 58@0, "reuse", "command", "bat", "(b:bat[:any_1], h:oid, t:any_1, force:bit):bat[:any_1] ", "BKCbun_inplace_force;" ] +[ 59@0, "reuseMap", "command", "bat", "(b:bat[:any_1], h:oid, t:any_1):bat[:any_1] ", "BKCbun_inplace;" ] +[ 60@0, "save", "pattern", "bat", "(val:any_1):bat[:any_1] ", "CMDBATsingle;" ] +[ 61@0, "save", "command", "bat", "(b:bat[:any_1]):bit ", "BKCsetImprints;" ] +[ 62@0, "setAccess", "command", "bat", "(b:bat[:any_1]):bit ", "BKCsetHash;" ] +[ 63@0, "setColumn", "command", "bat", "(nme:str):bit ", "BKCsave;" ] +[ 64@0, "setHash", "command", "bat", "(nme:bat[:any_1]):void ", "BKCsave2;" ] +[ 65@0, "setImprints", "command", "bat", "(b:bat[:any_1]):void ", "BKCsetPersistent;" ] +[ 66@0, "setKey", "command", "bat", "(b:bat[:any_1]):void ", "BKCsetTransient;" ] +[ 67@0, "setName", "command", "bat", "(b:bat[:any_1], t:str):void ", "BKCsetColumn;" ] +[ 68@0, "setPersistent", "command", "bat", "(b:bat[:any_1], s:str):void ", "BKCsetName;" ] +[ 69@0, "setTransient", "command", "bat", "(b:bat[:any_1], mode:str):bat[:any_1] ", "BKCsetAccess;" ] +[ 70@0, "single", "command", "bat", "(b:bat[:any_1], mode:bit):bat[:any_1] ", "BKCsetkey;" ] # 08:55:30 > # 08:55:30 > Done. diff --git a/monetdb5/modules/mal/clients.c b/monetdb5/modules/mal/clients.c --- a/monetdb5/modules/mal/clients.c +++ b/monetdb5/modules/mal/clients.c @@ -364,6 +364,50 @@ CLTwakeup(void *ret, int *id) return MCawakeClient(*id); } +/* Set session time out based in seconds. As of December 2019, this function is deprecated */ +str +CLTsetSessionTimeout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + lng sto; + int idx = cntxt->idx; + + (void) mb; + if( idx < 0 || idx > MAL_MAXCLIENTS) + throw(MAL,"clients.setsession","Illegal session id %d", idx); + if (mal_clients[idx].mode == FREECLIENT) + throw(MAL,"clients.setsession","Session not active anymore"); + sto = *getArgReference_lng(stk,pci,1); + if (sto < 0) + throw(MAL,"clients.setsession","Session timeout should be >= 0"); + mal_clients[idx].sessiontimeout = sto * 1000000; + return MAL_SUCCEED; +} + +/* Set the current query timeout in seconds. As of December 2019, this function is deprecated */ +str +CLTsetTimeout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + lng qto,sto; + int idx = cntxt->idx; + + (void) mb; + if( idx < 0 || idx > MAL_MAXCLIENTS) + throw(MAL,"clients.settimeout","Illegal session id %d", idx); + if (mal_clients[idx].mode == FREECLIENT) + throw(MAL,"clients.settimeout","Session not active anymore"); + qto = *getArgReference_lng(stk,pci,1); + if (qto < 0) + throw(MAL,"clients.settimeout","Query timeout should be >= 0"); + if (pci->argc == 3) { + sto = *getArgReference_lng(stk,pci,2); + if( sto < 0) + throw(MAL,"clients.settimeout","Session timeout should be >= 0"); + mal_clients[idx].sessiontimeout = sto * 1000000; + } + mal_clients[idx].querytimeout = qto * 1000000; + return MAL_SUCCEED; +} + /* set session time out based in seconds, converted into microseconds */ str CLTqueryTimeout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) diff --git a/monetdb5/modules/mal/clients.h b/monetdb5/modules/mal/clients.h --- a/monetdb5/modules/mal/clients.h +++ b/monetdb5/modules/mal/clients.h @@ -26,6 +26,8 @@ mal_export str CLTLogin(bat *ret, bat *n mal_export str CLTInfo(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str CLTstop(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str CLTsuspend(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str CLTsetSessionTimeout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str CLTsetTimeout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str CLTqueryTimeout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str CLTsessionTimeout(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str CLTsetoptimizer(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); diff --git a/monetdb5/modules/mal/clients.mal b/monetdb5/modules/mal/clients.mal --- a/monetdb5/modules/mal/clients.mal +++ b/monetdb5/modules/mal/clients.mal @@ -60,6 +60,22 @@ pattern getprofile()(opt:str, q:int, s:i address CLTgetProfile comment "Retrieve the profile settings for a client"; +# As of December 2019, the pattern setsession is deprecated, use setsessiontimeout +pattern setsession(n:lng):void +address CLTsetSessionTimeout +comment "Abort a session after n seconds."; + +# As of December 2019, the pattern settimeout is deprecated, use setquerytimeout +pattern settimeout(n:lng):void +address CLTsetTimeout +comment "Abort a query after n seconds."; + +pattern settimeout(q:lng,s:lng):void +address CLTsetTimeout +comment "Abort a query after q seconds (q=0 means run undisturbed). +The session timeout aborts the connection after spending too +many seconds on query processing."; + # set properties of others pattern setquerytimeout(n:int):void address CLTqueryTimeout; diff --git a/monetdb5/optimizer/opt_garbageCollector.c b/monetdb5/optimizer/opt_garbageCollector.c --- a/monetdb5/optimizer/opt_garbageCollector.c +++ b/monetdb5/optimizer/opt_garbageCollector.c @@ -63,8 +63,6 @@ OPTgarbageCollectorImplementation(Client for(i = 0; i < limit; i++) if(mb->stmt[i] && getModuleId(mb->stmt[i]) == querylogRef && getFunctionId(mb->stmt[i]) == defineRef ){ p = getInstrPtr(mb,i); - if( i != 1) - fprintf(stderr, "define statement not in expected place %d\n", i); break; } diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c --- a/monetdb5/optimizer/opt_mitosis.c +++ b/monetdb5/optimizer/opt_mitosis.c @@ -11,23 +11,6 @@ #include "mal_interpreter.h" #include "gdk_utils.h" -static int -eligible(MalBlkPtr mb) -{ - InstrPtr p; - int i; - for (i = 1; i < mb->stop; i++) { - p = getInstrPtr(mb, i); - if (getModuleId(p) == sqlRef && getFunctionId(p) == assertRef && - p->argc > 2 && getArgType(mb, p, 2) == TYPE_str && - isVarConstant(mb, getArg(p, 2)) && - getVarConstant(mb, getArg(p, 2)).val.sval != NULL && - (strstr(getVarConstant(mb, getArg(p, 2)).val.sval, "PRIMARY KEY constraint") || - strstr(getVarConstant(mb, getArg(p, 2)).val.sval, "UNIQUE constraint"))) - return 0; - } - return 1; -} str OPTmitosisImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) @@ -48,14 +31,20 @@ OPTmitosisImplementation(Client cntxt, M //return 0; (void) cntxt; (void) stk; - if (!eligible(mb)) - return MAL_SUCCEED; activeClients = mb->activeClients = MCactiveClients(); old = mb->stmt; for (i = 1; i < mb->stop; i++) { InstrPtr p = old[i]; + if (getModuleId(p) == sqlRef && getFunctionId(p) == assertRef && + p->argc > 2 && getArgType(mb, p, 2) == TYPE_str && + isVarConstant(mb, getArg(p, 2)) && + getVarConstant(mb, getArg(p, 2)).val.sval != NULL && + (strstr(getVarConstant(mb, getArg(p, 2)).val.sval, "PRIMARY KEY constraint") || + strstr(getVarConstant(mb, getArg(p, 2)).val.sval, "UNIQUE constraint"))) + goto bailout; + /* mitosis/mergetable bailout conditions */ if (p->argc > 2 && getModuleId(p) == aggrRef && @@ -72,7 +61,7 @@ OPTmitosisImplementation(Client cntxt, M getFunctionId(p) != avgRef && _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list