Changeset: fe6468cef2b0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fe6468cef2b0
Modified Files:
        monetdb5/optimizer/opt_pipes.c
        sql/backends/monet5/Tests/optimizers.stable.err
        sql/test/Tests/setoptimizer.stable.err
        sql/test/Tests/setoptimizer.stable.out
Branch: Apr2012
Log Message:

When set optimizer fails, don't change old value.
It seems reasonable to me to not change the value of the SQL optimizer
variable if there is an error setting it.  This also means not
changing the optimizers() table.
Also approved new error messages.
This fixes bug 3030.


diffs (183 lines):

diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c
--- a/monetdb5/optimizer/opt_pipes.c
+++ b/monetdb5/optimizer/opt_pipes.c
@@ -434,6 +434,7 @@ addPipeDefinition(Client cntxt, str name
 {
        int i;
        str msg;
+       struct PIPELINES oldpipe;
 
        for (i = 0; i < MAXOPTPIPES && pipes[i].name; i++)
                if (pipes[i].name && strcmp(name, pipes[i].name) == 0)
@@ -444,22 +445,31 @@ addPipeDefinition(Client cntxt, str name
        if (i == MAXOPTPIPES)
                throw(MAL, "optimizer.addPipeDefinition", "Out of slots");
 
-       if (pipes[i].name)
-               GDKfree(pipes[i].name);
-       if (pipes[i].def)
-               GDKfree(pipes[i].def);
-       if (pipes[i].mb)
-               freeMalBlk(pipes[i].mb);
-       if (pipes[i].status)
-               GDKfree(pipes[i].status);
+       /* save old value */
+       oldpipe = pipes[i];
        pipes[i].name = GDKstrdup(name);
        pipes[i].def = GDKstrdup(pipe);
        pipes[i].status = GDKstrdup("experimental");
        pipes[i].mb = NULL;
        msg = compileOptimizer(cntxt, name);
        if (msg) {
+               /* failed: restore old value */
+               GDKfree(pipes[i].name);
+               GDKfree(pipes[i].def);
+               if (pipes[i].mb)
+                       freeMalBlk(pipes[i].mb);
                GDKfree(pipes[i].status);
-               pipes[i].status = GDKstrdup(msg);
+               pipes[i] = oldpipe;
+       } else {
+               /* succeeded: destroy old value */
+               if (oldpipe.name)
+                       GDKfree(oldpipe.name);
+               if (oldpipe.def)
+                       GDKfree(oldpipe.def);
+               if (oldpipe.mb)
+                       freeMalBlk(oldpipe.mb);
+               if (oldpipe.status)
+                       GDKfree(oldpipe.status);
        }
        return msg;
 }
diff --git a/sql/backends/monet5/Tests/optimizers.stable.err 
b/sql/backends/monet5/Tests/optimizers.stable.err
--- a/sql/backends/monet5/Tests/optimizers.stable.err
+++ b/sql/backends/monet5/Tests/optimizers.stable.err
@@ -30,69 +30,74 @@ stderr of test 'optimizers` in directory
 # 03:16:16 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=rome" 
"--port=36613"
 # 03:16:16 >  
 
-MAPI  = monetdb@rome:32064
+MAPI  = monetdb@madrid:32172
 QUERY = set optimizer='off';
-ERROR = !Syntax error detected.See documentation for details
-MAPI  = monetdb@rome:32064
+ERROR = !SyntaxException:parseError:
+        !';' expected
+        !Syntax error detected.See documentation for details
+MAPI  = monetdb@madrid:32172
 QUERY = set optimizer='on';
-ERROR = !Syntax error detected.See documentation for details
-MAPI  = monetdb@rome:32064
+ERROR = !SyntaxException:parseError:
+        !';' expected
+        !Syntax error detected.See documentation for details
+MAPI  = monetdb@madrid:32172
 QUERY = set optimizer='';
-ERROR = !Syntax error detected.See documentation for details
-MAPI  = monetdb@sofia:38256
+ERROR = !improper optimizer mal block
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.costModel();optimizer.coercions();optimizer.emptySet();optimizer.accessmode();optimizer.aliases();optimizer.commonTerms();optimizer.accumulators();optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.coercions();optimizer.emptySet();optimizer.accessmode();optimizer.aliases();optimizer.commonTerms();optimizer.accumulators();optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.emptySet();optimizer.accessmode();optimizer.aliases();optimizer.commonTerms();optimizer.accumulators();optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.accessmode();optimizer.aliases();optimizer.commonTerms();optimizer.accumulators();optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.aliases();optimizer.commonTerms();optimizer.accumulators();optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.commonTerms();optimizer.accumulators();optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.accumulators();optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.deadcode();optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set optimizer='optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set optimizer='optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.costModel();optimizer.coercions();optimizer.emptySet();optimizer.accessmode();optimizer.commonTerms();optimizer.accumulators();optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@sofia:38256
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.costModel();optimizer.coercions();optimizer.emptySet();optimizer.accessmode();optimizer.commonTerms();optimizer.accumulators();optimizer.joinPath();optimizer.deadcode();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
+MAPI  = monetdb@madrid:32172
 QUERY = set optimizer='optimizer.inline();';
 ERROR = !'multiplex' should be used
-MAPI  = monetdb@rome:38178
+MAPI  = monetdb@madrid:32172
 QUERY = set optimizer='optimizer.inline();optimizer.multiplex();';
 ERROR = !'deadcode' should be used at least once
-MAPI  = monetdb@rome:38178
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.inline();optimizer.multiplex();optimizer.deadcode();';
 ERROR = !'garbageCollector' should be used as the last one
-MAPI  = monetdb@rome:38178
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.inline();optimizer.deadcode();optimizer.multiplex();';
 ERROR = !'garbageCollector' should be used as the last one
-MAPI  = monetdb@rome:38178
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.deadcode();optimizer.inline();optimizer.multiplex();optimizer.garbageCollector();';
 ERROR = !'inline' should be the first
-MAPI  = monetdb@rome:38178
+MAPI  = monetdb@madrid:32172
 QUERY = set 
optimizer='optimizer.inline();optimizer.deadcode();optimizer.garbageCollector();optimizer.multiplex();';
 ERROR = !'garbageCollector' should be used as the last one
 
diff --git a/sql/test/Tests/setoptimizer.stable.err 
b/sql/test/Tests/setoptimizer.stable.err
--- a/sql/test/Tests/setoptimizer.stable.err
+++ b/sql/test/Tests/setoptimizer.stable.err
@@ -80,9 +80,11 @@ stderr of test 'setoptimizer` in directo
 # 12:49:31 >  mclient -lsql -i --host=eir --port=36907 
 # 12:49:31 >  
 
-MAPI  = monetdb@rome:30272
+MAPI  = monetdb@madrid:35214
 QUERY = set optimizer='myfamous_pipe';
-ERROR = !Syntax error detected.See documentation for details
+ERROR = !SyntaxException:parseError:
+        !';' expected
+        !Syntax error detected.See documentation for details
 
 # 19:12:49 >  
 # 19:12:49 >  Done.
diff --git a/sql/test/Tests/setoptimizer.stable.out 
b/sql/test/Tests/setoptimizer.stable.out
--- a/sql/test/Tests/setoptimizer.stable.out
+++ b/sql/test/Tests/setoptimizer.stable.out
@@ -76,7 +76,7 @@ Ready.
 [ "datacyclotron_pipe",        
"optimizer.inline();optimizer.remap();optimizer.evaluate();optimizer.costModel();optimizer.coercions();optimizer.emptySet();optimizer.aliases();optimizer.datacyclotron();optimizer.mergetable();optimizer.deadcode();optimizer.commonTerms();optimizer.joinPath();optimizer.reorder();optimizer.deadcode();optimizer.reduce();optimizer.dataflow();optimizer.history();optimizer.multiplex();optimizer.garbageCollector();",
   "experimental"  ]
 [ "dictionary_pipe",   
"optimizer.inline();optimizer.remap();optimizer.dictionary();optimizer.evaluate();optimizer.costModel();optimizer.coercions();optimizer.emptySet();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.constants();optimizer.commonTerms();optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.dataflow();optimizer.history();optimizer.multiplex();optimizer.garbageCollector();",
    "experimental"  ]
 [ "compression_pipe",  
"optimizer.inline();optimizer.remap();optimizer.evaluate();optimizer.costModel();optimizer.coercions();optimizer.emptySet();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.constants();optimizer.commonTerms();optimizer.joinPath();optimizer.deadcode();optimizer.reduce();optimizer.dataflow();optimizer.compression();optimizer.dataflow();optimizer.history();optimizer.multiplex();optimizer.garbageCollector();",
      "experimental"  ]
-[ "user_1",    "myfamous_pipe",        "experimental"  ]
+[ "user_1",    " optimizer.inline(); optimizer.remap(); optimizer.evaluate(); 
optimizer.costModel(); optimizer.coercions(); optimizer.emptySet(); 
optimizer.aliases(); optimizer.mergetable(); optimizer.deadcode(); 
optimizer.commonTerms(); optimizer.joinPath(); optimizer.reorder(); 
optimizer.deadcode(); optimizer.reduce(); optimizer.history(); 
optimizer.multiplex(); optimizer.accumulators(); 
optimizer.garbageCollector();",       "experimental"  ]
 
 # 02:57:35 >  
 # 02:57:35 >  "Done."
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to