Changeset: ce3300816d59 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ce3300816d59 Modified Files: monetdb5/ChangeLog monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out monetdb5/mal/mal_listing.c monetdb5/optimizer/Tests/GCexample01.stable.out monetdb5/optimizer/Tests/dataflow.stable.out monetdb5/optimizer/Tests/tst4006.stable.out sql/backends/monet5/UDF/cudf/Tests/udf-fuse.stable.out sql/backends/monet5/UDF/cudf/Tests/udf-reverse.stable.out sql/backends/monet5/sql_execute.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-2014/Tests/manifold.Bug-3556.stable.out sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.out sql/test/mergetables/Tests/mergequery.stable.out sql/test/remote/Tests/partition_elim.stable.out Branch: default Log Message:
Include type information in MAL plans The EXPLAIN command now shows all the MAL type resolutions, because in general users may not be aware of their signatures. It also simplifies programs to analyse such plans. diffs (truncated from 2739 to 300 lines): diff --git a/monetdb5/ChangeLog b/monetdb5/ChangeLog --- a/monetdb5/ChangeLog +++ b/monetdb5/ChangeLog @@ -1,6 +1,11 @@ # ChangeLog file for MonetDB5 # This file is updated with Maddlog +* Wed Aug 23 2017 Martin Kersten <[email protected]> +- The EXPLAIN command now shows all the MAL type resolutions, because in + general users may not be aware of their signatures. It also simplifies + programs to analyse such plans. + * Sat Aug 19 2017 Sjoerd Mullender <[email protected]> - Implemented versions of group.(sub)group(done) that don't return a histogram. diff --git a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out --- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out +++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out @@ -61,16 +61,16 @@ Ready. % .explain # table_name % mal # name % clob # type -% 158 # length +% 174 # length function user.s10_1():void; - X_1:void := querylog.define("explain copy into ttt from \\'/tmp/xyz\\';", "sequential_pipe", 21:int); - X_4 := sql.mvc(); - (X_25:bat[:int], X_26:bat[:int], X_27:bat[:int]) := sql.copy_from(nil:ptr, "|", "\\n", nil:str, "null", "/tmp/xyz", -1:lng, 0:lng, 0:int, 0:int, nil:str); - X_29 := sql.append(X_4, "sys", "ttt", "a", X_25); - X_34 := sql.append(X_29, "sys", "ttt", "b", X_26); - X_37 := sql.append(X_34, "sys", "ttt", "c", X_27); - X_39 := aggr.count(X_27); - sql.affectedRows(X_37, X_39); + X_1:void := querylog.define("explain copy into ttt from \\'/tmp/xyz\\';":str, "sequential_pipe":str, 21:int); + X_4:int := sql.mvc(); + (X_25:bat[:int], X_26:bat[:int], X_27:bat[:int]) := sql.copy_from(nil:ptr, "|":str, "\\n":str, nil:str, "null":str, "/tmp/xyz":str, -1:lng, 0:lng, 0:int, 0:int, nil:str); + X_29:int := sql.append(X_4:int, "sys":str, "ttt":str, "a":str, X_25:bat[:int]); + X_34:int := sql.append(X_29:int, "sys":str, "ttt":str, "b":str, X_26:bat[:int]); + X_37:int := sql.append(X_34:int, "sys":str, "ttt":str, "c":str, X_27:bat[:int]); + X_39:lng := aggr.count(X_27:bat[:int]); + sql.affectedRows(X_37:int, X_39:lng); end user.s10_1; #inline actions= 0 time=1 usec #candidates actions= 1 time=14 usec @@ -120,16 +120,16 @@ end user.s10_1; % .explain # table_name % mal # name % clob # type -% 158 # length +% 174 # length function user.s26_1():void; - X_1:void := querylog.define("explain copy into ttt from \\'/tmp/xyz\\';", "user_1", 21:int); - X_4 := sql.mvc(); - (X_25:bat[:int], X_26:bat[:int], X_27:bat[:int]) := sql.copy_from(nil:ptr, "|", "\\n", nil:str, "null", "/tmp/xyz", -1:lng, 0:lng, 0:int, 0:int, nil:str); - X_29 := sql.append(X_4, "sys", "ttt", "a", X_25); - X_34 := sql.append(X_29, "sys", "ttt", "b", X_26); - X_39 := aggr.count(X_27); - X_37 := sql.append(X_34, "sys", "ttt", "c", X_27); - sql.affectedRows(X_37, X_39); + X_1:void := querylog.define("explain copy into ttt from \\'/tmp/xyz\\';":str, "user_1":str, 21:int); + X_4:int := sql.mvc(); + (X_25:bat[:int], X_26:bat[:int], X_27:bat[:int]) := sql.copy_from(nil:ptr, "|":str, "\\n":str, nil:str, "null":str, "/tmp/xyz":str, -1:lng, 0:lng, 0:int, 0:int, nil:str); + X_29:int := sql.append(X_4:int, "sys":str, "ttt":str, "a":str, X_25:bat[:int]); + X_34:int := sql.append(X_29:int, "sys":str, "ttt":str, "b":str, X_26:bat[:int]); + X_39:lng := aggr.count(X_27:bat[:int]); + X_37:int := sql.append(X_34:int, "sys":str, "ttt":str, "c":str, X_27:bat[:int]); + sql.affectedRows(X_37:int, X_39:lng); end user.s26_1; #inline actions= 0 time=1 usec #candidates actions= 1 time=14 usec diff --git a/monetdb5/mal/mal_listing.c b/monetdb5/mal/mal_listing.c --- a/monetdb5/mal/mal_listing.c +++ b/monetdb5/mal/mal_listing.c @@ -99,7 +99,7 @@ renderTerm(MalBlkPtr mb, MalStkPtr stk, strcat(buf+len,"\""); len++; } - showtype = showtype || closequote > TYPE_str || ((isVarUDFtype(mb,varid) || isVarTypedef(mb,varid) || (flg & LIST_MAL_REMOTE)) && isVarConstant(mb,varid)) || + showtype = showtype || closequote > TYPE_str || ((isVarUDFtype(mb,varid) || isVarTypedef(mb,varid) || (flg & (LIST_MAL_REMOTE | LIST_MAL_TYPE))) && isVarConstant(mb,varid)) || (isaBatType(getVarType(mb,varid)) && idx < p->retc); if (stk && isaBatType(getVarType(mb,varid)) && stk->stk[varid].val.bval ){ diff --git a/monetdb5/optimizer/Tests/GCexample01.stable.out b/monetdb5/optimizer/Tests/GCexample01.stable.out --- a/monetdb5/optimizer/Tests/GCexample01.stable.out +++ b/monetdb5/optimizer/Tests/GCexample01.stable.out @@ -29,44 +29,44 @@ Ready. # 06:41:05 > "mclient" "-lmal" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-8837" "--port=33343" # 06:41:05 > -function user.qry():void; #[0] (0) 0 - b:bat[:int] := bat.new(:int); #[1] (0) CMDBATnew 1 <- 2 - c:bat[:int] := bat.new(:int); #[2] (0) CMDBATnew 3 <- 2 - d:bat[:int] := bat.new(:int); #[3] (0) CMDBATnew 4 <- 2 - bat.append(b:bat[:int], 1:int); #[4] (0) BKCappend_val_wrap 5 <- 1 6 -barrier (x:oid, z:int) := iterator.new(b:bat[:int]); #[5] (0) ITRbunIterator 7 8 <- 1 - io.print(x:oid); #[6] (0) IOprint_val 9 <- 7 -exit (x:oid, z:int); #[7] (0) 7 8 -barrier (x:oid, z:int) := iterator.new(c:bat[:int]); #[8] (0) ITRbunIterator 7 8 <- 3 - io.print(x:oid); #[9] (0) IOprint_val 10 <- 7 - redo (x:oid, z:int) := iterator.next(c:bat[:int]); #[10] (0) ITRbunNext 7 8 <- 3 -exit (x:oid, z:int); #[11] (0) 7 8 +function user.qry():void; #[0] (0) 0 type check needed + b:bat[:int] := bat.new(:int); #[1] (0) CMDBATnew 1 <- 2 type check needed + c:bat[:int] := bat.new(:int); #[2] (0) CMDBATnew 3 <- 2 type check needed + d:bat[:int] := bat.new(:int); #[3] (0) CMDBATnew 4 <- 2 type check needed + bat.append(b:bat[:int], 1:int); #[4] (0) BKCappend_val_wrap 5 <- 1 6 type check needed +barrier (x:oid, z:int) := iterator.new(b:bat[:int]); #[5] (0) ITRbunIterator 7 8 <- 1 type check needed + io.print(x:oid); #[6] (0) IOprint_val 9 <- 7 type check needed +exit (x:oid, z:int); #[7] (0) 7 8 type check needed +barrier (x:oid, z:int) := iterator.new(c:bat[:int]); #[8] (0) ITRbunIterator 7 8 <- 3 type check needed + io.print(x:oid); #[9] (0) IOprint_val 10 <- 7 type check needed + redo (x:oid, z:int) := iterator.next(c:bat[:int]); #[10] (0) ITRbunNext 7 8 <- 3 type check needed +exit (x:oid, z:int); #[11] (0) 7 8 type check needed # do not close d, it may be reused -barrier go:bit := true:bit; #[13] (0) 12 <- 13 - io.print(d:bat[:int]); #[14] (0) IOprint_val 14 <- 4 - redo go:bit := true:bit; #[15] (0) 12 <- 13 -exit go:bit; #[16] (0) 12 -end user.qry; #[17] (0) -#garbagecollector actions= 0 time=18 usec -function user.qry():void; #[0] (0) 0 - b:bat[:int] := bat.new(:int); #[1] (0) CMDBATnew 1 <- 2 - c:bat[:int] := bat.new(:int); #[2] (0) CMDBATnew 3 <- 2 - d:bat[:int] := bat.new(:int); #[3] (0) CMDBATnew 4 <- 2 - bat.append(b:bat[:int], 1:int); #[4] (0) BKCappend_val_wrap 5 <- 1 6 -barrier (x:oid, z:int) := iterator.new(b:bat[:int]); #[5] (0) ITRbunIterator 7 8 <- 1 - io.print(x:oid); #[6] (0) IOprint_val 9 <- 7 -exit (x:oid, z:int); #[7] (0) 7 8 -barrier (x:oid, z:int) := iterator.new(c:bat[:int]); #[8] (0) ITRbunIterator 7 8 <- 3 - io.print(x:oid); #[9] (0) IOprint_val 10 <- 7 - redo (x:oid, z:int) := iterator.next(c:bat[:int]); #[10] (0) ITRbunNext 7 8 <- 3 -exit (x:oid, z:int); #[11] (0) 7 8 +barrier go:bit := true:bit; #[13] (0) 12 <- 13 type check needed + io.print(d:bat[:int]); #[14] (0) IOprint_val 14 <- 4 type check needed + redo go:bit := true:bit; #[15] (0) 12 <- 13 type check needed +exit go:bit; #[16] (0) 12 type check needed +end user.qry; #[17] (0) type check needed +#garbagecollector actions= 0 time=11 usec +function user.qry():void; #[0] (0) 0 type check needed + b:bat[:int] := bat.new(:int); #[1] (0) CMDBATnew 1 <- 2 type check needed + c:bat[:int] := bat.new(:int); #[2] (0) CMDBATnew 3 <- 2 type check needed + d:bat[:int] := bat.new(:int); #[3] (0) CMDBATnew 4 <- 2 type check needed + bat.append(b:bat[:int], 1:int); #[4] (0) BKCappend_val_wrap 5 <- 1 6 type check needed +barrier (x:oid, z:int) := iterator.new(b:bat[:int]); #[5] (0) ITRbunIterator 7 8 <- 1 type check needed + io.print(x:oid); #[6] (0) IOprint_val 9 <- 7 type check needed +exit (x:oid, z:int); #[7] (0) 7 8 type check needed +barrier (x:oid, z:int) := iterator.new(c:bat[:int]); #[8] (0) ITRbunIterator 7 8 <- 3 type check needed + io.print(x:oid); #[9] (0) IOprint_val 10 <- 7 type check needed + redo (x:oid, z:int) := iterator.next(c:bat[:int]); #[10] (0) ITRbunNext 7 8 <- 3 type check needed +exit (x:oid, z:int); #[11] (0) 7 8 type check needed # do not close d, it may be reused -barrier go:bit := true:bit; #[13] (0) 12 <- 13 - io.print(d:bat[:int]); #[14] (0) IOprint_val 14 <- 4 - redo go:bit := true:bit; #[15] (0) 12 <- 13 -exit go:bit; #[16] (0) 12 -end user.qry; #[17] (0) -#garbagecollector actions= 0 time=18 usec +barrier go:bit := true:bit; #[13] (0) 12 <- 13 type check needed + io.print(d:bat[:int]); #[14] (0) IOprint_val 14 <- 4 type check needed + redo go:bit := true:bit; #[15] (0) 12 <- 13 type check needed +exit go:bit; #[16] (0) 12 type check needed +end user.qry; #[17] (0) type check needed +#garbagecollector actions= 0 time=11 usec # 23:17:49 > # 23:17:49 > Done. diff --git a/monetdb5/optimizer/Tests/dataflow.stable.out b/monetdb5/optimizer/Tests/dataflow.stable.out --- a/monetdb5/optimizer/Tests/dataflow.stable.out +++ b/monetdb5/optimizer/Tests/dataflow.stable.out @@ -20,37 +20,37 @@ stdout of test 'dataflow` in directory ' Ready. -# 07:59:33 > -# 07:59:33 > "mclient" "-lmal" "-ftest" "-Eutf-8" "--host=/var/tmp/mtest-23820" "--port=35704" -# 07:59:33 > +# 10:28:25 > +# 10:28:25 > "mclient" "-lmal" "-ftest" "-Eutf-8" "--host=/var/tmp/mtest-28254" "--port=34870" +# 10:28:25 > -function user.tst():void; #[0] (0) 0 -barrier X_35:bit := language.dataflow(); #[1] (0) MALstartDataflow 35 - s:bat[:int] := microbenchmark.uniform(0@0:oid, 100000:lng, 100000:int); #[2] (0) MBMuniform 1 <- 2 3 4 - l:int := aggr.min(s:bat[:int]); #[3] (0) ALGminany 5 <- 1 - h:int := l:int; #[4] (0) 6 <- 5 +function user.tst():void; #[0] (0) 0 type check needed +barrier X_35:bit := language.dataflow(); #[1] (0) MALstartDataflow 35 type check needed + s:bat[:int] := microbenchmark.uniform(0@0:oid, 100000:lng, 100000:int); #[2] (0) MBMuniform 1 <- 2 3 4 type check needed + l:int := aggr.min(s:bat[:int]); #[3] (0) ALGminany 5 <- 1 type check needed + h:int := l:int; #[4] (0) 6 <- 5 type check needed #mdb.setTimer(true); #mdb.setThread(true); - z:bat[:oid] := nil:bat[:oid]; #[7] (0) 9 <- 10 - t1:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[8] (0) ALGselect2 11 <- 1 12 5 6 13 14 15 - t2:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[9] (0) ALGselect2 16 <- 1 17 5 6 13 13 15 - t3:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[10] (0) ALGselect2 18 <- 1 19 5 6 13 13 15 - t4:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[11] (0) ALGselect2 20 <- 1 21 5 6 13 13 15 - t5:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[12] (0) ALGselect2 22 <- 1 23 5 6 13 13 15 - t6:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[13] (0) ALGselect2 24 <- 1 25 5 6 13 13 15 - t7:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[14] (0) ALGselect2 26 <- 1 27 5 6 13 13 15 - t8:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[15] (0) ALGselect2 28 <- 1 29 5 6 13 13 15 - language.pass(s:bat[:int]); #[16] (0) MALpass 37 <- 1 -exit X_35:bit; #[17] (0) 35 - z:bat[:oid] := mat.pack(t1:bat[:oid], t2:bat[:oid], t3:bat[:oid], t4:bat[:oid], t5:bat[:oid], t6:bat[:oid], t7:bat[:oid], t8:bat[:oid]); #[18] (0) MATpack 9 <- 11 16 18 20 22 24 26 28 - mdb.var(); #[19] (0) MDBvar 30 - c:lng := aggr.count(z:bat[:oid]); #[20] (0) ALGcount_bat 31 <- 9 - io.print(c:lng); #[21] (0) IOprint_val 32 <- 31 - io.print("done":str); #[22] (0) IOprint_val 33 <- 34 -end user.tst; #[23] (0) -#dataflow actions= 1 time=43 usec -#garbagecollector actions= 0 time=51 usec -#Stack 'tst' size=43 top=33 + z:bat[:oid] := nil:bat[:oid]; #[7] (0) 9 <- 10 type check needed + t1:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[8] (0) ALGselect2 11 <- 1 12 5 6 13 14 15 type check needed + t2:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[9] (0) ALGselect2 16 <- 1 17 5 6 13 13 15 type check needed + t3:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[10] (0) ALGselect2 18 <- 1 19 5 6 13 13 15 type check needed + t4:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[11] (0) ALGselect2 20 <- 1 21 5 6 13 13 15 type check needed + t5:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[12] (0) ALGselect2 22 <- 1 23 5 6 13 13 15 type check needed + t6:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[13] (0) ALGselect2 24 <- 1 25 5 6 13 13 15 type check needed + t7:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[14] (0) ALGselect2 26 <- 1 27 5 6 13 13 15 type check needed + t8:bat[:oid] := algebra.select(s:bat[:int], nil:bat[:oid], l:int, h:int, true:bit, true:bit, false:bit); #[15] (0) ALGselect2 28 <- 1 29 5 6 13 13 15 type check needed + language.pass(s:bat[:int]); #[16] (0) MALpass 37 <- 1 type check needed +exit X_35:bit; #[17] (0) 35 type check needed + z:bat[:oid] := mat.pack(t1:bat[:oid], t2:bat[:oid], t3:bat[:oid], t4:bat[:oid], t5:bat[:oid], t6:bat[:oid], t7:bat[:oid], t8:bat[:oid]); #[18] (0) MATpack 9 <- 11 16 18 20 22 24 26 28 type check needed + mdb.var(); #[19] (0) MDBvar 30 type check needed + c:lng := aggr.count(z:bat[:oid]); #[20] (0) ALGcount_bat 31 <- 9 type check needed + io.print(c:lng); #[21] (0) IOprint_val 32 <- 31 type check needed + io.print("done":str); #[22] (0) IOprint_val 33 <- 34 type check needed +end user.tst; #[23] (0) type check needed +#dataflow actions= 1 time=30 usec +#garbagecollector actions= 0 time=19 usec +#Stack 'tst' size=55 top=41 #[ 0] tst (0,0,17) = 0@0 :void not used #[ 1] s (2,2,16) = <tmp_21> :bat[:int] rows=100000 #[ 2] X_2 (2,2,2) = 0@0 :oid constant diff --git a/monetdb5/optimizer/Tests/tst4006.stable.out b/monetdb5/optimizer/Tests/tst4006.stable.out --- a/monetdb5/optimizer/Tests/tst4006.stable.out +++ b/monetdb5/optimizer/Tests/tst4006.stable.out @@ -36,7 +36,7 @@ barrier V12:bit := true:bit; exit V12:bit; #[7] (0) 6 type check needed return V31:bat[:int] := V30:bat[:int]; #[8] (0) 9 <- 5 type check needed end user.getz; #[9] (0) type check needed -#aliases actions= 0 time=4 usec +#aliases actions= 0 time=8 usec #garbagecollector actions= 0 time=8 usec function user.getz(p:int):bat[:int]; #[0] (0) 0 <- 1 type check needed x:bat[:int] := bat.new(:int); #[1] (0) CMDBATnew 2 <- 3 type check needed @@ -48,8 +48,8 @@ barrier V12:bit := true:bit; exit V12:bit; #[7] (0) 6 type check needed return V31:bat[:int] := V30:bat[:int]; #[8] (0) 9 <- 5 type check needed end user.getz; #[9] (0) type check needed -#aliases actions= 0 time=4 usec -#garbagecollector actions= 1 time=12 usec +#aliases actions= 0 time=8 usec +#garbagecollector actions= 0 time=8 usec # 15:27:10 > # 15:27:10 > "Done." diff --git a/sql/backends/monet5/UDF/cudf/Tests/udf-fuse.stable.out b/sql/backends/monet5/UDF/cudf/Tests/udf-fuse.stable.out --- a/sql/backends/monet5/UDF/cudf/Tests/udf-fuse.stable.out +++ b/sql/backends/monet5/UDF/cudf/Tests/udf-fuse.stable.out @@ -27,11 +27,11 @@ Ready. % .explain # table_name % mal # name % clob # type -% 87 # length +% 95 # length function user.s4_1():void; - X_3:void := querylog.define("explain select fuse(1,2);", "sequential_pipe", 8:int); + X_3:void := querylog.define("explain select fuse(1,2);":str, "sequential_pipe":str, 8:int); X_9:sht := udf.fuse(1:bte, 2:bte); - sql.resultSet(".L2", "L2", "smallint", 16:int, 0:int, 7:int, X_9); + sql.resultSet(".L2":str, "L2":str, "smallint":str, 16:int, 0:int, 7:int, X_9:sht); end user.s4_1; #inline actions= 0 time=2 usec #candidates actions= 1 time=12 usec @@ -68,11 +68,11 @@ end user.s4_1; % .explain # table_name % mal # name % clob # type -% 93 # length +% 101 # length function user.s6_1():void; - X_3:void := querylog.define("explain select fuse(1000,2000);", "sequential_pipe", 8:int); + X_3:void := querylog.define("explain select fuse(1000,2000);":str, "sequential_pipe":str, 8:int); X_9:int := udf.fuse(1000:sht, 2000:sht); - sql.resultSet(".L2", "L2", "int", 32:int, 0:int, 7:int, X_9); + sql.resultSet(".L2":str, "L2":str, "int":str, 32:int, 0:int, 7:int, X_9:int); end user.s6_1; #inline actions= 0 time=2 usec #candidates actions= 1 time=10 usec @@ -109,11 +109,11 @@ end user.s6_1; % .explain # table_name % mal # name % clob # type -% 99 # length +% 107 # length function user.s8_1():void; - X_3:void := querylog.define("explain select fuse(1000000,2000000);", "sequential_pipe", 8:int); + X_3:void := querylog.define("explain select fuse(1000000,2000000);":str, "sequential_pipe":str, 8:int); _______________________________________________ checkin-list mailing list [email protected] https://www.monetdb.org/mailman/listinfo/checkin-list
