Changeset: 72d6976ab495 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=72d6976ab495 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/Tests/exports.stable.out monetdb5/mal/mal_builder.c monetdb5/mal/mal_builder.h monetdb5/mal/mal_instruction.c monetdb5/mal/mal_instruction.h sql/backends/monet5/sql_statement.c sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.stable.out Branch: default Log Message:
Accept output diffs (truncated from 372 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 @@ -660,7 +660,7 @@ stdout of test 'MAL-signatures` in direc [ "bat", "orderidx", "pattern bat.orderidx(bv:bat[:any_1]):void ", "OIDXcreate;", "Introduces the OID index arrangement of ordered values" ] [ "bat", "orderidx", "pattern bat.orderidx(bv:bat[:any_1], pieces:int):void ", "OIDXcreate;", "Introduces the OID index arrangement of ordered values" ] [ "bat", "orderidx", "pattern bat.orderidx(bv:bat[:any_1], l:bat[:any_1]...):void ", "OIDXmerge;", "Consolidates the OID index arrangement" ] -[ "bat", "pack", "pattern bat.pack(X_0:any_2...):bat[:any_2] ", "MATpackValues;", "Materialize the MAT (of values) into a BAT" ] +[ "bat", "pack", "pattern bat.pack(X_0:any_2...):bat[:any_2] ", "MATpackValues;", "Materialize the values into a BAT. Avoiding a clash with mat.pack() in mergetable" ] [ "bat", "partition", "pattern bat.partition(b:bat[:any_1], pieces:int, n:int):bat[:any_1] ", "CMDBATpartition2;", "Create the n-th slice over the BAT broken into several pieces." ] [ "bat", "partition", "pattern bat.partition(b:bat[:any_1]):bat[:any_1]... ", "CMDBATpartition;", "Create a serie of slices over the BAT argument. The BUNs are distributed evenly." ] [ "bat", "replace", "command bat.replace(b:bat[:any_1], rid:bat[:oid], val:bat[:any_1]):bat[:any_1] ", "BKCbat_inplace;", "Perform replace for all BUNs of the second BAT into the first." ] 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 @@ -766,7 +766,7 @@ stdout of test 'MAL-signatures` in direc [ "bat", "orderidx", "pattern bat.orderidx(bv:bat[:any_1]):void ", "OIDXcreate;", "Introduces the OID index arrangement of ordered values" ] [ "bat", "orderidx", "pattern bat.orderidx(bv:bat[:any_1], pieces:int):void ", "OIDXcreate;", "Introduces the OID index arrangement of ordered values" ] [ "bat", "orderidx", "pattern bat.orderidx(bv:bat[:any_1], l:bat[:any_1]...):void ", "OIDXmerge;", "Consolidates the OID index arrangement" ] -[ "bat", "pack", "pattern bat.pack(X_0:any_2...):bat[:any_2] ", "MATpackValues;", "Materialize the MAT (of values) into a BAT" ] +[ "bat", "pack", "pattern bat.pack(X_0:any_2...):bat[:any_2] ", "MATpackValues;", "Materialize the values into a BAT. Avoiding a clash with mat.pack() in mergetable" ] [ "bat", "partition", "pattern bat.partition(b:bat[:any_1], pieces:int, n:int):bat[:any_1] ", "CMDBATpartition2;", "Create the n-th slice over the BAT broken into several pieces." ] [ "bat", "partition", "pattern bat.partition(b:bat[:any_1]):bat[:any_1]... ", "CMDBATpartition;", "Create a serie of slices over the BAT argument. The BUNs are distributed evenly." ] [ "bat", "replace", "command bat.replace(b:bat[:any_1], rid:bat[:oid], val:bat[:any_1]):bat[:any_1] ", "BKCbat_inplace;", "Perform replace for all BUNs of the second BAT into the first." ] 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 @@ -2418,6 +2418,7 @@ InstrPtr newFcnCall(MalBlkPtr mb, char * Symbol newFunction(str mod, str nme, int kind); MalStkPtr newGlobalStack(int size); InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme); +InstrPtr newInstructionArgs(MalBlkPtr mb, str modnme, str fcnnme, int args); MalBlkPtr newMalBlk(int elements); int newMalBlkStmt(MalBlkPtr mb, int elements); Plant newPlant(MalBlkPtr mb); @@ -2425,6 +2426,7 @@ InstrPtr newRaiseStmt(MalBlkPtr mb, str str newRef; InstrPtr newReturnStmt(MalBlkPtr mb); InstrPtr newStmt(MalBlkPtr mb, const char *module, const char *name); +InstrPtr newStmtArgs(MalBlkPtr mb, const char *module, const char *name, int args); Symbol newSymbol(str nme, int kind); int newTmpVariable(MalBlkPtr mb, malType type); int newTypeVariable(MalBlkPtr mb, malType type); 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 @@ -57,6 +57,27 @@ newStmt(MalBlkPtr mb, const char *module } InstrPtr +newStmtArgs(MalBlkPtr mb, const char *module, const char *name, int args) +{ + InstrPtr q; + str mName = putName(module), nName = putName(name); + + if(mName == NULL || nName == NULL) { + return NULL; + } + q = newInstructionArgs(mb, mName, nName, args); + if ( q == NULL) + return NULL; + setDestVar(q, newTmpVariable(mb, TYPE_any)); + if (getDestVar(q) < 0 || mb->errors != MAL_SUCCEED) { + freeInstruction(q); + return NULL; + } + pushInstruction(mb, q); + return q; +} + +InstrPtr newReturnStmt(MalBlkPtr mb) { InstrPtr q = newInstruction(mb, NULL, NULL); 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 @@ -13,6 +13,7 @@ #include "mal_instruction.h" mal_export InstrPtr newStmt(MalBlkPtr mb, const char *module, const char *name); +mal_export InstrPtr newStmtArgs(MalBlkPtr mb, const char *module, const char *name, int args); mal_export InstrPtr newAssignment(MalBlkPtr mb); mal_export InstrPtr newComment(MalBlkPtr mb, const char *val); mal_export InstrPtr newCatchStmt(MalBlkPtr mb, str nme); 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 @@ -444,6 +444,36 @@ prepareMalBlk(MalBlkPtr mb, str s) * Allocation of an instruction should always succeed. */ InstrPtr +newInstructionArgs(MalBlkPtr mb, str modnme, str fcnnme, int args) +{ + InstrPtr p = NULL; + + p = GDKzalloc(args * sizeof(p->argv[0]) + offsetof(InstrRecord, argv)); + if (p == NULL) { + /* We are facing an hard problem. + * The hack is to re-use an already allocated instruction. + * The marking of the block as containing errors should protect further actions. + */ + if( mb){ + mb->errors = createMalException(mb,0, TYPE, SQLSTATE(HY001) MAL_MALLOC_FAIL); + } + return NULL; + } + p->maxarg = args; + p->typechk = TYPE_UNKNOWN; + setModuleId(p, modnme); + setFunctionId(p, fcnnme); + p->argc = 1; + p->retc = 1; + p->mitosis = -1; + p->argv[0] = -1; /* watch out for direct use in variable table */ + /* Flow of control instructions are always marked as an assignment + * with modifier */ + p->token = ASSIGNsymbol; + return p; + +} +InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme) { InstrPtr p = NULL; diff --git a/monetdb5/mal/mal_instruction.h b/monetdb5/mal/mal_instruction.h --- a/monetdb5/mal/mal_instruction.h +++ b/monetdb5/mal/mal_instruction.h @@ -129,6 +129,7 @@ mal_export void addMalException(MalBlkPtr mb, str msg); mal_export void mal_instruction_reset(void); mal_export InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme); +mal_export InstrPtr newInstructionArgs(MalBlkPtr mb, str modnme, str fcnnme, int args); mal_export InstrPtr copyInstruction(InstrPtr p); mal_export void oldmoveInstruction(InstrPtr dst, InstrPtr src); mal_export void clrInstruction(InstrPtr p); diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -2192,8 +2192,8 @@ stmt_rs_column(backend *be, stmt *rs, in */ #define NEWRESULTSET -#define meta(P, Id, Tpe) \ -P = newStmt(mb, batRef, packRef);\ +#define meta(P, Id, Tpe, Args) \ +P = newStmtArgs(mb, batRef, packRef, Args);\ Id = getArg(P,0);\ setVarType(mb, Id, newBatType(Tpe));\ setVarFixed(mb, Id);\ @@ -2209,11 +2209,16 @@ dump_export_header(mvc *sql, MalBlkPtr m node *n; bool error = false; int ret = -1; + int args; + // gather the meta information int tblId, nmeId, tpeId, lenId, scaleId; InstrPtr list; InstrPtr tblPtr, nmePtr, tpePtr, lenPtr, scalePtr; + args = 4; + for (n = l->h; n; n = n->next) args ++; + list = newInstruction(mb, sqlRef, export_tableRef); getArg(list,0) = newTmpVariable(mb,TYPE_int); if( file >= 0){ @@ -2225,11 +2230,11 @@ dump_export_header(mvc *sql, MalBlkPtr m list = pushStr(mb, list, ns); list = pushInt(mb, list, onclient); } - meta(tblPtr, tblId, TYPE_str); - meta(nmePtr, nmeId, TYPE_str); - meta(tpePtr, tpeId, TYPE_str); - meta(lenPtr, lenId, TYPE_int); - meta(scalePtr, scaleId, TYPE_int); + meta(tblPtr, tblId, TYPE_str, args); + meta(nmePtr, nmeId, TYPE_str, args); + meta(tpePtr, tpeId, TYPE_str, args); + meta(lenPtr, lenId, TYPE_int, args); + meta(scalePtr, scaleId, TYPE_int, args); if(tblPtr == NULL || nmePtr == NULL || tpePtr == NULL || lenPtr == NULL || scalePtr == NULL) return -1; @@ -2479,19 +2484,23 @@ dump_header(mvc *sql, MalBlkPtr mb, stmt bool error = false; // gather the meta information int tblId, nmeId, tpeId, lenId, scaleId; + int args; InstrPtr list; InstrPtr tblPtr, nmePtr, tpePtr, lenPtr, scalePtr; + args = 4; + for (n = l->h; n; n = n->next) args++; + list = newInstruction(mb,sqlRef, resultSetRef); if(!list) { return NULL; } getArg(list,0) = newTmpVariable(mb,TYPE_int); - meta(tblPtr, tblId, TYPE_str); - meta(nmePtr, nmeId, TYPE_str); - meta(tpePtr, tpeId, TYPE_str); - meta(lenPtr, lenId, TYPE_int); - meta(scalePtr, scaleId, TYPE_int); + meta(tblPtr, tblId, TYPE_str, args); + meta(nmePtr, nmeId, TYPE_str, args); + meta(tpePtr, tpeId, TYPE_str, args); + meta(lenPtr, lenId, TYPE_int, args); + meta(scalePtr, scaleId, TYPE_int, args); if(tblPtr == NULL || nmePtr == NULL || tpePtr == NULL || lenPtr == NULL || scalePtr == NULL) return NULL; diff --git a/sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out b/sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out --- a/sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out +++ b/sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out @@ -62,12 +62,12 @@ stdout of test 'manifold.Bug-3556` in di % clob # type % 206 # length function user.s4_0():void; - X_3:void := querylog.define("explain select replace(a1,a2,a3), id\nfrom (\n select name as a1, \\'a\\' as a2, \\'A\\' as a3, id as id \n from sys.functions\n) as x;":str, "sequential_pipe":str, 34:int); - X_33:bat[:str] := bat.new(nil:str); - X_39:bat[:int] := bat.new(nil:int); - X_37:bat[:int] := bat.new(nil:int); - X_36:bat[:str] := bat.new(nil:str); - X_35:bat[:str] := bat.new(nil:str); + X_3:void := querylog.define("explain select replace(a1,a2,a3), id\nfrom (\n select name as a1, \\'a\\' as a2, \\'A\\' as a3, id as id \n from sys.functions\n) as x;":str, "sequential_pipe":str, 24:int); + X_33:bat[:str] := bat.pack("sys.L5":str, "sys.x":str); + X_34:bat[:str] := bat.pack("L5":str, "id":str); + X_35:bat[:str] := bat.pack("varchar":str, "int":str); + X_36:bat[:int] := bat.pack(0:int, 32:int); + X_37:bat[:int] := bat.pack(0:int, 0:int); X_6:int := sql.mvc(); C_7:bat[:oid] := sql.tid(X_6:int, "sys":str, "functions":str); X_20:bat[:str] := sql.bind(X_6:int, "sys":str, "functions":str, "name":str, 0:int); @@ -81,17 +81,7 @@ function user.s4_0():void; X_13:bat[:int] := sql.bind(X_6:int, "sys":str, "functions":str, "id":str, 1:int); X_18:bat[:int] := sql.delta(X_10:bat[:int], X_15:bat[:oid], X_16:bat[:int], X_13:bat[:int]); X_19:bat[:int] := algebra.projection(C_7:bat[:oid], X_18:bat[:int]); - X_40:bat[:str] := bat.append(X_33:bat[:str], "sys.L5":str); - X_42:bat[:str] := bat.append(X_35:bat[:str], "L5":str); - X_44:bat[:str] := bat.append(X_36:bat[:str], "varchar":str); - X_46:bat[:int] := bat.append(X_37:bat[:int], 0:int); - X_48:bat[:int] := bat.append(X_39:bat[:int], 0:int); - X_49:bat[:str] := bat.append(X_40:bat[:str], "sys.x":str); - X_51:bat[:str] := bat.append(X_42:bat[:str], "id":str); - X_53:bat[:str] := bat.append(X_44:bat[:str], "int":str); - X_55:bat[:int] := bat.append(X_46:bat[:int], 32:int); - X_57:bat[:int] := bat.append(X_48:bat[:int], 0:int); - sql.resultSet(X_49:bat[:str], X_51:bat[:str], X_53:bat[:str], X_55:bat[:int], X_57:bat[:int], X_29:bat[:str], X_19:bat[:int]); + sql.resultSet(X_33:bat[:str], X_34:bat[:str], X_35:bat[:str], X_36:bat[:int], X_37:bat[:int], X_29:bat[:str], X_19:bat[:int]); end user.s4_0; #inline actions= 0 time=2 usec #remap actions= 0 time=3 usec @@ -128,12 +118,12 @@ end user.s4_0; % clob # type % 210 # length function user.s6_0():void; - X_4:void := querylog.define("explain select replace(a1,a2,a3), id\nfrom (\n select name as a1, \\'a\\' as a2, \\'A\\' as a3, id + 1 as id \n from sys.functions\n) as x;":str, "sequential_pipe":str, 41:int); - X_43:bat[:str] := bat.new(nil:str); - X_49:bat[:int] := bat.new(nil:int); - X_47:bat[:int] := bat.new(nil:int); - X_46:bat[:str] := bat.new(nil:str); - X_45:bat[:str] := bat.new(nil:str); + X_4:void := querylog.define("explain select replace(a1,a2,a3), id\nfrom (\n select name as a1, \\'a\\' as a2, \\'A\\' as a3, id + 1 as id \n from sys.functions\n) as x;":str, "sequential_pipe":str, 31:int); + X_43:bat[:str] := bat.pack("sys.L5":str, "sys.x":str); + X_44:bat[:str] := bat.pack("L5":str, "id":str); + X_45:bat[:str] := bat.pack("varchar":str, "bigint":str); + X_46:bat[:int] := bat.pack(0:int, 64:int); + X_47:bat[:int] := bat.pack(0:int, 0:int); X_7:int := sql.mvc(); C_8:bat[:oid] := sql.tid(X_7:int, "sys":str, "functions":str); X_21:bat[:str] := sql.bind(X_7:int, "sys":str, "functions":str, "name":str, 0:int); @@ -152,17 +142,7 @@ function user.s6_0():void; X_32:bat[:lng] := batcalc.lng(X_20:bat[:int]); X_35:bat[:lng] := algebra.project(X_20:bat[:int], 1:lng); X_36:bat[:lng] := batcalc.+(X_32:bat[:lng], X_35:bat[:lng]); - X_50:bat[:str] := bat.append(X_43:bat[:str], "sys.L5":str); - X_52:bat[:str] := bat.append(X_45:bat[:str], "L5":str); - X_54:bat[:str] := bat.append(X_46:bat[:str], "varchar":str); - X_56:bat[:int] := bat.append(X_47:bat[:int], 0:int); - X_58:bat[:int] := bat.append(X_49:bat[:int], 0:int); - X_59:bat[:str] := bat.append(X_50:bat[:str], "sys.x":str); - X_61:bat[:str] := bat.append(X_52:bat[:str], "id":str); - X_63:bat[:str] := bat.append(X_54:bat[:str], "bigint":str); - X_65:bat[:int] := bat.append(X_56:bat[:int], 64:int); - X_67:bat[:int] := bat.append(X_58:bat[:int], 0:int); - sql.resultSet(X_59:bat[:str], X_61:bat[:str], X_63:bat[:str], X_65:bat[:int], X_67:bat[:int], X_39:bat[:str], X_36:bat[:lng]); + sql.resultSet(X_43:bat[:str], X_44:bat[:str], X_45:bat[:str], X_46:bat[:int], X_47:bat[:int], X_39:bat[:str], X_36:bat[:lng]); end user.s6_0; #inline actions= 0 time=1 usec #remap actions= 1 time=33 usec @@ -199,12 +179,12 @@ end user.s6_0; % clob # type % 211 # length function user.s8_0():void; - X_3:void := querylog.define("explain select replace(a1,a2,a3), id\nfrom (\n select name as a1, \\'a\\' as a2, \\'A\\' as a3, abs(id) as id \n from sys.functions\n) as x;":str, "sequential_pipe":str, 37:int); - X_38:bat[:str] := bat.new(nil:str); - X_44:bat[:int] := bat.new(nil:int); - X_42:bat[:int] := bat.new(nil:int); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list