Changeset: 1e78a7ccf7e7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1e78a7ccf7e7
Modified Files:
        sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
        sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
        sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/05-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/06-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/07-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/08-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/09-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/10-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/11-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/12-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/13-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/01-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/02-explain.stable.out
        sql/benchmarks/tpch/Tests/03-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/04-explain.stable.out
        sql/benchmarks/tpch/Tests/05-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/06-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/07-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/08-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/09-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/10-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/11-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/12-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/13-explain.stable.out
        sql/benchmarks/tpch/Tests/14-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/15-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/16-explain.stable.out
        sql/benchmarks/tpch/Tests/17-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/18-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/19-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/20-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/21-explain.stable.out
        sql/benchmarks/tpch/Tests/22-explain.stable.out.int128
        sql/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out
        
sql/test/BugTracker-2010/Tests/group-by_ordered_column.Bug-2564.stable.out
        sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128
        sql/test/BugTracker-2011/Tests/func_iter_vs_bulk.Bug-2826.stable.out
        
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
        sql/test/BugTracker-2013/Tests/between.Bug-3259.stable.out.int128
        sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out
        sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.stable.out
        sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
Branch: resultset
Log Message:

Approve output


diffs (truncated from 1525 to 300 lines):

diff --git a/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out 
b/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
--- a/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
+++ b/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
@@ -27,12 +27,12 @@ Ready.
 % .explain # table_name
 % mal # name
 % clob # type
-% 64 # length
+% 81 # length
 function user.s2_1{autoCommit=true}(A0:bte,A1:bte):void;
+    X_11:void  := querylog.define("explain select 
fuse(1,2);","sequential_pipe");
     X_4 := udf.fuse(A0,A1);
     sql.resultSet(".L","fuse_single_value","smallint",16,0,X_4);
-end s2_1;
-# querylog.define("explain select fuse(1,2);","default_pipe")
+end user.s2_1;
 #select fuse(1,2);
 % .L # table_name
 % fuse_single_value # name
@@ -43,12 +43,12 @@ end s2_1;
 % .explain # table_name
 % mal # name
 % clob # type
-% 70 # length
+% 87 # length
 function user.s3_1{autoCommit=true}(A0:sht,A1:sht):void;
+    X_11:void  := querylog.define("explain select 
fuse(1000,2000);","sequential_pipe");
     X_4 := udf.fuse(A0,A1);
     sql.resultSet(".L","fuse_single_value","int",32,0,X_4);
-end s3_1;
-# querylog.define("explain select fuse(1000,2000);","default_pipe")
+end user.s3_1;
 #select fuse(1000,2000);
 % .L # table_name
 % fuse_single_value # name
@@ -59,12 +59,12 @@ end s3_1;
 % .explain # table_name
 % mal # name
 % clob # type
-% 76 # length
+% 93 # length
 function user.s4_1{autoCommit=true}(A0:int,A1:int):void;
+    X_11:void  := querylog.define("explain select 
fuse(1000000,2000000);","sequential_pipe");
     X_4 := udf.fuse(A0,A1);
     sql.resultSet(".L","fuse_single_value","bigint",64,0,X_4);
-end s4_1;
-# querylog.define("explain select fuse(1000000,2000000);","default_pipe")
+end user.s4_1;
 #select fuse(1000000,2000000);
 % .L # table_name
 % fuse_single_value # name
@@ -93,8 +93,9 @@ end s4_1;
 % .explain # table_name
 % mal # name
 % clob # type
-% 78 # length
+% 95 # length
 function user.s8_1{autoCommit=true}():void;
+    X_43:void  := querylog.define("explain select fuse(a,b) from 
udf_fuse;","sequential_pipe");
     X_25 := bat.new(nil:oid,nil:str);
     X_33 := bat.append(X_25,"sys.L");
     X_28 := bat.new(nil:oid,nil:str);
@@ -119,14 +120,14 @@ function user.s8_1{autoCommit=true}():vo
     X_22 := algebra.leftfetchjoin(X_3,X_21);
     X_23:bat[:oid,:sht]  := batudf.fuse(X_15,X_22);
     sql.resultSet(X_33,X_35,X_37,X_39,X_41,X_23);
-end s8_1;
-# querylog.define("explain select fuse(a,b) from udf_fuse;","sequential_pipe")
+end user.s8_1;
 #explain select fuse(c,d) from udf_fuse;
 % .explain # table_name
 % mal # name
 % clob # type
-% 78 # length
+% 95 # length
 function user.s9_1{autoCommit=true}():void;
+    X_43:void  := querylog.define("explain select fuse(c,d) from 
udf_fuse;","sequential_pipe");
     X_25 := bat.new(nil:oid,nil:str);
     X_33 := bat.append(X_25,"sys.L");
     X_28 := bat.new(nil:oid,nil:str);
@@ -151,14 +152,14 @@ function user.s9_1{autoCommit=true}():vo
     X_22 := algebra.leftfetchjoin(X_3,X_21);
     X_23:bat[:oid,:int]  := batudf.fuse(X_15,X_22);
     sql.resultSet(X_33,X_35,X_37,X_39,X_41,X_23);
-end s9_1;
-# querylog.define("explain select fuse(c,d) from udf_fuse;","sequential_pipe")
+end user.s9_1;
 #explain select fuse(e,f) from udf_fuse;
 % .explain # table_name
 % mal # name
 % clob # type
-% 78 # length
+% 95 # length
 function user.s10_1{autoCommit=true}():void;
+    X_43:void  := querylog.define("explain select fuse(e,f) from 
udf_fuse;","sequential_pipe");
     X_25 := bat.new(nil:oid,nil:str);
     X_33 := bat.append(X_25,"sys.L");
     X_28 := bat.new(nil:oid,nil:str);
@@ -183,8 +184,7 @@ function user.s10_1{autoCommit=true}():v
     X_22 := algebra.leftfetchjoin(X_3,X_21);
     X_23:bat[:oid,:lng]  := batudf.fuse(X_15,X_22);
     sql.resultSet(X_33,X_35,X_37,X_39,X_41,X_23);
-end s10_1;
-# querylog.define("explain select fuse(e,f) from udf_fuse;","sequential_pipe")
+end user.s10_1;
 #select fuse(a,b) from udf_fuse;
 % sys.L # table_name
 % fuse_a # name
diff --git a/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out 
b/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
--- a/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
+++ b/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
@@ -48,12 +48,12 @@ Ready.
 % .explain # table_name
 % mal # name
 % clob # type
-% 77 # length
+% 93 # length
 function user.s2_1{autoCommit=true}(A0:str):void;
+    X_9:void  := querylog.define("explain select 
reverse(\\'MonetDB\\');","sequential_pipe");
     X_3 := udf.reverse(A0);
     sql.resultSet(".L","reverse_single_value","clob",0,0,X_3);
-end s2_1;
-# querylog.define("explain select reverse(\\'MonetDB\\');","default_pipe")
+end user.s2_1;
 #select reverse('MonetDB');
 % .L # table_name
 % reverse_single_value # name
@@ -82,8 +82,9 @@ end s2_1;
 % .explain # table_name
 % mal # name
 % clob # type
-% 82 # length
+% 99 # length
 function user.s6_1{autoCommit=true}():void;
+    X_34:void  := querylog.define("explain select reverse(x) from 
udf_reverse;","sequential_pipe");
     X_18 := bat.new(nil:oid,nil:str);
     X_26 := bat.append(X_18,"sys.L");
     X_21 := bat.new(nil:oid,nil:str);
@@ -103,8 +104,7 @@ function user.s6_1{autoCommit=true}():vo
     X_15 := algebra.leftfetchjoin(X_3,X_14);
     X_16:bat[:oid,:str]  := batudf.reverse(X_15);
     sql.resultSet(X_26,X_28,X_30,X_32,X_33,X_16);
-end s6_1;
-# querylog.define("explain select reverse(x) from 
udf_reverse;","sequential_pipe")
+end user.s6_1;
 #select reverse(x) from udf_reverse;
 % sys.L # table_name
 % reverse_x # name
diff --git a/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128 
b/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128
--- a/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128
+++ b/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128
@@ -36,8 +36,9 @@ Ready.
 % .explain # table_name
 % mal # name
 % clob # type
-% 246 # length
+% 263 # length
 function user.s2_1{autoCommit=true}(A0:int,A1:int,A2:int,A3:int):void;
+    X_70:void  := querylog.define("explain\nselect 
sum(lo_extendedprice*lo_discount) as revenue\n\tfrom lineorder, dwdate\n\twhere 
lo_orderdate = d_datekey\n\t\tand d_year = 1993\n\t\tand lo_discount between 1 
and 3\n\t\tand lo_quantity < 25;","sequential_pipe");
     X_6 := sql.mvc();
     X_10:bat[:oid,:int]  := sql.bind(X_6,"sys","lineorder","lo_quantity",0);
     X_18:bat[:oid,:int]  := sql.bind(X_6,"sys","lineorder","lo_discount",0);
@@ -73,14 +74,13 @@ function user.s2_1{autoCommit=true}(A0:i
     X_56:bat[:oid,:int]  := 
sql.bind(X_6,"sys","lineorder","lo_extendedprice",1);
     X_57 := sql.projectdelta(X_25,X_51,X_54,r1_66,X_56);
     X_58 := algebra.leftfetchjoin(X_47,X_57);
-    X_59 := batcalc.hge(X_58);
+    X_59 := batcalc.lng(X_58);
     X_60 := sql.projectdelta(X_25,X_18,X_20,r1_23,X_22);
     X_61 := algebra.leftfetchjoin(X_47,X_60);
-    X_62:bat[:oid,:hge]  := batcalc.*(X_59,X_61);
+    X_62:bat[:oid,:lng]  := batcalc.*(X_59,X_61);
     X_63:hge  := aggr.sum(X_62);
-    sql.resultSet("sys.L1","revenue","hugeint",128,0,X_63);
-end s2_1;
-# querylog.define("explain\nselect sum(lo_extendedprice*lo_discount) as 
revenue\n\tfrom lineorder, dwdate\n\twhere lo_orderdate = d_datekey\n\t\tand 
d_year = 1993\n\t\tand lo_discount between 1 and 3\n\t\tand lo_quantity < 
25;","sequential_pipe")
+    sql.resultSet("sys.L1","revenue","hugeint",64,0,X_63);
+end user.s2_1;
 
 # 23:10:45 >  
 # 23:10:45 >  "Done."
diff --git a/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128 
b/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128
--- a/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128
+++ b/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128
@@ -36,8 +36,9 @@ Ready.
 % .explain # table_name
 % mal # name
 % clob # type
-% 269 # length
+% 286 # length
 function user.s2_1{autoCommit=true}(A0:int,A1:int,A2:int,A3:int,A4:int):void;
+    X_70:void  := querylog.define("explain\nselect 
sum(lo_extendedprice*lo_discount) as revenue\n\tfrom lineorder, dwdate\n\twhere 
lo_orderdate = d_datekey\n\t\tand d_yearmonthnum = 199401\n\t\tand lo_discount 
between 4 and 6\n\t\tand lo_quantity between 26 and 35;","sequential_pipe");
     X_7 := sql.mvc();
     X_11:bat[:oid,:int]  := sql.bind(X_7,"sys","lineorder","lo_quantity",0);
     X_19:bat[:oid,:int]  := sql.bind(X_7,"sys","lineorder","lo_discount",0);
@@ -73,14 +74,13 @@ function user.s2_1{autoCommit=true}(A0:i
     X_56:bat[:oid,:int]  := 
sql.bind(X_7,"sys","lineorder","lo_extendedprice",1);
     X_57 := sql.projectdelta(X_26,X_51,X_54,r1_67,X_56);
     X_58 := algebra.leftfetchjoin(X_47,X_57);
-    X_59 := batcalc.hge(X_58);
+    X_59 := batcalc.lng(X_58);
     X_60 := sql.projectdelta(X_26,X_19,X_21,r1_25,X_23);
     X_61 := algebra.leftfetchjoin(X_47,X_60);
-    X_62:bat[:oid,:hge]  := batcalc.*(X_59,X_61);
+    X_62:bat[:oid,:lng]  := batcalc.*(X_59,X_61);
     X_63:hge  := aggr.sum(X_62);
-    sql.resultSet("sys.L1","revenue","hugeint",128,0,X_63);
-end s2_1;
-# querylog.define("explain\nselect sum(lo_extendedprice*lo_discount) as 
revenue\n\tfrom lineorder, dwdate\n\twhere lo_orderdate = d_datekey\n\t\tand 
d_yearmonthnum = 199401\n\t\tand lo_discount between 4 and 6\n\t\tand 
lo_quantity between 26 and 35;","sequential_pipe")
+    sql.resultSet("sys.L1","revenue","hugeint",64,0,X_63);
+end user.s2_1;
 
 # 23:10:45 >  
 # 23:10:45 >  "Done."
diff --git a/sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128 
b/sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128
--- a/sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128
+++ b/sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128
@@ -36,8 +36,9 @@ Ready.
 % .explain # table_name
 % mal # name
 % clob # type
-% 283 # length
+% 300 # length
 function 
user.s2_1{autoCommit=true}(A0:int,A1:int,A2:int,A3:int,A4:int,A5:int):void;
+    X_79:void  := querylog.define("explain\nselect 
sum(lo_extendedprice*lo_discount) as revenue\n\tfrom lineorder, dwdate\n\twhere 
lo_orderdate = d_datekey\n\t\tand d_weeknuminyear = 6 and d_year = 
1994\n\t\tand lo_discount between 5 and 7\n\t\tand lo_quantity between 36 and 
40;","sequential_pipe");
     X_8 := sql.mvc();
     X_12:bat[:oid,:int]  := sql.bind(X_8,"sys","lineorder","lo_quantity",0);
     X_20:bat[:oid,:int]  := sql.bind(X_8,"sys","lineorder","lo_discount",0);
@@ -80,14 +81,13 @@ function user.s2_1{autoCommit=true}(A0:i
     X_65:bat[:oid,:int]  := 
sql.bind(X_8,"sys","lineorder","lo_extendedprice",1);
     X_66 := sql.projectdelta(X_27,X_59,X_62,r1_78,X_65);
     X_67 := algebra.leftfetchjoin(X_55,X_66);
-    X_68 := batcalc.hge(X_67);
+    X_68 := batcalc.lng(X_67);
     X_69 := sql.projectdelta(X_27,X_20,X_22,r1_26,X_24);
     X_70 := algebra.leftfetchjoin(X_55,X_69);
-    X_71:bat[:oid,:hge]  := batcalc.*(X_68,X_70);
+    X_71:bat[:oid,:lng]  := batcalc.*(X_68,X_70);
     X_72:hge  := aggr.sum(X_71);
-    sql.resultSet("sys.L1","revenue","hugeint",128,0,X_72);
-end s2_1;
-# querylog.define("explain\nselect sum(lo_extendedprice*lo_discount) as 
revenue\n\tfrom lineorder, dwdate\n\twhere lo_orderdate = d_datekey\n\t\tand 
d_weeknuminyear = 6 and d_year = 1994\n\t\tand lo_discount between 5 and 
7\n\t\tand lo_quantity between 36 and 40;","sequential_pipe")
+    sql.resultSet("sys.L1","revenue","hugeint",64,0,X_72);
+end user.s2_1;
 
 # 23:10:45 >  
 # 23:10:45 >  "Done."
diff --git a/sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128 
b/sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128
--- a/sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128
+++ b/sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128
@@ -39,8 +39,9 @@ Ready.
 % .explain # table_name
 % mal # name
 % clob # type
-% 392 # length
+% 410 # length
 function user.s2_1{autoCommit=true}(A0:str,A1:str):void;
+    X_155:void  := querylog.define("explain\nselect sum(lo_revenue), d_year, 
p_brand1\n\tfrom lineorder, dwdate, part, supplier\n\twhere lo_orderdate = 
d_datekey\n\t\tand lo_partkey = p_partkey\n\t\tand lo_suppkey = 
s_suppkey\n\t\tand p_category = \\'MFGR#12\\' -- OK to add p_mfgr = 
’MFGR#1’\n\t\tand s_region = \\'AMERICA\\'\n\tgroup by d_year, 
p_brand1\n\torder by d_year, p_brand1;","sequential_pipe");
     X_121 := bat.new(nil:oid,nil:str);
     X_129 := bat.append(X_121,"sys.L1");
     X_139 := bat.append(X_129,"sys.dwdate");
@@ -127,8 +128,7 @@ function user.s2_1{autoCommit=true}(A0:s
     X_118 := algebra.leftfetchjoin(r1_115,X_95);
     X_119 := algebra.leftfetchjoin(r1_115,X_94);
     sql.resultSet(X_147,X_149,X_151,X_153,X_154,X_117,X_118,X_119);
-end s2_1;
-# querylog.define("explain\nselect sum(lo_revenue), d_year, p_brand1\n\tfrom 
lineorder, dwdate, part, supplier\n\twhere lo_orderdate = d_datekey\n\t\tand 
lo_partkey = p_partkey\n\t\tand lo_suppkey = s_suppkey\n\t\tand p_category = 
\\'MFGR#12\\' -- OK to add p_mfgr = ’MFGR#1’\n\t\tand s_region = 
\\'AMERICA\\'\n\tgroup by d_year, p_brand1\n\torder by d_year, 
p_brand1;","sequential_pipe")
+end user.s2_1;
 
 # 23:10:46 >  
 # 23:10:46 >  "Done."
diff --git a/sql/benchmarks/ssbm/Tests/05-explain.stable.out.int128 
b/sql/benchmarks/ssbm/Tests/05-explain.stable.out.int128
--- a/sql/benchmarks/ssbm/Tests/05-explain.stable.out.int128
+++ b/sql/benchmarks/ssbm/Tests/05-explain.stable.out.int128
@@ -41,8 +41,9 @@ Ready.
 % .explain # table_name
 % mal # name
 % clob # type
-% 461 # length
+% 479 # length
 function user.s2_1{autoCommit=true}(A0:str,A1:str,A2:str):void;
+    X_147:void  := querylog.define("explain\nselect sum(lo_revenue), d_year, 
p_brand1\n\tfrom lineorder, dwdate, part, supplier\n\twhere lo_orderdate = 
d_datekey\n\t\tand lo_partkey = p_partkey\n\t\tand lo_suppkey = 
s_suppkey\n\t\t-- OK to add p_mfgr=’MFGR#2’\n\t\t-- OK to add 
p_category=’MFGR#22’\n\t\tand p_brand1 between \\'MFGR#2221\\' and 
\\'MFGR#2228\\'\n\t\tand s_region = \\'ASIA\\'\n\tgroup by d_year, 
p_brand1\n\torder by d_year, p_brand1;","sequential_pipe");
     X_113 := bat.new(nil:oid,nil:str);
     X_121 := bat.append(X_113,"sys.L1");
     X_131 := bat.append(X_121,"sys.dwdate");
@@ -126,8 +127,7 @@ function user.s2_1{autoCommit=true}(A0:s
     X_110 := algebra.leftfetchjoin(r1_109,X_90);
     X_111 := algebra.leftfetchjoin(r1_109,X_89);
     sql.resultSet(X_139,X_141,X_143,X_145,X_146,X_109,X_110,X_111);
-end s2_1;
-# querylog.define("explain\nselect sum(lo_revenue), d_year, p_brand1\n\tfrom 
lineorder, dwdate, part, supplier\n\twhere lo_orderdate = d_datekey\n\t\tand 
lo_partkey = p_partkey\n\t\tand lo_suppkey = s_suppkey\n\t\t-- OK to add 
p_mfgr=’MFGR#2’\n\t\t-- OK to add p_category=’MFGR#22’\n\t\tand p_brand1 
between \\'MFGR#2221\\' and \\'MFGR#2228\\'\n\t\tand s_region = 
\\'ASIA\\'\n\tgroup by d_year, p_brand1\n\torder by d_year, 
p_brand1;","sequential_pipe")
+end user.s2_1;
 
 # 23:10:46 >  
 # 23:10:46 >  "Done."
diff --git a/sql/benchmarks/ssbm/Tests/06-explain.stable.out.int128 
b/sql/benchmarks/ssbm/Tests/06-explain.stable.out.int128
--- a/sql/benchmarks/ssbm/Tests/06-explain.stable.out.int128
+++ b/sql/benchmarks/ssbm/Tests/06-explain.stable.out.int128
@@ -41,8 +41,9 @@ Ready.
 % .explain # table_name
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to