Changeset: d50298371bb0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d50298371bb0 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 monetdb5/modules/mal/mat.mal sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out sql/backends/monet5/sql_statement.c sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-0join-query.stable.out sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-0join-view.stable.out sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.stable.out sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.stable.out sql/test/remote/Tests/partition_elim.stable.out sql/test/sys-schema/Tests/systemfunctions.stable.out sql/test/sys-schema/Tests/systemfunctions.stable.out.int128 Branch: default Log Message:
Reduce the SQL header to just 5 BATs. Still upgrade on the pre-allocation of the corresponding argument list is needed to avoid repetitive calls to malloc. diffs (truncated from 1851 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,6 +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", "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,6 +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", "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/monetdb5/modules/mal/mat.mal b/monetdb5/modules/mal/mat.mal --- a/monetdb5/modules/mal/mat.mal +++ b/monetdb5/modules/mal/mat.mal @@ -11,6 +11,10 @@ address MATpack comment "Define a Merge Association Table (MAT). Fall back to the pack operation when this is called "; +pattern bat.pack(:any_2...):bat[:any_2] +address MATpackValues +comment "Materialize the values into a BAT. Avoiding a clash with mat.pack() in mergetable"; + pattern pack(:any_2...):bat[:any_2] address MATpackValues comment "Materialize the MAT (of values) into a BAT"; diff --git a/sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out b/sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out --- a/sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out +++ b/sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out @@ -169,12 +169,12 @@ end user.s8_0; % clob # type % 114 # length function user.s16_0():void; - X_1:void := querylog.define("explain select fuse(a,b) from udf_fuse;":str, "sequential_pipe":str, 27:int); - X_29:bat[:str] := bat.new(nil:str); - X_35:bat[:int] := bat.new(nil:int); - X_33:bat[:int] := bat.new(nil:int); - X_32:bat[:str] := bat.new(nil:str); - X_31:bat[:str] := bat.new(nil:str); + X_1:void := querylog.define("explain select fuse(a,b) from udf_fuse;":str, "sequential_pipe":str, 22:int); + X_29:bat[:str] := bat.pack("sys.L1":str); + X_30:bat[:str] := bat.pack("L1":str); + X_31:bat[:str] := bat.pack("smallint":str); + X_32:bat[:int] := bat.pack(16:int); + X_33:bat[:int] := bat.pack(0:int); X_4:int := sql.mvc(); C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_fuse":str); X_8:bat[:bte] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "a":str, 0:int); @@ -182,12 +182,7 @@ function user.s16_0():void; X_18:bat[:bte] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "b":str, 0:int); X_24:bat[:bte] := algebra.projection(C_5:bat[:oid], X_18:bat[:bte]); X_25:bat[:sht] := batudf.fuse(X_17:bat[:bte], X_24:bat[:bte]); - X_36:bat[:str] := bat.append(X_29:bat[:str], "sys.L1":str); - X_38:bat[:str] := bat.append(X_31:bat[:str], "L1":str); - X_40:bat[:str] := bat.append(X_32:bat[:str], "smallint":str); - X_42:bat[:int] := bat.append(X_33:bat[:int], 16:int); - X_44:bat[:int] := bat.append(X_35:bat[:int], 0:int); - sql.resultSet(X_36:bat[:str], X_38:bat[:str], X_40:bat[:str], X_42:bat[:int], X_44:bat[:int], X_25:bat[:sht]); + sql.resultSet(X_29:bat[:str], X_30:bat[:str], X_31:bat[:str], X_32:bat[:int], X_33:bat[:int], X_25:bat[:sht]); end user.s16_0; #inline actions= 0 time=1 usec #remap actions= 1 time=6 usec @@ -220,12 +215,12 @@ end user.s16_0; % clob # type % 114 # length function user.s18_0():void; - X_1:void := querylog.define("explain select fuse(c,d) from udf_fuse;":str, "sequential_pipe":str, 27:int); - X_29:bat[:str] := bat.new(nil:str); - X_35:bat[:int] := bat.new(nil:int); - X_33:bat[:int] := bat.new(nil:int); - X_32:bat[:str] := bat.new(nil:str); - X_31:bat[:str] := bat.new(nil:str); + X_1:void := querylog.define("explain select fuse(c,d) from udf_fuse;":str, "sequential_pipe":str, 22:int); + X_29:bat[:str] := bat.pack("sys.L1":str); + X_30:bat[:str] := bat.pack("L1":str); + X_31:bat[:str] := bat.pack("int":str); + X_32:bat[:int] := bat.pack(32:int); + X_33:bat[:int] := bat.pack(0:int); X_4:int := sql.mvc(); C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_fuse":str); X_8:bat[:sht] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "c":str, 0:int); @@ -233,12 +228,7 @@ function user.s18_0():void; X_18:bat[:sht] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "d":str, 0:int); X_24:bat[:sht] := algebra.projection(C_5:bat[:oid], X_18:bat[:sht]); X_25:bat[:int] := batudf.fuse(X_17:bat[:sht], X_24:bat[:sht]); - X_36:bat[:str] := bat.append(X_29:bat[:str], "sys.L1":str); - X_38:bat[:str] := bat.append(X_31:bat[:str], "L1":str); - X_40:bat[:str] := bat.append(X_32:bat[:str], "int":str); - X_42:bat[:int] := bat.append(X_33:bat[:int], 32:int); - X_44:bat[:int] := bat.append(X_35:bat[:int], 0:int); - sql.resultSet(X_36:bat[:str], X_38:bat[:str], X_40:bat[:str], X_42:bat[:int], X_44:bat[:int], X_25:bat[:int]); + sql.resultSet(X_29:bat[:str], X_30:bat[:str], X_31:bat[:str], X_32:bat[:int], X_33:bat[:int], X_25:bat[:int]); end user.s18_0; #inline actions= 0 time=0 usec #remap actions= 1 time=4 usec @@ -271,12 +261,12 @@ end user.s18_0; % clob # type % 114 # length function user.s20_0():void; - X_1:void := querylog.define("explain select fuse(e,f) from udf_fuse;":str, "sequential_pipe":str, 27:int); - X_29:bat[:str] := bat.new(nil:str); - X_35:bat[:int] := bat.new(nil:int); - X_33:bat[:int] := bat.new(nil:int); - X_32:bat[:str] := bat.new(nil:str); - X_31:bat[:str] := bat.new(nil:str); + X_1:void := querylog.define("explain select fuse(e,f) from udf_fuse;":str, "sequential_pipe":str, 22:int); + X_29:bat[:str] := bat.pack("sys.L1":str); + X_30:bat[:str] := bat.pack("L1":str); + X_31:bat[:str] := bat.pack("bigint":str); + X_32:bat[:int] := bat.pack(64:int); + X_33:bat[:int] := bat.pack(0:int); X_4:int := sql.mvc(); C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_fuse":str); X_8:bat[:int] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "e":str, 0:int); @@ -284,12 +274,7 @@ function user.s20_0():void; X_18:bat[:int] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "f":str, 0:int); X_24:bat[:int] := algebra.projection(C_5:bat[:oid], X_18:bat[:int]); X_25:bat[:lng] := batudf.fuse(X_17:bat[:int], X_24:bat[:int]); - X_36:bat[:str] := bat.append(X_29:bat[:str], "sys.L1":str); - X_38:bat[:str] := bat.append(X_31:bat[:str], "L1":str); - X_40:bat[:str] := bat.append(X_32:bat[:str], "bigint":str); - X_42:bat[:int] := bat.append(X_33:bat[:int], 64:int); - X_44:bat[:int] := bat.append(X_35:bat[:int], 0:int); - sql.resultSet(X_36:bat[:str], X_38:bat[:str], X_40:bat[:str], X_42:bat[:int], X_44:bat[:int], X_25:bat[:lng]); + sql.resultSet(X_29:bat[:str], X_30:bat[:str], X_31:bat[:str], X_32:bat[:int], X_33:bat[:int], X_25:bat[:lng]); end user.s20_0; #inline actions= 0 time=0 usec #remap actions= 1 time=4 usec diff --git a/sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out b/sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out --- a/sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out +++ b/sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out @@ -107,23 +107,17 @@ end user.s4_0; % clob # type % 114 # length function user.s16_0():void; - X_1:void := querylog.define("explain select reverse(x) from udf_reverse;":str, "sequential_pipe":str, 22:int); - X_22:bat[:str] := bat.new(nil:str); - X_28:bat[:int] := bat.new(nil:int); - X_26:bat[:int] := bat.new(nil:int); - X_25:bat[:str] := bat.new(nil:str); - X_24:bat[:str] := bat.new(nil:str); + X_1:void := querylog.define("explain select reverse(x) from udf_reverse;":str, "sequential_pipe":str, 17:int); + X_22:bat[:str] := bat.pack("sys.L1":str); + X_23:bat[:str] := bat.pack("L1":str); + X_24:bat[:str] := bat.pack("clob":str); + X_25:bat[:int] := bat.pack(0:int); X_4:int := sql.mvc(); C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_reverse":str); X_8:bat[:str] := sql.bind(X_4:int, "sys":str, "udf_reverse":str, "x":str, 0:int); X_17:bat[:str] := algebra.projection(C_5:bat[:oid], X_8:bat[:str]); X_18:bat[:str] := batudf.reverse(X_17:bat[:str]); - X_29:bat[:str] := bat.append(X_22:bat[:str], "sys.L1":str); - X_31:bat[:str] := bat.append(X_24:bat[:str], "L1":str); - X_33:bat[:str] := bat.append(X_25:bat[:str], "clob":str); - X_35:bat[:int] := bat.append(X_26:bat[:int], 0:int); - X_36:bat[:int] := bat.append(X_28:bat[:int], 0:int); - sql.resultSet(X_29:bat[:str], X_31:bat[:str], X_33:bat[:str], X_35:bat[:int], X_36:bat[:int], X_18:bat[:str]); + sql.resultSet(X_22:bat[:str], X_23:bat[:str], X_24:bat[:str], X_25:bat[:int], X_25:bat[:int], X_18:bat[:str]); end user.s16_0; #inline actions= 0 time=1 usec #remap actions= 1 time=5 usec 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,28 +2192,27 @@ stmt_rs_column(backend *be, stmt *rs, in */ #define NEWRESULTSET -#define meta(Id,Tpe) \ -q = newStmt(mb, batRef, newRef);\ -q= pushType(mb,q, Tpe);\ -Id = getArg(q,0); \ -list = pushArgument(mb,list,Id); - -#define metaInfo(Id,Tpe,Val)\ -p = newStmt(mb, batRef, appendRef);\ -p = pushArgument(mb,p, Id);\ -p = push##Tpe(mb,p, Val);\ -Id = getArg(p,0); +#define meta(P, Id, Tpe) \ +P = newStmt(mb, batRef, packRef);\ +Id = getArg(P,0);\ +setVarType(mb, Id, newBatType(Tpe));\ +setVarFixed(mb, Id);\ +list = pushArgument(mb, list, Id); + +#define metaInfo(P,Tpe,Val)\ +P = push##Tpe(mb, P, Val); static int dump_export_header(mvc *sql, MalBlkPtr mb, list *l, int file, const char * format, const char * sep,const char * rsep,const char * ssep,const char * ns, int onclient) { node *n; - InstrPtr q = NULL; + bool error = false; int ret = -1; // gather the meta information - int tblId, nmeId, tpeId, lenId, scaleId, k; - InstrPtr p= NULL, list; + int tblId, nmeId, tpeId, lenId, scaleId; + InstrPtr list; + InstrPtr tblPtr, nmePtr, tpePtr, lenPtr, scalePtr; list = newInstruction(mb, sqlRef, export_tableRef); getArg(list,0) = newTmpVariable(mb,TYPE_int); @@ -2226,12 +2225,13 @@ dump_export_header(mvc *sql, MalBlkPtr m list = pushStr(mb, list, ns); list = pushInt(mb, list, onclient); } - k = list->argc; - meta(tblId,TYPE_str); - meta(nmeId,TYPE_str); - meta(tpeId,TYPE_str); - meta(lenId,TYPE_int); - meta(scaleId,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); + if(tblPtr == NULL || nmePtr == NULL || tpePtr == NULL || lenPtr == NULL || scalePtr == NULL) + return -1; for (n = l->h; n; n = n->next) { stmt *c = n->data; @@ -2251,28 +2251,22 @@ dump_export_header(mvc *sql, MalBlkPtr m fqtn = NEW_ARRAY(char, fqtnl); if(fqtn) { snprintf(fqtn, fqtnl, "%s.%s", nsn, ntn); - metaInfo(tblId, Str, fqtn); - metaInfo(nmeId, Str, cn); - metaInfo(tpeId, Str, (t->type->localtype == TYPE_void ? "char" : t->type->sqlname)); - metaInfo(lenId, Int, t->digits); - metaInfo(scaleId, Int, t->scale); + metaInfo(tblPtr, Str, fqtn); + metaInfo(nmePtr, Str, cn); + metaInfo(tpePtr, Str, (t->type->localtype == TYPE_void ? "char" : t->type->sqlname)); + metaInfo(lenPtr, Int, t->digits); + metaInfo(scalePtr, Int, t->scale); list = pushArgument(mb, list, c->nr); _DELETE(fqtn); } else - q = NULL; + error = true; } else - q = NULL; + error = true; c_delete(ntn); c_delete(nsn); - if (q == NULL) + if(error) return -1; } - // add the correct variable ids - getArg(list,k++) = tblId; - getArg(list,k++) = nmeId; - getArg(list,k++) = tpeId; - getArg(list,k++) = lenId; - getArg(list,k) = scaleId; ret = getArg(list,0); pushInstruction(mb,list); return ret; @@ -2482,22 +2476,24 @@ static InstrPtr dump_header(mvc *sql, MalBlkPtr mb, stmt *s, list *l) { node *n; - InstrPtr q = NULL; + bool error = false; // gather the meta information - int tblId, nmeId, tpeId, lenId, scaleId, k; - InstrPtr p = NULL, list; + int tblId, nmeId, tpeId, lenId, scaleId; + InstrPtr list; + InstrPtr tblPtr, nmePtr, tpePtr, lenPtr, scalePtr; list = newInstruction(mb,sqlRef, resultSetRef); if(!list) { return NULL; } getArg(list,0) = newTmpVariable(mb,TYPE_int); - k = list->argc; - meta(tblId,TYPE_str); - meta(nmeId,TYPE_str); - meta(tpeId,TYPE_str); - meta(lenId,TYPE_int); - meta(scaleId,TYPE_int); + meta(tblPtr, tblId, TYPE_str); + meta(nmePtr, nmeId, TYPE_str); + meta(tpePtr, tpeId, TYPE_str); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list