Changeset: 7cc19dbbb44b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7cc19dbbb44b
Modified Files:
        sql/server/sql_semantic.c
        
sql/test/BugTracker-2011/Tests/alter_incorrect_syntax_crash.Bug-2795.stable.err
Branch: Apr2011
Log Message:

Fixed crash on Solaris in alter_incorrect_syntax_crash test.
The problem was that symbol2string returned NULL and that value was
passed on to snprintf to print as a string, resulting in a NULL
pointer dereference.  On other systems this would print (null) which
was also the wrong thing to do.  Now we always test the result of
symbol2string.

Also changed dlist2string to insert . between list elements.  This may
not be the correct thing to do, but it does produce a better error
message for the aforementioned test and has no effect on other tests.

Finally, fixed the call to dlist2string to not overwrite the value of
*err when a call to symbol2string inside dlist2string returns NULL
(which would also set *err).


diffs (100 lines):

diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -751,6 +751,9 @@
                        return NULL;
                if (b) {
                        char *o = b;
+                       b = strconcat(b,".");
+                       _DELETE(o);
+                       o = b;
                        b = strconcat(b,s);
                        _DELETE(o);
                        _DELETE(s);
@@ -775,9 +778,11 @@
 
                len = snprintf( buf+len, BUFSIZ-len, "%s(", op); 
                for (; ops; ops = ops->next) {
-                       char *tmp;
+                       char *tmp = symbol2string(sql, ops->data.sym, err);
+                       if (tmp == NULL)
+                               return NULL;
                        len = snprintf( buf+len, BUFSIZ-len, "%s%s", 
-                               tmp = symbol2string(sql, ops->data.sym, err), 
+                               tmp, 
                                (ops->next)?",":"");
                        _DELETE(tmp);
                }
@@ -786,8 +791,16 @@
        case SQL_BINOP: {
                dnode *lst = se->data.lval->h;
                char *op = qname_fname(lst->data.lval);
-               char *l = symbol2string(sql, lst->next->data.sym, err);
-               char *r = symbol2string(sql, lst->next->next->data.sym, err);
+               char *l;
+               char *r;
+               l = symbol2string(sql, lst->next->data.sym, err);
+               if (l == NULL)
+                       return NULL;
+               r = symbol2string(sql, lst->next->next->data.sym, err);
+               if (r == NULL) {
+                       _DELETE(l);
+                       return NULL;
+               }
                len = snprintf( buf+len, BUFSIZ-len, "%s(%s,%s)", op, l, r); 
                _DELETE(l);
                _DELETE(r);
@@ -801,6 +814,8 @@
                dnode *lst = se->data.lval->h;
                char *op = qname_fname(lst->data.lval);
                char *l = symbol2string(sql, lst->next->data.sym, err);
+               if (l == NULL)
+                       return NULL;
                len = snprintf( buf+len, BUFSIZ-len, "%s(%s)", op, l); 
                _DELETE(l);
                break;
@@ -834,15 +849,25 @@
                        atom *a = sql_bind_arg(sql, l->h->data.i_val);
                        return atom2sql(a);
                } else {
-                       *err = dlist2string(sql, l, err);
+                       char *e = dlist2string(sql, l, err);
+                       if (e)
+                               *err = e;
                }
                return NULL;
        }       
        case SQL_CAST: {
                dlist *dl = se->data.lval;
-               char *val = symbol2string(sql, dl->h->data.sym, err);
-               char *tpe = subtype2string(&dl->h->next->data.typeval);
-       
+               char *val;
+               char *tpe;
+
+               val = symbol2string(sql, dl->h->data.sym, err);
+               if (val == NULL)
+                       return NULL;
+               tpe = subtype2string(&dl->h->next->data.typeval);
+               if (tpe == NULL) {
+                       _DELETE(val);
+                       return NULL;
+               }
                len = snprintf( buf+len, BUFSIZ-len, "cast ( %s as %s )",
                                val, tpe);
                _DELETE(val);
diff --git 
a/sql/test/BugTracker-2011/Tests/alter_incorrect_syntax_crash.Bug-2795.stable.err
 
b/sql/test/BugTracker-2011/Tests/alter_incorrect_syntax_crash.Bug-2795.stable.err
--- 
a/sql/test/BugTracker-2011/Tests/alter_incorrect_syntax_crash.Bug-2795.stable.err
+++ 
b/sql/test/BugTracker-2011/Tests/alter_incorrect_syntax_crash.Bug-2795.stable.err
@@ -32,9 +32,9 @@
 # 12:32:37 >  mclient -lsql -ftest -i -e --host=alf --port=38195 
 # 12:32:37 >  
 
-MAPI  = monetdb@alf:38195
+MAPI  = monetdb@ottar:34692
 QUERY = alter table t2795 add r float default sqrt(power(t2795.x, 2) + 
power(t2795.y, 2));
-ERROR = !syntax error, unexpected sqlNULL in: "select sqrt(sql_add(power((null"
+ERROR = !incorrect default value 't2795.x'
 
 # 12:32:37 >  
 # 12:32:37 >  Done.
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to