Changeset: 94867e9cebc6 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=94867e9cebc6
Modified Files:
sql/benchmarks/tpch/Tests/10-explain.stable.out
sql/benchmarks/tpch/Tests/10-explain.stable.out.int128
sql/benchmarks/tpch/Tests/10-plan.stable.out.int128
sql/benchmarks/tpch/Tests/18-explain.stable.out.int128
sql/benchmarks/tpch/Tests/18-plan.stable.out.int128
sql/server/rel_optimizer.c
sql/test/BugTracker-2011/Tests/groupby_primary_key.Bug-2807.stable.out
Branch: default
Log Message:
reduce groupby expressions, but there is no need for late projection based
on the full table.
diffs (truncated from 690 to 300 lines):
diff --git a/sql/benchmarks/tpch/Tests/10-explain.stable.out
b/sql/benchmarks/tpch/Tests/10-explain.stable.out
--- a/sql/benchmarks/tpch/Tests/10-explain.stable.out
+++ b/sql/benchmarks/tpch/Tests/10-explain.stable.out
@@ -125,12 +125,12 @@ function user.s2_1(A0:bte,A1:date,A2:dat
X_29:bat[:date] := sql.bind(X_6,"sys","orders","o_orderdate",0);
C_27:bat[:oid] := sql.tid(X_6,"sys","orders");
X_34:date := mtime.addmonths(A2,A3);
- C_236 := algebra.subselect(X_29,C_27,A1,X_34,true,false,false);
+ C_232 := algebra.subselect(X_29,C_27,A1,X_34,true,false,false);
(C_31,r1_37) := sql.bind(X_6,"sys","orders","o_orderdate",2);
- C_237 := algebra.subselect(r1_37,nil:bat[:oid],A1,X_34,true,false,false);
+ C_233 := algebra.subselect(r1_37,nil:bat[:oid],A1,X_34,true,false,false);
X_33:bat[:date] := sql.bind(X_6,"sys","orders","o_orderdate",1);
- C_238 := algebra.subselect(X_33,C_27,A1,X_34,true,false,false);
- C_35 := sql.subdelta(C_236,C_27,C_31,C_237,C_238);
+ C_234 := algebra.subselect(X_33,C_27,A1,X_34,true,false,false);
+ C_35 := sql.subdelta(C_232,C_27,C_31,C_233,C_234);
(X_36,r1_48) := algebra.subjoin(X_26,C_35,nil:BAT,nil:BAT,false,nil:lng);
X_40:bat[:oid] :=
sql.bind_idxbat(X_6,"sys","orders","orders_o_custkey_fkey",0);
(X_42,r1_55) :=
sql.bind_idxbat(X_6,"sys","orders","orders_o_custkey_fkey",2);
diff --git a/sql/benchmarks/tpch/Tests/10-explain.stable.out.int128
b/sql/benchmarks/tpch/Tests/10-explain.stable.out.int128
--- a/sql/benchmarks/tpch/Tests/10-explain.stable.out.int128
+++ b/sql/benchmarks/tpch/Tests/10-explain.stable.out.int128
@@ -63,61 +63,61 @@ Ready.
% clob # type
% 619 # length
function user.s2_1(A0:bte,A1:date,A2:date,A3:int,A4:str):void;
- X_215:void := querylog.define("explain select\n c_custkey,\n c_name,\n
sum(l_extendedprice * (1 - l_discount)) as revenue,\n c_acctbal,\n n_name,\n
c_address,\n c_phone,\n c_comment\nfrom\n customer,\n orders,\n lineitem,\n
nation\nwhere\n c_custkey = o_custkey\n and l_orderkey = o_orderkey\n and
o_orderdate >= date \\'1993-10-01\\'\n and o_orderdate < date \\'1993-10-01\\'
+ interval \\'3\\' month\n and l_returnflag = \\'R\\'\n and c_nationkey =
n_nationkey\ngroup by\n c_custkey,\n c_name,\n c_acctbal,\n c_phone,\n
n_name,\n c_address,\n c_comment\norder by\n revenue desc\nlimit
20;","sequential_pipe",148);
+ X_211:void := querylog.define("explain select\n c_custkey,\n c_name,\n
sum(l_extendedprice * (1 - l_discount)) as revenue,\n c_acctbal,\n n_name,\n
c_address,\n c_phone,\n c_comment\nfrom\n customer,\n orders,\n lineitem,\n
nation\nwhere\n c_custkey = o_custkey\n and l_orderkey = o_orderkey\n and
o_orderdate >= date \\'1993-10-01\\'\n and o_orderdate < date \\'1993-10-01\\'
+ interval \\'3\\' month\n and l_returnflag = \\'R\\'\n and c_nationkey =
n_nationkey\ngroup by\n c_custkey,\n c_name,\n c_acctbal,\n c_phone,\n
n_name,\n c_address,\n c_comment\norder by\n revenue desc\nlimit
20;","sequential_pipe",145);
+ X_149 := bat.new(nil:oid,nil:str);
+ X_157 := bat.append(X_149,"sys.customer");
+ X_165 := bat.append(X_157,"sys.customer");
+ X_172 := bat.append(X_165,"sys.L1");
+ X_182 := bat.append(X_172,"sys.customer");
+ X_187 := bat.append(X_182,"sys.nation");
+ X_194 := bat.append(X_187,"sys.customer");
+ X_200 := bat.append(X_194,"sys.customer");
+ X_205 := bat.append(X_200,"sys.customer");
+ X_152 := bat.new(nil:oid,nil:str);
+ X_159 := bat.append(X_152,"c_custkey");
+ X_166 := bat.append(X_159,"c_name");
+ X_174 := bat.append(X_166,"revenue");
+ X_183 := bat.append(X_174,"c_acctbal");
+ X_189 := bat.append(X_183,"n_name");
+ X_195 := bat.append(X_189,"c_address");
+ X_201 := bat.append(X_195,"c_phone");
+ X_206 := bat.append(X_201,"c_comment");
X_153 := bat.new(nil:oid,nil:str);
- X_161 := bat.append(X_153,"sys.customer");
- X_169 := bat.append(X_161,"sys.customer");
- X_176 := bat.append(X_169,"sys.L1");
- X_186 := bat.append(X_176,"sys.customer");
- X_191 := bat.append(X_186,"sys.nation");
- X_198 := bat.append(X_191,"sys.customer");
- X_204 := bat.append(X_198,"sys.customer");
- X_209 := bat.append(X_204,"sys.customer");
- X_156 := bat.new(nil:oid,nil:str);
- X_163 := bat.append(X_156,"c_custkey");
- X_170 := bat.append(X_163,"c_name");
- X_178 := bat.append(X_170,"revenue");
- X_187 := bat.append(X_178,"c_acctbal");
- X_193 := bat.append(X_187,"n_name");
- X_199 := bat.append(X_193,"c_address");
- X_205 := bat.append(X_199,"c_phone");
- X_210 := bat.append(X_205,"c_comment");
- X_157 := bat.new(nil:oid,nil:str);
- X_164 := bat.append(X_157,"int");
- X_171 := bat.append(X_164,"varchar");
- X_180 := bat.append(X_171,"decimal");
- X_188 := bat.append(X_180,"decimal");
- X_194 := bat.append(X_188,"char");
- X_200 := bat.append(X_194,"varchar");
- X_206 := bat.append(X_200,"char");
- X_211 := bat.append(X_206,"varchar");
- X_158 := bat.new(nil:oid,nil:int);
- X_166 := bat.append(X_158,32);
- X_173 := bat.append(X_166,25);
- X_182 := bat.append(X_173,39);
- X_189 := bat.append(X_182,15);
- X_196 := bat.append(X_189,25);
- X_201 := bat.append(X_196,40);
- X_207 := bat.append(X_201,15);
- X_212 := bat.append(X_207,117);
- X_160 := bat.new(nil:oid,nil:int);
- X_168 := bat.append(X_160,0);
- X_175 := bat.append(X_168,0);
- X_184 := bat.append(X_175,4);
- X_190 := bat.append(X_184,2);
- X_197 := bat.append(X_190,0);
- X_203 := bat.append(X_197,0);
- X_208 := bat.append(X_203,0);
- X_214 := bat.append(X_208,0);
+ X_160 := bat.append(X_153,"int");
+ X_167 := bat.append(X_160,"varchar");
+ X_176 := bat.append(X_167,"decimal");
+ X_184 := bat.append(X_176,"decimal");
+ X_190 := bat.append(X_184,"char");
+ X_196 := bat.append(X_190,"varchar");
+ X_202 := bat.append(X_196,"char");
+ X_207 := bat.append(X_202,"varchar");
+ X_154 := bat.new(nil:oid,nil:int);
+ X_162 := bat.append(X_154,32);
+ X_169 := bat.append(X_162,25);
+ X_178 := bat.append(X_169,39);
+ X_185 := bat.append(X_178,15);
+ X_192 := bat.append(X_185,25);
+ X_197 := bat.append(X_192,40);
+ X_203 := bat.append(X_197,15);
+ X_208 := bat.append(X_203,117);
+ X_156 := bat.new(nil:oid,nil:int);
+ X_164 := bat.append(X_156,0);
+ X_171 := bat.append(X_164,0);
+ X_180 := bat.append(X_171,4);
+ X_186 := bat.append(X_180,2);
+ X_193 := bat.append(X_186,0);
+ X_199 := bat.append(X_193,0);
+ X_204 := bat.append(X_199,0);
+ X_210 := bat.append(X_204,0);
X_6 := sql.mvc();
X_10:bat[:str] := sql.bind(X_6,"sys","lineitem","l_returnflag",0);
C_7:bat[:oid] := sql.tid(X_6,"sys","lineitem");
- C_232 := algebra.subselect(X_10,C_7,A4,A4,true,false,false);
+ C_228 := algebra.subselect(X_10,C_7,A4,A4,true,false,false);
(C_13,r1_13) := sql.bind(X_6,"sys","lineitem","l_returnflag",2);
- C_233 := algebra.subselect(r1_13,nil:bat[:oid],A4,A4,true,false,false);
+ C_229 := algebra.subselect(r1_13,nil:bat[:oid],A4,A4,true,false,false);
X_16:bat[:str] := sql.bind(X_6,"sys","lineitem","l_returnflag",1);
- C_235 := algebra.subselect(X_16,C_7,A4,A4,true,false,false);
- C_18 := sql.subdelta(C_232,C_7,C_13,C_233,C_235);
+ C_231 := algebra.subselect(X_16,C_7,A4,A4,true,false,false);
+ C_18 := sql.subdelta(C_228,C_7,C_13,C_229,C_231);
X_21:bat[:oid] :=
sql.bind_idxbat(X_6,"sys","lineitem","lineitem_l_orderkey_fkey",0);
(X_23,r1_27) :=
sql.bind_idxbat(X_6,"sys","lineitem","lineitem_l_orderkey_fkey",2);
X_25:bat[:oid] :=
sql.bind_idxbat(X_6,"sys","lineitem","lineitem_l_orderkey_fkey",1);
@@ -125,12 +125,12 @@ function user.s2_1(A0:bte,A1:date,A2:dat
X_29:bat[:date] := sql.bind(X_6,"sys","orders","o_orderdate",0);
C_27:bat[:oid] := sql.tid(X_6,"sys","orders");
X_34:date := mtime.addmonths(A2,A3);
- C_236 := algebra.subselect(X_29,C_27,A1,X_34,true,false,false);
+ C_232 := algebra.subselect(X_29,C_27,A1,X_34,true,false,false);
(C_31,r1_37) := sql.bind(X_6,"sys","orders","o_orderdate",2);
- C_237 := algebra.subselect(r1_37,nil:bat[:oid],A1,X_34,true,false,false);
+ C_233 := algebra.subselect(r1_37,nil:bat[:oid],A1,X_34,true,false,false);
X_33:bat[:date] := sql.bind(X_6,"sys","orders","o_orderdate",1);
- C_238 := algebra.subselect(X_33,C_27,A1,X_34,true,false,false);
- C_35 := sql.subdelta(C_236,C_27,C_31,C_237,C_238);
+ C_234 := algebra.subselect(X_33,C_27,A1,X_34,true,false,false);
+ C_35 := sql.subdelta(C_232,C_27,C_31,C_233,C_234);
(X_36,r1_48) := algebra.subjoin(X_26,C_35,nil:BAT,nil:BAT,false,nil:lng);
X_40:bat[:oid] :=
sql.bind_idxbat(X_6,"sys","orders","orders_o_custkey_fkey",0);
(X_42,r1_55) :=
sql.bind_idxbat(X_6,"sys","orders","orders_o_custkey_fkey",2);
@@ -146,69 +146,66 @@ function user.s2_1(A0:bte,A1:date,A2:dat
X_57 := algebra.projection(r1_64,X_56);
C_58:bat[:oid] := sql.tid(X_6,"sys","nation");
(X_60,r1_77) := algebra.subjoin(X_57,C_58,nil:BAT,nil:BAT,false,nil:lng);
- X_62:bat[:str] := sql.bind(X_6,"sys","nation","n_name",0);
- (C_64,r1_81) := sql.bind(X_6,"sys","nation","n_name",2);
- X_66:bat[:str] := sql.bind(X_6,"sys","nation","n_name",1);
- X_67 := sql.projectdelta(C_58,X_62,C_64,r1_81,X_66);
- X_68 := algebra.projection(r1_77,X_67);
- X_69:bat[:int] := sql.bind(X_6,"sys","customer","c_custkey",0);
- (C_71,r1_89) := sql.bind(X_6,"sys","customer","c_custkey",2);
- X_73:bat[:int] := sql.bind(X_6,"sys","customer","c_custkey",1);
- X_74 := sql.projectdelta(C_47,X_69,C_71,r1_89,X_73);
- X_75:bat[:int] := algebra.projectionpath(X_60,r1_64,X_74);
- (X_76,r1_96,r2_96) := group.subgroup(X_75);
- (X_79,r1_99,r2_99) := group.subgroupdone(X_68,X_76);
- X_82 := algebra.projection(r1_99,X_75);
- X_85:bat[:lng] := sql.bind(X_6,"sys","lineitem","l_extendedprice",0);
- (C_87,r1_119) := sql.bind(X_6,"sys","lineitem","l_extendedprice",2);
- X_89:bat[:lng] := sql.bind(X_6,"sys","lineitem","l_extendedprice",1);
- X_90 := sql.projectdelta(C_18,X_85,C_87,r1_119,X_89);
- X_91:bat[:lng] := algebra.projectionpath(X_60,X_49,X_36,X_90);
- X_92 := calc.lng(A0,15,2);
- X_94:bat[:lng] := sql.bind(X_6,"sys","lineitem","l_discount",0);
- (C_96,r1_138) := sql.bind(X_6,"sys","lineitem","l_discount",2);
- X_98:bat[:lng] := sql.bind(X_6,"sys","lineitem","l_discount",1);
- X_99 := sql.projectdelta(C_18,X_94,C_96,r1_138,X_98);
- X_100:bat[:lng] := algebra.projectionpath(X_60,X_49,X_36,X_99);
- X_101:bat[:lng] := batcalc.-(X_92,X_100);
- X_102:bat[:hge] := batcalc.*(X_91,X_101);
- X_103:bat[:hge] := aggr.subsum(X_102,X_79,r1_99,true,true);
- (X_83,r1_111) := algebra.subjoin(X_82,X_74,nil:BAT,nil:BAT,false,nil:lng);
- X_104 := algebra.projection(X_83,X_103);
- C_107 := algebra.firstn(X_104,20,false,false);
- X_108 := algebra.projection(C_107,X_104);
- (X_109,r1_164,r2_164) := algebra.subsort(X_108,true,false);
- X_112:bat[:int] := algebra.projectionpath(r1_164,C_107,X_83,X_82);
- X_113 := algebra.subslice(X_112,0,19:wrd);
- X_130:bat[:str] :=
algebra.projectionpath(X_113,r1_164,C_107,X_83,r1_99,X_68);
- X_114 := algebra.projection(X_113,X_112);
- X_115:bat[:str] := sql.bind(X_6,"sys","customer","c_name",0);
- (C_117,r1_179) := sql.bind(X_6,"sys","customer","c_name",2);
- X_119:bat[:str] := sql.bind(X_6,"sys","customer","c_name",1);
- X_120 := sql.projectdelta(C_47,X_115,C_117,r1_179,X_119);
- X_121:bat[:str] := algebra.projectionpath(X_113,r1_164,C_107,r1_111,X_120);
- X_122:bat[:hge] := algebra.projectionpath(X_113,r1_164,X_108);
- X_123:bat[:lng] := sql.bind(X_6,"sys","customer","c_acctbal",0);
- (C_125,r1_192) := sql.bind(X_6,"sys","customer","c_acctbal",2);
- X_127:bat[:lng] := sql.bind(X_6,"sys","customer","c_acctbal",1);
- X_128 := sql.projectdelta(C_47,X_123,C_125,r1_192,X_127);
- X_129:bat[:lng] := algebra.projectionpath(X_113,r1_164,C_107,r1_111,X_128);
- X_131:bat[:str] := sql.bind(X_6,"sys","customer","c_address",0);
- (C_133,r1_208) := sql.bind(X_6,"sys","customer","c_address",2);
- X_135:bat[:str] := sql.bind(X_6,"sys","customer","c_address",1);
- X_136 := sql.projectdelta(C_47,X_131,C_133,r1_208,X_135);
- X_137:bat[:str] := algebra.projectionpath(X_113,r1_164,C_107,r1_111,X_136);
- X_138:bat[:str] := sql.bind(X_6,"sys","customer","c_phone",0);
- (C_140,r1_219) := sql.bind(X_6,"sys","customer","c_phone",2);
- X_142:bat[:str] := sql.bind(X_6,"sys","customer","c_phone",1);
- X_143 := sql.projectdelta(C_47,X_138,C_140,r1_219,X_142);
- X_144:bat[:str] := algebra.projectionpath(X_113,r1_164,C_107,r1_111,X_143);
- X_145:bat[:str] := sql.bind(X_6,"sys","customer","c_comment",0);
- (C_147,r1_230) := sql.bind(X_6,"sys","customer","c_comment",2);
- X_149:bat[:str] := sql.bind(X_6,"sys","customer","c_comment",1);
- X_150 := sql.projectdelta(C_47,X_145,C_147,r1_230,X_149);
- X_151:bat[:str] := algebra.projectionpath(X_113,r1_164,C_107,r1_111,X_150);
-
sql.resultSet(X_209,X_210,X_211,X_212,X_214,X_114,X_121,X_122,X_129,X_130,X_137,X_144,X_151);
+ X_62:bat[:lng] := sql.bind(X_6,"sys","lineitem","l_extendedprice",0);
+ (C_64,r1_81) := sql.bind(X_6,"sys","lineitem","l_extendedprice",2);
+ X_66:bat[:lng] := sql.bind(X_6,"sys","lineitem","l_extendedprice",1);
+ X_67 := sql.projectdelta(C_18,X_62,C_64,r1_81,X_66);
+ X_68:bat[:lng] := algebra.projectionpath(X_60,X_49,X_36,X_67);
+ X_69 := calc.lng(A0,15,2);
+ X_71:bat[:lng] := sql.bind(X_6,"sys","lineitem","l_discount",0);
+ (C_73,r1_100) := sql.bind(X_6,"sys","lineitem","l_discount",2);
+ X_75:bat[:lng] := sql.bind(X_6,"sys","lineitem","l_discount",1);
+ X_76 := sql.projectdelta(C_18,X_71,C_73,r1_100,X_75);
+ X_77:bat[:lng] := algebra.projectionpath(X_60,X_49,X_36,X_76);
+ X_78:bat[:lng] := batcalc.-(X_69,X_77);
+ X_79:bat[:hge] := batcalc.*(X_68,X_78);
+ X_80:bat[:str] := sql.bind(X_6,"sys","nation","n_name",0);
+ (C_82,r1_115) := sql.bind(X_6,"sys","nation","n_name",2);
+ X_84:bat[:str] := sql.bind(X_6,"sys","nation","n_name",1);
+ X_85 := sql.projectdelta(C_58,X_80,C_82,r1_115,X_84);
+ X_86 := algebra.projection(r1_77,X_85);
+ X_87:bat[:int] := sql.bind(X_6,"sys","customer","c_custkey",0);
+ (C_89,r1_123) := sql.bind(X_6,"sys","customer","c_custkey",2);
+ X_91:bat[:int] := sql.bind(X_6,"sys","customer","c_custkey",1);
+ X_92 := sql.projectdelta(C_47,X_87,C_89,r1_123,X_91);
+ X_93:bat[:int] := algebra.projectionpath(X_60,r1_64,X_92);
+ (X_94,r1_130,r2_130) := group.subgroup(X_93);
+ (X_97,r1_133,r2_133) := group.subgroupdone(X_86,X_94);
+ X_100:bat[:hge] := aggr.subsum(X_79,X_97,r1_133,true,true);
+ C_103 := algebra.firstn(X_100,20,false,false);
+ X_104 := algebra.projection(C_103,X_100);
+ (X_105,r1_148,r2_148) := algebra.subsort(X_104,true,false);
+ X_108:bat[:int] := algebra.projectionpath(r1_148,C_103,r1_133,X_93);
+ X_111:bat[:str] := sql.bind(X_6,"sys","customer","c_name",0);
+ (C_113,r1_163) := sql.bind(X_6,"sys","customer","c_name",2);
+ X_115:bat[:str] := sql.bind(X_6,"sys","customer","c_name",1);
+ X_116 := sql.projectdelta(C_47,X_111,C_113,r1_163,X_115);
+ X_109 := algebra.subslice(X_108,0,19:wrd);
+ X_117:bat[:str] :=
algebra.projectionpath(X_109,r1_148,C_103,r1_133,X_60,r1_64,X_116);
+ X_119:bat[:lng] := sql.bind(X_6,"sys","customer","c_acctbal",0);
+ (C_121,r1_178) := sql.bind(X_6,"sys","customer","c_acctbal",2);
+ X_123:bat[:lng] := sql.bind(X_6,"sys","customer","c_acctbal",1);
+ X_124 := sql.projectdelta(C_47,X_119,C_121,r1_178,X_123);
+ X_125:bat[:lng] :=
algebra.projectionpath(X_109,r1_148,C_103,r1_133,X_60,r1_64,X_124);
+ X_126:bat[:str] := algebra.projectionpath(X_109,r1_148,C_103,r1_133,X_86);
+ X_127:bat[:str] := sql.bind(X_6,"sys","customer","c_address",0);
+ (C_129,r1_195) := sql.bind(X_6,"sys","customer","c_address",2);
+ X_131:bat[:str] := sql.bind(X_6,"sys","customer","c_address",1);
+ X_132 := sql.projectdelta(C_47,X_127,C_129,r1_195,X_131);
+ X_133:bat[:str] :=
algebra.projectionpath(X_109,r1_148,C_103,r1_133,X_60,r1_64,X_132);
+ X_134:bat[:str] := sql.bind(X_6,"sys","customer","c_phone",0);
+ (C_136,r1_208) := sql.bind(X_6,"sys","customer","c_phone",2);
+ X_138:bat[:str] := sql.bind(X_6,"sys","customer","c_phone",1);
+ X_139 := sql.projectdelta(C_47,X_134,C_136,r1_208,X_138);
+ X_140:bat[:str] :=
algebra.projectionpath(X_109,r1_148,C_103,r1_133,X_60,r1_64,X_139);
+ X_141:bat[:str] := sql.bind(X_6,"sys","customer","c_comment",0);
+ (C_143,r1_221) := sql.bind(X_6,"sys","customer","c_comment",2);
+ X_145:bat[:str] := sql.bind(X_6,"sys","customer","c_comment",1);
+ X_146 := sql.projectdelta(C_47,X_141,C_143,r1_221,X_145);
+ X_147:bat[:str] :=
algebra.projectionpath(X_109,r1_148,C_103,r1_133,X_60,r1_64,X_146);
+ X_110 := algebra.projection(X_109,X_108);
+ X_118:bat[:hge] := algebra.projectionpath(X_109,r1_148,X_104);
+
sql.resultSet(X_205,X_206,X_207,X_208,X_210,X_110,X_117,X_118,X_125,X_126,X_133,X_140,X_147);
end user.s2_1;
# 22:53:27 >
diff --git a/sql/benchmarks/tpch/Tests/10-plan.stable.out.int128
b/sql/benchmarks/tpch/Tests/10-plan.stable.out.int128
--- a/sql/benchmarks/tpch/Tests/10-plan.stable.out.int128
+++ b/sql/benchmarks/tpch/Tests/10-plan.stable.out.int128
@@ -60,30 +60,25 @@ Ready.
% .plan # table_name
% rel # name
% clob # type
-% 328 # length
+% 463 # length
top N (
| project (
-| | project (
+| | group by (
| | | join (
-| | | | group by (
+| | | | join (
| | | | | join (
-| | | | | | join (
-| | | | | | | join (
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list