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

Reply via email to