Changeset: ede7b09261f9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ede7b09261f9
Modified Files:
sql/server/rel_optimizer.c
testing/Mtest.py.in
Branch: mtest
Log Message:
sync before merge with default
diffs (267 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -3758,35 +3758,42 @@ rel_project_cse(visitor *v, sql_rel *rel
}
static list *
-exps_merge_select_rse( mvc *sql, list *l, list *r )
+exps_merge_select_rse( mvc *sql, list *l, list *r, bool *merged)
{
node *n, *m, *o;
list *nexps = NULL, *lexps, *rexps;
+ bool lmerged = true, rmerged = true;
lexps = new_exp_list(sql->sa);
for (n = l->h; n; n = n->next) {
sql_exp *e = n->data;
if (e->type == e_cmp && e->flag == cmp_or && !is_anti(e) &&
!is_semantics(e)) {
- list *nexps = exps_merge_select_rse(sql, e->l, e->r);
+ lmerged = false;
+ list *nexps = exps_merge_select_rse(sql, e->l, e->r,
&lmerged);
for (o = nexps->h; o; o = o->next)
append(lexps, o->data);
} else {
append(lexps, e);
}
}
+ if (lmerged)
+ lmerged = (list_length(lexps) == 1);
rexps = new_exp_list(sql->sa);
for (n = r->h; n; n = n->next) {
sql_exp *e = n->data;
if (e->type == e_cmp && e->flag == cmp_or && !is_anti(e) &&
!is_semantics(e)) {
- list *nexps = exps_merge_select_rse(sql, e->l, e->r);
+ rmerged = false;
+ list *nexps = exps_merge_select_rse(sql, e->l, e->r,
&rmerged);
for (o = nexps->h; o; o = o->next)
append(rexps, o->data);
} else {
append(rexps, e);
}
}
+ if (rmerged)
+ rmerged = (list_length(r) == 1);
nexps = new_exp_list(sql->sa);
@@ -3850,9 +3857,12 @@ exps_merge_select_rse( mvc *sql, list *l
mine = exp_binop(sql->sa, le->r, re->r, min);
maxe = exp_binop(sql->sa, le->f, re->f, max);
fnd = exp_compare2(sql->sa, le->l, mine, maxe,
CMP_BETWEEN|le->flag);
- }
- if (fnd)
+ lmerged = false;
+ }
+ if (fnd) {
append(nexps, fnd);
+ *merged = (fnd && lmerged && rmerged);
+ }
}
}
return nexps;
@@ -3911,6 +3921,11 @@ rel_merge_project_rse(visitor *v, sql_re
* (x = e and y > 1 and y < 20)) and
* x in (a,c,e) and
* y > 1 and y < 20
+ *
+ * for single expression or's we can do better
+ * x in (a, b, c) or x in (d, e, f)
+ * ->
+ * x in (a, b, c, d, e, f)
* */
static sql_rel *
rel_merge_select_rse(visitor *v, sql_rel *rel)
@@ -3925,14 +3940,18 @@ rel_merge_select_rse(visitor *v, sql_rel
if (e->type == e_cmp && e->flag == cmp_or &&
!is_anti(e) && !is_semantics(e)) {
/* possibly merge related expressions */
- list *ps = exps_merge_select_rse(v->sql, e->l,
e->r);
+ bool merged = false;
+
+ list *ps = exps_merge_select_rse(v->sql, e->l,
e->r, &merged);
for (o = ps->h; o; o = o->next)
append(nexps, o->data);
- }
- }
- if (!list_empty(nexps))
- for (o = nexps->h; o; o = o->next)
- append(rel->exps, o->data);
+ if (!merged)
+ append(nexps, e);
+ } else {
+ append(nexps, e);
+ }
+ }
+ rel->exps = nexps;
rel->used = 1;
}
return rel;
@@ -4651,14 +4670,18 @@ rel_push_select_down_join(visitor *v, sq
sql_exp *e = n->data;
if (rel_rebind_exp(v->sql, rel->l, e)) {
sql_rel *l = rel->l;
- if (!is_select(l->op))
+ if (!is_select(l->op)) {
+ set_processed(l);
rel->l = l = rel_select(v->sql->sa,
rel->l, NULL);
+ }
rel_select_add_exp(v->sql->sa, rel->l, e);
v->changes++;
} else if (rel_rebind_exp(v->sql, rel->r, e)) {
sql_rel *r = rel->r;
- if (!is_select(r->op))
+ if (!is_select(r->op)) {
+ set_processed(r);
rel->r = r = rel_select(v->sql->sa,
rel->r, NULL);
+ }
rel_select_add_exp(v->sql->sa, rel->r, e);
v->changes++;
} else {
diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in
--- a/testing/Mtest.py.in
+++ b/testing/Mtest.py.in
@@ -44,6 +44,7 @@ verbose = False
quiet = False
initdb = None
+single_in_memory = False
global_timeout = 0
start_time = time.time()
@@ -1351,19 +1352,29 @@ def PerformDir(env, testdir, testlist, B
for TST,COND in testlist:
if oneserver and (pSrvr is None or pSrvr.poll() is not
None):
# restart server
- cmd = splitcommand(env['exe']['mserver5'][1]) +
['--dbpath=%s' % LogDBdir] + options
+ inmem = single_in_memory
+ for o in options:
+ if o.startswith('embedded'):
+ inmem = False
+ break
+ if inmem:
+ cmd = splitcommand(env['exe']['mserver5'][1]) +
['--set', 'gdk_dbname=%s' % TSTDB, '--in-memory'] + options
+ pollfile = None
+ else:
+ cmd = splitcommand(env['exe']['mserver5'][1]) +
['--dbpath=%s' % LogDBdir] + options
+ pollfile = os.path.join(LogDBdir, '.started')
if env.get('MULTIFARM'):
cmd.append('--dbextra=%s' %
os.path.join(env['GDK_DBFARM'], TSTPREF + '_transient'))
shutil.rmtree(os.path.join(env['GDK_DBFARM'],
TSTPREF + '_transient'),
ignore_errors = True)
os.makedirs(os.path.join(env['GDK_DBFARM'],
TSTPREF + '_transient'))
elif env.get('TRANS_INMEM'):
- cmd.append('--dbextra=:inmemory')
+ cmd.append('--dbextra=:memory:')
pSrvr = ServerClass(cmd,
open(os.path.join(TSTTRGDIR,
'SingleServer.out'), 'a'),
open(os.path.join(TSTTRGDIR,
'SingleServer.err'), 'a'),
0,
- os.path.join(LogDBdir, '.started'),
+ pollfile,
int(env['MAPIPORT']))
os.chdir(TSTTRGDIR)
pSrvr.LaunchIt()
@@ -1424,7 +1435,6 @@ def PerformDir(env, testdir, testlist, B
'*.client.err', '*.client.out',
'*.err.diff.html', '*.err.head.html', '*.err.html',
'*.out.diff.html', '*.out.head.html', '*.out.html',
- '*.out.diff.txt', '*.err.diff.txt',
'*.server.err', '*.server.out',
'*.stable.err*', '*.stable.out*',
'*.test.err', '*.test.out',
@@ -1739,7 +1749,7 @@ def GetBitsAndModsAndThreads(env) :
ignore_errors = True)
os.makedirs(os.path.join(env['GDK_DBFARM'], TSTPREF + '_transient'))
elif env.get('TRANS_INMEM'):
- cmd.append('--dbextra=:inmemory')
+ cmd.append('--dbextra=:memory:')
if procdebug:
print('GetBitsAndModsAndThreads: starting process "%s" (inpipe,
outpipe, errpipe)\n' % '" "'.join(cmd))
setpgrp = True
@@ -2454,15 +2464,12 @@ def RunTest(env, TST, BusyPorts, COND, o
cmd.append('-d')
if not verbose:
cmd.append('-q')
- diff_format = env.get('diff_format', 'html')
- out_fn = ('%s.out.diff.html' % TST)
cmd.extend(['-F^#', '-I%s' % par['IGNORE'],
'-C%s' % par['CONTEXT'], '-A%d' % ACCURACYout,
titlefmt % ('err', 'err'),
- '-f{}'.format(diff_format),
'%s%s.FILTERED' % (TST, STABLEout),
'%s.test.out.FILTERED' % TST,
- out_fn])
+ '%s.out.diff.html' % TST])
if procdebug:
print('RunTest: starting process "%s"\n' % '" "'.join(cmd))
setpgrp = True
@@ -2526,15 +2533,12 @@ def RunTest(env, TST, BusyPorts, COND, o
cmd.append('-d')
if not verbose:
cmd.append('-q')
- diff_format = env.get('diff_format', 'html')
- out_fn = ('%s.err.diff.html' % TST)
cmd.extend(['-F^#', '-I%s' % par['IGNORE'],
'-C%s' % par['CONTEXT'], '-A%d' % ACCURACYerr,
titlefmt % ('out', 'out'),
- '-f{}'.format(diff_format),
'%s%s.FILTERED' % (TST, STABLEerr),
'%s.test.err.FILTERED' % TST,
- out_fn])
+ '%s.err.diff.html' % TST])
if procdebug:
print('RunTest: starting process "%s"\n' % '" "'.join(cmd))
setpgrp = True
@@ -2592,12 +2596,6 @@ def RunTest(env, TST, BusyPorts, COND, o
if not testweb:
elem = AddTstToHtmlIndex(env, TST, STABLEout, STABLEerr, EXT,
FailedOut, FailedErr)
- diff_format = env.get('diff_format', 'html')
- if diff_format == 'txt':
- # we know the content is not html, so change the extension here
- for f in [('%s.out.diff.html' % TST), ('%s.err.diff.html' % TST)]:
- if os.path.exists(f):
- shutil.move(f, f[:-4] + 'txt')
if not verbose and not quiet:
if tres == 'socket':
@@ -3130,7 +3128,7 @@ def DoIt(env, SERVER, CALL, TST, EXT, Te
ignore_errors = True)
os.makedirs(os.path.join(env['GDK_DBFARM'], TSTDB +
'_transient'))
elif env.get('TRANS_INMEM'):
- Srvr.append('--dbextra=:inmemory')
+ Srvr.append('--dbextra=:memory:')
if os.path.isfile(TST + '.options5'):
Srvr.extend(openutf8(TST + '.options5').read().split())
lang=""
@@ -3178,7 +3176,7 @@ def DoIt(env, SERVER, CALL, TST, EXT, Te
ignore_errors = True)
os.makedirs(os.path.join(env['GDK_DBFARM'], TSTPREF +
'_transient'))
elif env.get('TRANS_INMEM'):
- Srvr.append('--dbextra=:inmemory')
+ Srvr.append('--dbextra=:memory:')
pSrvr = ServerClass(Srvr, SrvrOut, SrvrErr, TIMEOUT,
os.path.join(dbpath, '.started'), int(env['MAPIPORT']))
pSrvr.LaunchIt()
if savepath is not None:
@@ -3802,7 +3800,7 @@ def main(argv) :
parser.add_argument('--data_path', '-D', action='store',
dest='data_path', metavar='<path>', help='Path to the root directory of the
data files needed for testing')
parser.add_argument('--alltests', action='store_true',
dest='alltests', help='also run tests that are known to fail')
parser.add_argument('--initdb', action='store', dest='initdb',
metavar='<zipfile>', help='zip file with contents for initial database')
- parser.add_argument('--diff-format', dest='diff_format', type=str,
metavar='html|txt', default='html', help='output format for the difference
between stable and current test (html or txt)')
+ parser.add_argument('--single-in-memory', action='store_true',
dest='single_in_memory', help='use --in-memory for SingleServer directories')
elif THISFILE == 'Mapprove.py':
f = _configure(os.path.join('@QXprefix@',dftTSTPREF,'.Mapprove.rc'))
v = ReadMapproveRc(f)
@@ -3889,7 +3887,8 @@ def main(argv) :
env['TSTDATAPATH'] = a
global initdb
initdb = opts.initdb
- env['diff_format'] = opts.diff_format
+ global single_in_memory
+ single_in_memory = opts.single_in_memory
if THISFILE == 'Mapprove.py':
a = opts.ext
if a is None:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list